driver core: bus_type: add dev_groups
Greg Kroah-Hartman
maintainerPATCH 1/3 driver core: bus_type: add dev_groups
attribute groups are much more flexible than just a list of attributes, due to their support for visibility of the attributes, and binary attributes. Add dev_groups to struct bus_type which should be used instead of dev_attrs.
dev_attrs will be removed from the structure soon.
--- drivers/base/base.h | 5 +++++ drivers/base/bus.c | 6 ++++++ drivers/base/core.c | 7 +++---- include/linux/device.h | 4 +++- 4 files changed, 17 insertions(+), 5 deletions(-)
drivers/base/base.h +5 -0
@@ -119,6 +119,11 @@ static inline int driver_match_device(struct device_driver *drv,return drv->bus->match ? drv->bus->match (dev, drv) :1 ; } +extern int device_add_groups (struct device *dev, +const struct attribute_group **groups); +extern void device_remove_groups (struct device *dev, +const struct attribute_group **groups); +extern char *make_class_name (const char *name,struct kobject *kobj);extern int devres_release_all (struct device *dev);
drivers/base/bus.c +6 -0
@@ -499,6 +499,9 @@ int bus_add_device(struct device *dev) error =device_add_attrs (bus, dev);if (error) goto out_put; + error =device_add_groups (dev, bus->dev_groups); +if (error) + goto out_groups; error =sysfs_create_link (&bus->p->devices_kset->kobj, &dev->kobj,dev_name (dev));if (error)
@@ -513,6 +516,8 @@ int bus_add_device(struct device *dev) out_subsys:sysfs_remove_link (&bus->p->devices_kset->kobj,dev_name (dev)); +out_groups: +device_remove_groups (dev, bus->dev_groups); out_id:device_remove_attrs (bus, dev); out_put:
@@ -575,6 +580,7 @@ void bus_remove_device(struct device *dev)sysfs_remove_link (&dev->bus->p->devices_kset->kobj,dev_name (dev));device_remove_attrs (dev->bus, dev); +device_remove_groups (dev, dev->bus->dev_groups);if (klist_node_attached (&dev->p->knode_bus))klist_del (&dev->p->knode_bus);
drivers/base/core.c +3 -4
@@ -491,8 +491,7 @@ static void device_remove_bin_attributes(struct device *dev,device_remove_bin_file (dev, &attrs[i]); } -static int device_add_groups (struct device *dev, -const struct attribute_group **groups) +int device_add_groups (struct device *dev,const struct attribute_group **groups) {int error =0 ;int i;
@@ -511,8 +510,8 @@ static int device_add_groups(struct device *dev,return error; } -static void device_remove_groups (struct device *dev, -const struct attribute_group **groups) +void device_remove_groups (struct device *dev, +const struct attribute_group **groups) {int i;
include/linux/device.h +3 -1
@@ -66,6 +66,7 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);* @bus_attrs: Default attributes of the bus. * @dev_attrs: Default attributes of the devices on the bus. * @drv_attrs: Default attributes of the device drivers on the bus. +* @dev_groups: Default attributes of the devices on the bus. * @match: Called, perhaps multiple times, whenever a new device or driver * is added for this bus. It should return a nonzero value if the * given device can be handled by the given driver.
@@ -104,8 +105,9 @@ struct bus_type {const char *dev_name;struct device *dev_root;struct bus_attribute *bus_attrs; -struct device_attribute *dev_attrs; +struct device_attribute *dev_attrs;/* use dev_groups instead */ struct driver_attribute *drv_attrs; +const struct attribute_group **dev_groups;int (*match)(struct device *dev,struct device_driver *drv);int (*uevent)(struct device *dev,struct kobj_uevent_env *env);
Signature · 1 line
1.8.3.rc0.20.gb99dd2e
Greg Kroah-Hartman
maintainerPATCH 2/3 driver core: bus_type: add drv_groups
attribute groups are much more flexible than just a list of attributes, due to their support for visibility of the attributes, and binary attributes. Add drv_groups to struct bus_type which should be used instead of drv_attrs.
drv_attrs will be removed from the structure soon.
--- drivers/base/base.h | 5 +++++ drivers/base/bus.c | 5 +++++ drivers/base/driver.c | 8 ++++---- include/linux/device.h | 4 +++- 4 files changed, 17 insertions(+), 5 deletions(-)
drivers/base/base.h +5 -0
@@ -119,6 +119,11 @@ static inline int driver_match_device(struct device_driver *drv,return drv->bus->match ? drv->bus->match (dev, drv) :1 ; } +extern int driver_add_groups (struct device_driver *drv, +const struct attribute_group **groups); +extern void driver_remove_groups (struct device_driver *drv, +const struct attribute_group **groups); +extern int device_add_groups (struct device *dev,const struct attribute_group **groups); extern void device_remove_groups(struct device *dev,
drivers/base/bus.c +5 -0
@@ -725,6 +725,10 @@ int bus_add_driver(struct device_driver *drv)printk (KERN_ERR "%s: driver_add_attrs(%s) failed\n" , __func__, drv->name); } + error =driver_add_groups (drv, bus->drv_groups); +if (error) +printk (KERN_ERR "%s: driver_create_groups(%s) failed\n" , + __func__, drv->name);if (!drv->suppress_bind_attrs) { error =add_bind_files (drv);
@@ -762,6 +766,7 @@ void bus_remove_driver(struct device_driver *drv)if (!drv->suppress_bind_attrs)remove_bind_files (drv);driver_remove_attrs (drv->bus, drv); +driver_remove_groups (drv, drv->bus->drv_groups);driver_remove_file (drv, &driver_attr_uevent);klist_remove (&drv->p->knode_bus);pr_debug ("bus: '%s': remove driver %s\n" , drv->bus->name, drv->name);
drivers/base/driver.c +4 -4
@@ -123,8 +123,8 @@ void driver_remove_file(struct device_driver *drv, }EXPORT_SYMBOL_GPL (driver_remove_file); -static int driver_add_groups (struct device_driver *drv, -const struct attribute_group **groups) +int driver_add_groups (struct device_driver *drv, +const struct attribute_group **groups) {int error =0 ;int i;
@@ -143,8 +143,8 @@ static int driver_add_groups(struct device_driver *drv,return error; } -static void driver_remove_groups (struct device_driver *drv, -const struct attribute_group **groups) +void driver_remove_groups (struct device_driver *drv, +const struct attribute_group **groups) {int i;
include/linux/device.h +3 -1
@@ -67,6 +67,7 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);* @dev_attrs: Default attributes of the devices on the bus. * @drv_attrs: Default attributes of the device drivers on the bus. * @dev_groups: Default attributes of the devices on the bus. +* @drv_groups: Default attributes of the device drivers on the bus. * @match: Called, perhaps multiple times, whenever a new device or driver * is added for this bus. It should return a nonzero value if the * given device can be handled by the given driver.
@@ -106,8 +107,9 @@ struct bus_type {struct device *dev_root;struct bus_attribute *bus_attrs;struct device_attribute *dev_attrs;/* use dev_groups instead */ -struct driver_attribute *drv_attrs; +struct driver_attribute *drv_attrs;/* use drv_groups instead */ const struct attribute_group **dev_groups; +const struct attribute_group **drv_groups;int (*match)(struct device *dev,struct device_driver *drv);int (*uevent)(struct device *dev,struct kobj_uevent_env *env);
Signature · 1 line
1.8.3.rc0.20.gb99dd2e
Greg Kroah-Hartman
maintainerPATCH 3/3 driver core: bus_type: add bus_groups
In reply to Greg Kroah-Hartmanattribute groups are much more flexible than just a list of attributes, due to their support for visibility of the attributes, and binary attributes. Add bus_groups to struct bus_type which should be used instead of bus_attrs.
bus_attrs will be removed from the structure soon.
--- drivers/base/bus.c | 37 +++++++++++++++++++++++++++++++++++++ include/linux/device.h | 4 +++- 2 files changed, 40 insertions(+), 1 deletion(-)
drivers/base/bus.c +37 -0
@@ -881,6 +881,37 @@ static void bus_remove_attrs(struct bus_type *bus) } } +static int bus_add_groups (struct bus_type *bus, +const struct attribute_group **groups) +{ +int error =0 ; +int i; + +if (groups) { +for (i =0 ; groups[i]; i++) { + error =sysfs_create_group (&bus->p->subsys.kobj, + groups[i]); +if (error) { +while (--i >=0 ) +sysfs_remove_group (&bus->p->subsys.kobj, + groups[i]); +break ; + } + } + } +return error; +} + +static void bus_remove_groups (struct bus_type *bus, +const struct attribute_group **groups) +{ +int i; + +if (groups) +for (i =0 ; groups[i]; i++) +sysfs_remove_group (&bus->p->subsys.kobj, groups[i]); +} +static void klist_devices_get (struct klist_node *n) {struct device_private *dev_prv =to_device_private_bus (n);
@@ -973,10 +1004,15 @@ int bus_register(struct bus_type *bus) retval =bus_add_attrs (bus);if (retval) goto bus_attrs_fail; + retval =bus_add_groups (bus, bus->bus_groups); +if (retval) + goto bus_groups_fail;pr_debug ("bus: '%s': registered\n" , bus->name);return 0 ; +bus_groups_fail: +bus_remove_attrs (bus); bus_attrs_fail:remove_probe_files (bus); bus_probe_files_fail:
@@ -1007,6 +1043,7 @@ void bus_unregister(struct bus_type *bus)if (bus->dev_root)device_unregister (bus->dev_root);bus_remove_attrs (bus); +bus_remove_groups (bus, bus->bus_groups);remove_probe_files (bus);kset_unregister (bus->p->drivers_kset);kset_unregister (bus->p->devices_kset);
include/linux/device.h +3 -1
@@ -66,6 +66,7 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *);* @bus_attrs: Default attributes of the bus. * @dev_attrs: Default attributes of the devices on the bus. * @drv_attrs: Default attributes of the device drivers on the bus. +* @bus_groups: Default attributes of the bus. * @dev_groups: Default attributes of the devices on the bus. * @drv_groups: Default attributes of the device drivers on the bus. * @match: Called, perhaps multiple times, whenever a new device or driver
@@ -105,9 +106,10 @@ struct bus_type {const char *name;const char *dev_name;struct device *dev_root; -struct bus_attribute *bus_attrs; +struct bus_attribute *bus_attrs;/* use bus_groups instead */ struct device_attribute *dev_attrs;/* use dev_groups instead */ struct driver_attribute *drv_attrs;/* use drv_groups instead */ +const struct attribute_group **bus_groups;const struct attribute_group **dev_groups;const struct attribute_group **drv_groups;
Signature · 1 line
1.8.3.rc0.20.gb99dd2e