mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 22:02:02 +00:00
driver core: bus: move bus notifier logic into bus.c
The logic to touch the bus notifier was open-coded in numberous places in the driver core. Clean that up by creating a local bus_notify() function and have everyone call this function instead, making the reading of the caller code simpler and easier to maintain over time. Reviewed-by: Rafael J. Wysocki <rafael@kernel.org> Link: https://lore.kernel.org/r/20230111092331.3946745-2-gregkh@linuxfoundation.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
504450d05c
commit
ed9f918174
4 changed files with 19 additions and 31 deletions
|
@ -130,6 +130,7 @@ struct kobject *virtual_device_parent(struct device *dev);
|
|||
extern int bus_add_device(struct device *dev);
|
||||
extern void bus_probe_device(struct device *dev);
|
||||
extern void bus_remove_device(struct device *dev);
|
||||
void bus_notify(struct device *dev, enum bus_notifier_event value);
|
||||
|
||||
extern int bus_add_driver(struct device_driver *drv);
|
||||
extern void bus_remove_driver(struct device_driver *drv);
|
||||
|
|
|
@ -850,6 +850,14 @@ int bus_unregister_notifier(struct bus_type *bus, struct notifier_block *nb)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(bus_unregister_notifier);
|
||||
|
||||
void bus_notify(struct device *dev, enum bus_notifier_event value)
|
||||
{
|
||||
struct bus_type *bus = dev->bus;
|
||||
|
||||
if (bus)
|
||||
blocking_notifier_call_chain(&bus->p->bus_notifier, value, dev);
|
||||
}
|
||||
|
||||
struct kset *bus_get_kset(struct bus_type *bus)
|
||||
{
|
||||
return &bus->p->subsys;
|
||||
|
|
|
@ -3453,10 +3453,7 @@ int device_add(struct device *dev)
|
|||
/* Notify clients of device addition. This call must come
|
||||
* after dpm_sysfs_add() and before kobject_uevent().
|
||||
*/
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_ADD_DEVICE, dev);
|
||||
|
||||
bus_notify(dev, BUS_NOTIFY_ADD_DEVICE);
|
||||
kobject_uevent(&dev->kobj, KOBJ_ADD);
|
||||
|
||||
/*
|
||||
|
@ -3637,9 +3634,7 @@ void device_del(struct device *dev)
|
|||
* before dpm_sysfs_remove().
|
||||
*/
|
||||
noio_flag = memalloc_noio_save();
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_DEL_DEVICE, dev);
|
||||
bus_notify(dev, BUS_NOTIFY_DEL_DEVICE);
|
||||
|
||||
dpm_sysfs_remove(dev);
|
||||
if (parent)
|
||||
|
@ -3670,9 +3665,7 @@ void device_del(struct device *dev)
|
|||
device_platform_notify_remove(dev);
|
||||
device_links_purge(dev);
|
||||
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_REMOVED_DEVICE, dev);
|
||||
bus_notify(dev, BUS_NOTIFY_REMOVED_DEVICE);
|
||||
kobject_uevent(&dev->kobj, KOBJ_REMOVE);
|
||||
glue_dir = get_glue_dir(dev);
|
||||
kobject_del(&dev->kobj);
|
||||
|
|
|
@ -411,10 +411,7 @@ static void driver_bound(struct device *dev)
|
|||
driver_deferred_probe_del(dev);
|
||||
driver_deferred_probe_trigger();
|
||||
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_BOUND_DRIVER, dev);
|
||||
|
||||
bus_notify(dev, BUS_NOTIFY_BOUND_DRIVER);
|
||||
kobject_uevent(&dev->kobj, KOBJ_BIND);
|
||||
}
|
||||
|
||||
|
@ -433,9 +430,7 @@ static int driver_sysfs_add(struct device *dev)
|
|||
{
|
||||
int ret;
|
||||
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_BIND_DRIVER, dev);
|
||||
bus_notify(dev, BUS_NOTIFY_BIND_DRIVER);
|
||||
|
||||
ret = sysfs_create_link(&dev->driver->p->kobj, &dev->kobj,
|
||||
kobject_name(&dev->kobj));
|
||||
|
@ -500,9 +495,8 @@ int device_bind_driver(struct device *dev)
|
|||
device_links_force_bind(dev);
|
||||
driver_bound(dev);
|
||||
}
|
||||
else if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
|
||||
else
|
||||
bus_notify(dev, BUS_NOTIFY_DRIVER_NOT_BOUND);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(device_bind_driver);
|
||||
|
@ -693,9 +687,7 @@ static int really_probe(struct device *dev, struct device_driver *drv)
|
|||
probe_failed:
|
||||
driver_sysfs_remove(dev);
|
||||
sysfs_failed:
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_DRIVER_NOT_BOUND, dev);
|
||||
bus_notify(dev, BUS_NOTIFY_DRIVER_NOT_BOUND);
|
||||
if (dev->bus && dev->bus->dma_cleanup)
|
||||
dev->bus->dma_cleanup(dev);
|
||||
pinctrl_bind_failed:
|
||||
|
@ -1241,10 +1233,7 @@ static void __device_release_driver(struct device *dev, struct device *parent)
|
|||
|
||||
driver_sysfs_remove(dev);
|
||||
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_UNBIND_DRIVER,
|
||||
dev);
|
||||
bus_notify(dev, BUS_NOTIFY_UNBIND_DRIVER);
|
||||
|
||||
pm_runtime_put_sync(dev);
|
||||
|
||||
|
@ -1258,11 +1247,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)
|
|||
|
||||
klist_remove(&dev->p->knode_driver);
|
||||
device_pm_check_callbacks(dev);
|
||||
if (dev->bus)
|
||||
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
|
||||
BUS_NOTIFY_UNBOUND_DRIVER,
|
||||
dev);
|
||||
|
||||
bus_notify(dev, BUS_NOTIFY_UNBOUND_DRIVER);
|
||||
kobject_uevent(&dev->kobj, KOBJ_UNBIND);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue