summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVenkatesh Yadav Abbarapu <venkatesh.abbarapu@amd.com>2024-11-19 12:09:18 +0530
committerTom Rini <trini@konsulko.com>2025-05-06 13:13:36 -0600
commit46b3580c59466563bd26aa6aec1f15a8adf5dd5f (patch)
treefb487b6184bd0393e57b7f72624fee8cb21c543e
parentea2c6df478550fd5e4a412412cea30c986883808 (diff)
mtd: spi-nor: Send write disable cmd after every write enable
Write enable(06h) command will be sent to a flash device to set the write enable latch bit before every program, erase, write command. After that write disable command (04h) needs to be sent to clear the write enable latch. This write_disable() is missing at the majority of the places in the driver, add it to clear write enable latch. Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com> Signed-off-by: Venkatesh Yadav Abbarapu <venkatesh.abbarapu@amd.com> Link: https://gist.github.com/PrasanthBabuMantena/c12f39744de188a9d08cd5ca51dc2a7b Tested-by: Prasanth Babu Mantena <p-mantena@ti.com>
-rw-r--r--drivers/mtd/spi/spi-nor-core.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c
index c03136c1c20..655bf3aaf81 100644
--- a/drivers/mtd/spi/spi-nor-core.c
+++ b/drivers/mtd/spi/spi-nor-core.c
@@ -944,6 +944,7 @@ static int spi_nor_erase_chip_wait_till_ready(struct spi_nor *nor, unsigned long
static int clean_bar(struct spi_nor *nor)
{
u8 cmd, bank_sel = 0;
+ int ret;
if (nor->bank_curr == 0)
return 0;
@@ -951,7 +952,11 @@ static int clean_bar(struct spi_nor *nor)
nor->bank_curr = 0;
write_enable(nor);
- return nor->write_reg(nor, cmd, &bank_sel, 1);
+ ret = nor->write_reg(nor, cmd, &bank_sel, 1);
+ if (ret)
+ return ret;
+
+ return write_disable(nor);
}
static int write_bar(struct spi_nor *nor, u32 offset)
@@ -1272,6 +1277,10 @@ static int write_sr_and_check(struct spi_nor *nor, u8 status_new, u8 mask)
if (ret)
return ret;
+ ret = write_disable(nor);
+ if (ret)
+ return ret;
+
ret = read_sr(nor);
if (ret < 0)
return ret;
@@ -1809,13 +1818,18 @@ static int sst26_lock_ctl(struct spi_nor *nor, loff_t ofs, uint64_t len, enum lo
if (ctl == SST26_CTL_CHECK)
return 0;
+ /* Write latch enable before write operation */
+ ret = write_enable(nor);
+ if (ret)
+ return ret;
+
ret = nor->write_reg(nor, SPINOR_OP_WRITE_BPR, bpr_buff, bpr_size);
if (ret < 0) {
dev_err(nor->dev, "fail to write block-protection register\n");
return ret;
}
- return 0;
+ return write_disable(nor);
}
static int sst26_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len)
@@ -2217,7 +2231,7 @@ static int write_sr_cr(struct spi_nor *nor, u8 *sr_cr)
return ret;
}
- return 0;
+ return write_disable(nor);
}
/**
@@ -4305,6 +4319,9 @@ static int spi_nor_init(struct spi_nor *nor)
write_disable(nor);
}
}
+ err = write_disable(nor);
+ if (err)
+ return err;
}
if (nor->quad_enable) {