Message ID | 20191107084135.22122-4-tudor.ambarus@microchip.com |
---|---|
State | Accepted |
Delegated to: | Ambarus Tudor |
Headers | show |
Series | mtd: spi-nor: Quad Enable and (un)lock methods | expand |
On 07-Nov-19 2:11 PM, Tudor.Ambarus@microchip.com wrote: > From: Tudor Ambarus <tudor.ambarus@microchip.com> > > Test that all the bits from Status Register 1 and Status Register 2 > were written correctly. > > Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> Reviewed-by: Vignesh Raghavendra <vigneshr@ti.com> Regards Vignesh > --- > drivers/mtd/spi-nor/spi-nor.c | 58 +++++++++++++++++++++++++++++-------------- > 1 file changed, 39 insertions(+), 19 deletions(-) > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c > index 06aac894ee6d..d33ad56d3b67 100644 > --- a/drivers/mtd/spi-nor/spi-nor.c > +++ b/drivers/mtd/spi-nor/spi-nor.c > @@ -2047,20 +2047,7 @@ static int macronix_quad_enable(struct spi_nor *nor) > > nor->bouncebuf[0] |= SR_QUAD_EN_MX; > > - ret = spi_nor_write_sr(nor, nor->bouncebuf, 1); > - if (ret) > - return ret; > - > - ret = spi_nor_read_sr(nor, nor->bouncebuf); > - if (ret) > - return ret; > - > - if (!(nor->bouncebuf[0] & SR_QUAD_EN_MX)) { > - dev_dbg(nor->dev, "Macronix Quad bit not set\n"); > - return -EIO; > - } > - > - return 0; > + return spi_nor_write_sr1_and_check(nor, nor->bouncebuf[0]); > } > > /** > @@ -2080,6 +2067,7 @@ static int spansion_no_read_cr_quad_enable(struct spi_nor *nor) > { > u8 *sr_cr = nor->bouncebuf; > int ret; > + u8 sr_written; > > /* Keep the current value of the Status Register. */ > ret = spi_nor_read_sr(nor, sr_cr); > @@ -2088,7 +2076,22 @@ static int spansion_no_read_cr_quad_enable(struct spi_nor *nor) > > sr_cr[1] = CR_QUAD_EN_SPAN; > > - return spi_nor_write_sr(nor, sr_cr, 2); > + ret = spi_nor_write_sr(nor, sr_cr, 2); > + if (ret) > + return ret; > + > + sr_written = sr_cr[0]; > + > + ret = spi_nor_read_sr(nor, sr_cr); > + if (ret) > + return ret; > + > + if (sr_cr[0] != sr_written) { > + dev_err(nor->dev, "SR: Read back test failed\n"); > + return -EIO; > + } > + > + return 0; > } > > /** > @@ -2108,6 +2111,7 @@ static int spansion_read_cr_quad_enable(struct spi_nor *nor) > { > u8 *sr_cr = nor->bouncebuf; > int ret; > + u8 sr_written; > > /* Check current Quad Enable bit value. */ > ret = spi_nor_read_cr(nor, &sr_cr[1]); > @@ -2128,13 +2132,26 @@ static int spansion_read_cr_quad_enable(struct spi_nor *nor) > if (ret) > return ret; > > + sr_written = sr_cr[0]; > + > + ret = spi_nor_read_sr(nor, sr_cr); > + if (ret) > + return ret; > + > + if (sr_written != sr_cr[0]) { > + dev_err(nor->dev, "SR: Read back test failed\n"); > + return -EIO; > + } > + > + sr_written = sr_cr[1]; > + > /* Read back and check it. */ > ret = spi_nor_read_cr(nor, &sr_cr[1]); > if (ret) > return ret; > > - if (!(sr_cr[1] & CR_QUAD_EN_SPAN)) { > - dev_dbg(nor->dev, "Spansion Quad bit not set\n"); > + if (sr_cr[1] != sr_written) { > + dev_dbg(nor->dev, "CR: Read back test failed\n"); > return -EIO; > } > > @@ -2157,6 +2174,7 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor) > { > u8 *sr2 = nor->bouncebuf; > int ret; > + u8 sr2_written; > > /* Check current Quad Enable bit value. */ > ret = spi_nor_read_sr2(nor, sr2); > @@ -2172,13 +2190,15 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor) > if (ret) > return ret; > > + sr2_written = *sr2; > + > /* Read back and check it. */ > ret = spi_nor_read_sr2(nor, sr2); > if (ret) > return ret; > > - if (!(*sr2 & SR2_QUAD_EN_BIT7)) { > - dev_dbg(nor->dev, "SR2 Quad bit not set\n"); > + if (*sr2 != sr2_written) { > + dev_dbg(nor->dev, "SR2: Read back test failed\n"); > return -EIO; > } > >
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index 06aac894ee6d..d33ad56d3b67 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c @@ -2047,20 +2047,7 @@ static int macronix_quad_enable(struct spi_nor *nor) nor->bouncebuf[0] |= SR_QUAD_EN_MX; - ret = spi_nor_write_sr(nor, nor->bouncebuf, 1); - if (ret) - return ret; - - ret = spi_nor_read_sr(nor, nor->bouncebuf); - if (ret) - return ret; - - if (!(nor->bouncebuf[0] & SR_QUAD_EN_MX)) { - dev_dbg(nor->dev, "Macronix Quad bit not set\n"); - return -EIO; - } - - return 0; + return spi_nor_write_sr1_and_check(nor, nor->bouncebuf[0]); } /** @@ -2080,6 +2067,7 @@ static int spansion_no_read_cr_quad_enable(struct spi_nor *nor) { u8 *sr_cr = nor->bouncebuf; int ret; + u8 sr_written; /* Keep the current value of the Status Register. */ ret = spi_nor_read_sr(nor, sr_cr); @@ -2088,7 +2076,22 @@ static int spansion_no_read_cr_quad_enable(struct spi_nor *nor) sr_cr[1] = CR_QUAD_EN_SPAN; - return spi_nor_write_sr(nor, sr_cr, 2); + ret = spi_nor_write_sr(nor, sr_cr, 2); + if (ret) + return ret; + + sr_written = sr_cr[0]; + + ret = spi_nor_read_sr(nor, sr_cr); + if (ret) + return ret; + + if (sr_cr[0] != sr_written) { + dev_err(nor->dev, "SR: Read back test failed\n"); + return -EIO; + } + + return 0; } /** @@ -2108,6 +2111,7 @@ static int spansion_read_cr_quad_enable(struct spi_nor *nor) { u8 *sr_cr = nor->bouncebuf; int ret; + u8 sr_written; /* Check current Quad Enable bit value. */ ret = spi_nor_read_cr(nor, &sr_cr[1]); @@ -2128,13 +2132,26 @@ static int spansion_read_cr_quad_enable(struct spi_nor *nor) if (ret) return ret; + sr_written = sr_cr[0]; + + ret = spi_nor_read_sr(nor, sr_cr); + if (ret) + return ret; + + if (sr_written != sr_cr[0]) { + dev_err(nor->dev, "SR: Read back test failed\n"); + return -EIO; + } + + sr_written = sr_cr[1]; + /* Read back and check it. */ ret = spi_nor_read_cr(nor, &sr_cr[1]); if (ret) return ret; - if (!(sr_cr[1] & CR_QUAD_EN_SPAN)) { - dev_dbg(nor->dev, "Spansion Quad bit not set\n"); + if (sr_cr[1] != sr_written) { + dev_dbg(nor->dev, "CR: Read back test failed\n"); return -EIO; } @@ -2157,6 +2174,7 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor) { u8 *sr2 = nor->bouncebuf; int ret; + u8 sr2_written; /* Check current Quad Enable bit value. */ ret = spi_nor_read_sr2(nor, sr2); @@ -2172,13 +2190,15 @@ static int sr2_bit7_quad_enable(struct spi_nor *nor) if (ret) return ret; + sr2_written = *sr2; + /* Read back and check it. */ ret = spi_nor_read_sr2(nor, sr2); if (ret) return ret; - if (!(*sr2 & SR2_QUAD_EN_BIT7)) { - dev_dbg(nor->dev, "SR2 Quad bit not set\n"); + if (*sr2 != sr2_written) { + dev_dbg(nor->dev, "SR2: Read back test failed\n"); return -EIO; }