]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge tag 'dev_groups_all_drivers' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 6 Aug 2019 06:48:37 +0000 (08:48 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 6 Aug 2019 06:48:37 +0000 (08:48 +0200)
dev_groups added to struct driver

Persistent tag for others to pull this branch from

This is the first patch in a longer series that adds 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.

See:
https://lore.kernel.org/r/20190731124349.4474-2-gregkh@linuxfoundation.org
for details on this patch, and examples of how to use it in other
drivers.

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 @@ static int really_probe(struct device *dev, struct device_driver *drv)
                        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 @@ static int really_probe(struct device *dev, struct device_driver *drv)
                 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 6717adee33f0199627c04c6e5b9363552e97a574..47ccb2029bc3fa44014d4b7706baa8953cb208c0 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);