|
@@ -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;
|