mutex_unlock(&wfs_lock);
}
-/**
- * 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
*
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);
}
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);
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;
* @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.
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);
* @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.
*
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)
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);
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