driver core: add dev_groups to all drivers
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 31 Jul 2019 12:43:40 +0000 (14:43 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 Aug 2019 10:37:53 +0000 (12:37 +0200)
Add the ability for the driver core to create and remove a list of
attribute groups automatically when the device is bound/unbound from a
specific driver.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Tested-by: Richard Gong <richard.gong@linux.intel.com>
Link: https://lore.kernel.org/r/20190731124349.4474-2-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/dd.c
include/linux/device.h

index 994a9074742046edfed5afefe62011450e20669c..d811e60610d33ae952efacc2db3ce9fb47349a5e 100644 (file)
@@ -554,9 +554,16 @@ re_probe:
                        goto probe_failed;
        }
 
+       if (device_add_groups(dev, drv->dev_groups)) {
+               dev_err(dev, "device_add_groups() failed\n");
+               goto dev_groups_failed;
+       }
+
        if (test_remove) {
                test_remove = false;
 
+               device_remove_groups(dev, drv->dev_groups);
+
                if (dev->bus->remove)
                        dev->bus->remove(dev);
                else if (drv->remove)
@@ -584,6 +591,11 @@ re_probe:
                 drv->bus->name, __func__, dev_name(dev), drv->name);
        goto done;
 
+dev_groups_failed:
+       if (dev->bus->remove)
+               dev->bus->remove(dev);
+       else if (drv->remove)
+               drv->remove(dev);
 probe_failed:
        if (dev->bus)
                blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
@@ -1114,6 +1126,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)
 
                pm_runtime_put_sync(dev);
 
+               device_remove_groups(dev, drv->dev_groups);
+
                if (dev->bus && dev->bus->remove)
                        dev->bus->remove(dev);
                else if (drv->remove)
index c330b75c6c57cdbd46a360bff2b50c96bde4d515..98c00b71b598eb6a7362755cf50ca03551355314 100644 (file)
@@ -262,6 +262,8 @@ enum probe_type {
  * @resume:    Called to bring a device from sleep mode.
  * @groups:    Default attributes that get created by the driver core
  *             automatically.
+ * @dev_groups:        Additional attributes attached to device instance once the
+ *             it is bound to the driver.
  * @pm:                Power management operations of the device which matched
  *             this driver.
  * @coredump:  Called when sysfs entry is written to. The device driver
@@ -296,6 +298,7 @@ struct device_driver {
        int (*suspend) (struct device *dev, pm_message_t state);
        int (*resume) (struct device *dev);
        const struct attribute_group **groups;
+       const struct attribute_group **dev_groups;
 
        const struct dev_pm_ops *pm;
        void (*coredump) (struct device *dev);