[PATCH] mtd: spi-nor: Use CLSR command for FL-L chips

Vignesh Raghavendra vigneshr at ti.com
Sun Jan 24 01:12:40 EST 2021


 Hi, Yaliang

On 1/23/21 11:15 PM, Tudor.Ambarus at microchip.com wrote:
> Hi, Yaliang,
> 
[...]
>> +static int spi_nor_s25fl_l_sr_ready(struct spi_nor *nor)
>> +{
>> +	u8 *sr = nor->bouncebuf;
>> +	int ret;
>> +
>> +	ret = spi_nor_read_sr(nor, sr);
>> +	if (ret)
>> +		return ret;
>> +
>> +	/**
>> +	 * P_ERR and E_ERR bits are located in the Status Register 2
>> +	 * of Cypress FL-L series chips.
>> +	 */
>> +	ret = spi_nor_s25fl_l_read_sr2(nor, &sr[1]);
>> +	if (ret)
>> +		return ret;
>> +
>> +	if (nor->flags & SNOR_F_USE_CLSR && sr[1] & (SR_E_ERR | SR_P_ERR)) {
> If checking other manufacturer datasheets, would you please check if
> CLSR is used by any other manufacturer?
> 

This is limited to certain subsets of Cypress/Spansion flashes.

>> +		if (sr[1] & SR_E_ERR)
>> +			dev_err(nor->dev, "Erase Error occurred\n");
>> +		else
>> +			dev_err(nor->dev, "Programming Error occurred\n");
>> +
>> +		spi_nor_clear_sr(nor);
>> +
>> +		/*
>> +		 * WEL bit remains set to one when an erase or page program
>> +		 * error occurs. Issue a Write Disable command to protect
>> +		 * against inadvertent writes that can possibly corrupt the
>> +		 * contents of the memory.
>> +		 */
>> +		ret = spi_nor_write_disable(nor);
>> +		if (ret)
>> +			return ret;
>> +
>> +		return -EIO;
>> +	}
>> +
>> +	return !(sr[0] & SR_WIP);
>> +}
>> +
>>  /**
>>   * spi_nor_sr_ready() - Query the Status Register to see if the flash is ready
>>   * for new commands.
>> @@ -546,7 +628,19 @@ static void spi_nor_clear_sr(struct spi_nor *nor)
>>   */
>>  static int spi_nor_sr_ready(struct spi_nor *nor)
>>  {
>> -	int ret = spi_nor_read_sr(nor, nor->bouncebuf);
>> +	int ret;
>> +	const struct flash_info *tmpinfo = nor->info ? nor->info : spi_nor_read_id(nor);
>> +
>> +	if (IS_ERR_OR_NULL(tmpinfo))
>> +		return -ENOENT;
>> +
>> +	if (!strcmp(tmpinfo->name, "s25fl064l")
>> +			|| !strcmp(tmpinfo->name, "s25fl128l")
>> +			|| !strcmp(tmpinfo->name, "s25fl256l")) {
>> +		return spi_nor_s25fl_l_sr_ready(nor);
>> +	}
> 
> No, we can't accept flash name comparisons in the SPI NOR core.
> If CLSR and RDSR2 are just spansion specific, we can provide a sr_ready
> function pointer that can be filled by spansion flashes. Or some other
> method depending on the CLSR and RDSR2 exposure through other
> manufacturers.
> 
> Ideally one would skim through at least 2 - 3 datasheets from each
> manufacturer available in SPI NOR. Preferable each datasheet from
> a different manufacturer family. Unfortunately I'm not aware of any
> standard that describes all the supported SPI NOR commands.
> If you find this overwhelming, I can share the workload with you,
> but at best effort. If you go through this by yourself, please
> save the name of the datasheet flashes that you go through.
> 

Agree with Tudor. There is quite a bit of variation even within
Cypress/Spansion devices. S28 series of flashes have these error bits
within SR1 register. See: https://www.cypress.com/file/513996/download

So, this cannot be in SPI NOR core.

spi_nor_xread_sr(), spi_nor_fsr_ready() and spi_nor_clear_sr() are all
vendor/family specific and should be moved to appropriate vendor
specific drivers.

Would highly appreciate it, if you could fix these up as part of your
current work. Thanks!

Regards
Vignesh

[...]



More information about the linux-mtd mailing list