[PATCH V2] mtd: spi-nor: prefer more specific entries from chips database
Huang Shijie
shijie.huang at intel.com
Thu Nov 6 17:21:15 PST 2014
On Thu, Nov 06, 2014 at 08:02:13AM +0100, Rafał Miłecki wrote:
> 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.
I perfer to make a limit before we add new item to the table:
Put the longest one in the first place.
By this way, we can avoid the too much "for"s in the following code
which makes the code a little complicated.
So It should looks like this in the table.
1) n25q128a13 with ID 0x20bb181234
2) n25q128a11 with ID 0x20bb18
Hi Brian, what's your opinion?
thanks
Huang Shijie
>
> 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