]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/s390/cio/ccwgroup.c
[S390] bus_id -> dev_name conversions
[linux-2.6-omap-h63xx.git] / drivers / s390 / cio / ccwgroup.c
index f38923e38e92be588d915d8616bd5bb897419b2e..e17b462ace03e7ca30ceb8201f9d85c594c69850 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/ctype.h>
 #include <linux/dcache.h>
 
-#include <asm/semaphore.h>
 #include <asm/ccwdev.h>
 #include <asm/ccwgroup.h>
 
@@ -113,8 +112,11 @@ ccwgroup_release (struct device *dev)
        gdev = to_ccwgroupdev(dev);
 
        for (i = 0; i < gdev->count; i++) {
-               dev_set_drvdata(&gdev->cdev[i]->dev, NULL);
-               put_device(&gdev->cdev[i]->dev);
+               if (gdev->cdev[i]) {
+                       if (dev_get_drvdata(&gdev->cdev[i]->dev) == gdev)
+                               dev_set_drvdata(&gdev->cdev[i]->dev, NULL);
+                       put_device(&gdev->cdev[i]->dev);
+               }
        }
        kfree(gdev);
 }
@@ -222,6 +224,13 @@ int ccwgroup_create_from_string(struct device *root, unsigned int creator_id,
        atomic_set(&gdev->onoff, 0);
        mutex_init(&gdev->reg_mutex);
        mutex_lock(&gdev->reg_mutex);
+       gdev->creator_id = creator_id;
+       gdev->count = num_devices;
+       gdev->dev.bus = &ccwgroup_bus_type;
+       gdev->dev.parent = root;
+       gdev->dev.release = ccwgroup_release;
+       device_initialize(&gdev->dev);
+
        curr_buf = buf;
        for (i = 0; i < num_devices && curr_buf; i++) {
                rc = __get_next_bus_id(&curr_buf, tmp_bus_id);
@@ -259,16 +268,11 @@ int ccwgroup_create_from_string(struct device *root, unsigned int creator_id,
                rc = -EINVAL;
                goto error;
        }
-       gdev->creator_id = creator_id;
-       gdev->count = num_devices;
-       gdev->dev.bus = &ccwgroup_bus_type;
-       gdev->dev.parent = root;
-       gdev->dev.release = ccwgroup_release;
 
        snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s",
-                       gdev->cdev[0]->dev.bus_id);
+                       dev_name(&gdev->cdev[0]->dev));
 
-       rc = device_register(&gdev->dev);
+       rc = device_add(&gdev->dev);
        if (rc)
                goto error;
        get_device(&gdev->dev);
@@ -293,6 +297,7 @@ error:
                        if (dev_get_drvdata(&gdev->cdev[i]->dev) == gdev)
                                dev_set_drvdata(&gdev->cdev[i]->dev, NULL);
                        put_device(&gdev->cdev[i]->dev);
+                       gdev->cdev[i] = NULL;
                }
        mutex_unlock(&gdev->reg_mutex);
        put_device(&gdev->dev);
@@ -374,7 +379,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
 {
        struct ccwgroup_device *gdev;
        struct ccwgroup_driver *gdrv;
-       unsigned int value;
+       unsigned long value;
        int ret;
 
        gdev = to_ccwgroupdev(dev);
@@ -385,7 +390,9 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
        if (!try_module_get(gdrv->owner))
                return -EINVAL;
 
-       value = simple_strtoul(buf, NULL, 0);
+       ret = strict_strtoul(buf, 0, &value);
+       if (ret)
+               goto out;
        ret = count;
        if (value == 1)
                ccwgroup_set_online(gdev);
@@ -393,6 +400,7 @@ ccwgroup_online_store (struct device *dev, struct device_attribute *attr, const
                ccwgroup_set_offline(gdev);
        else
                ret = -EINVAL;
+out:
        module_put(gdrv->owner);
        return ret;
 }