]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/base/bus.c
kset: convert struct bus_device->devices to use kset_create
[linux-2.6-omap-h63xx.git] / drivers / base / bus.c
index 0a8d075f3e6c3f785e36e1fad5020363f8f66052..b23eeb2d4ead0ae8c6226cba940f69bc656d080a 100644 (file)
@@ -89,7 +89,7 @@ static void driver_release(struct kobject * kobj)
         */
 }
 
-static struct kobj_type ktype_driver = {
+static struct kobj_type driver_ktype = {
        .sysfs_ops      = &driver_sysfs_ops,
        .release        = driver_release,
 };
@@ -166,7 +166,7 @@ static struct kset_uevent_ops bus_uevent_ops = {
        .filter = bus_uevent_filter,
 };
 
-static decl_subsys(bus, &bus_ktype, &bus_uevent_ops);
+static struct kset *bus_kset;
 
 
 #ifdef CONFIG_HOTPLUG
@@ -449,7 +449,7 @@ int bus_add_device(struct device * dev)
                error = device_add_attrs(bus, dev);
                if (error)
                        goto out_put;
-               error = sysfs_create_link(&bus->devices.kobj,
+               error = sysfs_create_link(&bus->devices_kset->kobj,
                                                &dev->kobj, dev->bus_id);
                if (error)
                        goto out_id;
@@ -466,7 +466,7 @@ int bus_add_device(struct device * dev)
 out_deprecated:
        sysfs_remove_link(&dev->kobj, "subsystem");
 out_subsys:
-       sysfs_remove_link(&bus->devices.kobj, dev->bus_id);
+       sysfs_remove_link(&bus->devices_kset->kobj, dev->bus_id);
 out_id:
        device_remove_attrs(bus, dev);
 out_put:
@@ -512,7 +512,7 @@ void bus_remove_device(struct device * dev)
        if (dev->bus) {
                sysfs_remove_link(&dev->kobj, "subsystem");
                remove_deprecated_bus_links(dev);
-               sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id);
+               sysfs_remove_link(&dev->bus->devices_kset->kobj, dev->bus_id);
                device_remove_attrs(dev->bus, dev);
                if (dev->is_registered) {
                        dev->is_registered = 0;
@@ -610,6 +610,17 @@ static inline int add_probe_files(struct bus_type *bus) { return 0; }
 static inline void remove_probe_files(struct bus_type *bus) {}
 #endif
 
+static ssize_t driver_uevent_store(struct device_driver *drv,
+                                  const char *buf, size_t count)
+{
+       enum kobject_action action;
+
+       if (kobject_action_type(buf, count, &action) == 0)
+               kobject_uevent(&drv->kobj, action);
+       return count;
+}
+static DRIVER_ATTR(uevent, S_IWUSR, NULL, driver_uevent_store);
+
 /**
  *     bus_add_driver - Add a driver to the bus.
  *     @drv:   driver.
@@ -628,6 +639,7 @@ int bus_add_driver(struct device_driver *drv)
        if (error)
                goto out_put_bus;
        drv->kobj.kset = &bus->drivers;
+       drv->kobj.ktype = &driver_ktype;
        error = kobject_register(&drv->kobj);
        if (error)
                goto out_put_bus;
@@ -640,6 +652,11 @@ int bus_add_driver(struct device_driver *drv)
        klist_add_tail(&drv->knode_bus, &bus->klist_drivers);
        module_add_driver(drv->owner, drv);
 
+       error = driver_create_file(drv, &driver_attr_uevent);
+       if (error) {
+               printk(KERN_ERR "%s: uevent attr (%s) failed\n",
+                       __FUNCTION__, drv->name);
+       }
        error = driver_add_attrs(bus, drv);
        if (error) {
                /* How the hell do we get out of this pickle? Give up */
@@ -677,6 +694,7 @@ void bus_remove_driver(struct device_driver * drv)
 
        remove_bind_files(drv);
        driver_remove_attrs(drv->bus, drv);
+       driver_remove_file(drv, &driver_attr_uevent);
        klist_remove(&drv->knode_bus);
        pr_debug("bus %s: remove driver %s\n", drv->bus->name, drv->name);
        driver_detach(drv);
@@ -749,7 +767,7 @@ EXPORT_SYMBOL_GPL(device_reprobe);
 #if 0
 struct bus_type * find_bus(char * name)
 {
-       struct kobject * k = kset_find_obj(&bus_subsys.kset, name);
+       struct kobject * k = kset_find_obj(bus_kset, name);
        return k ? to_bus(k) : NULL;
 }
 #endif  /*  0  */
@@ -804,6 +822,17 @@ static void klist_devices_put(struct klist_node *n)
        put_device(dev);
 }
 
+static ssize_t bus_uevent_store(struct bus_type *bus,
+                               const char *buf, size_t count)
+{
+       enum kobject_action action;
+
+       if (kobject_action_type(buf, count, &action) == 0)
+               kobject_uevent(&bus->subsys.kobj, action);
+       return count;
+}
+static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);
+
 /**
  *     bus_register - register a bus with the system.
  *     @bus:   bus.
@@ -822,21 +851,26 @@ int bus_register(struct bus_type * bus)
        if (retval)
                goto out;
 
-       bus->subsys.kobj.kset = &bus_subsys;
+       bus->subsys.kobj.kset = bus_kset;
+       bus->subsys.kobj.ktype = &bus_ktype;
 
        retval = subsystem_register(&bus->subsys);
        if (retval)
                goto out;
 
-       kobject_set_name(&bus->devices.kobj, "devices");
-       bus->devices.kobj.parent = &bus->subsys.kobj;
-       retval = kset_register(&bus->devices);
+       retval = bus_create_file(bus, &bus_attr_uevent);
        if (retval)
+               goto bus_uevent_fail;
+
+       bus->devices_kset = kset_create_and_add("devices", NULL,
+                                               &bus->subsys.kobj);
+       if (!bus->devices_kset) {
+               retval = -ENOMEM;
                goto bus_devices_fail;
+       }
 
        kobject_set_name(&bus->drivers.kobj, "drivers");
        bus->drivers.kobj.parent = &bus->subsys.kobj;
-       bus->drivers.ktype = &ktype_driver;
        retval = kset_register(&bus->drivers);
        if (retval)
                goto bus_drivers_fail;
@@ -861,8 +895,10 @@ bus_attrs_fail:
 bus_probe_files_fail:
        kset_unregister(&bus->drivers);
 bus_drivers_fail:
-       kset_unregister(&bus->devices);
+       kset_unregister(bus->devices_kset);
 bus_devices_fail:
+       bus_remove_file(bus, &bus_attr_uevent);
+bus_uevent_fail:
        subsystem_unregister(&bus->subsys);
 out:
        return retval;
@@ -881,7 +917,8 @@ void bus_unregister(struct bus_type * bus)
        bus_remove_attrs(bus);
        remove_probe_files(bus);
        kset_unregister(&bus->drivers);
-       kset_unregister(&bus->devices);
+       kset_unregister(bus->devices_kset);
+       bus_remove_file(bus, &bus_attr_uevent);
        subsystem_unregister(&bus->subsys);
 }
 
@@ -899,7 +936,10 @@ EXPORT_SYMBOL_GPL(bus_unregister_notifier);
 
 int __init buses_init(void)
 {
-       return subsystem_register(&bus_subsys);
+       bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
+       if (!bus_kset)
+               return -ENOMEM;
+       return 0;
 }