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.