+++ /dev/null
-From c6516d2c672450fb27783866397a487511d90bba Mon Sep 17 00:00:00 2001
-From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Fri, 22 Aug 2014 08:44:52 +0200
-Subject: [PATCH 08/17] bcma: only map wrapper if its address is available
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The Chipcommon B core does not have a wrap address and it would fail here.
-
-Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
----
- drivers/bcma/host_soc.c | 4 ++++
- drivers/bcma/scan.c | 11 +++++++----
- 2 files changed, 11 insertions(+), 4 deletions(-)
-
---- a/drivers/bcma/host_soc.c
-+++ b/drivers/bcma/host_soc.c
-@@ -137,12 +137,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/drivers/bcma/scan.c
-+++ b/drivers/bcma/scan.c
-@@ -421,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;
/* 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:
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
{ BCMA_CORE_ARMCA9, "ARM Cortex A9 core (ihost)" },
{ BCMA_CORE_AMEMC, "AMEMC (DDR)" },
{ BCMA_CORE_ALTA, "ALTA (I2S)" },
+@@ -421,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/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/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/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