Commit ced6473e authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

driver core: class: add class_groups support

struct class needs to have a set of default groups that are added, as
adding individual attributes does not work well in the long run.  So add
support for that.

Future patches will convert the existing usages of class_attrs to use
class_groups and then class_attrs will go away.
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b5a06234
...@@ -163,6 +163,18 @@ static void klist_class_dev_put(struct klist_node *n) ...@@ -163,6 +163,18 @@ static void klist_class_dev_put(struct klist_node *n)
put_device(dev); put_device(dev);
} }
static int class_add_groups(struct class *cls,
const struct attribute_group **groups)
{
return sysfs_create_groups(&cls->p->subsys.kobj, groups);
}
static void class_remove_groups(struct class *cls,
const struct attribute_group **groups)
{
return sysfs_remove_groups(&cls->p->subsys.kobj, groups);
}
int __class_register(struct class *cls, struct lock_class_key *key) int __class_register(struct class *cls, struct lock_class_key *key)
{ {
struct subsys_private *cp; struct subsys_private *cp;
...@@ -203,6 +215,8 @@ int __class_register(struct class *cls, struct lock_class_key *key) ...@@ -203,6 +215,8 @@ int __class_register(struct class *cls, struct lock_class_key *key)
kfree(cp); kfree(cp);
return error; return error;
} }
error = class_add_groups(class_get(cls), cls->class_groups);
class_put(cls);
error = add_class_attrs(class_get(cls)); error = add_class_attrs(class_get(cls));
class_put(cls); class_put(cls);
return error; return error;
...@@ -213,6 +227,7 @@ void class_unregister(struct class *cls) ...@@ -213,6 +227,7 @@ void class_unregister(struct class *cls)
{ {
pr_debug("device class '%s': unregistering\n", cls->name); pr_debug("device class '%s': unregistering\n", cls->name);
remove_class_attrs(cls); remove_class_attrs(cls);
class_remove_groups(cls, cls->class_groups);
kset_unregister(&cls->p->subsys); kset_unregister(&cls->p->subsys);
} }
......
...@@ -362,6 +362,7 @@ int subsys_virtual_register(struct bus_type *subsys, ...@@ -362,6 +362,7 @@ int subsys_virtual_register(struct bus_type *subsys,
* @name: Name of the class. * @name: Name of the class.
* @owner: The module owner. * @owner: The module owner.
* @class_attrs: Default attributes of this class. * @class_attrs: Default attributes of this class.
* @class_groups: Default attributes of this class.
* @dev_groups: Default attributes of the devices that belong to the class. * @dev_groups: Default attributes of the devices that belong to the class.
* @dev_kobj: The kobject that represents this class and links it into the hierarchy. * @dev_kobj: The kobject that represents this class and links it into the hierarchy.
* @dev_uevent: Called when a device is added, removed from this class, or a * @dev_uevent: Called when a device is added, removed from this class, or a
...@@ -390,6 +391,7 @@ struct class { ...@@ -390,6 +391,7 @@ struct class {
struct module *owner; struct module *owner;
struct class_attribute *class_attrs; struct class_attribute *class_attrs;
const struct attribute_group **class_groups;
const struct attribute_group **dev_groups; const struct attribute_group **dev_groups;
struct kobject *dev_kobj; struct kobject *dev_kobj;
......
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