Merge branch 'regulator-4.19' into regulator-next
[muen/linux.git] / drivers / base / core.c
index df3e1a44707acc74010cf5ce6fab815c4f744896..2ab316d856510958b58501203bb7fc61c2f49a46 100644 (file)
@@ -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;