summaryrefslogtreecommitdiffstats
path: root/drivers/of/platform.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/of/platform.c')
-rw-r--r--drivers/of/platform.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index ae85a88ba53e..52590fb20422 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -650,24 +650,35 @@ static bool of_link_property(struct device *dev, struct device_node *con_np,
return done ? 0 : -ENODEV;
}
+static int __of_link_to_suppliers(struct device *dev,
+ struct device_node *con_np)
+{
+ struct device_node *child;
+ struct property *p;
+ bool done = true;
+
+ for_each_property_of_node(con_np, p)
+ if (of_link_property(dev, con_np, p->name))
+ done = false;
+
+ for_each_child_of_node(con_np, child)
+ if (__of_link_to_suppliers(dev, child))
+ done = false;
+
+ return done ? 0 : -ENODEV;
+}
+
static bool of_devlink;
core_param(of_devlink, of_devlink, bool, 0);
static int of_link_to_suppliers(struct device *dev)
{
- struct property *p;
- bool done = true;
-
if (!of_devlink)
return 0;
if (unlikely(!dev->of_node))
return 0;
- for_each_property_of_node(dev->of_node, p)
- if (of_link_property(dev, dev->of_node, p->name))
- done = false;
-
- return done ? 0 : -ENODEV;
+ return __of_link_to_suppliers(dev, dev->of_node);
}
#ifndef CONFIG_PPC