[PATCH 08/13] mtd: spinand: Reject 8D-8D-8D op_templates if octal_dtr_enale() is missing in manufacturer_op

Apurva Nandan a-nandan at ti.com
Fri Aug 20 04:26:50 PDT 2021



On 07/08/21 12:31 am, Miquel Raynal wrote:
> Hi Apurva,
> 
> Apurva Nandan <a-nandan at ti.com> wrote on Tue, 13 Jul 2021 13:05:33
> +0000:
> 
>> The SPI NAND core doesn't know how to switch the flash to Octal DTR
>> mode (i.e. which operations to perform). If the manufacturer hasn't
>> implemented the octal_dtr_enable() manufacturer_op, the SPI NAND core
>> wouldn't be able to switch to 8D-8D-8D mode and will also not be able
>> to run in 1S-1S-1S mode due to already selected 8D-8D-8D read/write
>> cache op_templates.
>>
>> So, avoid choosing a Octal DTR SPI op_template for read_cache,
>> write_cache and update_cache operations, if the manufacturer_op
>> octal_dtr_enable() is missing.
> 
> After looking at your previous commit I don't see why this patch would
> be needed. octal_dtr_enable() only updates the mode when it succeeds so
> I don't think this patch is really needed.
> 

I added it to prevent any errors happening dues to a missing 
implementation of octal_dtr_enable() from manufacturer driver side.
So, if the manufacturers skips the octal_dtr_enable() implementation, we 
want the spinand core to run in 1s-1s-1s mode.

Read/write/update op variant selection happens in select_op_variant(), 
much before octal_dtr_enable(). So just check if there is a definition 
of octal_dtr_enable in manufacturer ops and then only use 8D op variants.

Removing this wouldn't break anything in the current implementation.
Do you think we should drop this?

>>
>> Signed-off-by: Apurva Nandan <a-nandan at ti.com>
>> ---
>>   drivers/mtd/nand/spi/core.c | 7 ++++++-
>>   1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
>> index 19d8affac058..8711e887b795 100644
>> --- a/drivers/mtd/nand/spi/core.c
>> +++ b/drivers/mtd/nand/spi/core.c
>> @@ -1028,6 +1028,8 @@ static int spinand_manufacturer_match(struct spinand_device *spinand,
>>   		if (id[0] != manufacturer->id)
>>   			continue;
>>   
>> +		spinand->manufacturer = manufacturer;
>> +
>>   		ret = spinand_match_and_init(spinand,
>>   					     manufacturer->chips,
>>   					     manufacturer->nchips,
>> @@ -1035,7 +1037,6 @@ static int spinand_manufacturer_match(struct spinand_device *spinand,
>>   		if (ret < 0)
>>   			continue;
>>   
>> -		spinand->manufacturer = manufacturer;
>>   		return 0;
>>   	}
>>   	return -ENOTSUPP;
>> @@ -1097,6 +1098,10 @@ spinand_select_op_variant(struct spinand_device *spinand,
>>   		unsigned int nbytes;
>>   		int ret;
>>   
>> +		if (spinand_op_is_octal_dtr(&op) &&
>> +		    !spinand->manufacturer->ops->octal_dtr_enable)
>> +			continue;
>> +
>>   		nbytes = nanddev_per_page_oobsize(nand) +
>>   			 nanddev_page_size(nand);
>>   
> 
> Thanks,
> Miquèl
> 
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
> 

Thanks,
Apurva Nandan



More information about the linux-mtd mailing list