]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/base/bus.c
driver core: add way to get to bus kset
[linux-2.6-omap-h63xx.git] / drivers / base / bus.c
index 9a19b071c573aaa7d6fc17cdaa1f86e4a1d38580..8335a1079b0efdebda537c1f5efdf8954d2adb63 100644 (file)
@@ -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;
@@ -638,7 +638,8 @@ int bus_add_driver(struct device_driver *drv)
        error = kobject_set_name(&drv->kobj, "%s", drv->name);
        if (error)
                goto out_put_bus;
-       drv->kobj.kset = &bus->drivers;
+       drv->kobj.kset = bus->drivers_kset;
+       drv->kobj.ktype = &driver_ktype;
        error = kobject_register(&drv->kobj);
        if (error)
                goto out_put_bus;
@@ -766,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  */
@@ -850,9 +851,10 @@ 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);
+       retval = kset_register(&bus->subsys);
        if (retval)
                goto out;
 
@@ -860,18 +862,19 @@ int bus_register(struct bus_type * bus)
        if (retval)
                goto bus_uevent_fail;
 
-       kobject_set_name(&bus->devices.kobj, "devices");
-       bus->devices.kobj.parent = &bus->subsys.kobj;
-       retval = kset_register(&bus->devices);
-       if (retval)
+       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 = &driver_ktype;
-       retval = kset_register(&bus->drivers);
-       if (retval)
+       bus->drivers_kset = kset_create_and_add("drivers", NULL,
+                                               &bus->subsys.kobj);
+       if (!bus->drivers_kset) {
+               retval = -ENOMEM;
                goto bus_drivers_fail;
+       }
 
        klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put);
        klist_init(&bus->klist_drivers, NULL, NULL);
@@ -891,13 +894,13 @@ int bus_register(struct bus_type * bus)
 bus_attrs_fail:
        remove_probe_files(bus);
 bus_probe_files_fail:
-       kset_unregister(&bus->drivers);
+       kset_unregister(bus->drivers_kset);
 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);
+       kset_unregister(&bus->subsys);
 out:
        return retval;
 }
@@ -914,10 +917,10 @@ void bus_unregister(struct bus_type * bus)
        pr_debug("bus %s: unregistering\n", bus->name);
        bus_remove_attrs(bus);
        remove_probe_files(bus);
-       kset_unregister(&bus->drivers);
-       kset_unregister(&bus->devices);
+       kset_unregister(bus->drivers_kset);
+       kset_unregister(bus->devices_kset);
        bus_remove_file(bus, &bus_attr_uevent);
-       subsystem_unregister(&bus->subsys);
+       kset_unregister(&bus->subsys);
 }
 
 int bus_register_notifier(struct bus_type *bus, struct notifier_block *nb)
@@ -932,9 +935,18 @@ int bus_unregister_notifier(struct bus_type *bus, struct notifier_block *nb)
 }
 EXPORT_SYMBOL_GPL(bus_unregister_notifier);
 
+struct kset *bus_get_kset(struct bus_type *bus)
+{
+       return &bus->subsys;
+}
+EXPORT_SYMBOL_GPL(bus_get_kset);
+
 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;
 }