diff options
author | Rob Herring <robh@kernel.org> | 2022-02-23 16:52:57 -0600 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2022-03-18 14:27:26 +0100 |
commit | 4b775aaf1ea9997f5eb1a792f357a7b81a1fc632 (patch) | |
tree | c4e4d79c12e56796106708de7fa623968142377f /drivers/base/dd.c | |
parent | 9ad307213fa4081f4bc2f2daa31d4f2d35d7a213 (diff) |
driver core: Refactor sysfs and drv/bus remove hooks
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>
Diffstat (limited to 'drivers/base/dd.c')
-rw-r--r-- | drivers/base/dd.c | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 86e230973010..dbf9f0ada713 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -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); |