All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] bcma: use module_init for the main part of bus initialization
@ 2015-12-17 19:53 Rafał Miłecki
  2015-12-31  8:17 ` Kalle Valo
  0 siblings, 1 reply; 2+ messages in thread
From: Rafał Miłecki @ 2015-12-17 19:53 UTC (permalink / raw)
  To: Kalle Valo, linux-wireless; +Cc: Hauke Mehrtens, Rafał Miłecki

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: Rafał Miłecki <zajec5@gmail.com>
---
This change was already suggested in RFC patch early this year:
https://patchwork.kernel.org/patch/5802611/

Noone objected / got any better idea, so I'm sending a final version.

V1 (from RFC):
* Use int bcma_bus_registered to avoid #ifdef MODULE and make code simpler.
* Document reason for this behavior better.
---
 drivers/bcma/main.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index 59d8d0d..c466f75 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -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)
 {
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] bcma: use module_init for the main part of bus initialization
  2015-12-17 19:53 [PATCH] bcma: use module_init for the main part of bus initialization Rafał Miłecki
@ 2015-12-31  8:17 ` Kalle Valo
  0 siblings, 0 replies; 2+ messages in thread
From: Kalle Valo @ 2015-12-31  8:17 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: linux-wireless, Hauke Mehrtens

Rafał Miłecki <zajec5@gmail.com> writes:

> 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: Rafał Miłecki <zajec5@gmail.com>
> ---
> This change was already suggested in RFC patch early this year:
> https://patchwork.kernel.org/patch/5802611/
>
> Noone objected / got any better idea, so I'm sending a final version.
>
> V1 (from RFC):
> * Use int bcma_bus_registered to avoid #ifdef MODULE and make code simpler.
> * Document reason for this behavior better.

Applied manually, thanks.

-- 
Kalle Valo

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-12-31  8:18 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-17 19:53 [PATCH] bcma: use module_init for the main part of bus initialization Rafał Miłecki
2015-12-31  8:17 ` Kalle Valo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.