diff options
Diffstat (limited to 'drivers/of/base.c')
-rw-r--r-- | drivers/of/base.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c index b99201a50f..17f58dba23 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2248,6 +2248,7 @@ int of_add_memory(struct device_node *node, bool dump) return -ENXIO; while (!of_address_to_resource(node, n, &res)) { + int err; n++; if (!resource_size(&res)) continue; @@ -2255,12 +2256,15 @@ int of_add_memory(struct device_node *node, bool dump) if (!of_device_is_available(node)) continue; - of_add_memory_bank(node, dump, mem_bank_num, + err = of_add_memory_bank(node, dump, mem_bank_num, res.start, resource_size(&res)); + if (err) + ret = err; + mem_bank_num++; } - return 0; + return ret; } static struct device_node *of_chosen; @@ -2283,18 +2287,25 @@ const struct of_device_id of_default_bus_match_table[] = { } }; -static void of_probe_memory(void) +static int of_probe_memory(void) { struct device_node *memory = root_node; + int ret = 0; /* Parse all available node with "memory" device_type */ while (1) { + int err; + memory = of_find_node_by_type(memory, "memory"); if (!memory) break; - of_add_memory(memory, false); + err = of_add_memory(memory, false); + if (err) + ret = err; } + + return ret; } static void of_platform_device_create_root(struct device_node *np) @@ -2315,6 +2326,7 @@ static void of_platform_device_create_root(struct device_node *np) int of_probe(void) { struct device_node *firmware; + int ret; if(!root_node) return -ENODEV; @@ -2325,7 +2337,7 @@ int of_probe(void) if (of_model) barebox_set_model(of_model); - of_probe_memory(); + ret = of_probe_memory(); firmware = of_find_node_by_path("/firmware"); if (firmware) @@ -2336,7 +2348,7 @@ int of_probe(void) of_clk_init(root_node, NULL); of_platform_populate(root_node, of_default_bus_match_table, NULL); - return 0; + return ret; } /** |