Commit 36b519df authored by Tejun Heo's avatar Tejun Heo

Merge branch 'for-3.10-subsys_virtual_register' into for-3.10

parents ba630e49 d73ce004
...@@ -101,6 +101,8 @@ static inline int hypervisor_init(void) { return 0; } ...@@ -101,6 +101,8 @@ static inline int hypervisor_init(void) { return 0; }
extern int platform_bus_init(void); extern int platform_bus_init(void);
extern void cpu_dev_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 int bus_add_device(struct device *dev);
extern void bus_probe_device(struct device *dev); extern void bus_probe_device(struct device *dev);
extern void bus_remove_device(struct device *dev); extern void bus_remove_device(struct device *dev);
......
...@@ -1205,26 +1205,10 @@ static void system_root_device_release(struct device *dev) ...@@ -1205,26 +1205,10 @@ static void system_root_device_release(struct device *dev)
{ {
kfree(dev); kfree(dev);
} }
/**
* subsys_system_register - register a subsystem at /sys/devices/system/ static int subsys_register(struct bus_type *subsys,
* @subsys: system subsystem const struct attribute_group **groups,
* @groups: default attributes for the root device struct kobject *parent_of_root)
*
* 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)
{ {
struct device *dev; struct device *dev;
int err; int err;
...@@ -1243,7 +1227,7 @@ int subsys_system_register(struct bus_type *subsys, ...@@ -1243,7 +1227,7 @@ int subsys_system_register(struct bus_type *subsys,
if (err < 0) if (err < 0)
goto err_name; goto err_name;
dev->kobj.parent = &system_kset->kobj; dev->kobj.parent = parent_of_root;
dev->groups = groups; dev->groups = groups;
dev->release = system_root_device_release; dev->release = system_root_device_release;
...@@ -1263,8 +1247,55 @@ int subsys_system_register(struct bus_type *subsys, ...@@ -1263,8 +1247,55 @@ int subsys_system_register(struct bus_type *subsys,
bus_unregister(subsys); bus_unregister(subsys);
return err; 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); 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) int __init buses_init(void)
{ {
bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL); bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
......
...@@ -690,7 +690,7 @@ void device_initialize(struct device *dev) ...@@ -690,7 +690,7 @@ void device_initialize(struct device *dev)
set_dev_node(dev, -1); 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; static struct kobject *virtual_dir = NULL;
......
...@@ -302,6 +302,8 @@ void subsys_interface_unregister(struct subsys_interface *sif); ...@@ -302,6 +302,8 @@ void subsys_interface_unregister(struct subsys_interface *sif);
int subsys_system_register(struct bus_type *subsys, int subsys_system_register(struct bus_type *subsys,
const struct attribute_group **groups); const struct attribute_group **groups);
int subsys_virtual_register(struct bus_type *subsys,
const struct attribute_group **groups);
/** /**
* struct class - device classes * struct class - device classes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment