Hi,

On 20/08/21 02:58PM, JaimeLiao wrote:
> Power-on-Reset is a method to restore flash back to 1S-1S-1S mode from 
> 8D-8D-8D
> in the begging of probe.
> 
> Command extension type is not standardized across flash vendors in DTR mode.
> 
> For suiting different vendor flash devices, having second times Softreset with
> different types is clumsy but useful in the begging of probe.

Yes, it is indeed clumsy, and I am not convinced this is the right way 
to go.

Firstly, you issue the reset twice. This is obviously not ideal and you 
have to hope the command with incorrect extension is ignored, and not 
interpreted as something different. But more importantly, you also do 
the same when called via spi_nor_remove(). At that point you have parsed 
SFDP and know the flash we are dealing with so you should already know 
which extension to use.

So here is my suggestion: create a separate function, something like 
spi_nor_early_soft_reset(). In that function check a config variable to 
decide which extension to use and temporarily set nor->cmd_ext_type to 
that. Then in spi_nor_soft_reset() just use nor->cmd_ext_type, no need 
to hard code the extension. This way you will certainly use the correct 
extension at remove and will have a more accurate guess at probe time.

I admit this isn't the cleanest solution, but this is the best I can 
come up with right now.

> 
> Signed-off-by: JaimeLiao <jaimeliao...@gmail.com>
> ---
>  drivers/mtd/spi/spi-nor-core.c | 30 ++++++++++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
> 
> diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c
> index 351ca9c3a8..707eb9c1d2 100644
> --- a/drivers/mtd/spi/spi-nor-core.c
> +++ b/drivers/mtd/spi/spi-nor-core.c
> @@ -3692,6 +3692,36 @@ static int spi_nor_soft_reset(struct spi_nor *nor)
>        */
>       udelay(SPI_NOR_SRST_SLEEP_LEN);
>  
> +     /* Manufacturers with different command extension type. For suitting
> +      * different flash devices, using command extension type is equal 
> "INVERT"
> +      * when second time Software Reset.
> +      */
> +
> +     nor->cmd_ext_type = SPI_NOR_EXT_INVERT;
> +     op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRSTEN, 0),
> +                     SPI_MEM_OP_NO_DUMMY,
> +                     SPI_MEM_OP_NO_ADDR,
> +                     SPI_MEM_OP_NO_DATA);
> +     spi_nor_setup_op(nor, &op, SNOR_PROTO_8_8_8_DTR);
> +     ret = spi_mem_exec_op(nor->spi, &op);
> +     if (ret) {
> +             dev_warn(nor->dev, "Software reset enable failed: %d\n", ret);
> +             goto out;
> +     }
> +
> +     op = (struct spi_mem_op)SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_SRST, 0),
> +                     SPI_MEM_OP_NO_DUMMY,
> +                     SPI_MEM_OP_NO_ADDR,
> +                     SPI_MEM_OP_NO_DATA);
> +     spi_nor_setup_op(nor, &op, SNOR_PROTO_8_8_8_DTR);
> +     ret = spi_mem_exec_op(nor->spi, &op);
> +     if (ret) {
> +             dev_warn(nor->dev, "Software reset failed: %d\n", ret);
> +             goto out;
> +     }
> +
> +     udelay(SPI_NOR_SRST_SLEEP_LEN);
> +
>  out:
>       nor->cmd_ext_type = ext;
>       return ret;
> -- 
> 2.17.1
> 

-- 
Regards,
Pratyush Yadav
Texas Instruments Inc.

Reply via email to