[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