Platform code can call fdt_fixup_mtdparts() in order to hand U-Boot's
MTD partitions over to the Linux device tree.

Currently, fdt_fixup_mtdparts() calls mtdparts_init() in its entry.
If no target MTD device is found, an error message like follows is
displayed:

    Device nand0 not found!

This occurs when the same code (e.g. arch/arm/mach-uniphier/fdt-fixup.c)
is shared among several boards, but not all boards support an MTD device.

Parse the DT first, then call mtdparts_init() only when the target MTD
node is found.

Yet, you still need to call mtdparts_init() before device_find().

Signed-off-by: Masahiro Yamada <yamada.masah...@socionext.com>
---

 common/fdt_support.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/common/fdt_support.c b/common/fdt_support.c
index b010d0b552ad..717b2b6354c0 100644
--- a/common/fdt_support.c
+++ b/common/fdt_support.c
@@ -951,9 +951,7 @@ void fdt_fixup_mtdparts(void *blob, const struct node_info 
*node_info,
        struct mtd_device *dev;
        int i, idx;
        int noff;
-
-       if (mtdparts_init() != 0)
-               return;
+       bool initialized = false;
 
        for (i = 0; i < node_info_size; i++) {
                idx = 0;
@@ -963,6 +961,13 @@ void fdt_fixup_mtdparts(void *blob, const struct node_info 
*node_info,
                        debug("%s: %s, mtd dev type %d\n",
                                fdt_get_name(blob, noff, 0),
                                node_info[i].compat, node_info[i].type);
+
+                       if (!initialized) {
+                               if (mtdparts_init() != 0)
+                                       return;
+                               initialized = true;
+                       }
+
                        dev = device_find(node_info[i].type, idx++);
                        if (dev) {
                                if (fdt_node_set_part_info(blob, noff, dev))
-- 
2.17.1

Reply via email to