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.ray...@bootlin.com>
---
 drivers/mtd/mtdpart.c          | 62 ++++++++++++++++++++++++++++++++++
 include/linux/mtd/partitions.h |  2 ++
 2 files changed, 64 insertions(+)

diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index d9708da2ae..096351e48b 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -263,6 +263,68 @@ int mtd_parse_partitions(struct mtd_info *parent, const 
char **_mtdparts,
        return 0;
 }
 
+/**
+ * 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 - equal;
+               else
+                       mtd_id_len = &mtdids[strlen(mtdids)] - equal;
+
+               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;
+}
+
 /*
  * MTD methods which simply translate the effective address and pass through
  * to the _real_ device.
diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
index ed4ece5e13..082a4966ea 100644
--- a/include/linux/mtd/partitions.h
+++ b/include/linux/mtd/partitions.h
@@ -88,5 +88,7 @@ int mtd_del_partition(struct mtd_info *master, int partno);
 uint64_t mtd_get_device_size(const struct mtd_info *mtd);
 int mtd_parse_partitions(struct mtd_info *parent, const char **_mtdparts,
                         struct mtd_partition **_parts, int *_nb_parts);
+int mtd_search_alternate_name(const char *mtdname, char *altname,
+                             unsigned int max_len);
 
 #endif
-- 
2.17.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to