aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-3.10
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/patches-3.10')
-rw-r--r--target/linux/generic/patches-3.10/025-bcma_backport.patch141
1 files changed, 141 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.10/025-bcma_backport.patch b/target/linux/generic/patches-3.10/025-bcma_backport.patch
index 0d41ed03c0..ab4b2ceb85 100644
--- a/target/linux/generic/patches-3.10/025-bcma_backport.patch
+++ b/target/linux/generic/patches-3.10/025-bcma_backport.patch
@@ -1085,6 +1085,24 @@
/* no more entries for port _i_ */
/* pr_debug("erom: master wrapper %d "
* has %d descriptors\n", i, j); */
+@@ -407,10 +421,13 @@ static int bcma_get_next_core(struct bcm
+ 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;
++ if (core->wrap) {
++ core->io_wrap = ioremap_nocache(core->wrap,
++ BCMA_CORE_SIZE);
++ if (!core->io_wrap) {
++ iounmap(core->io_addr);
++ return -ENOMEM;
++ }
+ }
+ }
+ return 0;
--- a/drivers/bcma/sprom.c
+++ b/drivers/bcma/sprom.c
@@ -72,12 +72,12 @@ fail:
@@ -1766,3 +1784,126 @@
brcms_b_xtal(wlc_hw, OFF);
}
}
+--- a/drivers/bcma/driver_mips.c
++++ b/drivers/bcma/driver_mips.c
+@@ -21,6 +21,14 @@
+ #include <linux/serial_reg.h>
+ #include <linux/time.h>
+
++enum bcma_boot_dev {
++ BCMA_BOOT_DEV_UNK = 0,
++ BCMA_BOOT_DEV_ROM,
++ BCMA_BOOT_DEV_PARALLEL,
++ BCMA_BOOT_DEV_SERIAL,
++ BCMA_BOOT_DEV_NAND,
++};
++
+ static const char * const part_probes[] = { "bcm47xxpart", NULL };
+
+ static struct physmap_flash_data bcma_pflash_data = {
+@@ -229,11 +237,51 @@ u32 bcma_cpu_clock(struct bcma_drv_mips
+ }
+ EXPORT_SYMBOL(bcma_cpu_clock);
+
++static enum bcma_boot_dev bcma_boot_dev(struct bcma_bus *bus)
++{
++ struct bcma_drv_cc *cc = &bus->drv_cc;
++ u8 cc_rev = cc->core->id.rev;
++
++ if (cc_rev == 42) {
++ struct bcma_device *core;
++
++ core = bcma_find_core(bus, BCMA_CORE_NS_ROM);
++ if (core) {
++ switch (bcma_aread32(core, BCMA_IOST) &
++ BCMA_NS_ROM_IOST_BOOT_DEV_MASK) {
++ case BCMA_NS_ROM_IOST_BOOT_DEV_NOR:
++ return BCMA_BOOT_DEV_SERIAL;
++ case BCMA_NS_ROM_IOST_BOOT_DEV_NAND:
++ return BCMA_BOOT_DEV_NAND;
++ case BCMA_NS_ROM_IOST_BOOT_DEV_ROM:
++ default:
++ return BCMA_BOOT_DEV_ROM;
++ }
++ }
++ } else {
++ if (cc_rev == 38) {
++ if (cc->status & BCMA_CC_CHIPST_5357_NAND_BOOT)
++ return BCMA_BOOT_DEV_NAND;
++ else if (cc->status & BIT(5))
++ return BCMA_BOOT_DEV_ROM;
++ }
++
++ if ((cc->capabilities & BCMA_CC_CAP_FLASHT) ==
++ BCMA_CC_FLASHT_PARA)
++ return BCMA_BOOT_DEV_PARALLEL;
++ else
++ return BCMA_BOOT_DEV_SERIAL;
++ }
++
++ return BCMA_BOOT_DEV_SERIAL;
++}
++
+ static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore)
+ {
+ struct bcma_bus *bus = mcore->core->bus;
+ struct bcma_drv_cc *cc = &bus->drv_cc;
+ struct bcma_pflash *pflash = &cc->pflash;
++ enum bcma_boot_dev boot_dev;
+
+ switch (cc->capabilities & BCMA_CC_CAP_FLASHT) {
+ case BCMA_CC_FLASHT_STSER:
+@@ -269,6 +317,20 @@ static void bcma_core_mips_flash_detect(
+ bcma_nflash_init(cc);
+ }
+ }
++
++ /* Determine flash type this SoC boots from */
++ boot_dev = bcma_boot_dev(bus);
++ switch (boot_dev) {
++ case BCMA_BOOT_DEV_PARALLEL:
++ case BCMA_BOOT_DEV_SERIAL:
++ /* TODO: Init NVRAM using BCMA_SOC_FLASH2 window */
++ break;
++ case BCMA_BOOT_DEV_NAND:
++ /* TODO: Init NVRAM using BCMA_SOC_FLASH1 window */
++ break;
++ default:
++ break;
++ }
+ }
+
+ void bcma_core_mips_early_init(struct bcma_drv_mips *mcore)
+--- a/drivers/bcma/host_soc.c
++++ b/drivers/bcma/host_soc.c
+@@ -134,12 +134,16 @@ static void bcma_host_soc_block_write(st
+
+ static u32 bcma_host_soc_aread32(struct bcma_device *core, u16 offset)
+ {
++ if (WARN_ONCE(!core->io_wrap, "Accessed core has no wrapper/agent\n"))
++ return ~0;
+ return readl(core->io_wrap + offset);
+ }
+
+ static void bcma_host_soc_awrite32(struct bcma_device *core, u16 offset,
+ u32 value)
+ {
++ if (WARN_ONCE(!core->io_wrap, "Accessed core has no wrapper/agent\n"))
++ return;
+ writel(value, core->io_wrap + offset);
+ }
+
+--- a/include/linux/bcma/bcma_regs.h
++++ b/include/linux/bcma/bcma_regs.h
+@@ -39,6 +39,11 @@
+ #define BCMA_RESET_CTL_RESET 0x0001
+ #define BCMA_RESET_ST 0x0804
+
++#define BCMA_NS_ROM_IOST_BOOT_DEV_MASK 0x0003
++#define BCMA_NS_ROM_IOST_BOOT_DEV_NOR 0x0000
++#define BCMA_NS_ROM_IOST_BOOT_DEV_NAND 0x0001
++#define BCMA_NS_ROM_IOST_BOOT_DEV_ROM 0x0002
++
+ /* BCMA PCI config space registers. */
+ #define BCMA_PCI_PMCSR 0x44
+ #define BCMA_PCI_PE 0x100