diff options
Diffstat (limited to 'drivers/of/fdt.c')
-rw-r--r-- | drivers/of/fdt.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 14f2f8c7c260..33daffc4392c 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c | |||
@@ -395,7 +395,7 @@ static int unflatten_dt_nodes(const void *blob, | |||
395 | struct device_node **nodepp) | 395 | struct device_node **nodepp) |
396 | { | 396 | { |
397 | struct device_node *root; | 397 | struct device_node *root; |
398 | int offset = 0, depth = 0; | 398 | int offset = 0, depth = 0, initial_depth = 0; |
399 | #define FDT_MAX_DEPTH 64 | 399 | #define FDT_MAX_DEPTH 64 |
400 | unsigned int fpsizes[FDT_MAX_DEPTH]; | 400 | unsigned int fpsizes[FDT_MAX_DEPTH]; |
401 | struct device_node *nps[FDT_MAX_DEPTH]; | 401 | struct device_node *nps[FDT_MAX_DEPTH]; |
@@ -405,11 +405,22 @@ static int unflatten_dt_nodes(const void *blob, | |||
405 | if (nodepp) | 405 | if (nodepp) |
406 | *nodepp = NULL; | 406 | *nodepp = NULL; |
407 | 407 | ||
408 | /* | ||
409 | * We're unflattening device sub-tree if @dad is valid. There are | ||
410 | * possibly multiple nodes in the first level of depth. We need | ||
411 | * set @depth to 1 to make fdt_next_node() happy as it bails | ||
412 | * immediately when negative @depth is found. Otherwise, the device | ||
413 | * nodes except the first one won't be unflattened successfully. | ||
414 | */ | ||
415 | if (dad) | ||
416 | depth = initial_depth = 1; | ||
417 | |||
408 | root = dad; | 418 | root = dad; |
409 | fpsizes[depth] = dad ? strlen(of_node_full_name(dad)) : 0; | 419 | fpsizes[depth] = dad ? strlen(of_node_full_name(dad)) : 0; |
410 | nps[depth] = dad; | 420 | nps[depth] = dad; |
421 | |||
411 | for (offset = 0; | 422 | for (offset = 0; |
412 | offset >= 0 && depth >= 0; | 423 | offset >= 0 && depth >= initial_depth; |
413 | offset = fdt_next_node(blob, offset, &depth)) { | 424 | offset = fdt_next_node(blob, offset, &depth)) { |
414 | if (WARN_ON_ONCE(depth >= FDT_MAX_DEPTH)) | 425 | if (WARN_ON_ONCE(depth >= FDT_MAX_DEPTH)) |
415 | continue; | 426 | continue; |