Merge Official Source
Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
commit
b6fc8cad90
@ -74,6 +74,10 @@ menuconfig DEVEL
|
||||
Store ccache in this directory.
|
||||
If not set, uses './.ccache'
|
||||
|
||||
config KERNEL_CFLAGS
|
||||
string "Kernel extra CFLAGS" if DEVEL
|
||||
default ""
|
||||
|
||||
config EXTERNAL_KERNEL_TREE
|
||||
string "Use external kernel tree" if DEVEL
|
||||
default ""
|
||||
|
||||
@ -101,7 +101,7 @@ endif
|
||||
KERNEL_MAKE = $(MAKE) $(KERNEL_MAKEOPTS)
|
||||
|
||||
KERNEL_MAKE_FLAGS = \
|
||||
KCFLAGS="$(call iremap,$(BUILD_DIR),$(notdir $(BUILD_DIR))) $(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION))" \
|
||||
KCFLAGS="$(call iremap,$(BUILD_DIR),$(notdir $(BUILD_DIR))) $(call qstrip,$(CONFIG_EXTRA_OPTIMIZATION)) $(call qstrip,$(CONFIG_KERNEL_CFLAGS))" \
|
||||
HOSTCFLAGS="$(HOST_CFLAGS) -Wall -Wmissing-prototypes -Wstrict-prototypes" \
|
||||
CROSS_COMPILE="$(KERNEL_CROSS)" \
|
||||
ARCH="$(LINUX_KARCH)" \
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- broadcom-wl-5.10.56.27.3/driver/wl_linux.c.orig 2018-01-13 18:25:14.944667645 +0100
|
||||
+++ broadcom-wl-5.10.56.27.3/driver/wl_linux.c 2018-01-13 18:25:25.836667888 +0100
|
||||
@@ -2762,7 +2762,6 @@
|
||||
--- a/driver/wl_linux.c
|
||||
+++ b/driver/wl_linux.c
|
||||
@@ -2762,7 +2762,6 @@ wl_monitor(wl_info_t *wl, wl_rxsts_t *rx
|
||||
bcopy(oskb->data + D11_PHY_HDR_LEN, pdata, oskb->len - D11_PHY_HDR_LEN);
|
||||
|
||||
skb->dev = wl->monitor;
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/driver/wl_linux.c
|
||||
+++ b/driver/wl_linux.c
|
||||
@@ -235,7 +235,11 @@
|
||||
@@ -235,7 +235,11 @@ struct wl_info {
|
||||
|
||||
};
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
static void _wl_timer(wl_timer_t *t);
|
||||
|
||||
#ifdef WLC_HIGH_ONLY
|
||||
@@ -2512,6 +2517,18 @@
|
||||
@@ -2512,6 +2516,18 @@ wl_timer_task(wl_task_t *task)
|
||||
}
|
||||
#endif /* WLC_HIGH_ONLY */
|
||||
|
||||
@ -31,7 +31,7 @@
|
||||
static void
|
||||
wl_timer(ulong data)
|
||||
{
|
||||
@@ -2522,6 +2539,7 @@
|
||||
@@ -2522,6 +2538,7 @@ wl_timer(ulong data)
|
||||
wl_schedule_task(t->wl, wl_timer_task, t);
|
||||
#endif /* WLC_HIGH_ONLY */
|
||||
}
|
||||
@ -39,7 +39,7 @@
|
||||
|
||||
static void
|
||||
_wl_timer(wl_timer_t *t)
|
||||
@@ -2573,9 +2591,13 @@
|
||||
@@ -2573,9 +2590,13 @@ wl_init_timer(wl_info_t *wl, void (*fn)(
|
||||
|
||||
bzero(t, sizeof(wl_timer_t));
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
--- a/driver/wl_iw.c
|
||||
+++ b/driver/wl_iw.c
|
||||
@@ -112,10 +112,14 @@
|
||||
@@ -112,10 +112,14 @@ dev_wlc_ioctl(
|
||||
ifr.ifr_data = (caddr_t) &ioc;
|
||||
|
||||
/* Must be up for virtually all useful ioctls */
|
||||
|
||||
@ -0,0 +1,42 @@
|
||||
Index: broadcom-wl-5.10.56.27.3/driver/wl_linux.c
|
||||
===================================================================
|
||||
--- broadcom-wl-5.10.56.27.3.orig/driver/wl_linux.c
|
||||
+++ broadcom-wl-5.10.56.27.3/driver/wl_linux.c
|
||||
@@ -74,6 +74,10 @@
|
||||
#error "No support for Kernel Rev <= 2.4.5, As the older kernel revs doesn't support Tasklets"
|
||||
#endif
|
||||
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
|
||||
+#define ioremap_nocache ioremap
|
||||
+#endif
|
||||
+
|
||||
typedef void wlc_info_t;
|
||||
typedef void wlc_hw_info_t;
|
||||
#include <wlc_pub.h>
|
||||
@@ -1915,7 +1919,11 @@ wl_ioctl(struct net_device *dev, struct
|
||||
}
|
||||
|
||||
/* optimization for direct ioctl calls from kernel */
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0)
|
||||
if (segment_eq(get_fs(), KERNEL_DS))
|
||||
+#else
|
||||
+ if (uaccess_kernel())
|
||||
+#endif
|
||||
buf = ioc.buf;
|
||||
|
||||
else if (ioc.buf) {
|
||||
Index: broadcom-wl-5.10.56.27.3/driver/linux_osl.c
|
||||
===================================================================
|
||||
--- broadcom-wl-5.10.56.27.3.orig/driver/linux_osl.c
|
||||
+++ broadcom-wl-5.10.56.27.3/driver/linux_osl.c
|
||||
@@ -34,6 +34,10 @@
|
||||
#define OS_HANDLE_MAGIC 0x1234abcd /* Magic # to recognise osh */
|
||||
#define BCM_MEM_FILENAME_LEN 24 /* Mem. filename length */
|
||||
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
|
||||
+#define ioremap_nocache ioremap
|
||||
+#endif
|
||||
+
|
||||
typedef struct bcm_mem_link {
|
||||
struct bcm_mem_link *prev;
|
||||
struct bcm_mem_link *next;
|
||||
@ -172,7 +172,8 @@ configure_by_model() {
|
||||
"Linksys E3000 V1" | \
|
||||
"Linksys WRT610N V2" | \
|
||||
"Netgear WNR3500 V2" | \
|
||||
"Netgear WNR3500L")
|
||||
"Netgear WNR3500L" | \
|
||||
"Netgear WNR3500L V2")
|
||||
ucidef_add_switch "switch0" \
|
||||
"0:wan" "1:lan:4" "2:lan:3" "3:lan:2" "4:lan:1" "8@eth0"
|
||||
;;
|
||||
|
||||
@ -147,8 +147,11 @@ CONFIG_MIPS_L1_CACHE_SHIFT=5
|
||||
CONFIG_MODULES_USE_ELF_REL=y
|
||||
CONFIG_MTD_BCM47XXSFLASH=y
|
||||
CONFIG_MTD_BCM47XX_PARTS=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_CORE=y
|
||||
CONFIG_MTD_RAW_NAND=y
|
||||
CONFIG_MTD_NAND_BCM47XXNFLASH=y
|
||||
CONFIG_MTD_NAND_BRCMNAND=y
|
||||
CONFIG_MTD_NAND_BRCMNAND_BCMA=y
|
||||
CONFIG_MTD_NAND_ECC=y
|
||||
CONFIG_MTD_PARSER_TRX=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
|
||||
@ -460,6 +460,8 @@ define Device/netgear_wnr3500l-v2
|
||||
$(Device/netgear)
|
||||
NETGEAR_BOARD_ID := U12H172T00_NETGEAR
|
||||
NETGEAR_REGION := 1
|
||||
KERNEL_NAME = vmlinux-nodictionary.lzma
|
||||
IMAGE/chk := append-rootfs | trx-without-loader | netgear-chk
|
||||
endef
|
||||
TARGET_DEVICES += netgear_wnr3500l-v2
|
||||
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 1/9] mtd: rawnand: brcmnand: Assign soc as early as possible
|
||||
Date: Fri, 07 Jan 2022 10:46:06 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
In order to key off the brcmnand_probe() code in subsequent changes
|
||||
depending upon ctrl->soc, assign that variable as early as possible,
|
||||
instead of much later when we have checked that it is non-NULL.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
@@ -2949,6 +2949,7 @@ int brcmnand_probe(struct platform_devic
|
||||
|
||||
dev_set_drvdata(dev, ctrl);
|
||||
ctrl->dev = dev;
|
||||
+ ctrl->soc = soc;
|
||||
|
||||
init_completion(&ctrl->done);
|
||||
init_completion(&ctrl->dma_done);
|
||||
@@ -3089,8 +3090,6 @@ int brcmnand_probe(struct platform_devic
|
||||
* interesting ways
|
||||
*/
|
||||
if (soc) {
|
||||
- ctrl->soc = soc;
|
||||
-
|
||||
ret = devm_request_irq(dev, ctrl->irq, brcmnand_irq, 0,
|
||||
DRV_NAME, ctrl);
|
||||
|
||||
@ -0,0 +1,150 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 2/9] mtd: rawnand: brcmnand: Allow SoC to provide I/O operations
|
||||
Date: Fri, 07 Jan 2022 10:46:07 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
Allow a brcmnand_soc instance to provide a custom set of I/O operations
|
||||
which we will require when using this driver on a BCMA bus which is not
|
||||
directly memory mapped I/O. Update the nand_{read,write}_reg accordingly
|
||||
to use the SoC operations if provided.
|
||||
|
||||
To minimize the penalty on other SoCs which do support standard MMIO
|
||||
accesses, we use a static key which is disabled by default and gets
|
||||
enabled if a soc implementation does provide I/O operations.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 28 +++++++++++++++++++++--
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.h | 29 ++++++++++++++++++++++++
|
||||
2 files changed, 55 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/static_key.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/log2.h>
|
||||
|
||||
@@ -207,6 +208,8 @@ enum {
|
||||
|
||||
struct brcmnand_host;
|
||||
|
||||
+static DEFINE_STATIC_KEY_FALSE(brcmnand_soc_has_ops_key);
|
||||
+
|
||||
struct brcmnand_controller {
|
||||
struct device *dev;
|
||||
struct nand_controller controller;
|
||||
@@ -589,15 +592,25 @@ enum {
|
||||
INTFC_CTLR_READY = BIT(31),
|
||||
};
|
||||
|
||||
+static inline bool brcmnand_non_mmio_ops(struct brcmnand_controller *ctrl)
|
||||
+{
|
||||
+ return static_branch_unlikely(&brcmnand_soc_has_ops_key);
|
||||
+}
|
||||
+
|
||||
static inline u32 nand_readreg(struct brcmnand_controller *ctrl, u32 offs)
|
||||
{
|
||||
+ if (brcmnand_non_mmio_ops(ctrl))
|
||||
+ return brcmnand_soc_read(ctrl->soc, offs);
|
||||
return brcmnand_readl(ctrl->nand_base + offs);
|
||||
}
|
||||
|
||||
static inline void nand_writereg(struct brcmnand_controller *ctrl, u32 offs,
|
||||
u32 val)
|
||||
{
|
||||
- brcmnand_writel(val, ctrl->nand_base + offs);
|
||||
+ if (brcmnand_non_mmio_ops(ctrl))
|
||||
+ brcmnand_soc_write(ctrl->soc, val, offs);
|
||||
+ else
|
||||
+ brcmnand_writel(val, ctrl->nand_base + offs);
|
||||
}
|
||||
|
||||
static int brcmnand_revision_init(struct brcmnand_controller *ctrl)
|
||||
@@ -763,13 +776,18 @@ static inline void brcmnand_rmw_reg(stru
|
||||
|
||||
static inline u32 brcmnand_read_fc(struct brcmnand_controller *ctrl, int word)
|
||||
{
|
||||
+ if (brcmnand_non_mmio_ops(ctrl))
|
||||
+ return brcmnand_soc_read(ctrl->soc, BRCMNAND_NON_MMIO_FC_ADDR);
|
||||
return __raw_readl(ctrl->nand_fc + word * 4);
|
||||
}
|
||||
|
||||
static inline void brcmnand_write_fc(struct brcmnand_controller *ctrl,
|
||||
int word, u32 val)
|
||||
{
|
||||
- __raw_writel(val, ctrl->nand_fc + word * 4);
|
||||
+ if (brcmnand_non_mmio_ops(ctrl))
|
||||
+ brcmnand_soc_write(ctrl->soc, val, BRCMNAND_NON_MMIO_FC_ADDR);
|
||||
+ else
|
||||
+ __raw_writel(val, ctrl->nand_fc + word * 4);
|
||||
}
|
||||
|
||||
static inline void edu_writel(struct brcmnand_controller *ctrl,
|
||||
@@ -2951,6 +2969,12 @@ int brcmnand_probe(struct platform_devic
|
||||
ctrl->dev = dev;
|
||||
ctrl->soc = soc;
|
||||
|
||||
+ /* Enable the static key if the soc provides I/O operations indicating
|
||||
+ * that a non-memory mapped IO access path must be used
|
||||
+ */
|
||||
+ if (brcmnand_soc_has_ops(ctrl->soc))
|
||||
+ static_branch_enable(&brcmnand_soc_has_ops_key);
|
||||
+
|
||||
init_completion(&ctrl->done);
|
||||
init_completion(&ctrl->dma_done);
|
||||
init_completion(&ctrl->edu_done);
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.h
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.h
|
||||
@@ -11,12 +11,25 @@
|
||||
|
||||
struct platform_device;
|
||||
struct dev_pm_ops;
|
||||
+struct brcmnand_io_ops;
|
||||
+
|
||||
+/* Special register offset constant to intercept a non-MMIO access
|
||||
+ * to the flash cache register space. This is intentionally large
|
||||
+ * not to overlap with an existing offset.
|
||||
+ */
|
||||
+#define BRCMNAND_NON_MMIO_FC_ADDR 0xffffffff
|
||||
|
||||
struct brcmnand_soc {
|
||||
bool (*ctlrdy_ack)(struct brcmnand_soc *soc);
|
||||
void (*ctlrdy_set_enabled)(struct brcmnand_soc *soc, bool en);
|
||||
void (*prepare_data_bus)(struct brcmnand_soc *soc, bool prepare,
|
||||
bool is_param);
|
||||
+ const struct brcmnand_io_ops *ops;
|
||||
+};
|
||||
+
|
||||
+struct brcmnand_io_ops {
|
||||
+ u32 (*read_reg)(struct brcmnand_soc *soc, u32 offset);
|
||||
+ void (*write_reg)(struct brcmnand_soc *soc, u32 val, u32 offset);
|
||||
};
|
||||
|
||||
static inline void brcmnand_soc_data_bus_prepare(struct brcmnand_soc *soc,
|
||||
@@ -58,6 +71,22 @@ static inline void brcmnand_writel(u32 v
|
||||
writel_relaxed(val, addr);
|
||||
}
|
||||
|
||||
+static inline bool brcmnand_soc_has_ops(struct brcmnand_soc *soc)
|
||||
+{
|
||||
+ return soc && soc->ops && soc->ops->read_reg && soc->ops->write_reg;
|
||||
+}
|
||||
+
|
||||
+static inline u32 brcmnand_soc_read(struct brcmnand_soc *soc, u32 offset)
|
||||
+{
|
||||
+ return soc->ops->read_reg(soc, offset);
|
||||
+}
|
||||
+
|
||||
+static inline void brcmnand_soc_write(struct brcmnand_soc *soc, u32 val,
|
||||
+ u32 offset)
|
||||
+{
|
||||
+ soc->ops->write_reg(soc, val, offset);
|
||||
+}
|
||||
+
|
||||
int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc);
|
||||
int brcmnand_remove(struct platform_device *pdev);
|
||||
|
||||
@ -0,0 +1,52 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 3/9] mtd: rawnand: brcmnand: Avoid pdev in brcmnand_init_cs()
|
||||
Date: Fri, 07 Jan 2022 10:46:08 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
In preparation for encapsulating more of what the loop calling
|
||||
brcmnand_init_cs() does, avoid using platform_device when it is the
|
||||
device behind platform_device that we are using for printing errors.
|
||||
|
||||
No functional changes introduced.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
@@ -2722,7 +2722,7 @@ static const struct nand_controller_ops
|
||||
static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)
|
||||
{
|
||||
struct brcmnand_controller *ctrl = host->ctrl;
|
||||
- struct platform_device *pdev = host->pdev;
|
||||
+ struct device *dev = ctrl->dev;
|
||||
struct mtd_info *mtd;
|
||||
struct nand_chip *chip;
|
||||
int ret;
|
||||
@@ -2730,7 +2730,7 @@ static int brcmnand_init_cs(struct brcmn
|
||||
|
||||
ret = of_property_read_u32(dn, "reg", &host->cs);
|
||||
if (ret) {
|
||||
- dev_err(&pdev->dev, "can't get chip-select\n");
|
||||
+ dev_err(dev, "can't get chip-select\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
@@ -2739,13 +2739,13 @@ static int brcmnand_init_cs(struct brcmn
|
||||
|
||||
nand_set_flash_node(chip, dn);
|
||||
nand_set_controller_data(chip, host);
|
||||
- mtd->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "brcmnand.%d",
|
||||
+ mtd->name = devm_kasprintf(dev, GFP_KERNEL, "brcmnand.%d",
|
||||
host->cs);
|
||||
if (!mtd->name)
|
||||
return -ENOMEM;
|
||||
|
||||
mtd->owner = THIS_MODULE;
|
||||
- mtd->dev.parent = &pdev->dev;
|
||||
+ mtd->dev.parent = dev;
|
||||
|
||||
chip->legacy.cmd_ctrl = brcmnand_cmd_ctrl;
|
||||
chip->legacy.cmdfunc = brcmnand_cmdfunc;
|
||||
@ -0,0 +1,63 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 4/9] mtd: rawnand: brcmnand: Move OF operations out of brcmnand_init_cs()
|
||||
Date: Fri, 07 Jan 2022 10:46:09 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
In order to initialize a given chip select object for use by the
|
||||
brcmnand driver, move all of the Device Tree specific routines outside
|
||||
of brcmnand_init_cs() in order to make it usable in a platform data
|
||||
configuration which will be necessary for supporting BCMA chips.
|
||||
|
||||
No functional changes introduced.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 20 +++++++++++---------
|
||||
1 file changed, 11 insertions(+), 9 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
@@ -2719,7 +2719,7 @@ static const struct nand_controller_ops
|
||||
.attach_chip = brcmnand_attach_chip,
|
||||
};
|
||||
|
||||
-static int brcmnand_init_cs(struct brcmnand_host *host, struct device_node *dn)
|
||||
+static int brcmnand_init_cs(struct brcmnand_host *host)
|
||||
{
|
||||
struct brcmnand_controller *ctrl = host->ctrl;
|
||||
struct device *dev = ctrl->dev;
|
||||
@@ -2728,16 +2728,9 @@ static int brcmnand_init_cs(struct brcmn
|
||||
int ret;
|
||||
u16 cfg_offs;
|
||||
|
||||
- ret = of_property_read_u32(dn, "reg", &host->cs);
|
||||
- if (ret) {
|
||||
- dev_err(dev, "can't get chip-select\n");
|
||||
- return -ENXIO;
|
||||
- }
|
||||
-
|
||||
mtd = nand_to_mtd(&host->chip);
|
||||
chip = &host->chip;
|
||||
|
||||
- nand_set_flash_node(chip, dn);
|
||||
nand_set_controller_data(chip, host);
|
||||
mtd->name = devm_kasprintf(dev, GFP_KERNEL, "brcmnand.%d",
|
||||
host->cs);
|
||||
@@ -3144,7 +3137,16 @@ int brcmnand_probe(struct platform_devic
|
||||
host->pdev = pdev;
|
||||
host->ctrl = ctrl;
|
||||
|
||||
- ret = brcmnand_init_cs(host, child);
|
||||
+ ret = of_property_read_u32(child, "reg", &host->cs);
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "can't get chip-select\n");
|
||||
+ devm_kfree(dev, host);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ nand_set_flash_node(&host->chip, child);
|
||||
+
|
||||
+ ret = brcmnand_init_cs(host);
|
||||
if (ret) {
|
||||
devm_kfree(dev, host);
|
||||
continue; /* Try all chip-selects */
|
||||
@ -0,0 +1,91 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 5/9] mtd: rawnand: brcmnand: Allow working without interrupts
|
||||
Date: Fri, 07 Jan 2022 10:46:10 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
The BCMA devices include the brcmnand controller but they do not wire up
|
||||
any interrupt line, allow the main interrupt to be optional and update
|
||||
the completion path to also check for the lack of an interrupt line.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 52 +++++++++++-------------
|
||||
1 file changed, 24 insertions(+), 28 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
@@ -216,7 +216,7 @@ struct brcmnand_controller {
|
||||
void __iomem *nand_base;
|
||||
void __iomem *nand_fc; /* flash cache */
|
||||
void __iomem *flash_dma_base;
|
||||
- unsigned int irq;
|
||||
+ int irq;
|
||||
unsigned int dma_irq;
|
||||
int nand_version;
|
||||
|
||||
@@ -1590,7 +1590,7 @@ static bool brcmstb_nand_wait_for_comple
|
||||
bool err = false;
|
||||
int sts;
|
||||
|
||||
- if (mtd->oops_panic_write) {
|
||||
+ if (mtd->oops_panic_write || ctrl->irq < 0) {
|
||||
/* switch to interrupt polling and PIO mode */
|
||||
disable_ctrl_irqs(ctrl);
|
||||
sts = bcmnand_ctrl_poll_status(ctrl, NAND_CTRL_RDY,
|
||||
@@ -3095,33 +3095,29 @@ int brcmnand_probe(struct platform_devic
|
||||
}
|
||||
|
||||
/* IRQ */
|
||||
- ctrl->irq = platform_get_irq(pdev, 0);
|
||||
- if ((int)ctrl->irq < 0) {
|
||||
- dev_err(dev, "no IRQ defined\n");
|
||||
- ret = -ENODEV;
|
||||
- goto err;
|
||||
- }
|
||||
-
|
||||
- /*
|
||||
- * Some SoCs integrate this controller (e.g., its interrupt bits) in
|
||||
- * interesting ways
|
||||
- */
|
||||
- if (soc) {
|
||||
- ret = devm_request_irq(dev, ctrl->irq, brcmnand_irq, 0,
|
||||
- DRV_NAME, ctrl);
|
||||
-
|
||||
- /* Enable interrupt */
|
||||
- ctrl->soc->ctlrdy_ack(ctrl->soc);
|
||||
- ctrl->soc->ctlrdy_set_enabled(ctrl->soc, true);
|
||||
- } else {
|
||||
- /* Use standard interrupt infrastructure */
|
||||
- ret = devm_request_irq(dev, ctrl->irq, brcmnand_ctlrdy_irq, 0,
|
||||
- DRV_NAME, ctrl);
|
||||
- }
|
||||
- if (ret < 0) {
|
||||
- dev_err(dev, "can't allocate IRQ %d: error %d\n",
|
||||
- ctrl->irq, ret);
|
||||
- goto err;
|
||||
+ ctrl->irq = platform_get_irq_optional(pdev, 0);
|
||||
+ if (ctrl->irq > 0) {
|
||||
+ /*
|
||||
+ * Some SoCs integrate this controller (e.g., its interrupt bits) in
|
||||
+ * interesting ways
|
||||
+ */
|
||||
+ if (soc) {
|
||||
+ ret = devm_request_irq(dev, ctrl->irq, brcmnand_irq, 0,
|
||||
+ DRV_NAME, ctrl);
|
||||
+
|
||||
+ /* Enable interrupt */
|
||||
+ ctrl->soc->ctlrdy_ack(ctrl->soc);
|
||||
+ ctrl->soc->ctlrdy_set_enabled(ctrl->soc, true);
|
||||
+ } else {
|
||||
+ /* Use standard interrupt infrastructure */
|
||||
+ ret = devm_request_irq(dev, ctrl->irq, brcmnand_ctlrdy_irq, 0,
|
||||
+ DRV_NAME, ctrl);
|
||||
+ }
|
||||
+ if (ret < 0) {
|
||||
+ dev_err(dev, "can't allocate IRQ %d: error %d\n",
|
||||
+ ctrl->irq, ret);
|
||||
+ goto err;
|
||||
+ }
|
||||
}
|
||||
|
||||
for_each_available_child_of_node(dn, child) {
|
||||
@ -0,0 +1,115 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 6/9] mtd: rawnand: brcmnand: Add platform data structure for BCMA
|
||||
Date: Fri, 07 Jan 2022 10:46:11 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
Update the BCMA's chipcommon nand flash driver to detect which
|
||||
chip-select is used and pass that information via platform data to the
|
||||
brcmnand driver. Make sure that the brcmnand platform data structure is
|
||||
always at the beginning of the platform data of the "nflash" device
|
||||
created by BCMA to allow brcmnand to safely de-reference it.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
MAINTAINERS | 1 +
|
||||
drivers/bcma/driver_chipcommon_nflash.c | 20 +++++++++++++++++++-
|
||||
include/linux/bcma/bcma_driver_chipcommon.h | 5 +++++
|
||||
include/linux/platform_data/brcmnand.h | 12 ++++++++++++
|
||||
4 files changed, 37 insertions(+), 1 deletion(-)
|
||||
create mode 100644 include/linux/platform_data/brcmnand.h
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -3712,6 +3712,7 @@ L: linux-mtd@lists.infradead.org
|
||||
L: bcm-kernel-feedback-list@broadcom.com
|
||||
S: Maintained
|
||||
F: drivers/mtd/nand/raw/brcmnand/
|
||||
+F: include/linux/platform_data/brcmnand.h
|
||||
|
||||
BROADCOM SYSTEMPORT ETHERNET DRIVER
|
||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
--- a/drivers/bcma/driver_chipcommon_nflash.c
|
||||
+++ b/drivers/bcma/driver_chipcommon_nflash.c
|
||||
@@ -7,18 +7,28 @@
|
||||
|
||||
#include "bcma_private.h"
|
||||
|
||||
+#include <linux/bitops.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/platform_data/brcmnand.h>
|
||||
#include <linux/bcma/bcma.h>
|
||||
|
||||
+/* Alternate NAND controller driver name in order to allow both bcm47xxnflash
|
||||
+ * and bcma_brcmnand to be built into the same kernel image.
|
||||
+ */
|
||||
+static const char *bcma_nflash_alt_name = "bcma_brcmnand";
|
||||
+
|
||||
struct platform_device bcma_nflash_dev = {
|
||||
.name = "bcma_nflash",
|
||||
.num_resources = 0,
|
||||
};
|
||||
|
||||
+static const char *probes[] = { "bcm47xxpart", NULL };
|
||||
+
|
||||
/* Initialize NAND flash access */
|
||||
int bcma_nflash_init(struct bcma_drv_cc *cc)
|
||||
{
|
||||
struct bcma_bus *bus = cc->core->bus;
|
||||
+ u32 reg;
|
||||
|
||||
if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 &&
|
||||
cc->core->id.rev != 38) {
|
||||
@@ -33,8 +43,16 @@ int bcma_nflash_init(struct bcma_drv_cc
|
||||
|
||||
cc->nflash.present = true;
|
||||
if (cc->core->id.rev == 38 &&
|
||||
- (cc->status & BCMA_CC_CHIPST_5357_NAND_BOOT))
|
||||
+ (cc->status & BCMA_CC_CHIPST_5357_NAND_BOOT)) {
|
||||
cc->nflash.boot = true;
|
||||
+ /* Determine the chip select that is being used */
|
||||
+ reg = bcma_cc_read32(cc, BCMA_CC_NAND_CS_NAND_SELECT) & 0xff;
|
||||
+ cc->nflash.brcmnand_info.chip_select = ffs(reg) - 1;
|
||||
+ cc->nflash.brcmnand_info.part_probe_types = probes;
|
||||
+ cc->nflash.brcmnand_info.ecc_stepsize = 512;
|
||||
+ cc->nflash.brcmnand_info.ecc_strength = 1;
|
||||
+ bcma_nflash_dev.name = bcma_nflash_alt_name;
|
||||
+ }
|
||||
|
||||
/* Prepare platform device, but don't register it yet. It's too early,
|
||||
* malloc (required by device_private_init) is not available yet. */
|
||||
--- a/include/linux/bcma/bcma_driver_chipcommon.h
|
||||
+++ b/include/linux/bcma/bcma_driver_chipcommon.h
|
||||
@@ -3,6 +3,7 @@
|
||||
#define LINUX_BCMA_DRIVER_CC_H_
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/platform_data/brcmnand.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
/** ChipCommon core registers. **/
|
||||
@@ -599,6 +600,10 @@ struct bcma_sflash {
|
||||
|
||||
#ifdef CONFIG_BCMA_NFLASH
|
||||
struct bcma_nflash {
|
||||
+ /* Must be the fist member for the brcmnand driver to
|
||||
+ * de-reference that structure.
|
||||
+ */
|
||||
+ struct brcmnand_platform_data brcmnand_info;
|
||||
bool present;
|
||||
bool boot; /* This is the flash the SoC boots from */
|
||||
};
|
||||
--- /dev/null
|
||||
+++ b/include/linux/platform_data/brcmnand.h
|
||||
@@ -0,0 +1,12 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
+#ifndef BRCMNAND_PLAT_DATA_H
|
||||
+#define BRCMNAND_PLAT_DATA_H
|
||||
+
|
||||
+struct brcmnand_platform_data {
|
||||
+ int chip_select;
|
||||
+ const char * const *part_probe_types;
|
||||
+ unsigned int ecc_stepsize;
|
||||
+ unsigned int ecc_strength;
|
||||
+};
|
||||
+
|
||||
+#endif /* BRCMNAND_PLAT_DATA_H */
|
||||
@ -0,0 +1,124 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 7/9] mtd: rawnand: brcmnand: Allow platform data instantation
|
||||
Date: Fri, 07 Jan 2022 10:46:12 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
Make use of the recently refactored code in brcmnand_init_cs() and
|
||||
derive the chip-select from the platform data that is supplied. Update
|
||||
the various code paths to avoid relying on possibly non-existent
|
||||
resources, too.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 45 ++++++++++++++++++------
|
||||
1 file changed, 35 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
+#include <linux/platform_data/brcmnand.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/interrupt.h>
|
||||
@@ -2719,7 +2720,8 @@ static const struct nand_controller_ops
|
||||
.attach_chip = brcmnand_attach_chip,
|
||||
};
|
||||
|
||||
-static int brcmnand_init_cs(struct brcmnand_host *host)
|
||||
+static int brcmnand_init_cs(struct brcmnand_host *host,
|
||||
+ const char * const *part_probe_types)
|
||||
{
|
||||
struct brcmnand_controller *ctrl = host->ctrl;
|
||||
struct device *dev = ctrl->dev;
|
||||
@@ -2772,7 +2774,7 @@ static int brcmnand_init_cs(struct brcmn
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
- ret = mtd_device_register(mtd, NULL, 0);
|
||||
+ ret = mtd_device_parse_register(mtd, part_probe_types, NULL, NULL, 0);
|
||||
if (ret)
|
||||
nand_cleanup(chip);
|
||||
|
||||
@@ -2941,17 +2943,15 @@ static int brcmnand_edu_setup(struct pla
|
||||
|
||||
int brcmnand_probe(struct platform_device *pdev, struct brcmnand_soc *soc)
|
||||
{
|
||||
+ struct brcmnand_platform_data *pd = dev_get_platdata(&pdev->dev);
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *dn = dev->of_node, *child;
|
||||
struct brcmnand_controller *ctrl;
|
||||
+ struct brcmnand_host *host;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
- /* We only support device-tree instantiation */
|
||||
- if (!dn)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- if (!of_match_node(brcmnand_of_match, dn))
|
||||
+ if (dn && !of_match_node(brcmnand_of_match, dn))
|
||||
return -ENODEV;
|
||||
|
||||
ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL);
|
||||
@@ -2978,7 +2978,7 @@ int brcmnand_probe(struct platform_devic
|
||||
/* NAND register range */
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
ctrl->nand_base = devm_ioremap_resource(dev, res);
|
||||
- if (IS_ERR(ctrl->nand_base))
|
||||
+ if (IS_ERR(ctrl->nand_base) && !brcmnand_soc_has_ops(soc))
|
||||
return PTR_ERR(ctrl->nand_base);
|
||||
|
||||
/* Enable clock before using NAND registers */
|
||||
@@ -3122,7 +3122,6 @@ int brcmnand_probe(struct platform_devic
|
||||
|
||||
for_each_available_child_of_node(dn, child) {
|
||||
if (of_device_is_compatible(child, "brcm,nandcs")) {
|
||||
- struct brcmnand_host *host;
|
||||
|
||||
host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
|
||||
if (!host) {
|
||||
@@ -3142,7 +3141,7 @@ int brcmnand_probe(struct platform_devic
|
||||
|
||||
nand_set_flash_node(&host->chip, child);
|
||||
|
||||
- ret = brcmnand_init_cs(host);
|
||||
+ ret = brcmnand_init_cs(host, NULL);
|
||||
if (ret) {
|
||||
devm_kfree(dev, host);
|
||||
continue; /* Try all chip-selects */
|
||||
@@ -3152,6 +3151,32 @@ int brcmnand_probe(struct platform_devic
|
||||
}
|
||||
}
|
||||
|
||||
+ if (!list_empty(&ctrl->host_list))
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!pd) {
|
||||
+ ret = -ENODEV;
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
+ /* If we got there we must have been probing via platform data */
|
||||
+ host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL);
|
||||
+ if (!host) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto err;
|
||||
+ }
|
||||
+ host->pdev = pdev;
|
||||
+ host->ctrl = ctrl;
|
||||
+ host->cs = pd->chip_select;
|
||||
+ host->chip.ecc.size = pd->ecc_stepsize;
|
||||
+ host->chip.ecc.strength = pd->ecc_strength;
|
||||
+
|
||||
+ ret = brcmnand_init_cs(host, pd->part_probe_types);
|
||||
+ if (ret)
|
||||
+ goto err;
|
||||
+
|
||||
+ list_add_tail(&host->node, &ctrl->host_list);
|
||||
+
|
||||
/* No chip-selects could initialize properly */
|
||||
if (list_empty(&ctrl->host_list)) {
|
||||
ret = -ENODEV;
|
||||
@ -0,0 +1,29 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 8/9] mtd: rawnand: brcmnand: BCMA controller uses command shift of 0
|
||||
Date: Fri, 07 Jan 2022 10:46:13 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
For some odd and unexplained reason the BCMA NAND controller, albeit
|
||||
revision 3.4 uses a command shift of 0 instead of 24 as it should be,
|
||||
quirk that.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
@@ -913,6 +913,12 @@ static void brcmnand_wr_corr_thresh(stru
|
||||
|
||||
static inline int brcmnand_cmd_shift(struct brcmnand_controller *ctrl)
|
||||
{
|
||||
+ /* Kludge for the BCMA-based NAND controller which does not actually
|
||||
+ * shift the command
|
||||
+ */
|
||||
+ if (ctrl->nand_version == 0x0304 && brcmnand_non_mmio_ops(ctrl))
|
||||
+ return 0;
|
||||
+
|
||||
if (ctrl->nand_version < 0x0602)
|
||||
return 24;
|
||||
return 0;
|
||||
@ -0,0 +1,201 @@
|
||||
From: Florian Fainelli <f.fainelli@gmail.com>
|
||||
Subject: [PATCH v3 9/9] mtd: rawnand: brcmnand: Add BCMA shim
|
||||
Date: Fri, 07 Jan 2022 10:46:14 -0800
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
|
||||
Add a BCMA shim to allow us to register the brcmnand driver using the
|
||||
BCMA bus which provides indirect memory mapped access to SoC registers.
|
||||
|
||||
There are a number of registers that need to be byte swapped because
|
||||
they are natively big endian, coming directly from the NAND chip, and
|
||||
there is no bus interface unlike the iProc or STB platforms that
|
||||
performs the byte swapping for us.
|
||||
|
||||
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
|
||||
---
|
||||
drivers/mtd/nand/raw/Kconfig | 13 +++
|
||||
drivers/mtd/nand/raw/brcmnand/Makefile | 2 +
|
||||
drivers/mtd/nand/raw/brcmnand/bcma_nand.c | 132 ++++++++++++++++++++++
|
||||
drivers/mtd/nand/raw/brcmnand/brcmnand.c | 4 +
|
||||
4 files changed, 151 insertions(+)
|
||||
create mode 100644 drivers/mtd/nand/raw/brcmnand/bcma_nand.c
|
||||
|
||||
--- a/drivers/mtd/nand/raw/Kconfig
|
||||
+++ b/drivers/mtd/nand/raw/Kconfig
|
||||
@@ -236,6 +236,19 @@ config MTD_NAND_BRCMNAND
|
||||
originally designed for Set-Top Box but is used on various BCM7xxx,
|
||||
BCM3xxx, BCM63xxx, iProc/Cygnus and more.
|
||||
|
||||
+if MTD_NAND_BRCMNAND
|
||||
+
|
||||
+config MTD_NAND_BRCMNAND_BCMA
|
||||
+ tristate "Broadcom BCMA NAND controller"
|
||||
+ depends on BCMA_NFLASH
|
||||
+ depends on BCMA
|
||||
+ help
|
||||
+ Enables the BRCMNAND controller over BCMA on BCM47186/BCM5358 SoCs.
|
||||
+ The glue driver will take care of performing the low-level I/O
|
||||
+ operations to interface the BRCMNAND controller over the BCMA bus.
|
||||
+
|
||||
+endif # MTD_NAND_BRCMNAND
|
||||
+
|
||||
config MTD_NAND_BCM47XXNFLASH
|
||||
tristate "BCM4706 BCMA NAND controller"
|
||||
depends on BCMA_NFLASH
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/Makefile
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/Makefile
|
||||
@@ -6,3 +6,5 @@ obj-$(CONFIG_MTD_NAND_BRCMNAND) += bcm6
|
||||
obj-$(CONFIG_MTD_NAND_BRCMNAND) += bcm6368_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_BRCMNAND) += brcmstb_nand.o
|
||||
obj-$(CONFIG_MTD_NAND_BRCMNAND) += brcmnand.o
|
||||
+
|
||||
+obj-$(CONFIG_MTD_NAND_BRCMNAND_BCMA) += bcma_nand.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/bcma_nand.c
|
||||
@@ -0,0 +1,132 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0-only
|
||||
+/*
|
||||
+ * Copyright © 2021 Broadcom
|
||||
+ */
|
||||
+#include <linux/bcma/bcma.h>
|
||||
+#include <linux/bcma/bcma_driver_chipcommon.h>
|
||||
+#include <linux/device.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+
|
||||
+#include "brcmnand.h"
|
||||
+
|
||||
+struct brcmnand_bcma_soc {
|
||||
+ struct brcmnand_soc soc;
|
||||
+ struct bcma_drv_cc *cc;
|
||||
+};
|
||||
+
|
||||
+static inline bool brcmnand_bcma_needs_swapping(u32 offset)
|
||||
+{
|
||||
+ switch (offset) {
|
||||
+ case BCMA_CC_NAND_SPARE_RD0:
|
||||
+ case BCMA_CC_NAND_SPARE_RD4:
|
||||
+ case BCMA_CC_NAND_SPARE_RD8:
|
||||
+ case BCMA_CC_NAND_SPARE_RD12:
|
||||
+ case BCMA_CC_NAND_SPARE_WR0:
|
||||
+ case BCMA_CC_NAND_SPARE_WR4:
|
||||
+ case BCMA_CC_NAND_SPARE_WR8:
|
||||
+ case BCMA_CC_NAND_SPARE_WR12:
|
||||
+ case BCMA_CC_NAND_DEVID:
|
||||
+ case BCMA_CC_NAND_DEVID_X:
|
||||
+ case BCMA_CC_NAND_SPARE_RD16:
|
||||
+ case BCMA_CC_NAND_SPARE_RD20:
|
||||
+ case BCMA_CC_NAND_SPARE_RD24:
|
||||
+ case BCMA_CC_NAND_SPARE_RD28:
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static inline struct brcmnand_bcma_soc *to_bcma_soc(struct brcmnand_soc *soc)
|
||||
+{
|
||||
+ return container_of(soc, struct brcmnand_bcma_soc, soc);
|
||||
+}
|
||||
+
|
||||
+static u32 brcmnand_bcma_read_reg(struct brcmnand_soc *soc, u32 offset)
|
||||
+{
|
||||
+ struct brcmnand_bcma_soc *sc = to_bcma_soc(soc);
|
||||
+ u32 val;
|
||||
+
|
||||
+ /* Offset into the NAND block and deal with the flash cache separately */
|
||||
+ if (offset == BRCMNAND_NON_MMIO_FC_ADDR)
|
||||
+ offset = BCMA_CC_NAND_CACHE_DATA;
|
||||
+ else
|
||||
+ offset += BCMA_CC_NAND_REVISION;
|
||||
+
|
||||
+ val = bcma_cc_read32(sc->cc, offset);
|
||||
+
|
||||
+ /* Swap if necessary */
|
||||
+ if (brcmnand_bcma_needs_swapping(offset))
|
||||
+ val = be32_to_cpu(val);
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+static void brcmnand_bcma_write_reg(struct brcmnand_soc *soc, u32 val,
|
||||
+ u32 offset)
|
||||
+{
|
||||
+ struct brcmnand_bcma_soc *sc = to_bcma_soc(soc);
|
||||
+
|
||||
+ /* Offset into the NAND block */
|
||||
+ if (offset == BRCMNAND_NON_MMIO_FC_ADDR)
|
||||
+ offset = BCMA_CC_NAND_CACHE_DATA;
|
||||
+ else
|
||||
+ offset += BCMA_CC_NAND_REVISION;
|
||||
+
|
||||
+ /* Swap if necessary */
|
||||
+ if (brcmnand_bcma_needs_swapping(offset))
|
||||
+ val = cpu_to_be32(val);
|
||||
+
|
||||
+ bcma_cc_write32(sc->cc, offset, val);
|
||||
+}
|
||||
+
|
||||
+static struct brcmnand_io_ops brcmnand_bcma_io_ops = {
|
||||
+ .read_reg = brcmnand_bcma_read_reg,
|
||||
+ .write_reg = brcmnand_bcma_write_reg,
|
||||
+};
|
||||
+
|
||||
+static void brcmnand_bcma_prepare_data_bus(struct brcmnand_soc *soc, bool prepare,
|
||||
+ bool is_param)
|
||||
+{
|
||||
+ struct brcmnand_bcma_soc *sc = to_bcma_soc(soc);
|
||||
+
|
||||
+ /* Reset the cache address to ensure we are already accessing the
|
||||
+ * beginning of a sub-page.
|
||||
+ */
|
||||
+ bcma_cc_write32(sc->cc, BCMA_CC_NAND_CACHE_ADDR, 0);
|
||||
+}
|
||||
+
|
||||
+static int brcmnand_bcma_nand_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct bcma_nflash *nflash = dev_get_platdata(&pdev->dev);
|
||||
+ struct brcmnand_bcma_soc *soc;
|
||||
+
|
||||
+ soc = devm_kzalloc(&pdev->dev, sizeof(*soc), GFP_KERNEL);
|
||||
+ if (!soc)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ soc->cc = container_of(nflash, struct bcma_drv_cc, nflash);
|
||||
+ soc->soc.prepare_data_bus = brcmnand_bcma_prepare_data_bus;
|
||||
+ soc->soc.ops = &brcmnand_bcma_io_ops;
|
||||
+
|
||||
+ if (soc->cc->core->bus->chipinfo.id == BCMA_CHIP_ID_BCM4706) {
|
||||
+ dev_err(&pdev->dev, "Use bcm47xxnflash for 4706!\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ return brcmnand_probe(pdev, &soc->soc);
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver brcmnand_bcma_nand_driver = {
|
||||
+ .probe = brcmnand_bcma_nand_probe,
|
||||
+ .remove = brcmnand_remove,
|
||||
+ .driver = {
|
||||
+ .name = "bcma_brcmnand",
|
||||
+ .pm = &brcmnand_pm_ops,
|
||||
+ }
|
||||
+};
|
||||
+module_platform_driver(brcmnand_bcma_nand_driver);
|
||||
+
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
+MODULE_AUTHOR("Broadcom");
|
||||
+MODULE_DESCRIPTION("NAND controller driver glue for BCMA chips");
|
||||
--- a/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
+++ b/drivers/mtd/nand/raw/brcmnand/brcmnand.c
|
||||
@@ -595,7 +595,11 @@ enum {
|
||||
|
||||
static inline bool brcmnand_non_mmio_ops(struct brcmnand_controller *ctrl)
|
||||
{
|
||||
+#if IS_ENABLED(CONFIG_MTD_NAND_BRCMNAND_BCMA)
|
||||
return static_branch_unlikely(&brcmnand_soc_has_ops_key);
|
||||
+#else
|
||||
+ return false;
|
||||
+#endif
|
||||
}
|
||||
|
||||
static inline u32 nand_readreg(struct brcmnand_controller *ctrl, u32 offs)
|
||||
@ -1,6 +1,8 @@
|
||||
diff --git a/arch/mips/bcm47xx/board.c b/arch/mips/bcm47xx/board.c
|
||||
index 35266a70e22a..4ef610431802 100644
|
||||
--- a/arch/mips/bcm47xx/board.c
|
||||
+++ b/arch/mips/bcm47xx/board.c
|
||||
@@ -141,6 +141,7 @@ struct bcm47xx_board_type_list2 bcm47xx_
|
||||
@@ -141,6 +141,7 @@ struct bcm47xx_board_type_list2 bcm47xx_board_list_boot_hw[] __initconst = {
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT300NV11, "Linksys WRT300N V1.1"}, "WRT300N", "1.1"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT310NV1, "Linksys WRT310N V1"}, "WRT310N", "1.0"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT310NV2, "Linksys WRT310N V2"}, "WRT310N", "2.0"},
|
||||
@ -8,7 +10,7 @@
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT54G3GV2, "Linksys WRT54G3GV2-VF"}, "WRT54G3GV2-VF", "1.0"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT610NV1, "Linksys WRT610N V1"}, "WRT610N", "1.0"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT610NV2, "Linksys WRT610N V2"}, "WRT610N", "2.0"},
|
||||
@@ -161,9 +162,12 @@ struct bcm47xx_board_type_list1 bcm47xx_
|
||||
@@ -161,9 +162,12 @@ struct bcm47xx_board_type_list1 bcm47xx_board_list_board_id[] __initconst = {
|
||||
{{BCM47XX_BOARD_LUXUL_XWR_600_V1, "Luxul XWR-600 V1"}, "luxul_xwr600_v1"},
|
||||
{{BCM47XX_BOARD_LUXUL_XWR_1750_V1, "Luxul XWR-1750 V1"}, "luxul_xwr1750_v1"},
|
||||
{{BCM47XX_BOARD_NETGEAR_R6200_V1, "Netgear R6200 V1"}, "U12H192T00_NETGEAR"},
|
||||
@ -21,25 +23,44 @@
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR3300, "Netgear WNDR3300"}, "U12H093T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR3400V1, "Netgear WNDR3400 V1"}, "U12H155T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNDR3400V2, "Netgear WNDR3400 V2"}, "U12H187T00_NETGEAR"},
|
||||
@@ -177,6 +181,7 @@ struct bcm47xx_board_type_list1 bcm47xx_board_list_board_id[] __initconst = {
|
||||
{{BCM47XX_BOARD_NETGEAR_WNR1000_V3, "Netgear WNR1000 V3"}, "U12H139T50_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNR2000, "Netgear WNR2000"}, "U12H114T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNR3500L, "Netgear WNR3500L"}, "U12H136T99_NETGEAR"},
|
||||
+ {{BCM47XX_BOARD_NETGEAR_WNR3500L_V2, "Netgear WNR3500L V2"}, "U12H172T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNR3500U, "Netgear WNR3500U"}, "U12H136T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNR3500V2, "Netgear WNR3500 V2"}, "U12H127T00_NETGEAR"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNR3500V2VC, "Netgear WNR3500 V2vc"}, "U12H127T70_NETGEAR"},
|
||||
@@ -191,6 +196,7 @@ struct bcm47xx_board_type_list3 bcm47xx_board_list_board[] __initconst = {
|
||||
{{BCM47XX_BOARD_PHICOMM_M1, "Phicomm M1"}, "0x0590", "80", "0x1104"},
|
||||
{{BCM47XX_BOARD_ZTE_H218N, "ZTE H218N"}, "0x053d", "1234", "0x1305"},
|
||||
{{BCM47XX_BOARD_NETGEAR_WNR3500L, "Netgear WNR3500L"}, "0x04CF", "3500", "02"},
|
||||
+ {{BCM47XX_BOARD_NETGEAR_WNR3500L_V2, "Netgear WNR3500L V2"}, "0x052b", "3500L", "02"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0101, "Linksys WRT54G/GS/GL"}, "0x0101", "42", "0x10"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0467, "Linksys WRT54G/GS/GL"}, "0x0467", "42", "0x10"},
|
||||
{{BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0708, "Linksys WRT54G/GS/GL"}, "0x0708", "42", "0x10"},
|
||||
diff --git a/arch/mips/bcm47xx/buttons.c b/arch/mips/bcm47xx/buttons.c
|
||||
index 535d84addcdb..38e4a9cbcf4e 100644
|
||||
--- a/arch/mips/bcm47xx/buttons.c
|
||||
+++ b/arch/mips/bcm47xx/buttons.c
|
||||
@@ -27,6 +27,12 @@
|
||||
@@ -26,6 +26,12 @@
|
||||
|
||||
/* Asus */
|
||||
|
||||
static const struct gpio_keys_button
|
||||
+static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_asus_rtn10u[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(20, KEY_WPS_BUTTON),
|
||||
+ BCM47XX_GPIO_KEY(21, KEY_RESTART),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
static const struct gpio_keys_button
|
||||
bcm47xx_buttons_asus_rtn12[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON),
|
||||
BCM47XX_GPIO_KEY(1, KEY_RESTART),
|
||||
@@ -277,6 +283,18 @@ bcm47xx_buttons_linksys_wrt310nv1[] __in
|
||||
@@ -276,6 +282,18 @@ bcm47xx_buttons_linksys_wrt310nv1[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(8, KEY_UNKNOWN),
|
||||
};
|
||||
|
||||
static const struct gpio_keys_button
|
||||
+static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_linksys_wrt310n_v2[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON),
|
||||
+ BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
@ -51,14 +72,14 @@
|
||||
+ BCM47XX_GPIO_KEY(8, KEY_RESTART),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
static const struct gpio_keys_button
|
||||
bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(5, KEY_WIMAX),
|
||||
BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
@@ -392,6 +410,17 @@ bcm47xx_buttons_netgear_r6200_v1[] __ini
|
||||
@@ -391,6 +409,17 @@ bcm47xx_buttons_netgear_r6200_v1[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON),
|
||||
};
|
||||
|
||||
static const struct gpio_keys_button
|
||||
+static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_netgear_r6300_v1[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
+};
|
||||
@ -69,11 +90,24 @@
|
||||
+ BCM47XX_GPIO_KEY(31, KEY_WPS_BUTTON),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_keys_button
|
||||
static const struct gpio_keys_button
|
||||
bcm47xx_buttons_netgear_wndr3400v1[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(4, KEY_RESTART),
|
||||
@@ -430,6 +459,13 @@ bcm47xx_buttons_netgear_wnr3500lv1[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
|
||||
@@ -478,6 +507,9 @@ int __init bcm47xx_buttons_register(void
|
||||
};
|
||||
|
||||
+static const struct gpio_keys_button
|
||||
+bcm47xx_buttons_netgear_wnr3500lv2[] __initconst = {
|
||||
+ BCM47XX_GPIO_KEY(4, KEY_RESTART),
|
||||
+ BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON),
|
||||
+ BCM47XX_GPIO_KEY(8, KEY_RFKILL),
|
||||
+};
|
||||
+
|
||||
static const struct gpio_keys_button
|
||||
bcm47xx_buttons_netgear_wnr834bv2[] __initconst = {
|
||||
BCM47XX_GPIO_KEY(6, KEY_RESTART),
|
||||
@@ -478,6 +514,9 @@ int __init bcm47xx_buttons_register(void)
|
||||
int err;
|
||||
|
||||
switch (board) {
|
||||
@ -83,7 +117,7 @@
|
||||
case BCM47XX_BOARD_ASUS_RTN12:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn12);
|
||||
break;
|
||||
@@ -608,6 +640,12 @@ int __init bcm47xx_buttons_register(void
|
||||
@@ -608,6 +647,12 @@ int __init bcm47xx_buttons_register(void)
|
||||
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1);
|
||||
break;
|
||||
@ -96,7 +130,7 @@
|
||||
case BCM47XX_BOARD_LINKSYS_WRT54G3GV2:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g3gv2);
|
||||
break;
|
||||
@@ -674,6 +712,12 @@ int __init bcm47xx_buttons_register(void
|
||||
@@ -674,6 +719,12 @@ int __init bcm47xx_buttons_register(void)
|
||||
case BCM47XX_BOARD_NETGEAR_R6200_V1:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6200_v1);
|
||||
break;
|
||||
@ -109,6 +143,108 @@
|
||||
case BCM47XX_BOARD_NETGEAR_WNDR3400V1:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400v1);
|
||||
break;
|
||||
@@ -692,6 +743,9 @@ int __init bcm47xx_buttons_register(void)
|
||||
case BCM47XX_BOARD_NETGEAR_WNR3500L:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_NETGEAR_WNR3500L_V2:
|
||||
+ err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv2);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_NETGEAR_WNR834BV2:
|
||||
err = bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr834bv2);
|
||||
break;
|
||||
diff --git a/arch/mips/bcm47xx/leds.c b/arch/mips/bcm47xx/leds.c
|
||||
index 167c42c71e79..8e257d0896d2 100644
|
||||
--- a/arch/mips/bcm47xx/leds.c
|
||||
+++ b/arch/mips/bcm47xx/leds.c
|
||||
@@ -29,6 +29,14 @@
|
||||
|
||||
/* Asus */
|
||||
|
||||
+static const struct gpio_led
|
||||
+bcm47xx_leds_asus_rtn10u[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(5, "green", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(6, "green", "power", 1, LEDS_GPIO_DEFSTATE_ON),
|
||||
+ BCM47XX_GPIO_LED(7, "green", "wps", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(8, "green", "usb", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
static const struct gpio_led
|
||||
bcm47xx_leds_asus_rtn12[] __initconst = {
|
||||
BCM47XX_GPIO_LED(2, "unk", "power", 1, LEDS_GPIO_DEFSTATE_ON),
|
||||
@@ -313,6 +321,13 @@ bcm47xx_leds_linksys_wrt310nv1[] __initconst = {
|
||||
BCM47XX_GPIO_LED(9, "blue", "wps", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
};
|
||||
|
||||
+static const struct gpio_led
|
||||
+bcm47xx_leds_linksys_wrt320n_v1[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(1, "blue", "wlan", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(2, "blue", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
+ BCM47XX_GPIO_LED(4, "amber", "wps", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
static const struct gpio_led
|
||||
bcm47xx_leds_linksys_wrt54g_generic[] __initconst = {
|
||||
BCM47XX_GPIO_LED(0, "unk", "dmz", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
@@ -512,6 +527,14 @@ bcm47xx_leds_netgear_wnr3500lv1[] __initconst = {
|
||||
BCM47XX_GPIO_LED(7, "amber", "power", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
};
|
||||
|
||||
+static const struct gpio_led
|
||||
+bcm47xx_leds_netgear_wnr3500lv2[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(0, "blue", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(1, "green", "wps", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(3, "green", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
+ BCM47XX_GPIO_LED(7, "amber", "power", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
static const struct gpio_led
|
||||
bcm47xx_leds_netgear_wnr834bv2[] __initconst = {
|
||||
BCM47XX_GPIO_LED(2, "green", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
@@ -556,6 +579,9 @@ void __init bcm47xx_leds_register(void)
|
||||
enum bcm47xx_board board = bcm47xx_board_get();
|
||||
|
||||
switch (board) {
|
||||
+ case BCM47XX_BOARD_ASUS_RTN10U:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_asus_rtn10u);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_ASUS_RTN12:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_asus_rtn12);
|
||||
break;
|
||||
@@ -689,6 +715,9 @@ void __init bcm47xx_leds_register(void)
|
||||
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt310nv1);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt320n_v1);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_LINKSYS_WRT54G3GV2:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt54g3gv2);
|
||||
break;
|
||||
@@ -770,6 +799,9 @@ void __init bcm47xx_leds_register(void)
|
||||
case BCM47XX_BOARD_NETGEAR_WNR3500L:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_netgear_wnr3500lv1);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_NETGEAR_WNR3500L_V2:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_netgear_wnr3500lv2);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_NETGEAR_WNR834BV2:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_netgear_wnr834bv2);
|
||||
break;
|
||||
diff --git a/arch/mips/bcm47xx/workarounds.c b/arch/mips/bcm47xx/workarounds.c
|
||||
index 0ab95dd431b3..745c6228eb2c 100644
|
||||
--- a/arch/mips/bcm47xx/workarounds.c
|
||||
+++ b/arch/mips/bcm47xx/workarounds.c
|
||||
@@ -22,6 +22,7 @@ void __init bcm47xx_workarounds(void)
|
||||
|
||||
switch (board) {
|
||||
case BCM47XX_BOARD_NETGEAR_WNR3500L:
|
||||
+ case BCM47XX_BOARD_NETGEAR_WNR3500L_V2:
|
||||
bcm47xx_workarounds_enable_usb_power(12);
|
||||
break;
|
||||
case BCM47XX_BOARD_NETGEAR_WNDR3400V2:
|
||||
diff --git a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
index f879be3e8099..30f4114ab872 100644
|
||||
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx_board.h
|
||||
@@ -72,6 +72,7 @@ enum bcm47xx_board {
|
||||
@ -132,54 +268,11 @@
|
||||
BCM47XX_BOARD_NETGEAR_WNDR3300,
|
||||
BCM47XX_BOARD_NETGEAR_WNDR3400V1,
|
||||
BCM47XX_BOARD_NETGEAR_WNDR3400V2,
|
||||
--- a/arch/mips/bcm47xx/leds.c
|
||||
+++ b/arch/mips/bcm47xx/leds.c
|
||||
@@ -30,6 +30,14 @@
|
||||
/* Asus */
|
||||
|
||||
static const struct gpio_led
|
||||
+bcm47xx_leds_asus_rtn10u[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(5, "green", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(6, "green", "power", 1, LEDS_GPIO_DEFSTATE_ON),
|
||||
+ BCM47XX_GPIO_LED(7, "green", "wps", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(8, "green", "usb", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_led
|
||||
bcm47xx_leds_asus_rtn12[] __initconst = {
|
||||
BCM47XX_GPIO_LED(2, "unk", "power", 1, LEDS_GPIO_DEFSTATE_ON),
|
||||
BCM47XX_GPIO_LED(7, "unk", "wlan", 0, LEDS_GPIO_DEFSTATE_OFF),
|
||||
@@ -314,6 +322,13 @@ bcm47xx_leds_linksys_wrt310nv1[] __initc
|
||||
};
|
||||
|
||||
static const struct gpio_led
|
||||
+bcm47xx_leds_linksys_wrt320n_v1[] __initconst = {
|
||||
+ BCM47XX_GPIO_LED(1, "blue", "wlan", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+ BCM47XX_GPIO_LED(2, "blue", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
+ BCM47XX_GPIO_LED(4, "amber", "wps", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
+};
|
||||
+
|
||||
+static const struct gpio_led
|
||||
bcm47xx_leds_linksys_wrt54g_generic[] __initconst = {
|
||||
BCM47XX_GPIO_LED(0, "unk", "dmz", 1, LEDS_GPIO_DEFSTATE_OFF),
|
||||
BCM47XX_GPIO_LED(1, "unk", "power", 0, LEDS_GPIO_DEFSTATE_ON),
|
||||
@@ -556,6 +571,9 @@ void __init bcm47xx_leds_register(void)
|
||||
enum bcm47xx_board board = bcm47xx_board_get();
|
||||
|
||||
switch (board) {
|
||||
+ case BCM47XX_BOARD_ASUS_RTN10U:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_asus_rtn10u);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_ASUS_RTN12:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_asus_rtn12);
|
||||
break;
|
||||
@@ -689,6 +707,9 @@ void __init bcm47xx_leds_register(void)
|
||||
case BCM47XX_BOARD_LINKSYS_WRT310NV1:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt310nv1);
|
||||
break;
|
||||
+ case BCM47XX_BOARD_LINKSYS_WRT320N_V1:
|
||||
+ bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt320n_v1);
|
||||
+ break;
|
||||
case BCM47XX_BOARD_LINKSYS_WRT54G3GV2:
|
||||
bcm47xx_set_pdata(bcm47xx_leds_linksys_wrt54g3gv2);
|
||||
break;
|
||||
@@ -114,6 +118,7 @@ enum bcm47xx_board {
|
||||
BCM47XX_BOARD_NETGEAR_WNR1000_V3,
|
||||
BCM47XX_BOARD_NETGEAR_WNR2000,
|
||||
BCM47XX_BOARD_NETGEAR_WNR3500L,
|
||||
+ BCM47XX_BOARD_NETGEAR_WNR3500L_V2,
|
||||
BCM47XX_BOARD_NETGEAR_WNR3500U,
|
||||
BCM47XX_BOARD_NETGEAR_WNR3500V2,
|
||||
BCM47XX_BOARD_NETGEAR_WNR3500V2VC,
|
||||
|
||||
@ -1,25 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Subject: Upgrade to Linux 2.6.19
|
||||
|
||||
- Includes large parts of the patch from #1021 by dpalffy
|
||||
- Includes RB532 NAND driver changes by n0-1
|
||||
|
||||
[john@phrozen.org: feix will add this to his upstream queue]
|
||||
|
||||
lede-commit: bff468813f78f81e36ebb2a3f4354de7365e640f
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
Makefile | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -739,7 +739,7 @@ KBUILD_CFLAGS += -O2
|
||||
else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3
|
||||
KBUILD_CFLAGS += -O3
|
||||
else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||
-KBUILD_CFLAGS += -Os
|
||||
+KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch
|
||||
endif
|
||||
|
||||
# Tell gcc to never replace conditional load with a non-conditional one
|
||||
@ -1,25 +0,0 @@
|
||||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Subject: Upgrade to Linux 2.6.19
|
||||
|
||||
- Includes large parts of the patch from #1021 by dpalffy
|
||||
- Includes RB532 NAND driver changes by n0-1
|
||||
|
||||
[john@phrozen.org: feix will add this to his upstream queue]
|
||||
|
||||
lede-commit: bff468813f78f81e36ebb2a3f4354de7365e640f
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
Makefile | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -756,7 +756,7 @@ KBUILD_CFLAGS += -O2
|
||||
else ifdef CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE_O3
|
||||
KBUILD_CFLAGS += -O3
|
||||
else ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||
-KBUILD_CFLAGS += -Os
|
||||
+KBUILD_CFLAGS += -Os -fno-reorder-blocks -fno-tree-ch
|
||||
endif
|
||||
|
||||
# Tell gcc to never replace conditional load with a non-conditional one
|
||||
@ -416,7 +416,7 @@
|
||||
|
||||
device_type = "pci";
|
||||
|
||||
resets = <&reset0 13 13>;
|
||||
resets = <&reset 13 13>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -329,7 +329,7 @@
|
||||
|
||||
device_type = "pci";
|
||||
|
||||
resets = <&reset0 13 13>;
|
||||
resets = <&reset 13 13>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -1237,6 +1237,7 @@ endef
|
||||
TARGET_DEVICES += zyxel_nbg-419n
|
||||
|
||||
define Device/zyxel_nbg-419n-v2
|
||||
$(Device/uimage-lzma-loader)
|
||||
SOC := rt3352
|
||||
IMAGE_SIZE := 7872k
|
||||
DEVICE_VENDOR := ZyXEL
|
||||
|
||||
Loading…
Reference in New Issue
Block a user