diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/base/base.h | 2 | ||||
| -rw-r--r-- | drivers/base/bus.c | 73 | ||||
| -rw-r--r-- | drivers/base/core.c | 2 | 
3 files changed, 55 insertions, 22 deletions
diff --git a/drivers/base/base.h b/drivers/base/base.h index 6ee17bb391a..b8bdfe61daa 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -101,6 +101,8 @@ static inline int hypervisor_init(void) { return 0; }  extern int platform_bus_init(void);  extern void cpu_dev_init(void); +struct kobject *virtual_device_parent(struct device *dev); +  extern int bus_add_device(struct device *dev);  extern void bus_probe_device(struct device *dev);  extern void bus_remove_device(struct device *dev); diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 519865b53f7..2ae2d2f92b6 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -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); diff --git a/drivers/base/core.c b/drivers/base/core.c index 56536f4b0f6..f58084a86e8 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -690,7 +690,7 @@ void device_initialize(struct device *dev)  	set_dev_node(dev, -1);  } -static struct kobject *virtual_device_parent(struct device *dev) +struct kobject *virtual_device_parent(struct device *dev)  {  	static struct kobject *virtual_dir = NULL;  |