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>
This commit is contained in:
parent
9ad307213f
commit
4b775aaf1e
|
@ -520,6 +520,17 @@ static void device_unbind_cleanup(struct device *dev)
|
||||||
dev_pm_set_driver_flags(dev, 0);
|
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)
|
static int call_driver_probe(struct device *dev, struct device_driver *drv)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -633,14 +644,7 @@ re_probe:
|
||||||
if (test_remove) {
|
if (test_remove) {
|
||||||
test_remove = false;
|
test_remove = false;
|
||||||
|
|
||||||
device_remove_file(dev, &dev_attr_state_synced);
|
device_remove(dev);
|
||||||
device_remove_groups(dev, drv->dev_groups);
|
|
||||||
|
|
||||||
if (dev->bus->remove)
|
|
||||||
dev->bus->remove(dev);
|
|
||||||
else if (drv->remove)
|
|
||||||
drv->remove(dev);
|
|
||||||
|
|
||||||
driver_sysfs_remove(dev);
|
driver_sysfs_remove(dev);
|
||||||
device_unbind_cleanup(dev);
|
device_unbind_cleanup(dev);
|
||||||
|
|
||||||
|
@ -658,12 +662,8 @@ re_probe:
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
dev_sysfs_state_synced_failed:
|
dev_sysfs_state_synced_failed:
|
||||||
device_remove_groups(dev, drv->dev_groups);
|
|
||||||
dev_groups_failed:
|
dev_groups_failed:
|
||||||
if (dev->bus->remove)
|
device_remove(dev);
|
||||||
dev->bus->remove(dev);
|
|
||||||
else if (drv->remove)
|
|
||||||
drv->remove(dev);
|
|
||||||
probe_failed:
|
probe_failed:
|
||||||
driver_sysfs_remove(dev);
|
driver_sysfs_remove(dev);
|
||||||
sysfs_failed:
|
sysfs_failed:
|
||||||
|
@ -1196,13 +1196,7 @@ static void __device_release_driver(struct device *dev, struct device *parent)
|
||||||
|
|
||||||
pm_runtime_put_sync(dev);
|
pm_runtime_put_sync(dev);
|
||||||
|
|
||||||
device_remove_file(dev, &dev_attr_state_synced);
|
device_remove(dev);
|
||||||
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_links_driver_cleanup(dev);
|
device_links_driver_cleanup(dev);
|
||||||
device_unbind_cleanup(dev);
|
device_unbind_cleanup(dev);
|
||||||
|
|
Loading…
Reference in New Issue