]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mtd: spi-nor: sst: Fix write enable before AAI sequence
authorSanjaikumar V S <sanjaikumar.vs@dicortech.com>
Wed, 11 Mar 2026 10:30:56 +0000 (10:30 +0000)
committerPratyush Yadav (Google) <pratyush@kernel.org>
Mon, 30 Mar 2026 14:24:38 +0000 (14:24 +0000)
When writing to SST flash starting at an odd address, a single byte is
first programmed using the byte program (BP) command. After this
operation completes, the flash hardware automatically clears the Write
Enable Latch (WEL) bit.

If an AAI (Auto Address Increment) word program sequence follows, it
requires WEL to be set. Without re-enabling writes, the AAI sequence
fails.

Add spi_nor_write_enable() after the odd-address byte program when more
data needs to be written. Use a local boolean for clarity.

Fixes: b199489d37b2 ("mtd: spi-nor: add the framework for SPI NOR")
Cc: stable@vger.kernel.org
Signed-off-by: Sanjaikumar V S <sanjaikumar.vs@dicortech.com>
Tested-by: Hendrik Donner <hd@os-cillation.de>
Reviewed-by: Hendrik Donner <hd@os-cillation.de>
Signed-off-by: Pratyush Yadav (Google) <pratyush@kernel.org>
drivers/mtd/spi-nor/sst.c

index 175211fe6a5ed2b6e9d7a887a6ebfd47675485be..db02c14ba16fafab3d82a0566faf79fa85bdd76b 100644 (file)
@@ -203,6 +203,8 @@ static int sst_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
 
        /* Start write from odd address. */
        if (to % 2) {
+               bool needs_write_enable = (len > 1);
+
                /* write one byte. */
                ret = sst_nor_write_data(nor, to, 1, buf);
                if (ret < 0)
@@ -210,6 +212,17 @@ static int sst_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
 
                to++;
                actual++;
+
+               /*
+                * Byte program clears the write enable latch. If more
+                * data needs to be written using the AAI sequence,
+                * re-enable writes.
+                */
+               if (needs_write_enable) {
+                       ret = spi_nor_write_enable(nor);
+                       if (ret)
+                               goto out;
+               }
        }
 
        /* Write out most of the data here. */