[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