[S390] cio: Add css_driver_{register,unregister}.
authorCornelia Huck <cornelia.huck@de.ibm.com>
Sat, 26 Jan 2008 13:10:41 +0000 (14:10 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Sat, 26 Jan 2008 13:10:58 +0000 (14:10 +0100)
Add wrapper functions for driver_register and driver_unregister so
that css drivers don't need to muck with struct device_driver
directly.

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/cio/css.c
drivers/s390/cio/css.h
drivers/s390/cio/device.c

index f558686a66dd97a9e8bf467354570d4ab536e49b..7d887f88bb737d3c6a4d6be60df5ce2454dc939a 100644 (file)
@@ -837,6 +837,33 @@ struct bus_type css_bus_type = {
        .shutdown = css_shutdown,
 };
 
+/**
+ * css_driver_register - register a css driver
+ * @cdrv: css driver to register
+ *
+ * This is mainly a wrapper around driver_register that sets name
+ * and bus_type in the embedded struct device_driver correctly.
+ */
+int css_driver_register(struct css_driver *cdrv)
+{
+       cdrv->drv.name = cdrv->name;
+       cdrv->drv.bus = &css_bus_type;
+       return driver_register(&cdrv->drv);
+}
+EXPORT_SYMBOL_GPL(css_driver_register);
+
+/**
+ * css_driver_unregister - unregister a css driver
+ * @cdrv: css driver to unregister
+ *
+ * This is a wrapper around driver_unregister.
+ */
+void css_driver_unregister(struct css_driver *cdrv)
+{
+       driver_unregister(&cdrv->drv);
+}
+EXPORT_SYMBOL_GPL(css_driver_unregister);
+
 subsys_initcall(init_channel_subsystem);
 
 MODULE_LICENSE("GPL");
index 32acd24a407c79b25cf78044ef2c8c04b09801f9..c9fd600411c4493e62c174d6937963dbc23d24bb 100644 (file)
@@ -132,6 +132,7 @@ struct css_driver {
        int (*probe)(struct subchannel *);
        int (*remove)(struct subchannel *);
        void (*shutdown)(struct subchannel *);
+       const char *name;
 };
 
 #define to_cssdriver(n) container_of(n, struct css_driver, drv)
@@ -141,6 +142,9 @@ struct css_driver {
  */
 extern struct bus_type css_bus_type;
 
+extern int css_driver_register(struct css_driver *);
+extern void css_driver_unregister(struct css_driver *);
+
 extern void css_sch_device_unregister(struct subchannel *);
 extern struct subchannel * get_subchannel_by_schid(struct subchannel_id);
 extern int css_init_done;
index 000c64129ed8139e82f1539b6bde6b2611e90c4c..7bccca9684e599bc6d753830f1875bfbcb6ca215 100644 (file)
@@ -125,10 +125,7 @@ static void io_subchannel_shutdown(struct subchannel *);
 
 static struct css_driver io_subchannel_driver = {
        .subchannel_type = SUBCHANNEL_TYPE_IO,
-       .drv = {
-               .name = "io_subchannel",
-               .bus  = &css_bus_type,
-       },
+       .name = "io_subchannel",
        .irq = io_subchannel_irq,
        .notify = io_subchannel_notify,
        .verify = io_subchannel_verify,
@@ -167,7 +164,8 @@ init_ccw_bus_type (void)
        if ((ret = bus_register (&ccw_bus_type)))
                goto out_err;
 
-       if ((ret = driver_register(&io_subchannel_driver.drv)))
+       ret = css_driver_register(&io_subchannel_driver);
+       if (ret)
                goto out_err;
 
        wait_event(ccw_device_init_wq,
@@ -187,7 +185,7 @@ out_err:
 static void __exit
 cleanup_ccw_bus_type (void)
 {
-       driver_unregister(&io_subchannel_driver.drv);
+       css_driver_unregister(&io_subchannel_driver);
        bus_unregister(&ccw_bus_type);
        destroy_workqueue(ccw_device_notify_work);
        destroy_workqueue(ccw_device_work);