summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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) {