summaryrefslogtreecommitdiff
path: root/target/linux/brcm47xx
diff options
context:
space:
mode:
authorhauke <hauke@3c298f89-4303-0410-b956-a3cf2f4a3e73>2011-12-19 23:33:03 +0000
committerhauke <hauke@3c298f89-4303-0410-b956-a3cf2f4a3e73>2011-12-19 23:33:03 +0000
commita604d7454cd81740bb3f2ada108e37284477c822 (patch)
tree2c691892f4e36354a69a84b539a774c4c546947f /target/linux/brcm47xx
parent84ddb1a86303e4ff6028720c877bd0d5f9ec9a2a (diff)
kernel: update bcma and ssb to version master-2011-12-16 from wireless-testing
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@29574 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/brcm47xx')
-rw-r--r--target/linux/brcm47xx/patches-3.0/0001-bcma-move-parsing-of-EEPROM-into-own-function.patch278
-rw-r--r--target/linux/brcm47xx/patches-3.0/0002-bcma-move-initializing-of-struct-bcma_bus-to-own-fun.patch52
-rw-r--r--target/linux/brcm47xx/patches-3.0/0003-bcma-add-functions-to-scan-cores-needed-on-SoCs.patch321
-rw-r--r--target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch417
-rw-r--r--target/linux/brcm47xx/patches-3.0/0005-bcma-add-mips-driver.patch456
-rw-r--r--target/linux/brcm47xx/patches-3.0/0006-bcma-add-serial-console-support.patch166
-rw-r--r--target/linux/brcm47xx/patches-3.0/0007-bcma-get-CPU-clock.patch229
-rw-r--r--target/linux/brcm47xx/patches-3.0/0012-bcma-move-parallel-flash-into-a-union.patch10
-rw-r--r--target/linux/brcm47xx/patches-3.0/0013-bcma-add-serial-flash-support-to-bcma.patch14
-rw-r--r--target/linux/brcm47xx/patches-3.0/0023-bcma-use-randoom-mac-address-as-long-as-reading-it-o.patch2
-rw-r--r--target/linux/brcm47xx/patches-3.0/220-bcm5354.patch2
-rw-r--r--target/linux/brcm47xx/patches-3.0/230-ssb_pci_sprom.patch19
-rw-r--r--target/linux/brcm47xx/patches-3.0/951-brcm4716-defines.patch4
13 files changed, 16 insertions, 1954 deletions
diff --git a/target/linux/brcm47xx/patches-3.0/0001-bcma-move-parsing-of-EEPROM-into-own-function.patch b/target/linux/brcm47xx/patches-3.0/0001-bcma-move-parsing-of-EEPROM-into-own-function.patch
deleted file mode 100644
index 740e96e81f..0000000000
--- a/target/linux/brcm47xx/patches-3.0/0001-bcma-move-parsing-of-EEPROM-into-own-function.patch
+++ /dev/null
@@ -1,278 +0,0 @@
-From a1bf12e78294c6cd3d8747e1e07c48977ca1e3e3 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sat, 11 Jun 2011 16:47:38 +0200
-Subject: [PATCH 01/26] bcma: move parsing of EEPROM into own function.
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Move the parsing of the EEPROM data in scan function for one core into
-an own function. Now we are able to use it in some other scan function
-as well.
-
-Acked-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/bcma/scan.c | 230 ++++++++++++++++++++++++++-------------------------
- 1 files changed, 118 insertions(+), 112 deletions(-)
-
---- a/drivers/bcma/scan.c
-+++ b/drivers/bcma/scan.c
-@@ -200,16 +200,124 @@ static s32 bcma_erom_get_addr_desc(struc
- return addrl;
- }
-
-+static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
-+ struct bcma_device *core)
-+{
-+ s32 tmp;
-+ u8 i, j;
-+ s32 cia, cib;
-+ u8 ports[2], wrappers[2];
-+
-+ /* get CIs */
-+ cia = bcma_erom_get_ci(bus, eromptr);
-+ if (cia < 0) {
-+ bcma_erom_push_ent(eromptr);
-+ if (bcma_erom_is_end(bus, eromptr))
-+ return -ESPIPE;
-+ return -EILSEQ;
-+ }
-+ cib = bcma_erom_get_ci(bus, eromptr);
-+ if (cib < 0)
-+ return -EILSEQ;
-+
-+ /* parse CIs */
-+ core->id.class = (cia & SCAN_CIA_CLASS) >> SCAN_CIA_CLASS_SHIFT;
-+ core->id.id = (cia & SCAN_CIA_ID) >> SCAN_CIA_ID_SHIFT;
-+ core->id.manuf = (cia & SCAN_CIA_MANUF) >> SCAN_CIA_MANUF_SHIFT;
-+ ports[0] = (cib & SCAN_CIB_NMP) >> SCAN_CIB_NMP_SHIFT;
-+ ports[1] = (cib & SCAN_CIB_NSP) >> SCAN_CIB_NSP_SHIFT;
-+ wrappers[0] = (cib & SCAN_CIB_NMW) >> SCAN_CIB_NMW_SHIFT;
-+ wrappers[1] = (cib & SCAN_CIB_NSW) >> SCAN_CIB_NSW_SHIFT;
-+ core->id.rev = (cib & SCAN_CIB_REV) >> SCAN_CIB_REV_SHIFT;
-+
-+ if (((core->id.manuf == BCMA_MANUF_ARM) &&
-+ (core->id.id == 0xFFF)) ||
-+ (ports[1] == 0)) {
-+ bcma_erom_skip_component(bus, eromptr);
-+ return -ENXIO;
-+ }
-+
-+ /* check if component is a core at all */
-+ if (wrappers[0] + wrappers[1] == 0) {
-+ /* we could save addrl of the router
-+ if (cid == BCMA_CORE_OOB_ROUTER)
-+ */
-+ bcma_erom_skip_component(bus, eromptr);
-+ return -ENXIO;
-+ }
-+
-+ if (bcma_erom_is_bridge(bus, eromptr)) {
-+ bcma_erom_skip_component(bus, eromptr);
-+ return -ENXIO;
-+ }
-+
-+ /* get & parse master ports */
-+ for (i = 0; i < ports[0]; i++) {
-+ u32 mst_port_d = bcma_erom_get_mst_port(bus, eromptr);
-+ if (mst_port_d < 0)
-+ return -EILSEQ;
-+ }
-+
-+ /* get & parse slave ports */
-+ for (i = 0; i < ports[1]; i++) {
-+ for (j = 0; ; j++) {
-+ tmp = bcma_erom_get_addr_desc(bus, eromptr,
-+ SCAN_ADDR_TYPE_SLAVE, i);
-+ if (tmp < 0) {
-+ /* no more entries for port _i_ */
-+ /* pr_debug("erom: slave port %d "
-+ * "has %d descriptors\n", i, j); */
-+ break;
-+ } else {
-+ if (i == 0 && j == 0)
-+ core->addr = tmp;
-+ }
-+ }
-+ }
-+
-+ /* get & parse master wrappers */
-+ for (i = 0; i < wrappers[0]; i++) {
-+ for (j = 0; ; j++) {
-+ tmp = bcma_erom_get_addr_desc(bus, eromptr,
-+ SCAN_ADDR_TYPE_MWRAP, i);
-+ if (tmp < 0) {
-+ /* no more entries for port _i_ */
-+ /* pr_debug("erom: master wrapper %d "
-+ * "has %d descriptors\n", i, j); */
-+ break;
-+ } else {
-+ if (i == 0 && j == 0)
-+ core->wrap = tmp;
-+ }
-+ }
-+ }
-+
-+ /* get & parse slave wrappers */
-+ for (i = 0; i < wrappers[1]; i++) {
-+ u8 hack = (ports[1] == 1) ? 0 : 1;
-+ for (j = 0; ; j++) {
-+ tmp = bcma_erom_get_addr_desc(bus, eromptr,
-+ SCAN_ADDR_TYPE_SWRAP, i + hack);
-+ if (tmp < 0) {
-+ /* no more entries for port _i_ */
-+ /* pr_debug("erom: master wrapper %d "
-+ * has %d descriptors\n", i, j); */
-+ break;
-+ } else {
-+ if (wrappers[0] == 0 && !i && !j)
-+ core->wrap = tmp;
-+ }
-+ }
-+ }
-+ return 0;
-+}
-+
- int bcma_bus_scan(struct bcma_bus *bus)
- {
- u32 erombase;
- u32 __iomem *eromptr, *eromend;
-
-- s32 cia, cib;
-- u8 ports[2], wrappers[2];
--
- s32 tmp;
-- u8 i, j;
-
- int err;
-
-@@ -236,112 +344,13 @@ int bcma_bus_scan(struct bcma_bus *bus)
- INIT_LIST_HEAD(&core->list);
- core->bus = bus;
-
-- /* get CIs */
-- cia = bcma_erom_get_ci(bus, &eromptr);
-- if (cia < 0) {
-- bcma_erom_push_ent(&eromptr);
-- if (bcma_erom_is_end(bus, &eromptr))
-- break;
-- err= -EILSEQ;
-- goto out;
-- }
-- cib = bcma_erom_get_ci(bus, &eromptr);
-- if (cib < 0) {
-- err= -EILSEQ;
-- goto out;
-- }
--
-- /* parse CIs */
-- core->id.class = (cia & SCAN_CIA_CLASS) >> SCAN_CIA_CLASS_SHIFT;
-- core->id.id = (cia & SCAN_CIA_ID) >> SCAN_CIA_ID_SHIFT;
-- core->id.manuf = (cia & SCAN_CIA_MANUF) >> SCAN_CIA_MANUF_SHIFT;
-- ports[0] = (cib & SCAN_CIB_NMP) >> SCAN_CIB_NMP_SHIFT;
-- ports[1] = (cib & SCAN_CIB_NSP) >> SCAN_CIB_NSP_SHIFT;
-- wrappers[0] = (cib & SCAN_CIB_NMW) >> SCAN_CIB_NMW_SHIFT;
-- wrappers[1] = (cib & SCAN_CIB_NSW) >> SCAN_CIB_NSW_SHIFT;
-- core->id.rev = (cib & SCAN_CIB_REV) >> SCAN_CIB_REV_SHIFT;
--
-- if (((core->id.manuf == BCMA_MANUF_ARM) &&
-- (core->id.id == 0xFFF)) ||
-- (ports[1] == 0)) {
-- bcma_erom_skip_component(bus, &eromptr);
-+ err = bcma_get_next_core(bus, &eromptr, core);
-+ if (err == -ENXIO)
- continue;
-- }
--
-- /* check if component is a core at all */
-- if (wrappers[0] + wrappers[1] == 0) {
-- /* we could save addrl of the router
-- if (cid == BCMA_CORE_OOB_ROUTER)
-- */
-- bcma_erom_skip_component(bus, &eromptr);
-- continue;
-- }
--
-- if (bcma_erom_is_bridge(bus, &eromptr)) {
-- bcma_erom_skip_component(bus, &eromptr);
-- continue;
-- }
--
-- /* get & parse master ports */
-- for (i = 0; i < ports[0]; i++) {
-- u32 mst_port_d = bcma_erom_get_mst_port(bus, &eromptr);
-- if (mst_port_d < 0) {
-- err= -EILSEQ;
-- goto out;
-- }
-- }
--
-- /* get & parse slave ports */
-- for (i = 0; i < ports[1]; i++) {
-- for (j = 0; ; j++) {
-- tmp = bcma_erom_get_addr_desc(bus, &eromptr,
-- SCAN_ADDR_TYPE_SLAVE, i);
-- if (tmp < 0) {
-- /* no more entries for port _i_ */
-- /* pr_debug("erom: slave port %d "
-- * "has %d descriptors\n", i, j); */
-- break;
-- } else {
-- if (i == 0 && j == 0)
-- core->addr = tmp;
-- }
-- }
-- }
--
-- /* get & parse master wrappers */
-- for (i = 0; i < wrappers[0]; i++) {
-- for (j = 0; ; j++) {
-- tmp = bcma_erom_get_addr_desc(bus, &eromptr,
-- SCAN_ADDR_TYPE_MWRAP, i);
-- if (tmp < 0) {
-- /* no more entries for port _i_ */
-- /* pr_debug("erom: master wrapper %d "
-- * "has %d descriptors\n", i, j); */
-- break;
-- } else {
-- if (i == 0 && j == 0)
-- core->wrap = tmp;
-- }
-- }
-- }
--
-- /* get & parse slave wrappers */
-- for (i = 0; i < wrappers[1]; i++) {
-- u8 hack = (ports[1] == 1) ? 0 : 1;
-- for (j = 0; ; j++) {
-- tmp = bcma_erom_get_addr_desc(bus, &eromptr,
-- SCAN_ADDR_TYPE_SWRAP, i + hack);
-- if (tmp < 0) {
-- /* no more entries for port _i_ */
-- /* pr_debug("erom: master wrapper %d "
-- * has %d descriptors\n", i, j); */
-- break;
-- } else {
-- if (wrappers[0] == 0 && !i && !j)
-- core->wrap = tmp;
-- }
-- }
-- }
-+ else if (err == -ESPIPE)
-+ break;
-+ else if (err < 0)
-+ return err;
-
- pr_info("Core %d found: %s "
- "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n",
-@@ -351,9 +360,6 @@ int bcma_bus_scan(struct bcma_bus *bus)
-
- core->core_index = bus->nr_cores++;
- list_add(&core->list, &bus->cores);
-- continue;
--out:
-- return err;
- }
-
- return 0;
diff --git a/target/linux/brcm47xx/patches-3.0/0002-bcma-move-initializing-of-struct-bcma_bus-to-own-fun.patch b/target/linux/brcm47xx/patches-3.0/0002-bcma-move-initializing-of-struct-bcma_bus-to-own-fun.patch
deleted file mode 100644
index 48191abc3e..0000000000
--- a/target/linux/brcm47xx/patches-3.0/0002-bcma-move-initializing-of-struct-bcma_bus-to-own-fun.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 30ef571a04dc19171c6b6664d88b60c39161eb42 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sat, 18 Jun 2011 11:55:47 +0200
-Subject: [PATCH 02/26] bcma: move initializing of struct bcma_bus to own function.
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This makes it possible to use this code in some other method.
-
-Acked-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/bcma/scan.c | 17 +++++++++++------
- 1 files changed, 11 insertions(+), 6 deletions(-)
-
---- a/drivers/bcma/scan.c
-+++ b/drivers/bcma/scan.c
-@@ -312,15 +312,10 @@ static int bcma_get_next_core(struct bcm
- return 0;
- }
-
--int bcma_bus_scan(struct bcma_bus *bus)
-+static void bcma_init_bus(struct bcma_bus *bus)
- {
-- u32 erombase;
-- u32 __iomem *eromptr, *eromend;
--
- s32 tmp;
-
-- int err;
--
- INIT_LIST_HEAD(&bus->cores);
- bus->nr_cores = 0;
-
-@@ -330,6 +325,16 @@ int bcma_bus_scan(struct bcma_bus *bus)
- bus->chipinfo.id = (tmp & BCMA_CC_ID_ID) >> BCMA_CC_ID_ID_SHIFT;
- bus->chipinfo.rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT;
- bus->chipinfo.pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT;
-+}
-+
-+int bcma_bus_scan(struct bcma_bus *bus)
-+{
-+ u32 erombase;
-+ u32 __iomem *eromptr, *eromend;
-+
-+ int err;
-+
-+ bcma_init_bus(bus);
-
- erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM);
- eromptr = bus->mmio;
diff --git a/target/linux/brcm47xx/patches-3.0/0003-bcma-add-functions-to-scan-cores-needed-on-SoCs.patch b/target/linux/brcm47xx/patches-3.0/0003-bcma-add-functions-to-scan-cores-needed-on-SoCs.patch
deleted file mode 100644
index 92cd65d396..0000000000
--- a/target/linux/brcm47xx/patches-3.0/0003-bcma-add-functions-to-scan-cores-needed-on-SoCs.patch
+++ /dev/null
@@ -1,321 +0,0 @@
-From f3c07dd351161cb33f1c8e1ff55a65ae0cc6b661 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sat, 18 Jun 2011 14:30:55 +0200
-Subject: [PATCH 03/26] bcma: add functions to scan cores needed on SoCs
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The chip common and mips core have to be setup early in the boot
-process to get the cpu clock.
-bcma_bus_early_register() gets pointers to some space to store the core
-data and searches for the chip common and mips core and initializes
-chip common. After that was done and the kernel is out of early boot we
-just have to run bcma_bus_register() and it will search for the other
-cores, initialize and register them.
-The cores are getting the same numbers as before.
-
-Acked-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/bcma/bcma_private.h | 7 ++
- drivers/bcma/driver_chipcommon.c | 5 ++
- drivers/bcma/driver_pci.c | 5 ++
- drivers/bcma/main.c | 46 +++++++++++++
- drivers/bcma/scan.c | 95 +++++++++++++++++++++++++--
- include/linux/bcma/bcma.h | 1 +
- include/linux/bcma/bcma_driver_chipcommon.h | 1 +
- 7 files changed, 154 insertions(+), 6 deletions(-)
-
---- a/drivers/bcma/bcma_private.h
-+++ b/drivers/bcma/bcma_private.h
-@@ -15,9 +15,16 @@ struct bcma_bus;
- /* main.c */
- int bcma_bus_register(struct bcma_bus *bus);
- void bcma_bus_unregister(struct bcma_bus *bus);
-+int __init bcma_bus_early_register(struct bcma_bus *bus,
-+ struct bcma_device *core_cc,
-+ struct bcma_device *core_mips);
-
- /* scan.c */
- int bcma_bus_scan(struct bcma_bus *bus);
-+int __init bcma_bus_scan_early(struct bcma_bus *bus,
-+ struct bcma_device_id *match,
-+ struct bcma_device *core);
-+void bcma_init_bus(struct bcma_bus *bus);
-
- /* sprom.c */
- int bcma_sprom_get(struct bcma_bus *bus);
---- a/drivers/bcma/driver_chipcommon.c
-+++ b/drivers/bcma/driver_chipcommon.c
-@@ -26,6 +26,9 @@ void bcma_core_chipcommon_init(struct bc
- u32 leddc_on = 10;
- u32 leddc_off = 90;
-
-+ if (cc->setup_done)
-+ return;
-+
- if (cc->core->id.rev >= 11)
- cc->status = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT);
- cc->capabilities = bcma_cc_read32(cc, BCMA_CC_CAP);
-@@ -52,6 +55,8 @@ void bcma_core_chipcommon_init(struct bc
- ((leddc_on << BCMA_CC_GPIOTIMER_ONTIME_SHIFT) |
- (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT)));
- }
-+
-+ cc->setup_done = true;
- }
-
- /* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */
---- a/drivers/bcma/driver_pci.c
-+++ b/drivers/bcma/driver_pci.c
-@@ -187,6 +187,9 @@ static bool bcma_core_pci_is_in_hostmode
-
- void bcma_core_pci_init(struct bcma_drv_pci *pc)
- {
-+ if (pc->setup_done)
-+ return;
-+
- if (bcma_core_pci_is_in_hostmode(pc)) {
- #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE
- bcma_core_pci_hostmode_init(pc);
-@@ -196,6 +199,8 @@ void bcma_core_pci_init(struct bcma_drv_
- } else {
- bcma_core_pci_clientmode_init(pc);
- }
-+
-+ pc->setup_done = true;
- }
-
- int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
---- a/drivers/bcma/main.c
-+++ b/drivers/bcma/main.c
-@@ -169,6 +169,52 @@ void bcma_bus_unregister(struct bcma_bus
- bcma_unregister_cores(bus);
- }
-
-+int __init bcma_bus_early_register(struct bcma_bus *bus,
-+ struct bcma_device *core_cc,
-+ struct bcma_device *core_mips)
-+{
-+ int err;
-+ struct bcma_device *core;
-+ struct bcma_device_id match;
-+
-+ bcma_init_bus(bus);
-+
-+ match.manuf = BCMA_MANUF_BCM;
-+ match.id = BCMA_CORE_CHIPCOMMON;
-+ match.class = BCMA_CL_SIM;
-+ match.rev = BCMA_ANY_REV;
-+
-+ /* Scan for chip common core */
-+ err = bcma_bus_scan_early(bus, &match, core_cc);
-+ if (err) {
-+ pr_err("Failed to scan for common core: %d\n", err);
-+ return -1;
-+ }
-+
-+ match.manuf = BCMA_MANUF_MIPS;
-+ match.id = BCMA_CORE_MIPS_74K;
-+ match.class = BCMA_CL_SIM;
-+ match.rev = BCMA_ANY_REV;
-+
-+ /* Scan for mips core */
-+ err = bcma_bus_scan_early(bus, &match, core_mips);
-+ if (err) {
-+ pr_err("Failed to scan for mips core: %d\n", err);
-+ return -1;
-+ }
-+
-+ /* Init CC core */
-+ core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON);
-+ if (core) {
-+ bus->drv_cc.core = core;
-+ bcma_core_chipcommon_init(&bus->drv_cc);
-+ }
-+
-+ pr_info("Early bus registered\n");
-+
-+ return 0;
-+}
-+
- int __bcma_driver_register(struct bcma_driver *drv, struct module *owner)
- {
- drv->drv.name = drv->name;
---- a/drivers/bcma/scan.c
-+++ b/drivers/bcma/scan.c
-@@ -200,7 +200,20 @@ static s32 bcma_erom_get_addr_desc(struc
- return addrl;
- }
-
-+static struct bcma_device *bcma_find_core_by_index(struct bcma_bus *bus,
-+ u16 index)
-+{
-+ struct bcma_device *core;
-+
-+ list_for_each_entry(core, &bus->cores, list) {
-+ if (core->core_index == index)
-+ return core;
-+ }
-+ return NULL;
-+}
-+
- static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
-+ struct bcma_device_id *match, int core_num,
- struct bcma_device *core)
- {
- s32 tmp;
-@@ -251,6 +264,21 @@ static int bcma_get_next_core(struct bcm
- return -ENXIO;
- }
-
-+ if (bcma_find_core_by_index(bus, core_num)) {
-+ bcma_erom_skip_component(bus, eromptr);
-+ return -ENODEV;
-+ }
-+
-+ if (match && ((match->manuf != BCMA_ANY_MANUF &&
-+ match->manuf != core->id.manuf) ||
-+ (match->id != BCMA_ANY_ID && match->id != core->id.id) ||
-+ (match->rev != BCMA_ANY_REV && match->rev != core->id.rev) ||
-+ (match->class != BCMA_ANY_CLASS && match->class != core->id.class)
-+ )) {
-+ bcma_erom_skip_component(bus, eromptr);
-+ return -ENODEV;
-+ }
-+
- /* get & parse master ports */
- for (i = 0; i < ports[0]; i++) {
- u32 mst_port_d = bcma_erom_get_mst_port(bus, eromptr);
-@@ -312,10 +340,13 @@ static int bcma_get_next_core(struct bcm
- return 0;
- }
-
--static void bcma_init_bus(struct bcma_bus *bus)
-+void bcma_init_bus(struct bcma_bus *bus)
- {
- s32 tmp;
-
-+ if (bus->init_done)
-+ return;
-+
- INIT_LIST_HEAD(&bus->cores);
- bus->nr_cores = 0;
-
-@@ -325,6 +356,7 @@ static void bcma_init_bus(struct bcma_bu
- bus->chipinfo.id = (tmp & BCMA_CC_ID_ID) >> BCMA_CC_ID_ID_SHIFT;
- bus->chipinfo.rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT;
- bus->chipinfo.pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT;
-+ bus->init_done = true;
- }
-
- int bcma_bus_scan(struct bcma_bus *bus)
-@@ -332,7 +364,7 @@ int bcma_bus_scan(struct bcma_bus *bus)
- u32 erombase;
- u32 __iomem *eromptr, *eromend;
-
-- int err;
-+ int err, core_num = 0;
-
- bcma_init_bus(bus);
-
-@@ -349,23 +381,74 @@ int bcma_bus_scan(struct bcma_bus *bus)
- INIT_LIST_HEAD(&core->list);
- core->bus = bus;
-
-- err = bcma_get_next_core(bus, &eromptr, core);
-- if (err == -ENXIO)
-+ err = bcma_get_next_core(bus, &eromptr, NULL, core_num, core);
-+ if (err == -ENODEV) {
-+ core_num++;
-+ continue;
-+ } else if (err == -ENXIO)
- continue;
- else if (err == -ESPIPE)
- break;
- else if (err < 0)
- return err;
-
-+ core->core_index = core_num++;
-+ bus->nr_cores++;
-+
- pr_info("Core %d found: %s "
- "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n",
-- bus->nr_cores, bcma_device_name(&core->id),
-+ core->core_index, bcma_device_name(&core->id),
- core->id.manuf, core->id.id, core->id.rev,
- core->id.class);
-
-- core->core_index = bus->nr_cores++;
- list_add(&core->list, &bus->cores);
- }
-
- return 0;
- }
-+
-+int __init bcma_bus_scan_early(struct bcma_bus *bus,
-+ struct bcma_device_id *match,
-+ struct bcma_device *core)
-+{
-+ u32 erombase;
-+ u32 __iomem *eromptr, *eromend;
-+
-+ int err, core_num = 0;
-+
-+ erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM);
-+ eromptr = bus->mmio;
-+ eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32);
-+
-+ bcma_scan_switch_core(bus, erombase);
-+
-+ while (eromptr < eromend) {
-+ memset(core, 0, sizeof(*core));
-+ INIT_LIST_HEAD(&core->list);
-+ core->bus = bus;
-+
-+ err = bcma_get_next_core(bus, &eromptr, match, core_num, core);
-+ if (err == -ENODEV) {
-+ core_num++;
-+ continue;
-+ } else if (err == -ENXIO)
-+ continue;
-+ else if (err == -ESPIPE)
-+ break;
-+ else if (err < 0)
-+ return err;
-+
-+ core->core_index = core_num++;
-+ bus->nr_cores++;
-+ pr_info("Core %d found: %s "
-+ "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n",
-+ core->core_index, bcma_device_name(&core->id),
-+ core->id.manuf, core->id.id, core->id.rev,
-+ core->id.class);
-+
-+ list_add(&core->list, &bus->cores);
-+ return 0;
-+ }
-+
-+ return -ENODEV;
-+}
---- a/include/linux/bcma/bcma.h
-+++ b/include/linux/bcma/bcma.h
-@@ -190,6 +190,7 @@ struct bcma_bus {
- struct bcma_device *mapped_core;
- struct list_head cores;
- u8 nr_cores;
-+ u8 init_done:1;
-
- struct bcma_drv_cc drv_cc;
- struct bcma_drv_pci drv_pci;
---- a/include/linux/bcma/bcma_driver_chipcommon.h
-+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -252,6 +252,7 @@ struct bcma_drv_cc {
- u32 status;
- u32 capabilities;
- u32 capabilities_ext;
-+ u8 setup_done:1;
- /* Fast Powerup Delay constant */
- u16 fast_pwrup_delay;
- struct bcma_chipcommon_pmu pmu;
diff --git a/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch b/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch
deleted file mode 100644
index 6ad9dce4b8..0000000000
--- a/target/linux/brcm47xx/patches-3.0/0004-bcma-add-SOC-bus.patch
+++ /dev/null
@@ -1,417 +0,0 @@
-From d743a740b76a6be9e88fe1ae6991682927a7769c Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sat, 18 Jun 2011 14:31:53 +0200
-Subject: [PATCH 04/26] bcma: add SOC bus
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-This patch adds support for using bcma on a Broadcom SoC as the system
-bus. An SoC like the bcm4716 could register this bus and use it to
-searches for the bcma cores and register the devices on this bus.
-
-BCMA_HOSTTYPE_NONE was intended for SoCs at first but BCMA_HOSTTYPE_SOC
-is a better name.
-
-Acked-by: Rafał Miłecki <zajec5@gmail.com>
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/bcma/Kconfig | 4 +
- drivers/bcma/Makefile | 1 +
- drivers/bcma/core.c | 2 +
- drivers/bcma/driver_pci.c | 9 ++-
- drivers/bcma/host_soc.c | 183 +++++++++++++++++++++++++++++++++++++++++
- drivers/bcma/main.c | 9 ++-
- drivers/bcma/scan.c | 42 ++++++++-
- include/linux/bcma/bcma.h | 5 +-
- include/linux/bcma/bcma_soc.h | 16 ++++
- 9 files changed, 263 insertions(+), 8 deletions(-)
- create mode 100644 drivers/bcma/host_soc.c
- create mode 100644 include/linux/bcma/bcma_soc.h
-
---- a/drivers/bcma/Kconfig
-+++ b/drivers/bcma/Kconfig
-@@ -34,6 +34,10 @@ config BCMA_DRIVER_PCI_HOSTMODE
- help
- PCI core hostmode operation (external PCI bus).
-
-+config BCMA_HOST_SOC
-+ bool
-+ depends on BCMA && MIPS
-+
- config BCMA_DEBUG
- bool "BCMA debugging"
- depends on BCMA
---- a/drivers/bcma/Makefile
-+++ b/drivers/bcma/Makefile
-@@ -3,6 +3,7 @@ bcma-y += driver_chipcommon.o driver
- bcma-y += driver_pci.o
- bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE) += driver_pci_host.o
- bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o
-+bcma-$(CONFIG_BCMA_HOST_SOC) += host_soc.o
- obj-$(CONFIG_BCMA) += bcma.o
-
- ccflags-$(CONFIG_BCMA_DEBUG) := -DDEBUG
---- a/drivers/bcma/core.c
-+++ b/drivers/bcma/core.c
-@@ -110,6 +110,8 @@ EXPORT_SYMBOL_GPL(bcma_core_pll_ctl);
- u32 bcma_core_dma_translation(struct bcma_device *core)
- {
- switch (core->bus->hosttype) {
-+ case BCMA_HOSTTYPE_SOC:
-+ return 0;
- case BCMA_HOSTTYPE_PCI:
- if (bcma_aread32(core, BCMA_IOST) & BCMA_IOST_DMA64)
- return BCMA_DMA_TRANSLATION_DMA64_CMT;
---- a/drivers/bcma/driver_pci.c
-+++ b/drivers/bcma/driver_pci.c
-@@ -208,7 +208,14 @@ int bcma_core_pci_irq_ctl(struct bcma_dr
- {
- struct pci_dev *pdev = pc->core->bus->host_pci;
- u32 coremask, tmp;
-- int err;
-+ int err = 0;
-+
-+ if (core->bus->hosttype != BCMA_HOSTTYPE_PCI) {
-+ /* This bcma device is not on a PCI host-bus. So the IRQs are
-+ * not routed through the PCI core.
-+ * So we must not enable routing through the PCI core. */
-+ goto out;
-+ }
-
- err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp);
- if (err)
---- /dev/null
-+++ b/drivers/bcma/host_soc.c
-@@ -0,0 +1,183 @@
-+/*
-+ * Broadcom specific AMBA
-+ * System on Chip (SoC) Host
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#include "bcma_private.h"
-+#include "scan.h"
-+#include <linux/bcma/bcma.h>
-+#include <linux/bcma/bcma_soc.h>
-+
-+static u8 bcma_host_soc_read8(struct bcma_device *core, u16 offset)
-+{
-+ return readb(core->io_addr + offset);
-+}
-+
-+static u16 bcma_host_soc_read16(struct bcma_device *core, u16 offset)
-+{
-+ return readw(core->io_addr + offset);
-+}
-+
-+static u32 bcma_host_soc_read32(struct bcma_device *core, u16 offset)
-+{
-+ return readl(core->io_addr + offset);
-+}
-+
-+static void bcma_host_soc_write8(struct bcma_device *core, u16 offset,
-+ u8 value)
-+{
-+ writeb(value, core->io_addr + offset);
-+}
-+
-+static void bcma_host_soc_write16(struct bcma_device *core, u16 offset,
-+ u16 value)
-+{
-+ writew(value, core->io_addr + offset);
-+}
-+
-+static void bcma_host_soc_write32(struct bcma_device *core, u16 offset,
-+ u32 value)
-+{
-+ writel(value, core->io_addr + offset);
-+}
-+
-+#ifdef CONFIG_BCMA_BLOCKIO
-+static void bcma_host_soc_block_read(struct bcma_device *core, void *buffer,
-+ size_t count, u16 offset, u8 reg_width)
-+{
-+ void __iomem *addr = core->io_addr + offset;
-+
-+ switch (reg_width) {
-+ case sizeof(u8): {
-+ u8 *buf = buffer;
-+
-+ while (count) {
-+ *buf = __raw_readb(addr);
-+ buf++;
-+ count--;
-+ }
-+ break;
-+ }
-+ case sizeof(u16): {
-+ __le16 *buf = buffer;
-+
-+ WARN_ON(count & 1);
-+ while (count) {
-+ *buf = (__force __le16)__raw_readw(addr);
-+ buf++;
-+ count -= 2;
-+ }
-+ break;
-+ }
-+ case sizeof(u32): {
-+ __le32 *buf = buffer;
-+
-+ WARN_ON(count & 3);
-+ while (count) {
-+ *buf = (__force __le32)__raw_readl(addr);
-+ buf++;
-+ count -= 4;
-+ }
-+ break;
-+ }
-+ default:
-+ WARN_ON(1);
-+ }
-+}
-+
-+static void bcma_host_soc_block_write(struct bcma_device *core,
-+ const void *buffer,
-+ size_t count, u16 offset, u8 reg_width)
-+{
-+ void __iomem *addr = core->io_addr + offset;
-+
-+ switch (reg_width) {
-+ case sizeof(u8): {
-+ const u8 *buf = buffer;
-+
-+ while (count) {
-+ __raw_writeb(*buf, addr);
-+ buf++;
-+ count--;
-+ }
-+ break;
-+ }
-+ case sizeof(u16): {
-+ const __le16 *buf = buffer;
-+
-+ WARN_ON(count & 1);
-+ while (count) {
-+ __raw_writew((__force u16)(*buf), addr);
-+ buf++;
-+ count -= 2;
-+ }
-+ break;
-+ }
-+ case sizeof(u32): {
-+ const __le32 *buf = buffer;
-+
-+ WARN_ON(count & 3);
-+ while (count) {
-+ __raw_writel((__force u32)(*buf), addr);
-+ buf++;
-+ count -= 4;
-+ }
-+ break;
-+ }
-+ default:
-+ WARN_ON(1);
-+ }
-+}
-+#endif /* CONFIG_BCMA_BLOCKIO */
-+
-+static u32 bcma_host_soc_aread32(struct bcma_device *core, u16 offset)
-+{
-+ return readl(core->io_wrap + offset);
-+}
-+
-+static void bcma_host_soc_awrite32(struct bcma_device *core, u16 offset,
-+ u32 value)
-+{
-+ writel(value, core->io_wrap + offset);
-+}
-+
-+const struct bcma_host_ops bcma_host_soc_ops = {
-+ .read8 = bcma_host_soc_read8,
-+ .read16 = bcma_host_soc_read16,
-+ .read32 = bcma_host_soc_read32,
-+ .write8 = bcma_host_soc_write8,
-+ .write16 = bcma_host_soc_write16,
-+ .write32 = bcma_host_soc_write32,
-+#ifdef CONFIG_BCMA_BLOCKIO
-+ .block_read = bcma_host_soc_block_read,
-+ .block_write = bcma_host_soc_block_write,
-+#endif
-+ .aread32 = bcma_host_soc_aread32,
-+ .awrite32 = bcma_host_soc_awrite32,
-+};
-+
-+int __init bcma_host_soc_register(struct bcma_soc *soc)
-+{
-+ struct bcma_bus *bus = &soc->bus;
-+ int err;
-+
-+ /* iomap only first core. We have to read some register on this core
-+ * to scan the bus.
-+ */
-+ bus->mmio = ioremap_nocache(BCMA_ADDR_BASE, BCMA_CORE_SIZE * 1);
-+ if (!bus->mmio)
-+ return -ENOMEM;
-+
-+ /* Host specific */
-+ bus->hosttype = BCMA_HOSTTYPE_SOC;
-+ bus->ops = &bcma_host_soc_ops;
-+
-+ /* Register */
-+ err = bcma_bus_early_register(bus, &soc->core_cc, &soc->core_mips);
-+ if (err)
-+ iounmap(bus->mmio);
-+
-+ return err;
-+}
---- a/drivers/bcma/main.c
-+++ b/drivers/bcma/main.c
-@@ -66,6 +66,10 @@ static struct bcma_device *bcma_find_cor
- static void bcma_release_core_dev(struct device *dev)
- {
- struct bcma_device *core = container_of(dev, struct bcma_device, dev);
-+ if (core->io_addr)
-+ iounmap(core->io_addr);
-+ if (core->io_wrap)
-+ iounmap(core->io_wrap);
- kfree(core);
- }
-
-@@ -93,7 +97,10 @@ static int bcma_register_cores(struct bc
- core->dma_dev = &bus->host_pci->dev;
- core->irq = bus->host_pci->irq;
- break;
-- case BCMA_HOSTTYPE_NONE:
-+ case BCMA_HOSTTYPE_SOC:
-+ core->dev.dma_mask = &core->dev.coherent_dma_mask;
-+ core->dma_dev = &core->dev;
-+ break;
- case BCMA_HOSTTYPE_SDIO:
- break;
- }
---- a/drivers/bcma/scan.c
-+++ b/drivers/bcma/scan.c
-@@ -337,6 +337,16 @@ static int bcma_get_next_core(struct bcm
- }
- }
- }
-+ if (bus->hosttype == BCMA_HOSTTYPE_SOC) {
-+ core->io_addr = ioremap_nocache(core->addr, BCMA_CORE_SIZE);
-+ if (!core->io_addr)
-+ return -ENOMEM;
-+ core->io_wrap = ioremap_nocache(core->wrap, BCMA_CORE_SIZE);
-+ if (!core->io_wrap) {
-+ iounmap(core->io_addr);
-+ return -ENOMEM;
-+ }
-+ }
- return 0;
- }
-
-@@ -369,7 +379,14 @@ int bcma_bus_scan(struct bcma_bus *bus)
- bcma_init_bus(bus);
-
- erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM);
-- eromptr = bus->mmio;
-+ if (bus->hosttype == BCMA_HOSTTYPE_SOC) {
-+ eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE);
-+ if (!eromptr)
-+ return -ENOMEM;
-+ } else {
-+ eromptr = bus->mmio;
-+ }
-+
- eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32);
-
- bcma_scan_switch_core(bus, erombase);
-@@ -404,6 +421,9 @@ int bcma_bus_scan(struct bcma_bus *bus)
- list_add(&core->list, &bus->cores);
- }
-
-+ if (bus->hosttype == BCMA_HOSTTYPE_SOC)
-+ iounmap(eromptr);
-+
- return 0;
- }
-
-@@ -414,10 +434,18 @@ int __init bcma_bus_scan_early(struct bc
- u32 erombase;
- u32 __iomem *eromptr, *eromend;
-
-- int err, core_num = 0;
-+ int err = -ENODEV;
-+ int core_num = 0;
-
- erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM);
-- eromptr = bus->mmio;
-+ if (bus->hosttype == BCMA_HOSTTYPE_SOC) {
-+ eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE);
-+ if (!eromptr)
-+ return -ENOMEM;
-+ } else {
-+ eromptr = bus->mmio;
-+ }
-+
- eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32);
-
- bcma_scan_switch_core(bus, erombase);
-@@ -447,8 +475,12 @@ int __init bcma_bus_scan_early(struct bc
- core->id.class);
-
- list_add(&core->list, &bus->cores);
-- return 0;
-+ err = 0;
-+ break;
- }
-
-- return -ENODEV;
-+ if (bus->hosttype == BCMA_HOSTTYPE_SOC)
-+ iounmap(eromptr);
-+
-+ return err;
- }
---- a/include/linux/bcma/bcma.h
-+++ b/include/linux/bcma/bcma.h
-@@ -14,9 +14,9 @@ struct bcma_device;
- struct bcma_bus;
-
- enum bcma_hosttype {
-- BCMA_HOSTTYPE_NONE,
- BCMA_HOSTTYPE_PCI,
- BCMA_HOSTTYPE_SDIO,
-+ BCMA_HOSTTYPE_SOC,
- };
-
- struct bcma_chipinfo {
-@@ -138,6 +138,9 @@ struct bcma_device {
- u32 addr;
- u32 wrap;
-
-+ void __iomem *io_addr;
-+ void __iomem *io_wrap;
-+
- void *drvdata;
- struct list_head list;
- };
---- /dev/null
-+++ b/include/linux/bcma/bcma_soc.h
-@@ -0,0 +1,16 @@
-+#ifndef LINUX_BCMA_SOC_H_
-+#define LINUX_BCMA_SOC_H_
-+
-+#include <linux/bcma/bcma.h>
-+
-+struct bcma_soc {
-+ struct bcma_bus bus;
-+ struct bcma_device core_cc;
-+ struct bcma_device core_mips;
-+};
-+
-+int __init bcma_host_soc_register(struct bcma_soc *soc);
-+
-+int bcma_bus_register(struct bcma_bus *bus);
-+
-+#endif /* LINUX_BCMA_SOC_H_ */
diff --git a/target/linux/brcm47xx/patches-3.0/0005-bcma-add-mips-driver.patch b/target/linux/brcm47xx/patches-3.0/0005-bcma-add-mips-driver.patch
deleted file mode 100644
index 31181a4883..0000000000
--- a/target/linux/brcm47xx/patches-3.0/0005-bcma-add-mips-driver.patch
+++ /dev/null
@@ -1,456 +0,0 @@
-From 3be3bbe24a1d49283864a1e1ea1d88a2e1700b50 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Mon, 6 Jun 2011 00:07:32 +0200
-Subject: [PATCH 05/26] bcma: add mips driver
-
-This adds a mips driver to bcma. This is only found on embedded
-devices. For now the driver just initializes the irqs used on this
-system.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/bcma/Kconfig | 9 +
- drivers/bcma/Makefile | 1 +
- drivers/bcma/driver_mips.c | 243 +++++++++++++++++++++++++++
- drivers/bcma/main.c | 15 ++
- include/linux/bcma/bcma.h | 3 +
- include/linux/bcma/bcma_driver_chipcommon.h | 13 ++
- include/linux/bcma/bcma_driver_mips.h | 49 ++++++
- 7 files changed, 333 insertions(+), 0 deletions(-)
- create mode 100644 drivers/bcma/driver_mips.c
- create mode 100644 include/linux/bcma/bcma_driver_mips.h
-
---- a/drivers/bcma/Kconfig
-+++ b/drivers/bcma/Kconfig
-@@ -36,7 +36,16 @@ config BCMA_DRIVER_PCI_HOSTMODE
-
- config BCMA_HOST_SOC
- bool
-+ depends on BCMA_DRIVER_MIPS
-+
-+config BCMA_DRIVER_MIPS
-+ bool "BCMA Broadcom MIPS core driver"
- depends on BCMA && MIPS
-+ help
-+ Driver for the Broadcom MIPS core attached to Broadcom specific
-+ Advanced Microcontroller Bus.
-+
-+ If unsure, say N
-
- config BCMA_DEBUG
- bool "BCMA debugging"
---- a/drivers/bcma/Makefile
-+++ b/drivers/bcma/Makefile
-@@ -2,6 +2,7 @@ bcma-y += main.o scan.o core.o sprom
- bcma-y += driver_chipcommon.o driver_chipcommon_pmu.o
- bcma-y += driver_pci.o
- bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE) += driver_pci_host.o
-+bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o
- bcma-$(CONFIG_BCMA_HOST_PCI) += host_pci.o
- bcma-$(CONFIG_BCMA_HOST_SOC) += host_soc.o
- obj-$(CONFIG_BCMA) += bcma.o
---- /dev/null
-+++ b/drivers/bcma/driver_mips.c
-@@ -0,0 +1,243 @@
-+/*
-+ * Broadcom specific AMBA
-+ * Broadcom MIPS32 74K core driver
-+ *
-+ * Copyright 2009, Broadcom Corporation
-+ * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de>
-+ * Copyright 2010, Bernhard Loos <bernhardloos@googlemail.com>
-+ * Copyright 2011, Hauke Mehrtens <hauke@hauke-m.de>
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
-+#include "bcma_private.h"
-+
-+#include <linux/bcma/bcma.h>
-+
-+#include <linux/serial.h>
-+#include <linux/serial_core.h>
-+#include <linux/serial_reg.h>
-+#include <linux/time.h>
-+
-+/* The 47162a0 hangs when reading MIPS DMP registers registers */
-+static inline bool bcma_core_mips_bcm47162a0_quirk(struct bcma_device *dev)
-+{
-+ return dev->bus->chipinfo.id == 47162 && dev->bus->chipinfo.rev == 0 &&
-+ dev->id.id == BCMA_CORE_MIPS_74K;
-+}
-+
-+/* The 5357b0 hangs when reading USB20H DMP registers */
-+static inline bool bcma_core_mips_bcm5357b0_quirk(struct bcma_device *dev)
-+{
-+ return (dev->bus->chipinfo.id == 0x5357 ||
-+ dev->bus->chipinfo.id == 0x4749) &&
-+ dev->bus->chipinfo.pkg == 11 &&
-+ dev->id.id == BCMA_CORE_USB20_HOST;
-+}
-+
-+static inline u32 mips_read32(struct bcma_drv_mips *mcore,
-+ u16 offset)
-+{
-+ return bcma_read32(mcore->core, offset);
-+}
-+
-+static inline void mips_write32(struct bcma_drv_mips *mcore,
-+ u16 offset,
-+ u32 value)
-+{
-+ bcma_write32(mcore->core, offset, value);
-+}
-+
-+static const u32 ipsflag_irq_mask[] = {
-+ 0,
-+ BCMA_MIPS_IPSFLAG_IRQ1,
-+ BCMA_MIPS_IPSFLAG_IRQ2,
-+ BCMA_MIPS_IPSFLAG_IRQ3,
-+ BCMA_MIPS_IPSFLAG_IRQ4,
-+};
-+
-+static const u32 ipsflag_irq_shift[] = {
-+ 0,
-+ BCMA_MIPS_IPSFLAG_IRQ1_SHIFT,
-+ BCMA_MIPS_IPSFLAG_IRQ2_SHIFT,
-+ BCMA_MIPS_IPSFLAG_IRQ3_SHIFT,
-+ BCMA_MIPS_IPSFLAG_IRQ4_SHIFT,
-+};
-+
-+static u32 bcma_core_mips_irqflag(struct bcma_device *dev)
-+{
-+ u32 flag;
-+
-+ if (bcma_core_mips_bcm47162a0_quirk(dev))
-+ return dev->core_index;
-+ if (bcma_core_mips_bcm5357b0_quirk(dev))
-+ return dev->core_index;
-+ flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30);
-+
-+ return flag & 0x1F;
-+}
-+
-+/* Get the MIPS IRQ assignment for a specified device.
-+ * If unassigned, 0 is returned.
-+ */
-+unsigned int bcma_core_mips_irq(struct bcma_device *dev)
-+{
-+ struct bcma_device *mdev = dev->bus->drv_mips.core;
-+ u32 irqflag;
-+ unsigned int irq;
-+
-+ irqflag = bcma_core_mips_irqflag(dev);
-+
-+ for (irq = 1; irq <= 4; irq++)
-+ if (bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq)) &
-+ (1 << irqflag))
-+ return irq;
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(bcma_core_mips_irq);
-+
-+static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq)
-+{
-+ unsigned int oldirq = bcma_core_mips_irq(dev);
-+ struct bcma_bus *bus = dev->bus;
-+ struct bcma_device *mdev = bus->drv_mips.core;
-+ u32 irqflag;
-+
-+ irqflag = bcma_core_mips_irqflag(dev);
-+ BUG_ON(oldirq == 6);
-+
-+ dev->irq = irq + 2;
-+
-+ /* clear the old irq */
-+ if (oldirq == 0)
-+ bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0),
-+ bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) &
-+ ~(1 << irqflag));
-+ else
-+ bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 0);
-+
-+ /* assign the new one */
-+ if (irq == 0) {
-+ bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0),
-+ bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) |
-+ (1 << irqflag));
-+ } else {
-+ u32 oldirqflag = bcma_read32(mdev,
-+ BCMA_MIPS_MIPS74K_INTMASK(irq));
-+ if (oldirqflag) {
-+ struct bcma_device *core;
-+
-+ /* backplane irq line is in use, find out who uses
-+ * it and set user to irq 0
-+ */
-+ list_for_each_entry_reverse(core, &bus->cores, list) {
-+ if ((1 << bcma_core_mips_irqflag(core)) ==
-+ oldirqflag) {
-+ bcma_core_mips_set_irq(core, 0);
-+ break;
-+ }
-+ }
-+ }
-+ bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq),
-+ 1 << irqflag);
-+ }
-+
-+ pr_info("set_irq: core 0x%04x, irq %d => %d\n",
-+ dev->id.id, oldirq + 2, irq + 2);
-+}
-+
-+static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq)
-+{
-+ int i;
-+ static const char *irq_name[] = {"2(S)", "3", "4", "5", "6", "D", "I"};
-+ printk(KERN_INFO KBUILD_MODNAME ": core 0x%04x, irq :", dev->id.id);
-+ for (i = 0; i <= 6; i++)
-+ printk(" %s%s", irq_name[i], i == irq ? "*" : " ");
-+ printk("\n");
-+}
-+
-+static void bcma_core_mips_dump_irq(struct bcma_bus *bus)
-+{
-+ struct bcma_device *core;
-+
-+ list_for_each_entry_reverse(core, &bus->cores, list) {
-+ bcma_core_mips_print_irq(core, bcma_core_mips_irq(core));
-+ }
-+}
-+
-+static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore)
-+{
-+ struct bcma_bus *bus = mcore->core->bus;
-+
-+ switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) {
-+ case BCMA_CC_FLASHT_STSER:
-+ case BCMA_CC_FLASHT_ATSER:
-+ pr_err("Serial flash not supported.\n");
-+ break;
-+ case BCMA_CC_FLASHT_PARA:
-+ pr_info("found parallel flash.\n");
-+ bus->drv_cc.pflash.window = 0x1c000000;
-+ bus->drv_cc.pflash.window_size = 0x02000000;
-+
-+ if ((bcma_read32(bus->drv_cc.core, BCMA_CC_FLASH_CFG) &
-+ BCMA_CC_FLASH_CFG_DS) == 0)
-+ bus->drv_cc.pflash.buswidth = 1;
-+ else
-+ bus->drv_cc.pflash.buswidth = 2;
-+ break;
-+ default:
-+ pr_err("flash not supported.\n");
-+ }
-+}
-+
-+void bcma_core_mips_init(struct bcma_drv_mips *mcore)
-+{
-+ struct bcma_bus *bus;
-+ struct bcma_device *core;
-+ bus = mcore->core->bus;
-+
-+ pr_info("Initializing MIPS core...\n");
-+
-+ if (!mcore->setup_done)
-+ mcore->assigned_irqs = 1;
-+
-+ /* Assign IRQs to all cores on the bus */
-+ list_for_each_entry_reverse(core, &bus->cores, list) {
-+ int mips_irq;
-+ if (core->irq)
-+ continue;
-+
-+ mips_irq = bcma_core_mips_irq(core);
-+ if (mips_irq > 4)
-+ core->irq = 0;
-+ else
-+ core->irq = mips_irq + 2;
-+ if (core->irq > 5)
-+ continue;
-+ switch (core->id.id) {
-+ case BCMA_CORE_PCI:
-+ case BCMA_CORE_PCIE:
-+ case BCMA_CORE_ETHERNET:
-+ case BCMA_CORE_ETHERNET_GBIT:
-+ case BCMA_CORE_MAC_GBIT:
-+ case BCMA_CORE_80211:
-+ case BCMA_CORE_USB20_HOST:
-+ /* These devices get their own IRQ line if available,
-+ * the rest goes on IRQ0
-+ */
-+ if (mcore->assigned_irqs <= 4)
-+ bcma_core_mips_set_irq(core,
-+ mcore->assigned_irqs++);
-+ break;
-+ }
-+ }
-+ pr_info("IRQ reconfiguration done\n");
-+ bcma_core_mips_dump_irq(bus);
-+
-+ if (mcore->setup_done)
-+ return;
-+
-+ bcma_core_mips_flash_detect(mcore);
-+ mcore->setup_done = true;
-+}
---- a/drivers/bcma/main.c
-+++ b/drivers/bcma/main.c
-@@ -84,6 +84,7 @@ static int bcma_register_cores(struct bc
- case BCMA_CORE_CHIPCOMMON:
- case BCMA_CORE_PCI:
- case BCMA_CORE_PCIE:
-+ case BCMA_CORE_MIPS_74K:
- continue;
- }
-
-@@ -147,6 +148,13 @@ int bcma_bus_register(struct bcma_bus *b
- bcma_core_chipcommon_init(&bus->drv_cc);
- }
-
-+ /* Init MIPS core */
-+ core = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
-+ if (core) {
-+ bus->drv_mips.core = core;
-+ bcma_core_mips_init(&bus->drv_mips);
-+ }
-+
- /* Init PCIE core */
- core = bcma_find_core(bus, BCMA_CORE_PCIE);
- if (core) {
-@@ -217,6 +225,13 @@ int __init bcma_bus_early_register(struc
- bcma_core_chipcommon_init(&bus->drv_cc);
- }
-
-+ /* Init MIPS core */
-+ core = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
-+ if (core) {
-+ bus->drv_mips.core = core;
-+ bcma_core_mips_init(&bus->drv_mips);
-+ }
-+
- pr_info("Early bus registered\n");
-
- return 0;
---- a/include/linux/bcma/bcma.h
-+++ b/include/linux/bcma/bcma.h
-@@ -6,6 +6,7 @@
-
- #include <linux/bcma/bcma_driver_chipcommon.h>
- #include <linux/bcma/bcma_driver_pci.h>
-+#include <linux/bcma/bcma_driver_mips.h>
- #include <linux/ssb/ssb.h> /* SPROM sharing */
-
- #include "bcma_regs.h"
-@@ -130,6 +131,7 @@ struct bcma_device {
-
- struct device dev;
- struct device *dma_dev;
-+
- unsigned int irq;
- bool dev_registered;
-
-@@ -197,6 +199,7 @@ struct bcma_bus {
-
- struct bcma_drv_cc drv_cc;
- struct bcma_drv_pci drv_pci;
-+ struct bcma_drv_mips drv_mips;
-
- /* We decided to share SPROM struct with SSB as long as we do not need
- * any hacks for BCMA. This simplifies drivers code. */
---- a/include/linux/bcma/bcma_driver_chipcommon.h
-+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -24,6 +24,7 @@
- #define BCMA_CC_FLASHT_NONE 0x00000000 /* No flash */
- #define BCMA_CC_FLASHT_STSER 0x00000100 /* ST serial flash */
- #define BCMA_CC_FLASHT_ATSER 0x00000200 /* Atmel serial flash */
-+#define BCMA_CC_FLASHT_NFLASH 0x00000200
- #define BCMA_CC_FLASHT_PARA 0x00000700 /* Parallel flash */
- #define BCMA_CC_CAP_PLLT 0x00038000 /* PLL Type */
- #define BCMA_PLLTYPE_NONE 0x00000000
-@@ -178,6 +179,7 @@
- #define BCMA_CC_PROG_CFG 0x0120
- #define BCMA_CC_PROG_WAITCNT 0x0124
- #define BCMA_CC_FLASH_CFG 0x0128
-+#define BCMA_CC_FLASH_CFG_DS 0x0010 /* Data size, 0=8bit, 1=16bit */
- #define BCMA_CC_FLASH_WAITCNT 0x012C
- /* 0x1E0 is defined as shared BCMA_CLKCTLST */
- #define BCMA_CC_HW_WORKAROUND 0x01E4 /* Hardware workaround (rev >= 20) */
-@@ -247,6 +249,14 @@ struct bcma_chipcommon_pmu {
- u32 crystalfreq; /* The active crystal frequency (in kHz) */
- };
-
-+#ifdef CONFIG_BCMA_DRIVER_MIPS
-+struct bcma_pflash {
-+ u8 buswidth;
-+ u32 window;
-+ u32 window_size;
-+};
-+#endif /* CONFIG_BCMA_DRIVER_MIPS */
-+
- struct bcma_drv_cc {
- struct bcma_device *core;
- u32 status;
-@@ -256,6 +266,9 @@ struct bcma_drv_cc {
- /* Fast Powerup Delay constant */
- u16 fast_pwrup_delay;
- struct bcma_chipcommon_pmu pmu;
-+#ifdef CONFIG_BCMA_DRIVER_MIPS
-+ struct bcma_pflash pflash;
-+#endif /* CONFIG_BCMA_DRIVER_MIPS */
- };
-
- /* Register access */
---- /dev/null
-+++ b/include/linux/bcma/bcma_driver_mips.h
-@@ -0,0 +1,49 @@
-+#ifndef LINUX_BCMA_DRIVER_MIPS_H_
-+#define LINUX_BCMA_DRIVER_MIPS_H_
-+
-+#define BCMA_MIPS_IPSFLAG 0x0F08
-+/* which sbflags get routed to mips interrupt 1 */
-+#define BCMA_MIPS_IPSFLAG_IRQ1 0x0000003F
-+#define BCMA_MIPS_IPSFLAG_IRQ1_SHIFT 0
-+/* which sbflags get routed to mips interrupt 2 */
-+#define BCMA_MIPS_IPSFLAG_IRQ2 0x00003F00
-+#define BCMA_MIPS_IPSFLAG_IRQ2_SHIFT 8
-+/* which sbflags get routed to mips interrupt 3 */
-+#define BCMA_MIPS_IPSFLAG_IRQ3 0x003F0000
-+#define BCMA_MIPS_IPSFLAG_IRQ3_SHIFT 16
-+/* which sbflags get routed to mips interrupt 4 */
-+#define BCMA_MIPS_IPSFLAG_IRQ4 0x3F000000
-+#define BCMA_MIPS_IPSFLAG_IRQ4_SHIFT 24
-+
-+/* MIPS 74K core registers */
-+#define BCMA_MIPS_MIPS74K_CORECTL 0x0000
-+#define BCMA_MIPS_MIPS74K_EXCEPTBASE 0x0004
-+#define BCMA_MIPS_MIPS74K_BIST 0x000C
-+#define BCMA_MIPS_MIPS74K_INTMASK_INT0 0x0014
-+#define BCMA_MIPS_MIPS74K_INTMASK(int) \
-+ ((int) * 4 + BCMA_MIPS_MIPS74K_INTMASK_INT0)
-+#define BCMA_MIPS_MIPS74K_NMIMASK 0x002C
-+#define BCMA_MIPS_MIPS74K_GPIOSEL 0x0040
-+#define BCMA_MIPS_MIPS74K_GPIOOUT 0x0044
-+#define BCMA_MIPS_MIPS74K_GPIOEN 0x0048
-+#define BCMA_MIPS_MIPS74K_CLKCTLST 0x01E0
-+
-+#define BCMA_MIPS_OOBSELOUTA30 0x100
-+
-+struct bcma_device;
-+
-+struct bcma_drv_mips {
-+ struct bcma_device *core;
-+ u8 setup_done:1;
-+ unsigned int assigned_irqs;
-+};
-+
-+#ifdef CONFIG_BCMA_DRIVER_MIPS
-+extern void bcma_core_mips_init(struct bcma_drv_mips *mcore);
-+#else
-+static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { }
-+#endif
-+
-+extern unsigned int bcma_core_mips_irq(struct bcma_device *dev);
-+
-+#endif /* LINUX_BCMA_DRIVER_MIPS_H_ */
diff --git a/target/linux/brcm47xx/patches-3.0/0006-bcma-add-serial-console-support.patch b/target/linux/brcm47xx/patches-3.0/0006-bcma-add-serial-console-support.patch
deleted file mode 100644
index fd7b8ae78e..0000000000
--- a/target/linux/brcm47xx/patches-3.0/0006-bcma-add-serial-console-support.patch
+++ /dev/null
@@ -1,166 +0,0 @@
-From 4d58b9a14669e5ea0026f0d27257041aecfcbed3 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Mon, 6 Jun 2011 00:07:33 +0200
-Subject: [PATCH 06/26] bcma: add serial console support
-
-This adds support for serial console to bcma, when operating on an SoC.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/bcma/bcma_private.h | 8 ++++
- drivers/bcma/driver_chipcommon.c | 48 +++++++++++++++++++++++++++
- drivers/bcma/driver_chipcommon_pmu.c | 26 ++++++++++++++
- drivers/bcma/driver_mips.c | 1 +
- include/linux/bcma/bcma_driver_chipcommon.h | 14 ++++++++
- 5 files changed, 97 insertions(+), 0 deletions(-)
-
---- a/drivers/bcma/bcma_private.h
-+++ b/drivers/bcma/bcma_private.h
-@@ -29,6 +29,14 @@ void bcma_init_bus(struct bcma_bus *bus)
- /* sprom.c */
- int bcma_sprom_get(struct bcma_bus *bus);
-
-+/* driver_chipcommon.c */
-+#ifdef CONFIG_BCMA_DRIVER_MIPS
-+void bcma_chipco_serial_init(struct bcma_drv_cc *cc);
-+#endif /* CONFIG_BCMA_DRIVER_MIPS */
-+
-+/* driver_chipcommon_pmu.c */
-+u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc);
-+
- #ifdef CONFIG_BCMA_HOST_PCI
- /* host_pci.c */
- extern int __init bcma_host_pci_init(void);
---- a/drivers/bcma/driver_chipcommon.c
-+++ b/drivers/bcma/driver_chipcommon.c
-@@ -106,3 +106,51 @@ u32 bcma_chipco_gpio_polarity(struct bcm
- {
- return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value);
- }
-+
-+#ifdef CONFIG_BCMA_DRIVER_MIPS
-+void bcma_chipco_serial_init(struct bcma_drv_cc *cc)
-+{
-+ unsigned int irq;
-+ u32 baud_base;
-+ u32 i;
-+ unsigned int ccrev = cc->core->id.rev;
-+ struct bcma_serial_port *ports = cc->serial_ports;
-+
-+ if (ccrev >= 11 && ccrev != 15) {
-+ /* Fixed ALP clock */
-+ baud_base = bcma_pmu_alp_clock(cc);
-+ if (ccrev >= 21) {
-+ /* Turn off UART clock before switching clocksource. */
-+ bcma_cc_write32(cc, BCMA_CC_CORECTL,
-+ bcma_cc_read32(cc, BCMA_CC_CORECTL)
-+ & ~BCMA_CC_CORECTL_UARTCLKEN);
-+ }
-+ /* Set the override bit so we don't divide it */
-+ bcma_cc_write32(cc, BCMA_CC_CORECTL,
-+ bcma_cc_read32(cc, BCMA_CC_CORECTL)
-+ | BCMA_CC_CORECTL_UARTCLK0);
-+ if (ccrev >= 21) {
-+ /* Re-enable the UART clock. */
-+ bcma_cc_write32(cc, BCMA_CC_CORECTL,
-+ bcma_cc_read32(cc, BCMA_CC_CORECTL)
-+ | BCMA_CC_CORECTL_UARTCLKEN);
-+ }
-+ } else {
-+ pr_err("serial not supported on this device ccrev: 0x%x\n",
-+ ccrev);
-+ return;
-+ }
-+
-+ irq = bcma_core_mips_irq(cc->core);
-+
-+ /* Determine the registers of the UARTs */
-+ cc->nr_serial_ports = (cc->capabilities & BCMA_CC_CAP_NRUART);
-+ for (i = 0; i < cc->nr_serial_ports; i++) {
-+ ports[i].regs = cc->core->io_addr + BCMA_CC_UART0_DATA +
-+ (i * 256);
-+ ports[i].irq = irq;
-+ ports[i].baud_base = baud_base;
-+ ports[i].reg_shift = 0;
-+ }
-+}
-+#endif /* CONFIG_BCMA_DRIVER_MIPS */
---- a/drivers/bcma/driver_chipcommon_pmu.c
-+++ b/drivers/bcma/driver_chipcommon_pmu.c
-@@ -136,3 +136,29 @@ void bcma_pmu_init(struct bcma_drv_cc *c
- bcma_pmu_swreg_init(cc);
- bcma_pmu_workarounds(cc);
- }
-+
-+u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc)
-+{
-+ struct bcma_bus *bus = cc->core->bus;
-+
-+ switch (bus->chipinfo.id) {
-+ case 0x4716:
-+ case 0x4748:
-+ case 47162:
-+ case 0x4313:
-+ case 0x5357:
-+ case 0x4749:
-+ case 53572:
-+ /* always 20Mhz */
-+ return 20000 * 1000;
-+ case 0x5356:
-+ case 0x5300:
-+ /* always 25Mhz */
-+ return 25000 * 1000;
-+ default:
-+ pr_warn("No ALP clock specified for %04X device, "
-+ "pmu rev. %d, using default %d Hz\n",
-+ bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_ALP_CLOCK);
-+ }
-+ return BCMA_CC_PMU_ALP_CLOCK;
-+}
---- a/drivers/bcma/driver_mips.c
-+++ b/drivers/bcma/driver_mips.c
-@@ -238,6 +238,7 @@ void bcma_core_mips_init(struct bcma_drv
- if (mcore->setup_done)
- return;
-
-+ bcma_chipco_serial_init(&bus->drv_cc);
- bcma_core_mips_flash_detect(mcore);
- mcore->setup_done = true;
- }
---- a/include/linux/bcma/bcma_driver_chipcommon.h
-+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -241,6 +241,9 @@
- #define BCMA_CC_SPROM 0x0800 /* SPROM beginning */
- #define BCMA_CC_SPROM_PCIE6 0x0830 /* SPROM beginning on PCIe rev >= 6 */
-
-+/* ALP clock on pre-PMU chips */
-+#define BCMA_CC_PMU_ALP_CLOCK 20000000
-+
- /* Data for the PMU, if available.
- * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU)
- */
-@@ -255,6 +258,14 @@ struct bcma_pflash {
- u32 window;
- u32 window_size;
- };
-+
-+struct bcma_serial_port {
-+ void *regs;
-+ unsigned long clockspeed;
-+ unsigned int irq;
-+ unsigned int baud_base;
-+ unsigned int reg_shift;
-+};
- #endif /* CONFIG_BCMA_DRIVER_MIPS */
-
- struct bcma_drv_cc {
-@@ -268,6 +279,9 @@ struct bcma_drv_cc {
- struct bcma_chipcommon_pmu pmu;
- #ifdef CONFIG_BCMA_DRIVER_MIPS
- struct bcma_pflash pflash;
-+
-+ int nr_serial_ports;
-+ struct bcma_serial_port serial_ports[4];
- #endif /* CONFIG_BCMA_DRIVER_MIPS */
- };
-
diff --git a/target/linux/brcm47xx/patches-3.0/0007-bcma-get-CPU-clock.patch b/target/linux/brcm47xx/patches-3.0/0007-bcma-get-CPU-clock.patch
deleted file mode 100644
index 7fa752056b..0000000000
--- a/target/linux/brcm47xx/patches-3.0/0007-bcma-get-CPU-clock.patch
+++ /dev/null
@@ -1,229 +0,0 @@
-From bd2bb5fbf1982b18f44b6fd78e45717e0757cdc0 Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sat, 16 Jul 2011 15:19:38 +0200
-Subject: [PATCH 07/26] bcma: get CPU clock
-
-Add method to return the clock of the CPU. This is needed by the arch
-code to calculate the mips_hpt_frequency.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
----
- drivers/bcma/bcma_private.h | 1 +
- drivers/bcma/driver_chipcommon_pmu.c | 107 +++++++++++++++++++++++++++
- drivers/bcma/driver_mips.c | 12 +++
- include/linux/bcma/bcma_driver_chipcommon.h | 39 ++++++++++
- include/linux/bcma/bcma_driver_mips.h | 2 +
- 5 files changed, 161 insertions(+), 0 deletions(-)
-
---- a/drivers/bcma/bcma_private.h
-+++ b/drivers/bcma/bcma_private.h
-@@ -36,6 +36,7 @@ void bcma_chipco_serial_init(struct bcma
-
- /* driver_chipcommon_pmu.c */
- u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc);
-+u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc);
-
- #ifdef CONFIG_BCMA_HOST_PCI
- /* host_pci.c */
---- a/drivers/bcma/driver_chipcommon_pmu.c
-+++ b/drivers/bcma/driver_chipcommon_pmu.c
-@@ -11,6 +11,13 @@
- #include "bcma_private.h"
- #include <linux/bcma/bcma.h>
-
-+static u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset)
-+{
-+ bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset);
-+ bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR);
-+ return bcma_cc_read32(cc, BCMA_CC_PLLCTL_DATA);
-+}
-+
- static void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc,
- u32 offset, u32 mask, u32 set)
- {
-@@ -162,3 +169,103 @@ u32 bcma_pmu_alp_clock(struct bcma_drv_c
- }
- return BCMA_CC_PMU_ALP_CLOCK;
- }
-+
-+/* Find the output of the "m" pll divider given pll controls that start with
-+ * pllreg "pll0" i.e. 12 for main 6 for phy, 0 for misc.
-+ */
-+static u32 bcma_pmu_clock(struct bcma_drv_cc *cc, u32 pll0, u32 m)
-+{
-+ u32 tmp, div, ndiv, p1, p2, fc;
-+ struct bcma_bus *bus = cc->core->bus;
-+
-+ BUG_ON((pll0 & 3) || (pll0 > BCMA_CC_PMU4716_MAINPLL_PLL0));
-+
-+ BUG_ON(!m || m > 4);
-+
-+ if (bus->chipinfo.id == 0x5357 || bus->chipinfo.id == 0x4749) {
-+ /* Detect failure in clock setting */
-+ tmp = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT);
-+ if (tmp & 0x40000)
-+ return 133 * 1000000;
-+ }
-+
-+ tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_P1P2_OFF);
-+ p1 = (tmp & BCMA_CC_PPL_P1_MASK) >> BCMA_CC_PPL_P1_SHIFT;
-+ p2 = (tmp & BCMA_CC_PPL_P2_MASK) >> BCMA_CC_PPL_P2_SHIFT;
-+
-+ tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_M14_OFF);
-+ div = (tmp >> ((m - 1) * BCMA_CC_PPL_MDIV_WIDTH)) &
-+ BCMA_CC_PPL_MDIV_MASK;
-+
-+ tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_NM5_OFF);
-+ ndiv = (tmp & BCMA_CC_PPL_NDIV_MASK) >> BCMA_CC_PPL_NDIV_SHIFT;
-+
-+ /* Do calculation in Mhz */
-+ fc = bcma_pmu_alp_clock(cc) / 1000000;
-+ fc = (p1 * ndiv * fc) / p2;
-+
-+ /* Return clock in Hertz */
-+ return (fc / div) * 1000000;
-+}
-+
-+/* query bus clock frequency for PMU-enabled chipcommon */
-+u32 bcma_pmu_get_clockcontrol(struct bcma_drv_cc *cc)
-+{
-+ struct bcma_bus *bus = cc->core->bus;
-+
-+ switch (bus->chipinfo.id) {
-+ case 0x4716:
-+ case 0x4748:
-+ case 47162:
-+ return bcma_pmu_clock(cc, BCMA_CC_PMU4716_MAINPLL_PLL0,
-+ BCMA_CC_PMU5_MAINPLL_SSB);
-+ case 0x5356:
-+ return bcma_pmu_clock(cc, BCMA_CC_PMU5356_MAINPLL_PLL0,
-+ BCMA_CC_PMU5_MAINPLL_SSB);
-+ case 0x5357:
-+ case 0x4749:
-+ return bcma_pmu_clock(cc, BCMA_CC_PMU5357_MAINPLL_PLL0,
-+ BCMA_CC_PMU5_MAINPLL_SSB);
-+ case 0x5300:
-+ return bcma_pmu_clock(cc, BCMA_CC_PMU4706_MAINPLL_PLL0,
-+ BCMA_CC_PMU5_MAINPLL_SSB);
-+ case 53572:
-+ return 75000000;
-+ default:
-+ pr_warn("No backplane clock specified for %04X device, "
-+ "pmu rev. %d, using default %d Hz\n",
-+ bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_HT_CLOCK);
-+ }
-+ return BCMA_CC_PMU_HT_CLOCK;
-+}
-+
-+/* query cpu clock frequency for PMU-enabled chipcommon */
-+u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc)
-+{
-+ struct bcma_bus *bus = cc->core->bus;
-+
-+ if (bus->chipinfo.id == 53572)
-+ return 300000000;
-+
-+ if (cc->pmu.rev >= 5) {
-+ u32 pll;
-+ switch (bus->chipinfo.id) {
-+ case 0x5356:
-+ pll = BCMA_CC_PMU5356_MAINPLL_PLL0;
-+ break;
-+ case 0x5357:
-+ case 0x4749:
-+ pll = BCMA_CC_PMU5357_MAINPLL_PLL0;
-+ break;
-+ default:
-+ pll = BCMA_CC_PMU4716_MAINPLL_PLL0;
-+ break;
-+ }
-+
-+ /* TODO: if (bus->chipinfo.id == 0x5300)
-+ return si_4706_pmu_clock(sih, osh, cc, PMU4706_MAINPLL_PLL0, PMU5_MAINPLL_CPU); */
-+ return bcma_pmu_clock(cc, pll, BCMA_CC_PMU5_MAINPLL_CPU);
-+ }
-+
-+ return bcma_pmu_get_clockcontrol(cc);
-+}
---- a/drivers/bcma/driver_mips.c
-+++ b/drivers/bcma/driver_mips.c
-@@ -166,6 +166,18 @@ static void bcma_core_mips_dump_irq(stru
- }
- }
-
-+u32 bcma_cpu_clock(struct bcma_drv_mips *mcore)
-+{
-+ struct bcma_bus *bus = mcore->core->bus;
-+
-+ if (bus->drv_cc.capabilities & BCMA_CC_CAP_PMU)
-+ return bcma_pmu_get_clockcpu(&bus->drv_cc);
-+
-+ pr_err("No PMU available, need this to get the cpu clock\n");
-+ return 0;
-+}
-+EXPORT_SYMBOL(bcma_cpu_clock);
-+
- static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore)
- {
- struct bcma_bus *bus = mcore->core->bus;
---- a/include/linux/bcma/bcma_driver_chipcommon.h
-+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -241,8 +241,47 @@
- #define BCMA_CC_SPROM 0x0800 /* SPROM beginning */
- #define BCMA_CC_SPROM_PCIE6 0x0830 /* SPROM beginning on PCIe rev >= 6 */
-
-+/* Divider allocation in 4716/47162/5356 */
-+#define BCMA_CC_PMU5_MAINPLL_CPU 1
-+#define BCMA_CC_PMU5_MAINPLL_MEM 2
-+#define BCMA_CC_PMU5_MAINPLL_SSB 3
-+
-+/* PLL usage in 4716/47162 */
-+#define BCMA_CC_PMU4716_MAINPLL_PLL0 12
-+
-+/* PLL usage in 5356/5357 */
-+#define BCMA_CC_PMU5356_MAINPLL_PLL0 0
-+#define BCMA_CC_PMU5357_MAINPLL_PLL0 0
-+
-+/* 4706 PMU */
-+#define BCMA_CC_PMU4706_MAINPLL_PLL0 0
-+
- /* ALP clock on pre-PMU chips */
- #define BCMA_CC_PMU_ALP_CLOCK 20000000
-+/* HT clock for systems with PMU-enabled chipcommon */
-+#define BCMA_CC_PMU_HT_CLOCK 80000000
-+
-+/* PMU rev 5 (& 6) */
-+#define BCMA_CC_PPL_P1P2_OFF 0
-+#define BCMA_CC_PPL_P1_MASK 0x0f000000
-+#define BCMA_CC_PPL_P1_SHIFT 24
-+#define BCMA_CC_PPL_P2_MASK 0x00f00000
-+#define BCMA_CC_PPL_P2_SHIFT 20
-+#define BCMA_CC_PPL_M14_OFF 1
-+#define BCMA_CC_PPL_MDIV_MASK 0x000000ff
-+#define BCMA_CC_PPL_MDIV_WIDTH 8
-+#define BCMA_CC_PPL_NM5_OFF 2
-+#define BCMA_CC_PPL_NDIV_MASK 0xfff00000
-+#define BCMA_CC_PPL_NDIV_SHIFT 20
-+#define BCMA_CC_PPL_FMAB_OFF 3
-+#define BCMA_CC_PPL_MRAT_MASK 0xf0000000
-+#define BCMA_CC_PPL_MRAT_SHIFT 28
-+#define BCMA_CC_PPL_ABRAT_MASK 0x08000000
-+#define BCMA_CC_PPL_ABRAT_SHIFT 27
-+#define BCMA_CC_PPL_FDIV_MASK 0x07ffffff
-+#define BCMA_CC_PPL_PLLCTL_OFF 4
-+#define BCMA_CC_PPL_PCHI_OFF 5
-+#define BCMA_CC_PPL_PCHI_MASK 0x0000003f
-
- /* Data for the PMU, if available.
- * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU)
---- a/include/linux/bcma/bcma_driver_mips.h
-+++ b/include/linux/bcma/bcma_driver_mips.h
-@@ -44,6 +44,8 @@ extern void bcma_core_mips_init(struct b
- static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { }
- #endif
-
-+extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore);
-+
- extern unsigned int bcma_core_mips_irq(struct bcma_device *dev);
-
- #endif /* LINUX_BCMA_DRIVER_MIPS_H_ */
diff --git a/target/linux/brcm47xx/patches-3.0/0012-bcma-move-parallel-flash-into-a-union.patch b/target/linux/brcm47xx/patches-3.0/0012-bcma-move-parallel-flash-into-a-union.patch
index 9a4e877287..11855b4496 100644
--- a/target/linux/brcm47xx/patches-3.0/0012-bcma-move-parallel-flash-into-a-union.patch
+++ b/target/linux/brcm47xx/patches-3.0/0012-bcma-move-parallel-flash-into-a-union.patch
@@ -104,9 +104,9 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
#define BCMA_CC_BCAST_ADDR 0x0050
#define BCMA_CC_BCAST_DATA 0x0054
#define BCMA_CC_GPIOPULLUP 0x0058 /* Rev >= 20 only */
-@@ -283,6 +341,12 @@
- #define BCMA_CC_PPL_PCHI_OFF 5
- #define BCMA_CC_PPL_PCHI_MASK 0x0000003f
+@@ -300,6 +358,12 @@
+ #define BCMA_CHIPCTL_4331_BT_SHD0_ON_GPIO4 BIT(16) /* enable bt_shd0 at gpio4 */
+ #define BCMA_CHIPCTL_4331_BT_SHD1_ON_GPIO5 BIT(17) /* enable bt_shd1 at gpio5 */
+#define BCMA_FLASH2 0x1c000000 /* Flash Region 2 (region 1 shadowed here) */
+#define BCMA_FLASH2_SZ 0x02000000 /* Size of Flash Region 2 */
@@ -117,7 +117,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
/* Data for the PMU, if available.
* Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU)
*/
-@@ -292,6 +356,10 @@ struct bcma_chipcommon_pmu {
+@@ -309,6 +373,10 @@ struct bcma_chipcommon_pmu {
};
#ifdef CONFIG_BCMA_DRIVER_MIPS
@@ -128,7 +128,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
struct bcma_pflash {
u8 buswidth;
u32 window;
-@@ -317,7 +385,10 @@ struct bcma_drv_cc {
+@@ -334,7 +402,10 @@ struct bcma_drv_cc {
u16 fast_pwrup_delay;
struct bcma_chipcommon_pmu pmu;
#ifdef CONFIG_BCMA_DRIVER_MIPS
diff --git a/target/linux/brcm47xx/patches-3.0/0013-bcma-add-serial-flash-support-to-bcma.patch b/target/linux/brcm47xx/patches-3.0/0013-bcma-add-serial-flash-support-to-bcma.patch
index 14e5a3bcc9..e78f3c4576 100644
--- a/target/linux/brcm47xx/patches-3.0/0013-bcma-add-serial-flash-support-to-bcma.patch
+++ b/target/linux/brcm47xx/patches-3.0/0013-bcma-add-serial-flash-support-to-bcma.patch
@@ -40,7 +40,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
bcma-$(CONFIG_BCMA_DRIVER_MIPS) += driver_mips.o
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
-@@ -38,6 +38,11 @@ void bcma_chipco_serial_init(struct bcma
+@@ -41,6 +41,11 @@ void bcma_chipco_serial_init(struct bcma
u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc);
u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc);
@@ -629,7 +629,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
pr_info("found parallel flash.\n");
--- a/include/linux/bcma/bcma_driver_chipcommon.h
+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -358,6 +358,7 @@ struct bcma_chipcommon_pmu {
+@@ -375,6 +375,7 @@ struct bcma_chipcommon_pmu {
#ifdef CONFIG_BCMA_DRIVER_MIPS
enum bcma_flash_type {
BCMA_PFLASH,
@@ -637,7 +637,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
};
struct bcma_pflash {
-@@ -366,6 +367,14 @@ struct bcma_pflash {
+@@ -383,6 +384,14 @@ struct bcma_pflash {
u32 window_size;
};
@@ -652,7 +652,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
struct bcma_serial_port {
void *regs;
unsigned long clockspeed;
-@@ -388,6 +397,9 @@ struct bcma_drv_cc {
+@@ -405,6 +414,9 @@ struct bcma_drv_cc {
enum bcma_flash_type flash_type;
union {
struct bcma_pflash pflash;
@@ -662,9 +662,9 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
};
int nr_serial_ports;
-@@ -431,4 +443,16 @@ u32 bcma_chipco_gpio_polarity(struct bcm
- /* PMU support */
- extern void bcma_pmu_init(struct bcma_drv_cc *cc);
+@@ -459,4 +471,16 @@ extern void bcma_chipco_chipctl_maskset(
+ extern void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc,
+ u32 offset, u32 mask, u32 set);
+#ifdef CONFIG_BCMA_SFLASH
+/* Chipcommon sflash support. */
diff --git a/target/linux/brcm47xx/patches-3.0/0023-bcma-use-randoom-mac-address-as-long-as-reading-it-o.patch b/target/linux/brcm47xx/patches-3.0/0023-bcma-use-randoom-mac-address-as-long-as-reading-it-o.patch
index d83ad5326e..fee1d0a5a6 100644
--- a/target/linux/brcm47xx/patches-3.0/0023-bcma-use-randoom-mac-address-as-long-as-reading-it-o.patch
+++ b/target/linux/brcm47xx/patches-3.0/0023-bcma-use-randoom-mac-address-as-long-as-reading-it-o.patch
@@ -19,7 +19,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
#define SPOFF(offset) ((offset) / sizeof(u16))
-@@ -144,8 +145,10 @@ int bcma_sprom_get(struct bcma_bus *bus)
+@@ -214,8 +215,10 @@ int bcma_sprom_get(struct bcma_bus *bus)
if (!bus->drv_cc.core)
return -EOPNOTSUPP;
diff --git a/target/linux/brcm47xx/patches-3.0/220-bcm5354.patch b/target/linux/brcm47xx/patches-3.0/220-bcm5354.patch
index 6055e0a738..61f0a7ecad 100644
--- a/target/linux/brcm47xx/patches-3.0/220-bcm5354.patch
+++ b/target/linux/brcm47xx/patches-3.0/220-bcm5354.patch
@@ -31,7 +31,7 @@
}
--- a/drivers/ssb/main.c
+++ b/drivers/ssb/main.c
-@@ -1104,6 +1104,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus)
+@@ -1105,6 +1105,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus)
if (bus->chip_id == 0x5365) {
rate = 100000000;
diff --git a/target/linux/brcm47xx/patches-3.0/230-ssb_pci_sprom.patch b/target/linux/brcm47xx/patches-3.0/230-ssb_pci_sprom.patch
deleted file mode 100644
index 30f133bb56..0000000000
--- a/target/linux/brcm47xx/patches-3.0/230-ssb_pci_sprom.patch
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/drivers/ssb/driver_pcicore.c
-+++ b/drivers/ssb/driver_pcicore.c
-@@ -516,10 +516,14 @@ static void ssb_pcicore_pcie_setup_worka
-
- static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc)
- {
-- ssb_pcicore_fix_sprom_core_index(pc);
-+ struct ssb_device *pdev = pc->dev;
-+ struct ssb_bus *bus = pdev->bus;
-+
-+ if (bus->bustype == SSB_BUSTYPE_PCI)
-+ ssb_pcicore_fix_sprom_core_index(pc);
-
- /* Disable PCI interrupts. */
-- ssb_write32(pc->dev, SSB_INTVEC, 0);
-+ ssb_write32(pdev, SSB_INTVEC, 0);
-
- /* Additional PCIe always once-executed workarounds */
- if (pc->dev->id.coreid == SSB_DEV_PCIE) {
diff --git a/target/linux/brcm47xx/patches-3.0/951-brcm4716-defines.patch b/target/linux/brcm47xx/patches-3.0/951-brcm4716-defines.patch
index 25cd469964..18685af6eb 100644
--- a/target/linux/brcm47xx/patches-3.0/951-brcm4716-defines.patch
+++ b/target/linux/brcm47xx/patches-3.0/951-brcm4716-defines.patch
@@ -25,7 +25,7 @@
ssb_printk(KERN_ERR PFX
--- a/include/linux/ssb/ssb.h
+++ b/include/linux/ssb/ssb.h
-@@ -157,9 +157,16 @@ struct ssb_bus_ops {
+@@ -166,9 +166,16 @@ struct ssb_bus_ops {
#define SSB_DEV_MINI_MACPHY 0x823
#define SSB_DEV_ARM_1176 0x824
#define SSB_DEV_ARM_7TDMI 0x825
@@ -60,7 +60,7 @@
/* Enumeration space constants */
#define SSB_CORE_SIZE 0x1000 /* Size of a core MMIO area */
-@@ -499,5 +501,41 @@ enum {
+@@ -556,5 +558,41 @@ enum {
#define SSB_ADM_BASE2 0xFFFF0000 /* Type2 base address for the core */
#define SSB_ADM_BASE2_SHIFT 16