[PATCH] driver core: replace "hotplug" by "uevent"
[linux-2.6-block.git] / drivers / base / core.c
index 6ab73f5c799aa486b3cc6f8050b82f962c02ff89..fd8059920dbfde1a91a472d63480d0293b88236b 100644 (file)
@@ -90,7 +90,7 @@ static struct kobj_type ktype_device = {
 };
 
 
-static int dev_hotplug_filter(struct kset *kset, struct kobject *kobj)
+static int dev_uevent_filter(struct kset *kset, struct kobject *kobj)
 {
        struct kobj_type *ktype = get_ktype(kobj);
 
@@ -102,14 +102,14 @@ static int dev_hotplug_filter(struct kset *kset, struct kobject *kobj)
        return 0;
 }
 
-static const char *dev_hotplug_name(struct kset *kset, struct kobject *kobj)
+static const char *dev_uevent_name(struct kset *kset, struct kobject *kobj)
 {
        struct device *dev = to_dev(kobj);
 
        return dev->bus->name;
 }
 
-static int dev_hotplug(struct kset *kset, struct kobject *kobj, char **envp,
+static int dev_uevent(struct kset *kset, struct kobject *kobj, char **envp,
                        int num_envp, char *buffer, int buffer_size)
 {
        struct device *dev = to_dev(kobj);
@@ -119,15 +119,15 @@ static int dev_hotplug(struct kset *kset, struct kobject *kobj, char **envp,
 
        /* add bus name of physical device */
        if (dev->bus)
-               add_hotplug_env_var(envp, num_envp, &i,
-                                   buffer, buffer_size, &length,
-                                   "PHYSDEVBUS=%s", dev->bus->name);
+               add_uevent_var(envp, num_envp, &i,
+                              buffer, buffer_size, &length,
+                              "PHYSDEVBUS=%s", dev->bus->name);
 
        /* add driver name of physical device */
        if (dev->driver)
-               add_hotplug_env_var(envp, num_envp, &i,
-                                   buffer, buffer_size, &length,
-                                   "PHYSDEVDRIVER=%s", dev->driver->name);
+               add_uevent_var(envp, num_envp, &i,
+                              buffer, buffer_size, &length,
+                              "PHYSDEVDRIVER=%s", dev->driver->name);
 
        /* terminate, set to next free slot, shrink available space */
        envp[i] = NULL;
@@ -136,11 +136,11 @@ static int dev_hotplug(struct kset *kset, struct kobject *kobj, char **envp,
        buffer = &buffer[length];
        buffer_size -= length;
 
-       if (dev->bus && dev->bus->hotplug) {
+       if (dev->bus && dev->bus->uevent) {
                /* have the bus specific function add its stuff */
-               retval = dev->bus->hotplug (dev, envp, num_envp, buffer, buffer_size);
+               retval = dev->bus->uevent(dev, envp, num_envp, buffer, buffer_size);
                        if (retval) {
-                       pr_debug ("%s - hotplug() returned %d\n",
+                       pr_debug ("%s - uevent() returned %d\n",
                                  __FUNCTION__, retval);
                }
        }
@@ -148,17 +148,24 @@ static int dev_hotplug(struct kset *kset, struct kobject *kobj, char **envp,
        return retval;
 }
 
-static struct kset_hotplug_ops device_hotplug_ops = {
-       .filter =       dev_hotplug_filter,
-       .name =         dev_hotplug_name,
-       .hotplug =      dev_hotplug,
+static struct kset_uevent_ops device_uevent_ops = {
+       .filter =       dev_uevent_filter,
+       .name =         dev_uevent_name,
+       .uevent =       dev_uevent,
 };
 
+static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,
+                           const char *buf, size_t count)
+{
+       kobject_uevent(&dev->kobj, KOBJ_ADD);
+       return count;
+}
+
 /**
  *     device_subsys - structure to be registered with kobject core.
  */
 
-decl_subsys(devices, &ktype_device, &device_hotplug_ops);
+decl_subsys(devices, &ktype_device, &device_uevent_ops);
 
 
 /**
@@ -225,6 +232,7 @@ void device_initialize(struct device *dev)
                   klist_children_put);
        INIT_LIST_HEAD(&dev->dma_pools);
        init_MUTEX(&dev->sem);
+       device_init_wakeup(dev, 0);
 }
 
 /**
@@ -258,7 +266,15 @@ int device_add(struct device *dev)
 
        if ((error = kobject_add(&dev->kobj)))
                goto Error;
-       kobject_hotplug(&dev->kobj, KOBJ_ADD);
+
+       dev->uevent_attr.attr.name = "uevent";
+       dev->uevent_attr.attr.mode = S_IWUSR;
+       if (dev->driver)
+               dev->uevent_attr.attr.owner = dev->driver->owner;
+       dev->uevent_attr.store = store_uevent;
+       device_create_file(dev, &dev->uevent_attr);
+
+       kobject_uevent(&dev->kobj, KOBJ_ADD);
        if ((error = device_pm_add(dev)))
                goto PMError;
        if ((error = bus_add_device(dev)))
@@ -275,7 +291,7 @@ int device_add(struct device *dev)
  BusError:
        device_pm_remove(dev);
  PMError:
-       kobject_hotplug(&dev->kobj, KOBJ_REMOVE);
+       kobject_uevent(&dev->kobj, KOBJ_REMOVE);
        kobject_del(&dev->kobj);
  Error:
        if (parent)
@@ -349,6 +365,7 @@ void device_del(struct device * dev)
 
        if (parent)
                klist_del(&dev->knode_parent);
+       device_remove_file(dev, &dev->uevent_attr);
 
        /* Notify the platform of the removal, in case they
         * need to do anything...
@@ -357,7 +374,7 @@ void device_del(struct device * dev)
                platform_notify_remove(dev);
        bus_remove_device(dev);
        device_pm_remove(dev);
-       kobject_hotplug(&dev->kobj, KOBJ_REMOVE);
+       kobject_uevent(&dev->kobj, KOBJ_REMOVE);
        kobject_del(&dev->kobj);
        if (parent)
                put_device(parent);
@@ -390,11 +407,11 @@ static struct device * next_device(struct klist_iter * i)
 
 /**
  *     device_for_each_child - device child iterator.
- *     @dev:   parent struct device.
+ *     @parent: parent struct device.
  *     @data:  data for the callback.
  *     @fn:    function to be called for each device.
  *
- *     Iterate over @dev's child devices, and call @fn for each,
+ *     Iterate over @parent's child devices, and call @fn for each,
  *     passing it @data.
  *
  *     We check the return of @fn each time. If it returns anything