MIPS: BCM47XX: Move SPROM fallback code into sprom.c
authorRafał Miłecki <zajec5@gmail.com>
Tue, 28 Oct 2014 11:52:02 +0000 (12:52 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Mon, 24 Nov 2014 06:44:59 +0000 (07:44 +0100)
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
arch/mips/bcm47xx/setup.c
arch/mips/bcm47xx/sprom.c

index f1cc9d0..12a112d 100644 (file)
@@ -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);
 
index c00585d..444c65a 100644 (file)
@@ -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
index 41226b6..e772e77 100644 (file)
@@ -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
+}