]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mtd: compare also with OF path and device name in get_mtd_device_nm()
authorMarek Behún <marek.behun@nic.cz>
Wed, 26 May 2021 12:08:25 +0000 (14:08 +0200)
committerJagan Teki <jagan@amarulasolutions.com>
Thu, 24 Jun 2021 06:24:57 +0000 (11:54 +0530)
The get_mtd_device_nm() function (code imported from Linux) simply
iterates all registered MTD devices and compares the given name with
all MTDs' names.

With SPI_FLASH_MTD enabled U-Boot registers a SPI-NOR as a MTD device
with name identical to the SPI flash chip name (from SPI ID table). Thus
for a board with multiple same SPI-NORs it registers multiple MTDs, but
all with the same name (such as "s25fl164k"). We do not want to change
this behaviour, since such a change could break existing boot scripts,
which can rely on a hardcoded name.

In order to allow somehow to uniqely select a MTD device, change
get_mtd_device_nm() function as such:
- if first character of name is '/', try interpreting it as OF path
- otherwise compare the name with MTDs name and MTDs device name.

In the following example a board has two "s25fl164k" SPI-NORs. They both
have name "s25fl164k", thus cannot be uniquely selected via this name.
With this change, the user can select the second SPI-NOR either with
"spi-nor@1" or "/soc/spi@10600/spi-nor@1".

Example:
  => mtd list
  List of MTD devices:
  * s25fl164k
    - device: spi-nor@0
    - parent: spi@10600
    - driver: jedec_spi_nor
    - path: /soc/spi@10600/spi-nor@0
    - type: NOR flash
    - block size: 0x1000 bytes
    - min I/O: 0x1 bytes
    - 0x000000000000-0x000000800000 : "s25fl164k"
  * s25fl164k
    - device: spi-nor@1
    - parent: spi@10600
    - driver: jedec_spi_nor
    - path: /soc/spi@10600/spi-nor@1
    - type: NOR flash
    - block size: 0x1000 bytes
    - min I/O: 0x1 bytes
    - 0x000000000000-0x000000800000 : "s25fl164k"

Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Tested-by: Patrice Chotard <patrice.chotard@foss.st.com>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
Cc: Priyanka Jain <priyanka.jain@nxp.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Heiko Schocher <hs@denx.de>
Cc: Patrick Delaunay <patrick.delaunay@st.com>
drivers/mtd/mtdcore.c

index 0d1f94c6cba898c006bd2501e2c250380c213e11..582129d0df162a7498629ddd1000044ebf33161b 100644 (file)
@@ -768,6 +768,32 @@ int __get_mtd_device(struct mtd_info *mtd)
 }
 EXPORT_SYMBOL_GPL(__get_mtd_device);
 
+#if CONFIG_IS_ENABLED(DM) && CONFIG_IS_ENABLED(OF_CONTROL)
+static bool mtd_device_matches_name(struct mtd_info *mtd, const char *name)
+{
+       struct udevice *dev = NULL;
+       bool is_part;
+
+       /*
+        * If the first character of mtd name is '/', try interpreting as OF
+        * path. Otherwise try comparing by mtd->name and mtd->dev->name.
+        */
+       if (*name == '/')
+               device_get_global_by_ofnode(ofnode_path(name), &dev);
+
+       is_part = mtd_is_partition(mtd);
+
+       return (!is_part && dev && mtd->dev == dev) ||
+              !strcmp(name, mtd->name) ||
+              (is_part && mtd->dev && !strcmp(name, mtd->dev->name));
+}
+#else
+static bool mtd_device_matches_name(struct mtd_info *mtd, const char *name)
+{
+       return !strcmp(name, mtd->name);
+}
+#endif
+
 /**
  *     get_mtd_device_nm - obtain a validated handle for an MTD device by
  *     device name
@@ -784,10 +810,19 @@ struct mtd_info *get_mtd_device_nm(const char *name)
        mutex_lock(&mtd_table_mutex);
 
        mtd_for_each_device(other) {
+#ifdef __UBOOT__
+               if (mtd_device_matches_name(other, name)) {
+                       if (mtd)
+                               printf("\nWarning: MTD name \"%s\" is not unique!\n\n",
+                                      name);
+                       mtd = other;
+               }
+#else /* !__UBOOT__ */
                if (!strcmp(name, other->name)) {
                        mtd = other;
                        break;
                }
+#endif /* !__UBOOT__ */
        }
 
        if (!mtd)