bcma: use separated function to initialize bus on SoC
authorRafał Miłecki <zajec5@gmail.com>
Mon, 1 Sep 2014 21:11:07 +0000 (23:11 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 9 Sep 2014 19:27:18 +0000 (15:27 -0400)
This is required to split SoC bus init into two phases. The later one
(which includes scanning) should be called when kalloc is available.

Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Acked-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
arch/mips/bcm47xx/setup.c
drivers/bcma/host_soc.c
include/linux/bcma/bcma_soc.h

index 2b63e7e..fff6ed4 100644 (file)
@@ -201,6 +201,10 @@ static void __init bcm47xx_register_bcma(void)
                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);
+
+       err = bcma_host_soc_init(&bcm47xx_bus.bcma);
        if (err)
                panic("Failed to initialize BCMA bus (err %d)", err);
 
index 379e0d4..718e054 100644 (file)
@@ -165,7 +165,6 @@ static const struct bcma_host_ops bcma_host_soc_ops = {
 int __init bcma_host_soc_register(struct bcma_soc *soc)
 {
        struct bcma_bus *bus = &soc->bus;
-       int err;
 
        /* iomap only first core. We have to read some register on this core
         * to scan the bus.
@@ -181,7 +180,15 @@ int __init bcma_host_soc_register(struct bcma_soc *soc)
        /* Initialize struct, detect chip */
        bcma_init_bus(bus);
 
-       /* Register */
+       return 0;
+}
+
+int __init bcma_host_soc_init(struct bcma_soc *soc)
+{
+       struct bcma_bus *bus = &soc->bus;
+       int err;
+
+       /* Scan bus and initialize it */
        err = bcma_bus_early_register(bus, &soc->core_cc, &soc->core_mips);
        if (err)
                iounmap(bus->mmio);
index 4203c55..f24d245 100644 (file)
@@ -10,6 +10,7 @@ struct bcma_soc {
 };
 
 int __init bcma_host_soc_register(struct bcma_soc *soc);
+int __init bcma_host_soc_init(struct bcma_soc *soc);
 
 int bcma_bus_register(struct bcma_bus *bus);