aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/core.c
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2018-08-10 12:31:24 -0400
committerMark Brown <broonie@kernel.org>2018-08-10 12:31:24 -0400
commitd22d59362b7b2c749245f1269d447011c76ca41d (patch)
treeb3fc0673f62394dc5ed417eac6bad485a28baf25 /drivers/base/core.c
parenta8afa92ec0d9312b23fd291aa8db95da266f2d5f (diff)
parent46fc033eba42f5a4fb583b2ab53f0a9918468452 (diff)
Merge branch 'regulator-4.19' into regulator-next
Diffstat (limited to 'drivers/base/core.c')
-rw-r--r--drivers/base/core.c30
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)
372} 372}
373EXPORT_SYMBOL_GPL(device_link_del); 373EXPORT_SYMBOL_GPL(device_link_del);
374 374
375/**
376 * device_link_remove - remove a link between two devices.
377 * @consumer: Consumer end of the link.
378 * @supplier: Supplier end of the link.
379 *
380 * The caller must ensure proper synchronization of this function with runtime
381 * PM.
382 */
383void device_link_remove(void *consumer, struct device *supplier)
384{
385 struct device_link *link;
386
387 if (WARN_ON(consumer == supplier))
388 return;
389
390 device_links_write_lock();
391 device_pm_lock();
392
393 list_for_each_entry(link, &supplier->links.consumers, s_node) {
394 if (link->consumer == consumer) {
395 kref_put(&link->kref, __device_link_del);
396 break;
397 }
398 }
399
400 device_pm_unlock();
401 device_links_write_unlock();
402}
403EXPORT_SYMBOL_GPL(device_link_remove);
404
375static void device_links_missing_supplier(struct device *dev) 405static void device_links_missing_supplier(struct device *dev)
376{ 406{
377 struct device_link *link; 407 struct device_link *link;