diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2013-04-21 16:27:35 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2013-04-22 09:23:23 +0200 |
commit | 8e9d9bc7e6d9eaabd8287f5cd1db059518aec385 (patch) | |
tree | ce6d0908aa20c82172fba0bdb73d852522af9fbc | |
parent | 43f9a96a740d8942565b299f1484cd3a9b612e75 (diff) | |
download | barebox-8e9d9bc7e6d9eaabd8287f5cd1db059518aec385.tar.gz barebox-8e9d9bc7e6d9eaabd8287f5cd1db059518aec385.tar.xz |
of: parse phandles before probing devices
The phandles have to be parsed completely before registering the devices
from the devicetree. Otherwise drivers can't rely on of_find_node_by_phandle
in their probe.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/of/base.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c index d22031f32f..65d81715b4 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -873,15 +873,8 @@ static int add_of_device_resource(struct device_node *node) u64 address, size; struct resource *res; struct device_d *dev; - phandle phandle; int ret; - ret = of_property_read_u32(node, "phandle", &phandle); - if (!ret) { - node->phandle = phandle; - list_add_tail(&node->phandles, &phandle_list); - } - ret = of_add_memory(node, false); if (ret != -ENXIO) return ret; @@ -975,6 +968,22 @@ static void __of_probe(struct device_node *node) __of_probe(n); } +static void __of_parse_phandles(struct device_node *node) +{ + struct device_node *n; + phandle phandle; + int ret; + + ret = of_property_read_u32(node, "phandle", &phandle); + if (!ret) { + node->phandle = phandle; + list_add_tail(&node->phandles, &phandle_list); + } + + list_for_each_entry(n, &node->children, parent_list) + __of_parse_phandles(n); +} + struct device_node *of_chosen; const char *of_model; @@ -991,6 +1000,7 @@ int of_probe(void) of_chosen = of_find_node_by_path(root_node, "/chosen"); of_property_read_string(root_node, "model", &of_model); + __of_parse_phandles(root_node); __of_probe(root_node); return 0; |