aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/core.c
diff options
context:
space:
mode:
authorHeikki Krogerus <heikki.krogerus@linux.intel.com>2018-11-09 09:21:34 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2018-11-26 12:19:11 -0500
commit07de0e86fe081cd74f5b397af86172d156280d3e (patch)
tree8fd18d8ef290d93e1ef2364d9c8642dcc8169b46 /drivers/base/core.c
parent2d51ac9086fd4852c1e43d615bd8dd99f2a616eb (diff)
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: Heikki Krogerus <heikki.krogerus@linux.intel.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/base/core.c')
-rw-r--r--drivers/base/core.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 04bbcd779e11..3972ef3f080b 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -728,6 +728,16 @@ static inline int device_is_not_partition(struct device *dev)
728} 728}
729#endif 729#endif
730 730
731static int
732device_platform_notify(struct device *dev, enum kobject_action action)
733{
734 if (platform_notify && action == KOBJ_ADD)
735 platform_notify(dev);
736 else if (platform_notify_remove && action == KOBJ_REMOVE)
737 platform_notify_remove(dev);
738 return 0;
739}
740
731/** 741/**
732 * dev_driver_string - Return a device's driver name, if at all possible 742 * dev_driver_string - Return a device's driver name, if at all possible
733 * @dev: struct device to get the name of 743 * @dev: struct device to get the name of
@@ -1883,8 +1893,9 @@ int device_add(struct device *dev)
1883 } 1893 }
1884 1894
1885 /* notify platform of device entry */ 1895 /* notify platform of device entry */
1886 if (platform_notify) 1896 error = device_platform_notify(dev, KOBJ_ADD);
1887 platform_notify(dev); 1897 if (error)
1898 goto platform_error;
1888 1899
1889 error = device_create_file(dev, &dev_attr_uevent); 1900 error = device_create_file(dev, &dev_attr_uevent);
1890 if (error) 1901 if (error)
@@ -1960,6 +1971,8 @@ done:
1960 SymlinkError: 1971 SymlinkError:
1961 device_remove_file(dev, &dev_attr_uevent); 1972 device_remove_file(dev, &dev_attr_uevent);
1962 attrError: 1973 attrError:
1974 device_platform_notify(dev, KOBJ_REMOVE);
1975platform_error:
1963 kobject_uevent(&dev->kobj, KOBJ_REMOVE); 1976 kobject_uevent(&dev->kobj, KOBJ_REMOVE);
1964 glue_dir = get_glue_dir(dev); 1977 glue_dir = get_glue_dir(dev);
1965 kobject_del(&dev->kobj); 1978 kobject_del(&dev->kobj);
@@ -2077,14 +2090,10 @@ void device_del(struct device *dev)
2077 bus_remove_device(dev); 2090 bus_remove_device(dev);
2078 device_pm_remove(dev); 2091 device_pm_remove(dev);
2079 driver_deferred_probe_del(dev); 2092 driver_deferred_probe_del(dev);
2093 device_platform_notify(dev, KOBJ_REMOVE);
2080 device_remove_properties(dev); 2094 device_remove_properties(dev);
2081 device_links_purge(dev); 2095 device_links_purge(dev);
2082 2096
2083 /* Notify the platform of the removal, in case they
2084 * need to do anything...
2085 */
2086 if (platform_notify_remove)
2087 platform_notify_remove(dev);
2088 if (dev->bus) 2097 if (dev->bus)
2089 blocking_notifier_call_chain(&dev->bus->p->bus_notifier, 2098 blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
2090 BUS_NOTIFY_REMOVED_DEVICE, dev); 2099 BUS_NOTIFY_REMOVED_DEVICE, dev);