summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaravana Kannan <saravanak@google.com>2019-10-28 23:00:26 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-11-02 18:05:19 +0100
commit15956dad5c1016155c82d094f8c1273a30f79c3d (patch)
treedd153ad2e067f87d6f4abb6cf87caefedc8afacb
parentof: property: Make sure child dependencies don't block probing of parent (diff)
downloadlinux-15956dad5c1016155c82d094f8c1273a30f79c3d.tar.xz
linux-15956dad5c1016155c82d094f8c1273a30f79c3d.zip
of: property: Skip adding device links to suppliers that aren't devices
Some devices need to be initialized really early and can't wait for driver core or drivers to be functional. These devices are typically initialized without creating a struct device for their device nodes. If a supplier ends up being one of these devices, skip trying to add device links to them. Signed-off-by: Saravana Kannan <saravanak@google.com> Link: https://lore.kernel.org/r/20191028220027.251605-6-saravanak@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/of/property.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/of/property.c b/drivers/of/property.c
index 69a6ec8711bd..e225ab17f598 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1024,6 +1024,7 @@ static int of_link_to_phandle(struct device *dev, struct device_node *sup_np,
struct device *sup_dev;
int ret = 0;
struct device_node *tmp_np = sup_np;
+ int is_populated;
of_node_get(sup_np);
/*
@@ -1048,9 +1049,10 @@ static int of_link_to_phandle(struct device *dev, struct device_node *sup_np,
return -EINVAL;
}
sup_dev = get_dev_from_fwnode(&sup_np->fwnode);
+ is_populated = of_node_check_flag(sup_np, OF_POPULATED);
of_node_put(sup_np);
if (!sup_dev)
- return -EAGAIN;
+ return is_populated ? 0 : -EAGAIN;
if (!device_link_add(dev, sup_dev, dl_flags))
ret = -EAGAIN;
put_device(sup_dev);