[PATCH V2] mtd: spi-nor: prefer more specific entries from chips database

Rafał Miłecki zajec5 at gmail.com
Wed Nov 5 23:02:13 PST 2014


With two entries sharing first ID bytes but one of them having more of
them, we should prefer the more specific one. Consider following:
1) n25q128a11 with ID 0x20bb18
2) n25q128a13 with ID 0x20bb181234
we should prefer entry with the longer ID.

Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
Cc: Bean Huo <beanhuo at micron.com>
Cc: Huang Shijie <shijie.huang at intel.com>
---
V2: Rebase on top of Huang patches
---
 drivers/mtd/spi-nor/spi-nor.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 209e701..80e333f 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -667,6 +667,7 @@ static const struct spi_device_id *spi_nor_read_id(struct spi_nor *nor)
 	int			tmp;
 	u8			id[SPI_NOR_MAX_ID_LEN];
 	struct flash_info	*info;
+	u8			len;
 
 	tmp = nor->read_reg(nor, SPINOR_OP_RDID, id, SPI_NOR_MAX_ID_LEN);
 	if (tmp < 0) {
@@ -674,10 +675,15 @@ static const struct spi_device_id *spi_nor_read_id(struct spi_nor *nor)
 		return ERR_PTR(tmp);
 	}
 
-	for (tmp = 0; tmp < ARRAY_SIZE(spi_nor_ids) - 1; tmp++) {
-		info = (void *)spi_nor_ids[tmp].driver_data;
-		if (info->id_len) {
-			if (!memcmp(info->id, id, info->id_len))
+	/*
+	 * Start looking for entries with the longest ID, then go to the less
+	 * specific ones.
+	 */
+	for (len = SPI_NOR_MAX_ID_LEN; len > 0; len--) {
+		for (tmp = 0; tmp < ARRAY_SIZE(spi_nor_ids) - 1; tmp++) {
+			info = (void *)spi_nor_ids[tmp].driver_data;
+			if (info->id_len == len &&
+			    !memcmp(info->id, id, info->id_len))
 				return &spi_nor_ids[tmp];
 		}
 	}
-- 
1.8.4.5




More information about the linux-mtd mailing list