driver core: Refactor sysfs and drv/bus remove hooks
authorRob Herring <robh@kernel.org>
Wed, 23 Feb 2022 22:52:57 +0000 (16:52 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 18 Mar 2022 13:27:26 +0000 (14:27 +0100)
There are 3 copies of the same device sysfs cleanup and drv/bus remove()
hooks used for probe failure, testing re-probing, and device unbinding.

Let's refactor the code to its own function.

Signed-off-by: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20220223225257.1681968-3-robh@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/base/dd.c

index 86e2309..dbf9f0a 100644 (file)
@@ -520,6 +520,17 @@ static void device_unbind_cleanup(struct device *dev)
        dev_pm_set_driver_flags(dev, 0);
 }
 
+static void device_remove(struct device *dev)
+{
+       device_remove_file(dev, &dev_attr_state_synced);
+       device_remove_groups(dev, dev->driver->dev_groups);
+
+       if (dev->bus && dev->bus->remove)
+               dev->bus->remove(dev);
+       else if (dev->driver->remove)
+               dev->driver->remove(dev);
+}
+
 static int call_driver_probe(struct device *dev, struct device_driver *drv)
 {
        int ret = 0;
@@ -633,14 +644,7 @@ re_probe:
        if (test_remove) {
                test_remove = false;
 
-               device_remove_file(dev, &dev_attr_state_synced);
-               device_remove_groups(dev, drv->dev_groups);
-
-               if (dev->bus->remove)
-                       dev->bus->remove(dev);
-               else if (drv->remove)
-                       drv->remove(dev);
-
+               device_remove(dev);
                driver_sysfs_remove(dev);
                device_unbind_cleanup(dev);
 
@@ -658,12 +662,8 @@ re_probe:
        goto done;
 
 dev_sysfs_state_synced_failed:
-       device_remove_groups(dev, drv->dev_groups);
 dev_groups_failed:
-       if (dev->bus->remove)
-               dev->bus->remove(dev);
-       else if (drv->remove)
-               drv->remove(dev);
+       device_remove(dev);
 probe_failed:
        driver_sysfs_remove(dev);
 sysfs_failed:
@@ -1196,13 +1196,7 @@ static void __device_release_driver(struct device *dev, struct device *parent)
 
                pm_runtime_put_sync(dev);
 
-               device_remove_file(dev, &dev_attr_state_synced);
-               device_remove_groups(dev, drv->dev_groups);
-
-               if (dev->bus && dev->bus->remove)
-                       dev->bus->remove(dev);
-               else if (drv->remove)
-                       drv->remove(dev);
+               device_remove(dev);
 
                device_links_driver_cleanup(dev);
                device_unbind_cleanup(dev);