@@ -166,6 +166,32 @@ static int m25p80_write(struct spi_nor *nor, const u8 *cmd, size_t cmd_len,
return ret;
}
+static int m25p80_erase(struct spi_nor *nor, const u8 *cmd, size_t cmd_len)
+{
+ struct m25p *flash = nor->priv;
+ struct spi_slave *spi = flash->spi;
+ int ret;
+
+ ret = spi_claim_bus(spi);
+ if (ret < 0) {
+ debug("m25p80: unable to claim SPI bus\n");
+ return ret;
+ }
+
+ if (nor->flags & SNOR_F_U_PAGE)
+ spi->flags |= SPI_XFER_U_PAGE;
+
+ ret = spi_write_then_read(spi, cmd, cmd_len, NULL, NULL, 0);
+ if (ret < 0) {
+ debug("m25p80: error %d writing %x\n", ret, *cmd);
+ return ret;
+ }
+
+ spi_release_bus(spi);
+
+ return ret;
+}
+
static int m25p80_spi_nor(struct spi_nor *nor)
{
struct mtd_info *mtd = nor->mtd;
@@ -176,6 +202,7 @@ static int m25p80_spi_nor(struct spi_nor *nor)
/* install hooks */
nor->read_mmap = m25p80_read_mmap;
nor->read = m25p80_read;
+ nor->erase = m25p80_erase;
nor->write = m25p80_write;
nor->read_reg = m25p80_read_reg;
nor->write_reg = m25p80_write_reg;
@@ -526,7 +526,7 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
write_enable(nor);
- ret = nor->write(nor, cmd, sizeof(cmd), NULL, 0);
+ ret = nor->erase(nor, cmd, sizeof(cmd));
if (ret < 0)
goto erase_err;
@@ -191,7 +191,8 @@ extern const struct spi_nor_info spi_nor_ids[];
* @read_mmap: [DRIVER-SPECIFIC] read data from the mmapped SPI NOR
* @read: [DRIVER-SPECIFIC] read data from the SPI NOR
* @write: [DRIVER-SPECIFIC] write data to the SPI NOR
- * @flash_lock: [FLASH-SPECIFIC] lock a region of the SPI NOR
+ * @erase: [DRIVER-SPECIFIC] erase a sector of the SPI NOR
+ * @flash_lock: [FLASH-SPECIFIC] unlock a region of the SPI NOR
* @flash_unlock: [FLASH-SPECIFIC] unlock a region of the SPI NOR
* @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is
* @memory_map: address of read-only SPI NOR access
@@ -227,6 +228,7 @@ struct spi_nor {
void *data, size_t data_len);
int (*write)(struct spi_nor *nor, const u8 *cmd, size_t cmd_len,
const void *data, size_t data_len);
+ int (*erase)(struct spi_nor *nor, const u8 *cmd, size_t cmd_len);
int (*flash_lock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
int (*flash_unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
Added spi_nor erase ops for m25p80. Cc: Simon Glass <sjg@chromium.org> Cc: Bin Meng <bmeng.cn@gmail.com> Cc: Mugunthan V N <mugunthanvnm@ti.com> Cc: Michal Simek <michal.simek@xilinx.com> Cc: Siva Durga Prasad Paladugu <sivadur@xilinx.com> Signed-off-by: Jagan Teki <jteki@openedev.com> --- drivers/mtd/spi-nor/m25p80.c | 27 +++++++++++++++++++++++++++ drivers/mtd/spi-nor/spi-nor.c | 2 +- include/linux/mtd/spi-nor.h | 4 +++- 3 files changed, 31 insertions(+), 2 deletions(-)