@@ -173,9 +173,6 @@ static ssize_t spi_nor_spimem_write_data(struct spi_nor *nor, loff_t to,
op.addr.buswidth = spi_nor_get_protocol_addr_nbits(nor->write_proto);
op.data.buswidth = spi_nor_get_protocol_data_nbits(nor->write_proto);
- if (nor->program_opcode == SPINOR_OP_AAI_WP && nor->sst_write_second)
- op.addr.nbytes = 0;
-
if (spi_nor_spimem_bounce(nor, &op))
memcpy(nor->bouncebuf, buf, op.data.nbytes);
@@ -58,10 +58,9 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
if (ret)
goto out;
- nor->sst_write_second = false;
-
/* Start write from odd address. */
if (to % 2) {
+ nor->addr_width = 3;
nor->program_opcode = SPINOR_OP_BP;
/* write one byte. */
@@ -86,6 +85,8 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
goto out;
}
+ /* Send address only once for each AAI_WP cycle */
+ nor->addr_width = (actual > 1) ? 0 : 3;
nor->program_opcode = SPINOR_OP_AAI_WP;
/* write two bytes. */
@@ -97,9 +98,7 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
if (ret)
goto out;
to += 2;
- nor->sst_write_second = true;
}
- nor->sst_write_second = false;
ret = spi_nor_write_disable(nor);
if (ret)
@@ -115,6 +114,7 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
if (ret)
goto out;
+ nor->addr_width = 3;
nor->program_opcode = SPINOR_OP_BP;
ret = spi_nor_write_data(nor, to, 1, buf + actual);
if (ret < 0)
@@ -129,6 +129,8 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
ret = spi_nor_write_disable(nor);
}
out:
+ /* Set to default in case no trailing bytes are written */
+ nor->addr_width = 3;
*retlen += actual;
spi_nor_unlock_and_unprep(nor);
return ret;
@@ -343,7 +343,6 @@ struct spi_nor_flash_parameter;
* @read_opcode: the read opcode
* @read_dummy: the dummy needed by the read operation
* @program_opcode: the program opcode
- * @sst_write_second: used by the SST write operation
* @flags: flag options for the current SPI NOR (SNOR_F_*)
* @read_proto: the SPI protocol for read operations
* @write_proto: the SPI protocol for write operations
@@ -374,7 +373,6 @@ struct spi_nor {
enum spi_nor_protocol read_proto;
enum spi_nor_protocol write_proto;
enum spi_nor_protocol reg_proto;
- bool sst_write_second;
u32 flags;
const struct spi_nor_controller_ops *controller_ops;
Don't mess the spi-nor core with details only relating to this specific device. Handle the addr_width locally and drop the sst related stuff from the spi-nor core to clean it up. Signed-off-by: Marco Felsch <m.felsch@pengutronix.de> --- drivers/mtd/spi-nor/core.c | 3 --- drivers/mtd/spi-nor/sst.c | 10 ++++++---- include/linux/mtd/spi-nor.h | 2 -- 3 files changed, 6 insertions(+), 9 deletions(-)