driver core: Add device_link_remove function
Device_link_remove uses the same arguments than device_link_add. The Goal is to avoid storing the link pointer. Signed-off-by: pascal paillet <p.paillet@st.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
0380cf7dba
commit
d8842211b6
|
@ -365,6 +365,36 @@ void device_link_del(struct device_link *link)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(device_link_del);
|
||||
|
||||
/**
|
||||
* device_link_remove - remove a link between two devices.
|
||||
* @consumer: Consumer end of the link.
|
||||
* @supplier: Supplier end of the link.
|
||||
*
|
||||
* The caller must ensure proper synchronization of this function with runtime
|
||||
* PM.
|
||||
*/
|
||||
void device_link_remove(void *consumer, struct device *supplier)
|
||||
{
|
||||
struct device_link *link;
|
||||
|
||||
if (WARN_ON(consumer == supplier))
|
||||
return;
|
||||
|
||||
device_links_write_lock();
|
||||
device_pm_lock();
|
||||
|
||||
list_for_each_entry(link, &supplier->links.consumers, s_node) {
|
||||
if (link->consumer == consumer) {
|
||||
kref_put(&link->kref, __device_link_del);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
device_pm_unlock();
|
||||
device_links_write_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(device_link_remove);
|
||||
|
||||
static void device_links_missing_supplier(struct device *dev)
|
||||
{
|
||||
struct device_link *link;
|
||||
|
|
|
@ -1316,6 +1316,7 @@ extern const char *dev_driver_string(const struct device *dev);
|
|||
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);
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
|
||||
|
|
Loading…
Reference in New Issue