mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-25 06:46:00 +00:00
mtd: compare also with OF path and device name in get_mtd_device_nm()
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>
This commit is contained in:
parent
0b6f907d15
commit
dcb9a80359
1 changed files with 35 additions and 0 deletions
|
@ -768,6 +768,32 @@ int __get_mtd_device(struct mtd_info *mtd)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__get_mtd_device);
|
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
|
* get_mtd_device_nm - obtain a validated handle for an MTD device by
|
||||||
* device name
|
* device name
|
||||||
|
@ -784,10 +810,19 @@ struct mtd_info *get_mtd_device_nm(const char *name)
|
||||||
mutex_lock(&mtd_table_mutex);
|
mutex_lock(&mtd_table_mutex);
|
||||||
|
|
||||||
mtd_for_each_device(other) {
|
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)) {
|
if (!strcmp(name, other->name)) {
|
||||||
mtd = other;
|
mtd = other;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif /* !__UBOOT__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mtd)
|
if (!mtd)
|
||||||
|
|
Loading…
Add table
Reference in a new issue