mtd: Use default mtdparts/mtids when not defined in the environment
authorBoris Brezillon <boris.brezillon@bootlin.com>
Tue, 13 Nov 2018 11:43:09 +0000 (12:43 +0100)
committerJagan Teki <jagan@amarulasolutions.com>
Tue, 13 Nov 2018 13:23:10 +0000 (18:53 +0530)
U-boot provides a mean to define default values for mtdids and mtdparts
when they're not defined in the environment. Patch mtd_probe_devices()
to use those default values when env_get("mtdparts") or
env_get("mtdids") return NULL.

This implementation is based on the logic found in cmd/mtdparts.c.

Fixes: 5db66b3aee6f ("cmd: mtd: add 'mtd' command")
Reported-by: Stefan Roese <sr@denx.de>
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Tested-by: Stefan Roese <sr@denx.de>
Reviewed-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Jagan Teki <jagan@openedev.com>
drivers/mtd/mtd_uboot.c

index 7d7a11c..5ca560c 100644 (file)
@@ -92,12 +92,70 @@ static void mtd_probe_uclass_mtd_devs(void) { }
 #endif
 
 #if defined(CONFIG_MTD_PARTITIONS)
+extern void board_mtdparts_default(const char **mtdids,
+                                  const char **mtdparts);
+
+static const char *get_mtdids(void)
+{
+       __maybe_unused const char *mtdparts = NULL;
+       const char *mtdids = env_get("mtdids");
+
+       if (mtdids)
+               return mtdids;
+
+#if defined(CONFIG_SYS_MTDPARTS_RUNTIME)
+       board_mtdparts_default(&mtdids, &mtdparts);
+#elif defined(MTDIDS_DEFAULT)
+       mtdids = MTDIDS_DEFAULT;
+#elif defined(CONFIG_MTDIDS_DEFAULT)
+       mtdids = CONFIG_MTDIDS_DEFAULT;
+#endif
+
+       if (mtdids)
+               env_set("mtdids", mtdids);
+
+       return mtdids;
+}
+
+#define MTDPARTS_MAXLEN         512
+
+static const char *get_mtdparts(void)
+{
+       __maybe_unused const char *mtdids = NULL;
+       static char tmp_parts[MTDPARTS_MAXLEN];
+       static bool use_defaults = true;
+       const char *mtdparts = NULL;
+
+       if (gd->flags & GD_FLG_ENV_READY)
+               mtdparts = env_get("mtdparts");
+       else if (env_get_f("mtdparts", tmp_parts, sizeof(tmp_parts)) != -1)
+               mtdparts = tmp_parts;
+
+       if (mtdparts || !use_defaults)
+               return mtdparts;
+
+#if defined(CONFIG_SYS_MTDPARTS_RUNTIME)
+       board_mtdparts_default(&mtdids, &mtdparts);
+#elif defined(MTDPARTS_DEFAULT)
+       mtdparts = MTDPARTS_DEFAULT;
+#elif defined(CONFIG_MTDPARTS_DEFAULT)
+       mtdparts = CONFIG_MTDPARTS_DEFAULT;
+#endif
+
+       if (mtdparts)
+               env_set("mtdparts", mtdparts);
+
+       use_defaults = false;
+
+       return mtdparts;
+}
+
 int mtd_probe_devices(void)
 {
        static char *old_mtdparts;
        static char *old_mtdids;
-       const char *mtdparts = env_get("mtdparts");
-       const char *mtdids = env_get("mtdids");
+       const char *mtdparts = get_mtdparts();
+       const char *mtdids = get_mtdids();
        bool remaining_partitions = true;
        struct mtd_info *mtd;