mtd: uboot: search for an equivalent MTD name with the mtdids
authorMiquel Raynal <miquel.raynal@bootlin.com>
Sat, 29 Sep 2018 10:58:26 +0000 (12:58 +0200)
committerJagan Teki <jagan@amarulasolutions.com>
Tue, 2 Oct 2018 16:42:32 +0000 (22:12 +0530)
Using an MTD device (resp. partition) name in mtdparts is simple and
straightforward. However, for a long time already, another name was
given in mtdparts to indicate a device (resp. partition) so the
"mtdids" environment variable was created to do the match.

Let's create a function that, from an MTD device (resp. partition)
name, search for the equivalent name in the "mtdparts" environment
variable thanks to the "mtdids" string.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Reviewed-by: Stefan Roese <sr@denx.de>
Reviewed-by: Boris Brezillon <boris.brezillon@bootlin.com>
drivers/mtd/mtd_uboot.c
include/linux/mtd/mtd.h

index 2b3b2eecca48d54c47d4c072f9986eab533914f4..8d7e7890b71b06e268a0d07be8c76cf5b4678e53 100644 (file)
@@ -5,7 +5,70 @@
  */
 #include <common.h>
 #include <linux/mtd/mtd.h>
-#include <jffs2/jffs2.h>
+#include <jffs2/jffs2.h> /* Legacy */
+
+/**
+ * mtd_search_alternate_name - Search an alternate name for @mtdname thanks to
+ *                             the mtdids legacy environment variable.
+ *
+ * The mtdids string is a list of comma-separated 'dev_id=mtd_id' tupples.
+ * Check if one of the mtd_id matches mtdname, in this case save dev_id in
+ * altname.
+ *
+ * @mtdname: Current MTD device name
+ * @altname: Alternate name to return
+ * @max_len: Length of the alternate name buffer
+ *
+ * @return 0 on success, an error otherwise.
+ */
+int mtd_search_alternate_name(const char *mtdname, char *altname,
+                             unsigned int max_len)
+{
+       const char *mtdids, *equal, *comma, *dev_id, *mtd_id;
+       int dev_id_len, mtd_id_len;
+
+       mtdids = env_get("mtdids");
+       if (!mtdids)
+               return -EINVAL;
+
+       do {
+               /* Find the '=' sign */
+               dev_id = mtdids;
+               equal = strchr(dev_id, '=');
+               if (!equal)
+                       break;
+               dev_id_len = equal - mtdids;
+               mtd_id = equal + 1;
+
+               /* Find the end of the tupple */
+               comma = strchr(mtdids, ',');
+               if (comma)
+                       mtd_id_len = comma - mtd_id;
+               else
+                       mtd_id_len = &mtdids[strlen(mtdids)] - mtd_id + 1;
+
+               if (!dev_id_len || !mtd_id_len)
+                       return -EINVAL;
+
+               if (dev_id_len + 1 > max_len)
+                       continue;
+
+               /* Compare the name we search with the current mtd_id */
+               if (!strncmp(mtdname, mtd_id, mtd_id_len)) {
+                       strncpy(altname, dev_id, dev_id_len);
+                       altname[dev_id_len] = 0;
+
+                       return 0;
+               }
+
+               /* Go to the next tupple */
+               mtdids = comma + 1;
+       } while (comma);
+
+       return -EINVAL;
+}
+
+/* Legacy */
 
 static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
                loff_t *maxsize, int devtype)
index b8c2c3fd59708b85899d81c073be5734b53cac08..af6f4a61f8d3df86f2cca95dfdeb00179df95335 100644 (file)
@@ -549,5 +549,10 @@ int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
 void mtd_get_len_incl_bad(struct mtd_info *mtd, uint64_t offset,
                          const uint64_t length, uint64_t *len_incl_bad,
                          int *truncated);
+
+/* drivers/mtd/mtd_uboot.c */
+int mtd_search_alternate_name(const char *mtdname, char *altname,
+                             unsigned int max_len);
+
 #endif
 #endif /* __MTD_MTD_H__ */