Skip to contentSkip to conversation

pcmcia (2/5): add bus_type pcmcia_bus_type

PATCH In review Dominik Brodowski 3 participants 3 messages Mar 22, 2003 – Mar 25, 2003 Pcmcia

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 pcmcia (2/5): add bus_type pcmcia_bus_type

Register a bus_type pcmcia_bus_type. This means the initialization of the ds module needs to be done in two levels: one quite early (subsys_initcall) so that drivers may use the bus_type; the other one must stay that late (late_initcall). As only one initcall can be specified within one module, some tweaking is needed.

Dominik

drivers/pcmcia/ds.c +30 -5
diff -ruN linux-original/drivers/pcmcia/ds.c linux/drivers/pcmcia/ds.c
@@ -881,7 +881,18 @@
 
 /*====================================================================*/
 
-int __init init_pcmcia_ds(void)
+struct bus_type pcmcia_bus_type = {
+	.name = "pcmcia",
+};
+EXPORT_SYMBOL(pcmcia_bus_type);
+
+static int __init init_pcmcia_bus(void)
+{
+	bus_register(&pcmcia_bus_type);
+	return 0;
+}
+
+static int __init init_pcmcia_ds(void)
 {
     client_reg_t client_reg;
     servinfo_t serv;
@@ -967,11 +978,8 @@
     return 0;
 }
 
-late_initcall(init_pcmcia_ds);
-
-#ifdef MODULE
 
-void __exit cleanup_module(void)
+static void __exit exit_pcmcia_ds(void)
 {
     int i;
 #ifdef CONFIG_PROC_FS
@@ -984,6 +992,23 @@
 	pcmcia_deregister_client(socket_table[i].handle);
     sockets = 0;
     kfree(socket_table);
+    bus_unregister(&pcmcia_bus_type);
 }
 
+#ifdef MODULE
+
+/* init_pcmcia_bus must be done early, init_pcmcia_ds late. If we load this 
+ * as a module, we can only specify one initcall, though... 
+ */
+static int __init init_pcmcia_module(void) {
+	init_pcmcia_bus();
+	return init_pcmcia_ds();
+}
+module_init(init_pcmcia_module);
+
+#else /* !MODULE */
+subsys_initcall(init_pcmcia_bus);
+late_initcall(init_pcmcia_ds);
 #endif
+
+module_exit(exit_pcmcia_ds);
include/pcmcia/ds.h +3 -0
diff -ruN linux-original/include/pcmcia/ds.h linux/include/pcmcia/ds.h
@@ -32,6 +32,7 @@
 
 #include <pcmcia/driver_ops.h>
 #include <pcmcia/bulkmem.h>
+#include <linux/device.h>
 
 typedef struct tuple_parse_t {
     tuple_t		tuple;
@@ -143,6 +144,8 @@
 #define register_pcmcia_driver register_pccard_driver
 #define unregister_pcmcia_driver unregister_pccard_driver
 
+extern struct bus_type pcmcia_bus_type;
+
 #endif /* __KERNEL__ */
 
 #endif /* _LINUX_DS_H */
#1 lore raw
Quoted 6 lines · Dominik Brodowski

Register a bus_type pcmcia_bus_type. This means the initialization of the ds module needs to be done in two levels: one quite early (subsys_initcall) so that drivers may use the bus_type; the other one must stay that late (late_initcall). As only one initcall can be specified within one module, some tweaking is needed.

Hmm.. We should fix the module interface instead.

I've applied this patch, but there's no reall reason why modules shouldn't be able to have multiple initcalls.

Having drivers behave differently whether they are compiled in or as modules is not a good thing. Rusty?

Linus

#2 lore raw

In message <[email protected]> you wri te:

Quoted 9 lines · Dominik Brodowski
Quoted 6 lines

Register a bus_type pcmcia_bus_type. This means the initialization of the ds module needs to be done in two levels: one quite early (subsys_initcall) so that drivers may use the bus_type; the other one must stay that late (late_initcall). As only one initcall can be specified within one module, some tweaking is needed.

Quoted 4 lines

Hmm.. We should fix the module interface instead.

I've applied this patch, but there's no reall reason why modules shouldn't be able to have multiple initcalls.

Sure, it's been asked for before (dwmw2 IIRC).

We need a new interface though, like:

	init_and_cleanup(init1, cleanup1);

Because you have to unroll them when one fails.

But of course, you thought of that before you asked, right? Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.