diff mbox series

[1/2] fdt_support: call mtdparts_init() after finding MTD node to fix up

Message ID 20200715105638.19140-1-yamada.masahiro@socionext.com
State Superseded
Delegated to: Simon Glass
Headers show
Series [1/2] fdt_support: call mtdparts_init() after finding MTD node to fix up | expand

Commit Message

Masahiro Yamada July 15, 2020, 10:56 a.m. UTC
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.masahiro@socionext.com>
---

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

Comments

Simon Glass July 16, 2020, 3:43 p.m. UTC | #1
On Wed, 15 Jul 2020 at 04:57, Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
>
> 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.masahiro@socionext.com>
> ---
>
>  common/fdt_support.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

>
> 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;

How about inited as it is shorter?


>
>         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
>
diff mbox series

Patch

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))