diff options
Diffstat (limited to 'drivers/base/bus.c')
| -rw-r--r-- | drivers/base/bus.c | 81 | 
1 files changed, 56 insertions, 25 deletions
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 519865b53f7..1a68f947ded 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -898,18 +898,18 @@ static ssize_t bus_uevent_store(struct bus_type *bus,  static BUS_ATTR(uevent, S_IWUSR, NULL, bus_uevent_store);  /** - * __bus_register - register a driver-core subsystem + * bus_register - register a driver-core subsystem   * @bus: bus to register - * @key: lockdep class key   *   * Once we have that, we register the bus with the kobject   * infrastructure, then register the children subsystems it has:   * the devices and drivers that belong to the subsystem.   */ -int __bus_register(struct bus_type *bus, struct lock_class_key *key) +int bus_register(struct bus_type *bus)  {  	int retval;  	struct subsys_private *priv; +	struct lock_class_key *key = &bus->lock_key;  	priv = kzalloc(sizeof(struct subsys_private), GFP_KERNEL);  	if (!priv) @@ -981,7 +981,7 @@ out:  	bus->p = NULL;  	return retval;  } -EXPORT_SYMBOL_GPL(__bus_register); +EXPORT_SYMBOL_GPL(bus_register);  /**   * bus_unregister - remove a bus from the system @@ -1205,26 +1205,10 @@ static void system_root_device_release(struct device *dev)  {  	kfree(dev);  } -/** - * subsys_system_register - register a subsystem at /sys/devices/system/ - * @subsys: system subsystem - * @groups: default attributes for the root device - * - * All 'system' subsystems have a /sys/devices/system/<name> root device - * with the name of the subsystem. The root device can carry subsystem- - * wide attributes. All registered devices are below this single root - * device and are named after the subsystem with a simple enumeration - * number appended. The registered devices are not explicitely named; - * only 'id' in the device needs to be set. - * - * Do not use this interface for anything new, it exists for compatibility - * with bad ideas only. New subsystems should use plain subsystems; and - * add the subsystem-wide attributes should be added to the subsystem - * directory itself and not some create fake root-device placed in - * /sys/devices/system/<name>. - */ -int subsys_system_register(struct bus_type *subsys, -			   const struct attribute_group **groups) + +static int subsys_register(struct bus_type *subsys, +			   const struct attribute_group **groups, +			   struct kobject *parent_of_root)  {  	struct device *dev;  	int err; @@ -1243,7 +1227,7 @@ int subsys_system_register(struct bus_type *subsys,  	if (err < 0)  		goto err_name; -	dev->kobj.parent = &system_kset->kobj; +	dev->kobj.parent = parent_of_root;  	dev->groups = groups;  	dev->release = system_root_device_release; @@ -1263,8 +1247,55 @@ err_dev:  	bus_unregister(subsys);  	return err;  } + +/** + * subsys_system_register - register a subsystem at /sys/devices/system/ + * @subsys: system subsystem + * @groups: default attributes for the root device + * + * All 'system' subsystems have a /sys/devices/system/<name> root device + * with the name of the subsystem. The root device can carry subsystem- + * wide attributes. All registered devices are below this single root + * device and are named after the subsystem with a simple enumeration + * number appended. The registered devices are not explicitely named; + * only 'id' in the device needs to be set. + * + * Do not use this interface for anything new, it exists for compatibility + * with bad ideas only. New subsystems should use plain subsystems; and + * add the subsystem-wide attributes should be added to the subsystem + * directory itself and not some create fake root-device placed in + * /sys/devices/system/<name>. + */ +int subsys_system_register(struct bus_type *subsys, +			   const struct attribute_group **groups) +{ +	return subsys_register(subsys, groups, &system_kset->kobj); +}  EXPORT_SYMBOL_GPL(subsys_system_register); +/** + * subsys_virtual_register - register a subsystem at /sys/devices/virtual/ + * @subsys: virtual subsystem + * @groups: default attributes for the root device + * + * All 'virtual' subsystems have a /sys/devices/system/<name> root device + * with the name of the subystem.  The root device can carry subsystem-wide + * attributes.  All registered devices are below this single root device. + * There's no restriction on device naming.  This is for kernel software + * constructs which need sysfs interface. + */ +int subsys_virtual_register(struct bus_type *subsys, +			    const struct attribute_group **groups) +{ +	struct kobject *virtual_dir; + +	virtual_dir = virtual_device_parent(NULL); +	if (!virtual_dir) +		return -ENOMEM; + +	return subsys_register(subsys, groups, virtual_dir); +} +  int __init buses_init(void)  {  	bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);  |