diff options
author | Hauke Mehrtens <hauke@openwrt.org> | 2011-12-19 23:33:03 +0000 |
---|---|---|
committer | Hauke Mehrtens <hauke@openwrt.org> | 2011-12-19 23:33:03 +0000 |
commit | a8b46480d3b892dfc0ea90b70c98f2231a83a25b (patch) | |
tree | 2c691892f4e36354a69a84b539a774c4c546947f /target/linux/brcm47xx | |
parent | a4209940dba330a4084295315c8abcf879a902e3 (diff) | |
download | upstream-a8b46480d3b892dfc0ea90b70c98f2231a83a25b.tar.gz upstream-a8b46480d3b892dfc0ea90b70c98f2231a83a25b.tar.bz2 upstream-a8b46480d3b892dfc0ea90b70c98f2231a83a25b.zip |
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')
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 |