diff options
author | Mark Brown <broonie@kernel.org> | 2018-08-10 18:31:24 +0200 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2018-08-10 18:31:24 +0200 |
commit | d22d59362b7b2c749245f1269d447011c76ca41d (patch) | |
tree | b3fc0673f62394dc5ed417eac6bad485a28baf25 /drivers/base | |
parent | Merge branch 'regulator-4.18' into regulator-linus (diff) | |
parent | regulator: add QCOM RPMh regulator driver (diff) | |
download | linux-d22d59362b7b2c749245f1269d447011c76ca41d.tar.xz linux-d22d59362b7b2c749245f1269d447011c76ca41d.zip |
Merge branch 'regulator-4.19' into regulator-next
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/core.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/base/core.c b/drivers/base/core.c index df3e1a44707a..2ab316d85651 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -372,6 +372,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; |