|
|
|
@ -62,7 +62,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
|
|
|
|
|
--- a/drivers/base/core.c
|
|
|
|
|
+++ b/drivers/base/core.c
|
|
|
|
|
@@ -161,10 +161,10 @@ static int device_reorder_to_tail(struct
|
|
|
|
|
@@ -162,10 +162,10 @@ static int device_reorder_to_tail(struct
|
|
|
|
|
* of the link. If DL_FLAG_PM_RUNTIME is not set, DL_FLAG_RPM_ACTIVE will be
|
|
|
|
|
* ignored.
|
|
|
|
|
*
|
|
|
|
@ -77,7 +77,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
*
|
|
|
|
|
* A side effect of the link creation is re-ordering of dpm_list and the
|
|
|
|
|
* devices_kset list by moving the consumer device and all devices depending
|
|
|
|
|
@@ -181,7 +181,8 @@ struct device_link *device_link_add(stru
|
|
|
|
|
@@ -182,7 +182,8 @@ struct device_link *device_link_add(stru
|
|
|
|
|
struct device_link *link;
|
|
|
|
|
|
|
|
|
|
if (!consumer || !supplier ||
|
|
|
|
@ -87,7 +87,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
device_links_write_lock();
|
|
|
|
|
@@ -199,8 +200,10 @@ struct device_link *device_link_add(stru
|
|
|
|
|
@@ -200,8 +201,10 @@ struct device_link *device_link_add(stru
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
list_for_each_entry(link, &supplier->links.consumers, s_node)
|
|
|
|
@ -99,7 +99,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
|
|
|
|
|
link = kzalloc(sizeof(*link), GFP_KERNEL);
|
|
|
|
|
if (!link)
|
|
|
|
|
@@ -232,6 +235,7 @@ struct device_link *device_link_add(stru
|
|
|
|
|
@@ -233,6 +236,7 @@ struct device_link *device_link_add(stru
|
|
|
|
|
link->consumer = consumer;
|
|
|
|
|
INIT_LIST_HEAD(&link->c_node);
|
|
|
|
|
link->flags = flags;
|
|
|
|
@ -107,7 +107,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
|
|
|
|
|
/* Determine the initial link state. */
|
|
|
|
|
if (flags & DL_FLAG_STATELESS) {
|
|
|
|
|
@@ -302,8 +306,10 @@ static void __device_link_free_srcu(stru
|
|
|
|
|
@@ -303,8 +307,10 @@ static void __device_link_free_srcu(stru
|
|
|
|
|
device_link_free(container_of(rhead, struct device_link, rcu_head));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -119,7 +119,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
dev_info(link->consumer, "Dropping the link to %s\n",
|
|
|
|
|
dev_name(link->supplier));
|
|
|
|
|
|
|
|
|
|
@@ -315,8 +321,10 @@ static void __device_link_del(struct dev
|
|
|
|
|
@@ -316,8 +322,10 @@ static void __device_link_del(struct dev
|
|
|
|
|
call_srcu(&device_links_srcu, &link->rcu_head, __device_link_free_srcu);
|
|
|
|
|
}
|
|
|
|
|
#else /* !CONFIG_SRCU */
|
|
|
|
@ -131,7 +131,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
dev_info(link->consumer, "Dropping the link to %s\n",
|
|
|
|
|
dev_name(link->supplier));
|
|
|
|
|
|
|
|
|
|
@@ -334,18 +342,50 @@ static void __device_link_del(struct dev
|
|
|
|
|
@@ -335,18 +343,50 @@ static void __device_link_del(struct dev
|
|
|
|
|
* @link: Device link to delete.
|
|
|
|
|
*
|
|
|
|
|
* The caller must ensure proper synchronization of this function with runtime
|
|
|
|
@ -184,7 +184,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
static void device_links_missing_supplier(struct device *dev)
|
|
|
|
|
{
|
|
|
|
|
struct device_link *link;
|
|
|
|
|
@@ -453,8 +493,8 @@ static void __device_links_no_driver(str
|
|
|
|
|
@@ -454,8 +494,8 @@ static void __device_links_no_driver(str
|
|
|
|
|
if (link->flags & DL_FLAG_STATELESS)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
@ -195,7 +195,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
else if (link->status != DL_STATE_SUPPLIER_UNBIND)
|
|
|
|
|
WRITE_ONCE(link->status, DL_STATE_AVAILABLE);
|
|
|
|
|
}
|
|
|
|
|
@@ -489,8 +529,18 @@ void device_links_driver_cleanup(struct
|
|
|
|
|
@@ -490,8 +530,18 @@ void device_links_driver_cleanup(struct
|
|
|
|
|
if (link->flags & DL_FLAG_STATELESS)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
@ -215,7 +215,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
WRITE_ONCE(link->status, DL_STATE_DORMANT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -607,13 +657,13 @@ static void device_links_purge(struct de
|
|
|
|
|
@@ -608,13 +658,13 @@ static void device_links_purge(struct de
|
|
|
|
|
|
|
|
|
|
list_for_each_entry_safe_reverse(link, ln, &dev->links.suppliers, c_node) {
|
|
|
|
|
WARN_ON(link->status == DL_STATE_ACTIVE);
|
|
|
|
@ -231,7 +231,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
device_links_write_unlock();
|
|
|
|
|
@@ -1035,6 +1085,34 @@ static ssize_t online_store(struct devic
|
|
|
|
|
@@ -1036,6 +1086,34 @@ static ssize_t online_store(struct devic
|
|
|
|
|
}
|
|
|
|
|
static DEVICE_ATTR_RW(online);
|
|
|
|
|
|
|
|
|
@ -266,7 +266,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
int device_add_groups(struct device *dev, const struct attribute_group **groups)
|
|
|
|
|
{
|
|
|
|
|
return sysfs_create_groups(&dev->kobj, groups);
|
|
|
|
|
@@ -1206,8 +1284,20 @@ static int device_add_attrs(struct devic
|
|
|
|
|
@@ -1207,8 +1285,20 @@ static int device_add_attrs(struct devic
|
|
|
|
|
goto err_remove_dev_groups;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -287,7 +287,7 @@ Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com> |
|
|
|
|
err_remove_dev_groups:
|
|
|
|
|
device_remove_groups(dev, dev->groups);
|
|
|
|
|
err_remove_type_groups:
|
|
|
|
|
@@ -1225,6 +1315,8 @@ static void device_remove_attrs(struct d
|
|
|
|
|
@@ -1226,6 +1316,8 @@ static void device_remove_attrs(struct d
|
|
|
|
|
struct class *class = dev->class;
|
|
|
|
|
const struct device_type *type = dev->type;
|
|
|
|
|
|
|
|
|
|