diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-08-27 21:41:06 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-08-27 21:41:06 +0200 |
commit | 33cbfe54499338af08ab906a99afac247ea533f6 (patch) | |
tree | a2af0661254396449942ca00e9f770d073d39db7 | |
parent | d77b3f07a1d7127f1ecaf82a95a36b8a3e8fc689 (diff) |
Revert "driver core: Add edit_links() callback for drivers"
This reverts commit 134b23eec9e3a3c795a6ceb0efe2fa63e87983b2.
Based on a lot of email and in-person discussions, this patch series is
being reworked to address a number of issues that were pointed out that
needed to be taken care of before it should be merged. It will be
resubmitted with those changes hopefully soon.
Cc: Frank Rowand <frowand.list@gmail.com>
Cc: Saravana Kannan <saravanak@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/base/core.c | 24 | ||||
-rw-r--r-- | drivers/base/dd.c | 29 | ||||
-rw-r--r-- | include/linux/device.h | 20 |
3 files changed, 2 insertions, 71 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index de775c7a4d7c..605905de0cca 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -440,19 +440,6 @@ static void device_link_wait_for_supplier(struct device *consumer) } /** - * device_link_remove_from_wfs - Unmark device as waiting for supplier - * @consumer: Consumer device - * - * Unmark the consumer device as waiting for suppliers to become available. - */ -void device_link_remove_from_wfs(struct device *consumer) -{ - mutex_lock(&wfs_lock); - list_del_init(&consumer->links.needs_suppliers); - mutex_unlock(&wfs_lock); -} - -/** * device_link_check_waiting_consumers - Try to unmark waiting consumers * * Loops through all consumers waiting on suppliers and tries to add all their @@ -469,19 +456,12 @@ void device_link_remove_from_wfs(struct device *consumer) static void device_link_check_waiting_consumers(void) { struct device *dev, *tmp; - int ret; mutex_lock(&wfs_lock); list_for_each_entry_safe(dev, tmp, &wait_for_suppliers, - links.needs_suppliers) { - ret = 0; - if (dev->has_edit_links) - ret = driver_edit_links(dev); - else if (dev->bus->add_links) - ret = dev->bus->add_links(dev); - if (!ret) + links.needs_suppliers) + if (!dev->bus->add_links(dev)) list_del_init(&dev->links.needs_suppliers); - } mutex_unlock(&wfs_lock); } diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 55fbc2467b37..d811e60610d3 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -710,12 +710,6 @@ int driver_probe_device(struct device_driver *drv, struct device *dev) pr_debug("bus: '%s': %s: matched device %s with driver %s\n", drv->bus->name, __func__, dev_name(dev), drv->name); - if (drv->edit_links) { - if (drv->edit_links(dev)) - dev->has_edit_links = true; - else - device_link_remove_from_wfs(dev); - } pm_runtime_get_suppliers(dev); if (dev->parent) pm_runtime_get_sync(dev->parent); @@ -804,29 +798,6 @@ struct device_attach_data { bool have_async; }; -static int __driver_edit_links(struct device_driver *drv, void *data) -{ - struct device *dev = data; - - if (!drv->edit_links) - return 0; - - if (driver_match_device(drv, dev) <= 0) - return 0; - - return drv->edit_links(dev); -} - -int driver_edit_links(struct device *dev) -{ - int ret; - - device_lock(dev); - ret = bus_for_each_drv(dev->bus, NULL, dev, __driver_edit_links); - device_unlock(dev); - return ret; -} - static int __device_attach_driver(struct device_driver *drv, void *_data) { struct device_attach_data *data = _data; diff --git a/include/linux/device.h b/include/linux/device.h index 90142ec9ce84..73210745cc6b 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -349,20 +349,6 @@ enum probe_type { * @probe_type: Type of the probe (synchronous or asynchronous) to use. * @of_match_table: The open firmware table. * @acpi_match_table: The ACPI match table. - * @edit_links: Called to allow a matched driver to edit the device links the - * bus might have added incorrectly. This will be useful to handle - * cases where the bus incorrectly adds functional dependencies - * that aren't true or tries to create cyclic dependencies. But - * doesn't correctly handle functional dependencies that are - * missed by the bus as the supplier's sync_state might get to - * execute before the driver for a missing consumer is loaded and - * gets to edit the device links for the consumer. - * - * This function might be called multiple times after a new device - * is added. The function is expected to create all the device - * links for the new device and return 0 if it was completed - * successfully or return an error if it needs to be reattempted - * in the future. * @probe: Called to query the existence of a specific device, * whether this driver can work with it, and bind the driver * to a specific device. @@ -404,7 +390,6 @@ struct device_driver { const struct of_device_id *of_match_table; const struct acpi_device_id *acpi_match_table; - int (*edit_links)(struct device *dev); int (*probe) (struct device *dev); int (*remove) (struct device *dev); void (*shutdown) (struct device *dev); @@ -1240,8 +1225,6 @@ struct dev_links_info { * @offline: Set after successful invocation of bus type's .offline(). * @of_node_reused: Set if the device-tree node is shared with an ancestor * device. - * @has_edit_links: This device has a driver than is capable of - * editing the device links created by driver core. * @dma_coherent: this particular device is dma coherent, even if the * architecture supports non-coherent devices. * @@ -1338,7 +1321,6 @@ struct device { bool offline_disabled:1; bool offline:1; bool of_node_reused:1; - bool has_edit_links:1; #if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \ defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU) || \ defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL) @@ -1590,7 +1572,6 @@ extern int __must_check device_attach(struct device *dev); extern int __must_check driver_attach(struct device_driver *drv); extern void device_initial_probe(struct device *dev); extern int __must_check device_reprobe(struct device *dev); -extern int driver_edit_links(struct device *dev); extern bool device_is_bound(struct device *dev); @@ -1682,7 +1663,6 @@ struct device_link *device_link_add(struct device *consumer, struct device *supplier, u32 flags); void device_link_del(struct device_link *link); void device_link_remove(void *consumer, struct device *supplier); -void device_link_remove_from_wfs(struct device *consumer); #ifndef dev_fmt #define dev_fmt(fmt) fmt |