
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 '/', interpret 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"
This change adds code that depends on CONFIG_DM. Although CONFIG_DM is compulsory since v2020.01, there are still some boards (for example tqma6s_wru4_mmc_defconfig) that don't enable it. Therefore the code guards this parts by #ifdefs.
Signed-off-by: Marek Behún marek.behun@nic.cz Cc: 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: Jagan Teki jagan@amarulasolutions.com Cc: Patrick Delaunay patrick.delaunay@st.com Cc: Patrice CHOTARD patrice.chotard@foss.st.com Cc: Miquel Raynal miquel.raynal@bootlin.com --- drivers/mtd/mtdcore.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 0d1f94c6cb..7c894b2e41 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c @@ -780,13 +780,42 @@ struct mtd_info *get_mtd_device_nm(const char *name) { int err = -ENODEV; struct mtd_info *mtd = NULL, *other; +#ifdef CONFIG_DM + struct udevice *dev = NULL; +#endif + +#ifdef CONFIG_DM + /* + * If the first character of mtd name is '/', interpret it as OF path. + * Otherwise try comparing by mtd->name and mtd->dev->name. + */ + if (*name == '/') { + err = device_get_global_by_ofnode(ofnode_path(name), &dev); + if (err) + return ERR_PTR(err); + } +#endif
mutex_lock(&mtd_table_mutex);
mtd_for_each_device(other) { +#ifdef CONFIG_DM + if ((dev && !mtd_is_partition(other) && other->dev == dev) || + !strcmp(name, other->name) || + (!mtd_is_partition(other) && other->dev && + !strcmp(name, other->dev->name))) { +#else if (!strcmp(name, other->name)) { +#endif +#ifdef __UBOOT__ + if (mtd) + printf("\nWarning: MTD name "%s" is not unique!\n\n", + name); + mtd = other; +#else /* !__UBOOT__ */ mtd = other; break; +#endif /* !__UBOOT__ */ } }