brcm47xx: backport MIPS BCM47XX changes queued for 4.2
[openwrt/staging/chunkeey.git] / target / linux / brcm47xx / patches-3.18 / 032-05-MIPS-BCM47xx-Read-board-info-for-all-bcma-buses.patch
diff --git a/target/linux/brcm47xx/patches-3.18/032-05-MIPS-BCM47xx-Read-board-info-for-all-bcma-buses.patch b/target/linux/brcm47xx/patches-3.18/032-05-MIPS-BCM47xx-Read-board-info-for-all-bcma-buses.patch
new file mode 100644 (file)
index 0000000..d3873d4
--- /dev/null
@@ -0,0 +1,141 @@
+From 12e1ab54dcd414c3579cfd26be9d9c9e1cab92ad Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Tue, 12 May 2015 13:05:18 +0200
+Subject: [PATCH] MIPS: BCM47xx: Read board info for all bcma buses
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Extra bcma buses may be totally different models, see following dump:
+boardtype=0x0646
+pci/1/1/boardtype=0x0545
+pci/2/1/boardtype=0x62b
+We need to detect them properly to allow drivers apply some board
+specific hacks.
+
+[ralf@linux-mips.org: folded in Rafal's fix.]
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Cc: linux-mips@linux-mips.org
+Cc: Hauke Mehrtens <hauke@hauke-m.de>
+Patchwork: https://patchwork.linux-mips.org/patch/10028/
+Patchwork: https://patchwork.linux-mips.org/patch/10048/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ arch/mips/bcm47xx/setup.c                    |  3 --
+ arch/mips/bcm47xx/sprom.c                    | 44 ++++++++++++++--------------
+ arch/mips/include/asm/mach-bcm47xx/bcm47xx.h |  4 ---
+ 3 files changed, 22 insertions(+), 29 deletions(-)
+
+diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c
+index 82ff9fd..98c075f 100644
+--- a/arch/mips/bcm47xx/setup.c
++++ b/arch/mips/bcm47xx/setup.c
+@@ -206,9 +206,6 @@ void __init bcm47xx_bus_setup(void)
+               err = bcma_host_soc_init(&bcm47xx_bus.bcma);
+               if (err)
+                       panic("Failed to initialize BCMA bus (err %d)", err);
+-
+-              bcm47xx_fill_bcma_boardinfo(&bcm47xx_bus.bcma.bus.boardinfo,
+-                                          NULL);
+       }
+ #endif
+diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
+index 92a6c9d..b0d62e7 100644
+--- a/arch/mips/bcm47xx/sprom.c
++++ b/arch/mips/bcm47xx/sprom.c
+@@ -640,19 +640,6 @@ void bcm47xx_fill_ssb_boardinfo(struct ssb_boardinfo *boardinfo,
+ }
+ #endif
+-#ifdef CONFIG_BCM47XX_BCMA
+-void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo,
+-                               const char *prefix)
+-{
+-      nvram_read_u16(prefix, NULL, "boardvendor", &boardinfo->vendor, 0,
+-                     true);
+-      if (!boardinfo->vendor)
+-              boardinfo->vendor = SSB_BOARDVENDOR_BCM;
+-
+-      nvram_read_u16(prefix, NULL, "boardtype", &boardinfo->type, 0, true);
+-}
+-#endif
+-
+ #if defined(CONFIG_BCM47XX_SSB)
+ static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
+ {
+@@ -707,33 +694,46 @@ static void bcm47xx_sprom_apply_prefix_alias(char *prefix, size_t prefix_size)
+ static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
+ {
+-      char prefix[10];
++      struct bcma_boardinfo *binfo = &bus->boardinfo;
+       struct bcma_device *core;
++      char buf[10];
++      char *prefix;
++      bool fallback = false;
+       switch (bus->hosttype) {
+       case BCMA_HOSTTYPE_PCI:
+               memset(out, 0, sizeof(struct ssb_sprom));
+-              snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
++              snprintf(buf, sizeof(buf), "pci/%u/%u/",
+                        bus->host_pci->bus->number + 1,
+                        PCI_SLOT(bus->host_pci->devfn));
+-              bcm47xx_sprom_apply_prefix_alias(prefix, sizeof(prefix));
+-              bcm47xx_fill_sprom(out, prefix, false);
+-              return 0;
++              bcm47xx_sprom_apply_prefix_alias(buf, sizeof(buf));
++              prefix = buf;
++              break;
+       case BCMA_HOSTTYPE_SOC:
+               memset(out, 0, sizeof(struct ssb_sprom));
+               core = bcma_find_core(bus, BCMA_CORE_80211);
+               if (core) {
+-                      snprintf(prefix, sizeof(prefix), "sb/%u/",
++                      snprintf(buf, sizeof(buf), "sb/%u/",
+                                core->core_index);
+-                      bcm47xx_fill_sprom(out, prefix, true);
++                      prefix = buf;
++                      fallback = true;
+               } else {
+-                      bcm47xx_fill_sprom(out, NULL, false);
++                      prefix = NULL;
+               }
+-              return 0;
++              break;
+       default:
+               pr_warn("Unable to fill SPROM for given bustype.\n");
+               return -EINVAL;
+       }
++
++      nvram_read_u16(prefix, NULL, "boardvendor", &binfo->vendor, 0, true);
++      if (!binfo->vendor)
++              binfo->vendor = SSB_BOARDVENDOR_BCM;
++      nvram_read_u16(prefix, NULL, "boardtype", &binfo->type, 0, true);
++
++      bcm47xx_fill_sprom(out, prefix, fallback);
++
++      return 0;
+ }
+ #endif
+diff --git a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
+index 8ed77f6..1461c10 100644
+--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
++++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
+@@ -52,10 +52,6 @@ void bcm47xx_fill_sprom(struct ssb_sprom *sprom, const char *prefix,
+ void bcm47xx_fill_ssb_boardinfo(struct ssb_boardinfo *boardinfo,
+                               const char *prefix);
+ #endif
+-#ifdef CONFIG_BCM47XX_BCMA
+-void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo,
+-                               const char *prefix);
+-#endif
+ void bcm47xx_set_system_type(u16 chip_id);
+-- 
+1.8.4.5
+