Commit 0510931e authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Kalle Valo

bcma: use module_init for the main part of bus initialization

So far we were using fs_initcall. It was (and still is) needed because
struct bus_type has to be registered early. However main bus
initialization has to happen later as it requires SPROM which depends on
NVRAM which depends on mtd.
Solve it by using fs_initcall only for bus_register call and module_init
for the rest. It affects bcma only when built-in obviously.

This was tested with BCM4706 and BCM5357C0 (BCM47XX), BCM4708A0
(ARCH_BCM_5301X) and BCM43225 (PCIe card with bcma as module).
Signed-off-by: default avatarRafał Miłecki <zajec5@gmail.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent f99551a2
......@@ -668,11 +668,36 @@ static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env)
core->id.rev, core->id.class);
}
static int __init bcma_modinit(void)
static unsigned int bcma_bus_registered;
/*
* If built-in, bus has to be registered early, before any driver calls
* bcma_driver_register.
* Otherwise registering driver would trigger BUG in driver_register.
*/
static int __init bcma_init_bus_register(void)
{
int err;
if (bcma_bus_registered)
return 0;
err = bus_register(&bcma_bus_type);
if (!err)
bcma_bus_registered = 1;
return err;
}
#ifndef MODULE
fs_initcall(bcma_init_bus_register);
#endif
/* Main initialization has to be done with SPI/mtd/NAND/SPROM available */
static int __init bcma_modinit(void)
{
int err;
err = bcma_init_bus_register();
if (err)
return err;
......@@ -691,7 +716,7 @@ static int __init bcma_modinit(void)
return err;
}
fs_initcall(bcma_modinit);
module_init(bcma_modinit);
static void __exit bcma_modexit(void)
{
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment