]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/s390/cio/device.c
Merge branch 'for-linus' of git://www.linux-m32r.org/git/takata/linux-2.6_dev
[karo-tx-linux.git] / drivers / s390 / cio / device.c
index 6527f3f34493cfb74b4a3e58cdd529610e1ad01c..f780bdd3a04ea6093f4b3a6a41ba61425c1da164 100644 (file)
@@ -131,6 +131,10 @@ static void io_subchannel_shutdown(struct subchannel *);
 static int io_subchannel_sch_event(struct subchannel *, int);
 static int io_subchannel_chp_event(struct subchannel *, struct chp_link *,
                                   int);
+static void recovery_func(unsigned long data);
+struct workqueue_struct *ccw_device_work;
+wait_queue_head_t ccw_device_init_wq;
+atomic_t ccw_device_init_count;
 
 static struct css_device_id io_subchannel_ids[] = {
        { .match_flags = 0x1, .type = SUBCHANNEL_TYPE_IO, },
@@ -151,6 +155,13 @@ static int io_subchannel_prepare(struct subchannel *sch)
        return 0;
 }
 
+static void io_subchannel_settle(void)
+{
+       wait_event(ccw_device_init_wq,
+                  atomic_read(&ccw_device_init_count) == 0);
+       flush_workqueue(ccw_device_work);
+}
+
 static struct css_driver io_subchannel_driver = {
        .owner = THIS_MODULE,
        .subchannel_type = io_subchannel_ids,
@@ -162,16 +173,10 @@ static struct css_driver io_subchannel_driver = {
        .remove = io_subchannel_remove,
        .shutdown = io_subchannel_shutdown,
        .prepare = io_subchannel_prepare,
+       .settle = io_subchannel_settle,
 };
 
-struct workqueue_struct *ccw_device_work;
-wait_queue_head_t ccw_device_init_wq;
-atomic_t ccw_device_init_count;
-
-static void recovery_func(unsigned long data);
-
-static int __init
-init_ccw_bus_type (void)
+int __init io_subchannel_init(void)
 {
        int ret;
 
@@ -181,10 +186,10 @@ init_ccw_bus_type (void)
 
        ccw_device_work = create_singlethread_workqueue("cio");
        if (!ccw_device_work)
-               return -ENOMEM; /* FIXME: better errno ? */
+               return -ENOMEM;
        slow_path_wq = create_singlethread_workqueue("kslowcrw");
        if (!slow_path_wq) {
-               ret = -ENOMEM; /* FIXME: better errno ? */
+               ret = -ENOMEM;
                goto out_err;
        }
        if ((ret = bus_register (&ccw_bus_type)))
@@ -194,9 +199,6 @@ init_ccw_bus_type (void)
        if (ret)
                goto out_err;
 
-       wait_event(ccw_device_init_wq,
-                  atomic_read(&ccw_device_init_count) == 0);
-       flush_workqueue(ccw_device_work);
        return 0;
 out_err:
        if (ccw_device_work)
@@ -206,16 +208,6 @@ out_err:
        return ret;
 }
 
-static void __exit
-cleanup_ccw_bus_type (void)
-{
-       css_driver_unregister(&io_subchannel_driver);
-       bus_unregister(&ccw_bus_type);
-       destroy_workqueue(ccw_device_work);
-}
-
-subsys_initcall(init_ccw_bus_type);
-module_exit(cleanup_ccw_bus_type);
 
 /************************ device handling **************************/