Commit 07de0e86 authored by Heikki Krogerus's avatar Heikki Krogerus Committed by Rafael J. Wysocki

drivers core: Prepare support for multiple platform notifications

Since it should be possible to support several hardware
description models at the same time (at least in theory),
for example ACPI and devicetree on a running system, the
platform notifications need to be handled differently.

For now a single "platform_notify" callback function was
used to notify the underlying base system which is in charge
of the hardware description when a new device entry was
added to the system, but that callback is available to only
a single base system at the time. This will add a function
device_platform_notify() and replace all direct
platform_notify() calls with it.

device_platform_notify() will first simply call the
platform_notify() callback, so this commit has no functional
affect, however, the idea is that individual base systems
will put their direct notification calls there instead of
using the platform_notify function pointer.
Signed-off-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 2d51ac90
...@@ -728,6 +728,16 @@ static inline int device_is_not_partition(struct device *dev) ...@@ -728,6 +728,16 @@ static inline int device_is_not_partition(struct device *dev)
} }
#endif #endif
static int
device_platform_notify(struct device *dev, enum kobject_action action)
{
if (platform_notify && action == KOBJ_ADD)
platform_notify(dev);
else if (platform_notify_remove && action == KOBJ_REMOVE)
platform_notify_remove(dev);
return 0;
}
/** /**
* dev_driver_string - Return a device's driver name, if at all possible * dev_driver_string - Return a device's driver name, if at all possible
* @dev: struct device to get the name of * @dev: struct device to get the name of
...@@ -1883,8 +1893,9 @@ int device_add(struct device *dev) ...@@ -1883,8 +1893,9 @@ int device_add(struct device *dev)
} }
/* notify platform of device entry */ /* notify platform of device entry */
if (platform_notify) error = device_platform_notify(dev, KOBJ_ADD);
platform_notify(dev); if (error)
goto platform_error;
error = device_create_file(dev, &dev_attr_uevent); error = device_create_file(dev, &dev_attr_uevent);
if (error) if (error)
...@@ -1960,6 +1971,8 @@ int device_add(struct device *dev) ...@@ -1960,6 +1971,8 @@ int device_add(struct device *dev)
SymlinkError: SymlinkError:
device_remove_file(dev, &dev_attr_uevent); device_remove_file(dev, &dev_attr_uevent);
attrError: attrError:
device_platform_notify(dev, KOBJ_REMOVE);
platform_error:
kobject_uevent(&dev->kobj, KOBJ_REMOVE); kobject_uevent(&dev->kobj, KOBJ_REMOVE);
glue_dir = get_glue_dir(dev); glue_dir = get_glue_dir(dev);
kobject_del(&dev->kobj); kobject_del(&dev->kobj);
...@@ -2077,14 +2090,10 @@ void device_del(struct device *dev) ...@@ -2077,14 +2090,10 @@ void device_del(struct device *dev)
bus_remove_device(dev); bus_remove_device(dev);
device_pm_remove(dev); device_pm_remove(dev);
driver_deferred_probe_del(dev); driver_deferred_probe_del(dev);
device_platform_notify(dev, KOBJ_REMOVE);
device_remove_properties(dev); device_remove_properties(dev);
device_links_purge(dev); device_links_purge(dev);
/* Notify the platform of the removal, in case they
* need to do anything...
*/
if (platform_notify_remove)
platform_notify_remove(dev);
if (dev->bus) if (dev->bus)
blocking_notifier_call_chain(&dev->bus->p->bus_notifier, blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
BUS_NOTIFY_REMOVED_DEVICE, dev); BUS_NOTIFY_REMOVED_DEVICE, dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment