217 lines
6.7 KiB
Diff
217 lines
6.7 KiB
Diff
From a59da8fb3b2a1f2df5f871464e43cd5b6ca6ceb1 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
|
Date: Tue, 28 Oct 2014 12:52:02 +0100
|
|
Subject: [PATCH 157/158] MIPS: BCM47XX: Move SPROM fallback code into sprom.c
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This is some general cleanup as well as preparing sprom.c to become a
|
|
standalone driver. We will need this for bcm53xx ARM arch support.
|
|
|
|
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
|
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|
Cc: linux-mips@linux-mips.org
|
|
Patchwork: https://patchwork.linux-mips.org/patch/8232/
|
|
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
|
---
|
|
arch/mips/bcm47xx/bcm47xx_private.h | 3 ++
|
|
arch/mips/bcm47xx/setup.c | 58 ++-----------------------------
|
|
arch/mips/bcm47xx/sprom.c | 68 +++++++++++++++++++++++++++++++++++++
|
|
3 files changed, 73 insertions(+), 56 deletions(-)
|
|
|
|
diff --git a/arch/mips/bcm47xx/bcm47xx_private.h b/arch/mips/bcm47xx/bcm47xx_private.h
|
|
index f1cc9d0..12a112d 100644
|
|
--- a/arch/mips/bcm47xx/bcm47xx_private.h
|
|
+++ b/arch/mips/bcm47xx/bcm47xx_private.h
|
|
@@ -6,6 +6,9 @@
|
|
/* prom.c */
|
|
void __init bcm47xx_prom_highmem_init(void);
|
|
|
|
+/* sprom.c */
|
|
+void bcm47xx_sprom_register_fallbacks(void);
|
|
+
|
|
/* buttons.c */
|
|
int __init bcm47xx_buttons_register(void);
|
|
|
|
diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c
|
|
index c00585d..444c65a 100644
|
|
--- a/arch/mips/bcm47xx/setup.c
|
|
+++ b/arch/mips/bcm47xx/setup.c
|
|
@@ -102,23 +102,6 @@ static void bcm47xx_machine_halt(void)
|
|
}
|
|
|
|
#ifdef CONFIG_BCM47XX_SSB
|
|
-static int bcm47xx_get_sprom_ssb(struct ssb_bus *bus, struct ssb_sprom *out)
|
|
-{
|
|
- char prefix[10];
|
|
-
|
|
- if (bus->bustype == SSB_BUSTYPE_PCI) {
|
|
- memset(out, 0, sizeof(struct ssb_sprom));
|
|
- snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
|
- bus->host_pci->bus->number + 1,
|
|
- PCI_SLOT(bus->host_pci->devfn));
|
|
- bcm47xx_fill_sprom(out, prefix, false);
|
|
- return 0;
|
|
- } else {
|
|
- printk(KERN_WARNING "bcm47xx: unable to fill SPROM for given bustype.\n");
|
|
- return -EINVAL;
|
|
- }
|
|
-}
|
|
-
|
|
static int bcm47xx_get_invariants(struct ssb_bus *bus,
|
|
struct ssb_init_invariants *iv)
|
|
{
|
|
@@ -144,11 +127,6 @@ static void __init bcm47xx_register_ssb(void)
|
|
char buf[100];
|
|
struct ssb_mipscore *mcore;
|
|
|
|
- err = ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom_ssb);
|
|
- if (err)
|
|
- printk(KERN_WARNING "bcm47xx: someone else already registered"
|
|
- " a ssb SPROM callback handler (err %d)\n", err);
|
|
-
|
|
err = ssb_bus_ssbbus_register(&(bcm47xx_bus.ssb), SSB_ENUM_BASE,
|
|
bcm47xx_get_invariants);
|
|
if (err)
|
|
@@ -171,44 +149,10 @@ static void __init bcm47xx_register_ssb(void)
|
|
#endif
|
|
|
|
#ifdef CONFIG_BCM47XX_BCMA
|
|
-static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
|
|
-{
|
|
- char prefix[10];
|
|
- struct bcma_device *core;
|
|
-
|
|
- switch (bus->hosttype) {
|
|
- case BCMA_HOSTTYPE_PCI:
|
|
- memset(out, 0, sizeof(struct ssb_sprom));
|
|
- snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
|
- bus->host_pci->bus->number + 1,
|
|
- PCI_SLOT(bus->host_pci->devfn));
|
|
- bcm47xx_fill_sprom(out, prefix, false);
|
|
- return 0;
|
|
- 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/",
|
|
- core->core_index);
|
|
- bcm47xx_fill_sprom(out, prefix, true);
|
|
- } else {
|
|
- bcm47xx_fill_sprom(out, NULL, false);
|
|
- }
|
|
- return 0;
|
|
- default:
|
|
- pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
|
|
- return -EINVAL;
|
|
- }
|
|
-}
|
|
-
|
|
static void __init bcm47xx_register_bcma(void)
|
|
{
|
|
int err;
|
|
|
|
- err = bcma_arch_register_fallback_sprom(&bcm47xx_get_sprom_bcma);
|
|
- if (err)
|
|
- pr_warn("bcm47xx: someone else already registered a bcma SPROM callback handler (err %d)\n", err);
|
|
-
|
|
err = bcma_host_soc_register(&bcm47xx_bus.bcma);
|
|
if (err)
|
|
panic("Failed to register BCMA bus (err %d)", err);
|
|
@@ -229,6 +173,7 @@ void __init plat_mem_setup(void)
|
|
printk(KERN_INFO "bcm47xx: using bcma bus\n");
|
|
#ifdef CONFIG_BCM47XX_BCMA
|
|
bcm47xx_bus_type = BCM47XX_BUS_TYPE_BCMA;
|
|
+ bcm47xx_sprom_register_fallbacks();
|
|
bcm47xx_register_bcma();
|
|
bcm47xx_set_system_type(bcm47xx_bus.bcma.bus.chipinfo.id);
|
|
#ifdef CONFIG_HIGHMEM
|
|
@@ -239,6 +184,7 @@ void __init plat_mem_setup(void)
|
|
printk(KERN_INFO "bcm47xx: using ssb bus\n");
|
|
#ifdef CONFIG_BCM47XX_SSB
|
|
bcm47xx_bus_type = BCM47XX_BUS_TYPE_SSB;
|
|
+ bcm47xx_sprom_register_fallbacks();
|
|
bcm47xx_register_ssb();
|
|
bcm47xx_set_system_type(bcm47xx_bus.ssb.chip_id);
|
|
#endif
|
|
diff --git a/arch/mips/bcm47xx/sprom.c b/arch/mips/bcm47xx/sprom.c
|
|
index 41226b6..e772e77 100644
|
|
--- a/arch/mips/bcm47xx/sprom.c
|
|
+++ b/arch/mips/bcm47xx/sprom.c
|
|
@@ -801,3 +801,71 @@ void bcm47xx_fill_bcma_boardinfo(struct bcma_boardinfo *boardinfo,
|
|
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)
|
|
+{
|
|
+ char prefix[10];
|
|
+
|
|
+ if (bus->bustype == SSB_BUSTYPE_PCI) {
|
|
+ memset(out, 0, sizeof(struct ssb_sprom));
|
|
+ snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
|
+ bus->host_pci->bus->number + 1,
|
|
+ PCI_SLOT(bus->host_pci->devfn));
|
|
+ bcm47xx_fill_sprom(out, prefix, false);
|
|
+ return 0;
|
|
+ } else {
|
|
+ pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BCM47XX_BCMA)
|
|
+static int bcm47xx_get_sprom_bcma(struct bcma_bus *bus, struct ssb_sprom *out)
|
|
+{
|
|
+ char prefix[10];
|
|
+ struct bcma_device *core;
|
|
+
|
|
+ switch (bus->hosttype) {
|
|
+ case BCMA_HOSTTYPE_PCI:
|
|
+ memset(out, 0, sizeof(struct ssb_sprom));
|
|
+ snprintf(prefix, sizeof(prefix), "pci/%u/%u/",
|
|
+ bus->host_pci->bus->number + 1,
|
|
+ PCI_SLOT(bus->host_pci->devfn));
|
|
+ bcm47xx_fill_sprom(out, prefix, false);
|
|
+ return 0;
|
|
+ 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/",
|
|
+ core->core_index);
|
|
+ bcm47xx_fill_sprom(out, prefix, true);
|
|
+ } else {
|
|
+ bcm47xx_fill_sprom(out, NULL, false);
|
|
+ }
|
|
+ return 0;
|
|
+ default:
|
|
+ pr_warn("bcm47xx: unable to fill SPROM for given bustype.\n");
|
|
+ return -EINVAL;
|
|
+ }
|
|
+}
|
|
+#endif
|
|
+
|
|
+/*
|
|
+ * On bcm47xx we need to register SPROM fallback handler very early, so we can't
|
|
+ * use anything like platform device / driver for this.
|
|
+ */
|
|
+void bcm47xx_sprom_register_fallbacks(void)
|
|
+{
|
|
+#if defined(CONFIG_BCM47XX_SSB)
|
|
+ if (ssb_arch_register_fallback_sprom(&bcm47xx_get_sprom_ssb))
|
|
+ pr_warn("Failed to registered ssb SPROM handler\n");
|
|
+#endif
|
|
+
|
|
+#if defined(CONFIG_BCM47XX_BCMA)
|
|
+ if (bcma_arch_register_fallback_sprom(&bcm47xx_get_sprom_bcma))
|
|
+ pr_warn("Failed to registered bcma SPROM handler\n");
|
|
+#endif
|
|
+}
|
|
--
|
|
1.8.4.5
|
|
|