On 02/11/19 4:53 PM, Tudor.Ambarus@xxxxxxxxxxxxx wrote: > From: Tudor Ambarus <tudor.ambarus@xxxxxxxxxxxxx> > > Drop the default spansion_quad_enable() method and replace it with > spansion_read_cr_quad_enable(). > > The function was buggy, it didn't care about the previous values > of the Status and Configuration Registers. spansion_read_cr_quad_enable() > is a Read-Modify-Write-Check function that keeps track of what were > the previous values of the Status and Configuration Registers. > > In terms of instruction types sent to the flash, the only difference > between the spansion_quad_enable() and spansion_read_cr_quad_enable() > is that the later calls spi_nor_read_sr(). We can safely assume that all > flashes support spi_nor_read_sr(), because all flashes call it in > spi_nor_sr_ready(). The transition from spansion_quad_enable() to > spansion_read_cr_quad_enable() will not affect anybody, drop the buggy > code. > > Signed-off-by: Tudor Ambarus <tudor.ambarus@xxxxxxxxxxxxx> Reviewed-by: Vignesh Raghavendra <vigneshr@xxxxxx> Regards Vignesh > --- > drivers/mtd/spi-nor/spi-nor.c | 58 ++++--------------------------------------- > 1 file changed, 5 insertions(+), 53 deletions(-) > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c > index 99a9a6aba41d..f5193733a0f6 100644 > --- a/drivers/mtd/spi-nor/spi-nor.c > +++ b/drivers/mtd/spi-nor/spi-nor.c > @@ -1971,54 +1971,6 @@ static int macronix_quad_enable(struct spi_nor *nor) > } > > /** > - * spansion_quad_enable() - set QE bit in Configuraiton Register. > - * @nor: pointer to a 'struct spi_nor' > - * > - * Set the Quad Enable (QE) bit in the Configuration Register. > - * This function is kept for legacy purpose because it has been used for a > - * long time without anybody complaining but it should be considered as > - * deprecated and maybe buggy. > - * First, this function doesn't care about the previous values of the Status > - * and Configuration Registers when it sets the QE bit (bit 1) in the > - * Configuration Register: all other bits are cleared, which may have unwanted > - * side effects like removing some block protections. > - * Secondly, it uses the Read Configuration Register (35h) instruction though > - * some very old and few memories don't support this instruction. If a pull-up > - * resistor is present on the MISO/IO1 line, we might still be able to pass the > - * "read back" test because the QSPI memory doesn't recognize the command, > - * so leaves the MISO/IO1 line state unchanged, hence spi_nor_read_cr() returns > - * 0xFF. > - * > - * bit 1 of the Configuration Register is the QE bit for Spansion like QSPI > - * memories. > - * > - * Return: 0 on success, -errno otherwise. > - */ > -static int spansion_quad_enable(struct spi_nor *nor) > -{ > - u8 *sr_cr = nor->bouncebuf; > - int ret; > - > - sr_cr[0] = 0; > - sr_cr[1] = CR_QUAD_EN_SPAN; > - ret = spi_nor_write_sr(nor, sr_cr, 2); > - if (ret) > - return ret; > - > - /* read back and check it */ > - ret = spi_nor_read_cr(nor, nor->bouncebuf); > - if (ret) > - return ret; > - > - if (!(nor->bouncebuf[0] & CR_QUAD_EN_SPAN)) { > - dev_dbg(nor->dev, "Spansion Quad bit not set\n"); > - return -EINVAL; > - } > - > - return 0; > -} > - > -/** > * spansion_no_read_cr_quad_enable() - set QE bit in Configuration Register. > * @nor: pointer to a 'struct spi_nor' > * > @@ -2170,9 +2122,9 @@ static int spi_nor_clear_sr_bp(struct spi_nor *nor) > * > * Read-modify-write function that clears the Block Protection bits from the > * Status Register without affecting other bits. The function is tightly > - * coupled with the spansion_quad_enable() function. Both assume that the Write > - * Register with 16 bits, together with the Read Configuration Register (35h) > - * instructions are supported. > + * coupled with the spansion_read_cr_quad_enable() function. Both assume that > + * the Write Register with 16 bits, together with the Read Configuration > + * Register (35h) instructions are supported. > * > * Return: 0 on success, -errno otherwise. > */ > @@ -4654,7 +4606,7 @@ static void spi_nor_info_init_params(struct spi_nor *nor) > u8 i, erase_mask; > > /* Initialize legacy flash parameters and settings. */ > - params->quad_enable = spansion_quad_enable; > + params->quad_enable = spansion_read_cr_quad_enable; > params->set_4byte = spansion_set_4byte; > params->setup = spi_nor_default_setup; > > @@ -4869,7 +4821,7 @@ static int spi_nor_init(struct spi_nor *nor) > int err; > > if (nor->clear_sr_bp) { > - if (nor->params.quad_enable == spansion_quad_enable) > + if (nor->params.quad_enable == spansion_read_cr_quad_enable) > nor->clear_sr_bp = spi_nor_spansion_clear_sr_bp; > > err = nor->clear_sr_bp(nor); > -- Regards Vignesh ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/