[PATCH v2 4/8] mtd: spi-nor: spansion: Rework cypress_nor_set_page_size() for multi-chip device support

Tudor Ambarus tudor.ambarus at linaro.org
Tue Apr 4 18:44:54 PDT 2023



On 02.03.2023 08:09, Tudor Ambarus wrote:
> 
> 
> On 08.02.2023 07:53, tkuw584924 at gmail.com wrote:
>> From: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>
>>
>> For multi-chip devices, we can use 512B page only when the all dice are
>> configured as 512B page size. Simple for-loop with params->num_of_dice
>> can
>> check the CFR3V in each die. The volatile register address is calculated
>> inside the loop by using die number and volatile register offset.
>>
>> The location of cypress_nor_set_page_size() call is moved from
>> post_bfpt_fixup() to post_sfdp_fixup(), because the number of dice and
>> volatile register offset are parsed after BFPT. The post_sfdp_fixup()
> 
> No, this looks wrong.
> 
> BFPT is the only mandatory table and should be sufficient to make any
> flash work (in the multi die case, just for the first die). All the
> other tables are considered optional. If we get an error when parsing
> BFPT we return an error, if we get an error in any optional table, we
> just print a warning and continue. So you should make sure that the
> flash works fine even if sccr_map_mc fails.
> 
>> does not return error code so cypress_nor_set_page_size() prints error
>> message instead of returning error code.
>>
>> Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano at infineon.com>
>> ---
>>   drivers/mtd/spi-nor/spansion.c | 47 ++++++++++++++++++----------------
>>   1 file changed, 25 insertions(+), 22 deletions(-)
>>
>> diff --git a/drivers/mtd/spi-nor/spansion.c
>> b/drivers/mtd/spi-nor/spansion.c
>> index 12a256c0ef4c..7c533737d7c3 100644
>> --- a/drivers/mtd/spi-nor/spansion.c
>> +++ b/drivers/mtd/spi-nor/spansion.c
>> @@ -18,7 +18,7 @@
>>   #define SPINOR_REG_CYPRESS_CFR1_QUAD_EN        BIT(1)    /* Quad
>> Enable */
>>   #define SPINOR_REG_CYPRESS_CFR2V        0x00800003
>>   #define SPINOR_REG_CYPRESS_CFR2_MEMLAT_11_24    0xb
>> -#define SPINOR_REG_CYPRESS_CFR3V        0x00800004
>> +#define SPINOR_REG_CYPRESS_CFR3            0x4
>>   #define SPINOR_REG_CYPRESS_CFR3_PGSZ        BIT(4) /* Page size. */
>>   #define SPINOR_REG_CYPRESS_CFR5V        0x00800006
>>   #define SPINOR_REG_CYPRESS_CFR5_BIT6        BIT(6)
>> @@ -195,27 +195,34 @@ static int
>> cypress_nor_quad_enable_volatile(struct spi_nor *nor)
>>    * The BFPT table advertises a 512B or 256B page size depending on
>> part but the
>>    * page size is actually configurable (with the default being 256B).
>> Read from
>>    * CFR3V[4] and set the correct size.
>> - *
>> - * Return: 0 on success, -errno otherwise.
>>    */
>> -static int cypress_nor_set_page_size(struct spi_nor *nor)
>> +static void cypress_nor_set_page_size(struct spi_nor *nor)
>>   {
>> +    struct spi_nor_flash_parameter *params = nor->params;
>>       struct spi_mem_op op =
>> -        CYPRESS_NOR_RD_ANY_REG_OP(nor->params->addr_mode_nbytes,
>> -                      SPINOR_REG_CYPRESS_CFR3V,
>> +        CYPRESS_NOR_RD_ANY_REG_OP(params->addr_mode_nbytes, 0,
>>                         nor->bouncebuf);
>>       int ret;
>> +    u8 i;
>>   -    ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
>> -    if (ret)
>> -        return ret;
>> +    /* Set to default page size */
>> +    params->page_size = 256;
>>   -    if (nor->bouncebuf[0] & SPINOR_REG_CYPRESS_CFR3_PGSZ)
>> -        nor->params->page_size = 512;
>> -    else
>> -        nor->params->page_size = 256;
>> +    for (i = 0; i < params->num_of_dice; i++) {
>> +        op.addr.val = params->vreg_offset[i] + SPINOR_REG_CYPRESS_CFR3;
> 
> in case sccr_map fails vreg_offset is zero here, you'll read garbage
>>   -    return 0;
>> +        ret = spi_nor_read_any_reg(nor, &op, nor->reg_proto);
>> +        if (ret) {
>> +            dev_err(nor->dev, "Failed to read page size
>> configuration. Use default 256B.\n");
>> +            return;
> 
> why did we consider a no-go error and exited in the past and now we just
> use a default config?
> 

we should instead allow parse_sfdp to return errors. I'm sending a patch
shortly.



More information about the linux-mtd mailing list