* [PATCH 0/2] mtd: spinand: winbond: add support for additional SPI-NAND devices
@ 2026-08-07 6:43 Md Sadre Alam
2026-08-07 6:43 ` [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW Md Sadre Alam
2026-08-07 6:43 ` [PATCH 2/2] mtd: spinand: winbond: add support for W25N01KW and W25N02LW Md Sadre Alam
0 siblings, 2 replies; 7+ messages in thread
From: Md Sadre Alam @ 2026-08-07 6:43 UTC (permalink / raw)
To: miquel.raynal, richard, vigneshr, tudor.ambarus, s-k6, linux-mtd,
linux-kernel
Cc: varadarajan.narayanan
This series adds support for three Winbond SPI-NAND devices that
are currently not recognized by the winbond SPI-NAND driver.
The W25N01KW and W25N02LW share page geometry and ECC handling
with existing supported devices and therefore reuse the existing
OOB layout definitions and ECC status callbacks.
The W25N04LW uses a different page and spare-area organization
from the existing W25N04KV/W25N04KW devices and requires a
dedicated OOB layout description.
Md Sadre Alam (2):
mtd: spinand: winbond: add support for W25N04LW
mtd: spinand: winbond: Add support for W25N01KW and W25N02LW
drivers/mtd/nand/spi/winbond.c | 50 ++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
--
2.34.1
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW
2026-08-07 6:43 [PATCH 0/2] mtd: spinand: winbond: add support for additional SPI-NAND devices Md Sadre Alam
@ 2026-08-07 6:43 ` Md Sadre Alam
2026-08-07 13:52 ` Miquel Raynal
2026-08-10 8:28 ` Dominique MARTINET
2026-08-07 6:43 ` [PATCH 2/2] mtd: spinand: winbond: add support for W25N01KW and W25N02LW Md Sadre Alam
1 sibling, 2 replies; 7+ messages in thread
From: Md Sadre Alam @ 2026-08-07 6:43 UTC (permalink / raw)
To: miquel.raynal, richard, vigneshr, tudor.ambarus, s-k6, linux-mtd,
linux-kernel
Cc: varadarajan.narayanan
Add support for Winbond W25N04LW 4Gbit SPI-NAND.
It has 8-bit on-die ECC and a 4096+256 byte page
(4096 byte main area, 128 byte usable OOB once
on-chip ECC hides the 128 byte parity area),
organized as 2048 blocks of 64 pages each, unlike
the existing 2048 byte page W25N04KV/W25N04KW parts.
Signed-off-by: Md Sadre Alam <md.alam@oss.qualcomm.com>
---
drivers/mtd/nand/spi/winbond.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/drivers/mtd/nand/spi/winbond.c b/drivers/mtd/nand/spi/winbond.c
index 9b78c1e6cbc9..b0147b7cb76f 100644
--- a/drivers/mtd/nand/spi/winbond.c
+++ b/drivers/mtd/nand/spi/winbond.c
@@ -345,6 +345,29 @@ static const struct mtd_ooblayout_ops w25n02kv_ooblayout = {
.free = w25n02kv_ooblayout_free,
};
+static int w25n04lw_ooblayout_ecc(struct mtd_info *mtd, int section,
+ struct mtd_oob_region *region)
+{
+ return -ERANGE;
+}
+
+static int w25n04lw_ooblayout_free(struct mtd_info *mtd, int section,
+ struct mtd_oob_region *region)
+{
+ if (section)
+ return -ERANGE;
+
+ region->offset = 2;
+ region->length = mtd->oobsize - 2;
+
+ return 0;
+}
+
+static const struct mtd_ooblayout_ops w25n04lw_ooblayout = {
+ .ecc = w25n04lw_ooblayout_ecc,
+ .free = w25n04lw_ooblayout_free,
+};
+
static int w25n01jw_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *region)
{
@@ -768,6 +791,15 @@ static const struct spinand_info winbond_spinand_table[] = {
&update_cache_variants),
0,
SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
+ SPINAND_INFO("W25N04LW", /* 1.8V */
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb2, 0x23),
+ NAND_MEMORG(1, 4096, 128, 64, 2048, 40, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_variants,
+ &update_cache_variants),
+ 0,
+ SPINAND_ECCINFO(&w25n04lw_ooblayout, w25n02kv_ecc_get_status)),
SPINAND_INFO("W35N04JW", /* 1.8V */
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xdf, 0x23),
NAND_MEMORG(1, 4096, 128, 64, 512, 10, 1, 4, 1),
--
2.34.1
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] mtd: spinand: winbond: add support for W25N01KW and W25N02LW
2026-08-07 6:43 [PATCH 0/2] mtd: spinand: winbond: add support for additional SPI-NAND devices Md Sadre Alam
2026-08-07 6:43 ` [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW Md Sadre Alam
@ 2026-08-07 6:43 ` Md Sadre Alam
2026-08-07 13:50 ` Miquel Raynal
1 sibling, 1 reply; 7+ messages in thread
From: Md Sadre Alam @ 2026-08-07 6:43 UTC (permalink / raw)
To: miquel.raynal, richard, vigneshr, tudor.ambarus, s-k6, linux-mtd,
linux-kernel
Cc: varadarajan.narayanan
Add support for the Winbond W25N01KW and W25N02LW SPI-NAND
devices.
The W25N01KW shares the same geometry, OOB layout, and ECC
status handling as the existing W25N01KV, while the W25N02LW
matches the existing W25N02KV/W25N02KW devices and reuses
their OOB layout and ECC status callback.
Signed-off-by: Md Sadre Alam <md.alam@oss.qualcomm.com>
---
drivers/mtd/nand/spi/winbond.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/drivers/mtd/nand/spi/winbond.c b/drivers/mtd/nand/spi/winbond.c
index b0147b7cb76f..3bffa13bfa68 100644
--- a/drivers/mtd/nand/spi/winbond.c
+++ b/drivers/mtd/nand/spi/winbond.c
@@ -704,6 +704,15 @@ static const struct spinand_info winbond_spinand_table[] = {
&update_cache_variants),
0,
SPINAND_ECCINFO(&w25n01kv_ooblayout, w25n02kv_ecc_get_status)),
+ SPINAND_INFO("W25N01KW", /* 1.8V */
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xbe, 0x21),
+ NAND_MEMORG(1, 2048, 96, 64, 1024, 20, 1, 1, 1),
+ NAND_ECCREQ(4, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_variants,
+ &update_cache_variants),
+ 0,
+ SPINAND_ECCINFO(&w25n01kv_ooblayout, w25n02kv_ecc_get_status)),
SPINAND_INFO("W35N01JW", /* 1.8V */
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xdc, 0x21),
NAND_MEMORG(1, 4096, 128, 64, 512, 10, 1, 1, 1),
@@ -759,6 +768,15 @@ static const struct spinand_info winbond_spinand_table[] = {
&update_cache_variants),
0,
SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
+ SPINAND_INFO("W25N02LW", /* 1.8V */
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x12, 0x22),
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_variants,
+ &update_cache_variants),
+ 0,
+ SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
SPINAND_INFO("W35N02JW", /* 1.8V */
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xdf, 0x22),
NAND_MEMORG(1, 4096, 128, 64, 512, 10, 1, 2, 1),
--
2.34.1
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] mtd: spinand: winbond: add support for W25N01KW and W25N02LW
2026-08-07 6:43 ` [PATCH 2/2] mtd: spinand: winbond: add support for W25N01KW and W25N02LW Md Sadre Alam
@ 2026-08-07 13:50 ` Miquel Raynal
0 siblings, 0 replies; 7+ messages in thread
From: Miquel Raynal @ 2026-08-07 13:50 UTC (permalink / raw)
To: Md Sadre Alam
Cc: richard, vigneshr, tudor.ambarus, s-k6, linux-mtd, linux-kernel,
varadarajan.narayanan
Hi Sadre,
On 07/08/2026 at 12:13:39 +0530, Md Sadre Alam <md.alam@oss.qualcomm.com> wrote:
> Add support for the Winbond W25N01KW and W25N02LW SPI-NAND
> devices.
>
> The W25N01KW shares the same geometry, OOB layout, and ECC
> status handling as the existing W25N01KV, while the W25N02LW
> matches the existing W25N02KV/W25N02KW devices and reuses
> their OOB layout and ECC status callback.
>
> Signed-off-by: Md Sadre Alam <md.alam@oss.qualcomm.com>
> ---
Sashiko raises a point:
- [Medium] The device ID `0x12, 0x22` for W25N02LW breaks the
established pattern for Winbond 1.8V SPI NAND devices and is highly
likely a typo for `0xb2, 0x22`.
Can you please check?
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW
2026-08-07 6:43 ` [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW Md Sadre Alam
@ 2026-08-07 13:52 ` Miquel Raynal
2026-08-10 8:28 ` Dominique MARTINET
1 sibling, 0 replies; 7+ messages in thread
From: Miquel Raynal @ 2026-08-07 13:52 UTC (permalink / raw)
To: Md Sadre Alam
Cc: richard, vigneshr, tudor.ambarus, s-k6, linux-mtd, linux-kernel,
varadarajan.narayanan
On 07/08/2026 at 12:13:38 +0530, Md Sadre Alam <md.alam@oss.qualcomm.com> wrote:
> Add support for Winbond W25N04LW 4Gbit SPI-NAND.
> It has 8-bit on-die ECC and a 4096+256 byte page
> (4096 byte main area, 128 byte usable OOB once
> on-chip ECC hides the 128 byte parity area),
That is not what you did below. Below you declare 254 free bytes.
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW
2026-08-07 6:43 ` [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW Md Sadre Alam
2026-08-07 13:52 ` Miquel Raynal
@ 2026-08-10 8:28 ` Dominique MARTINET
2026-08-10 12:43 ` Miquel Raynal
1 sibling, 1 reply; 7+ messages in thread
From: Dominique MARTINET @ 2026-08-10 8:28 UTC (permalink / raw)
To: Md Sadre Alam
Cc: miquel.raynal, richard, vigneshr, tudor.ambarus, s-k6, linux-mtd,
linux-kernel, varadarajan.narayanan
Md Sadre Alam wrote on Fri, Aug 07, 2026 at 12:13:38PM +0530:
> Add support for Winbond W25N04LW 4Gbit SPI-NAND.
> It has 8-bit on-die ECC and a 4096+256 byte page
> (4096 byte main area, 128 byte usable OOB once
> on-chip ECC hides the 128 byte parity area),
> organized as 2048 blocks of 64 pages each, unlike
> the existing 2048 byte page W25N04KV/W25N04KW parts.
This is pretty good timing, I was just looking at sending a patch for
W25N04LW myself!
I agree with Miquèl that your patch looks odd, you wrote
> + NAND_MEMORG(1, 4096, 128, 64, 2048, 40, 1, 1, 1),
but the erase blocks are 256K long so it should be
+ NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
did you actually test this device?
If it helps, the datasheet for W25N04LWZExx / W25N04LWTBxx is freely
available from digikey here[1]
[1] https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/7182/W25N04LWZExx_W25N04LWTBxx_RevD_2025-08-05.pdf
(And it also supports continuous read, so I'm curious to see if it'd
work with the recent continous read support from Miquèl[2] merged in
7.2... I'm not familiar with the subsystem so will need a bit of time to
plug all the hooks in properly)
[2] https://lore.kernel.org/linux-mtd/20260429-winbond-v6-18-rc1-cont-read-v3-0-0f38b3c229ad@bootlin.com/
FWIW, I've confirmed it works with the following diff (at least up to
the point of creating an ubi volume and booting from it); happy to send
this as a patch if this has indeed not been tested
------------
diff --git a/drivers/mtd/nand/spi/winbond.c b/drivers/mtd/nand/spi/winbond.c
index 9b78c1e6cbc9..43a4886dc4a5 100644
--- a/drivers/mtd/nand/spi/winbond.c
+++ b/drivers/mtd/nand/spi/winbond.c
@@ -335,6 +335,30 @@ static int w25n02kv_ooblayout_free(struct mtd_info *mtd, int section,
return 0;
}
+static int w25n04lw_ooblayout_ecc(struct mtd_info *mtd, int section,
+ struct mtd_oob_region *region)
+{
+ if (section > 7)
+ return -ERANGE;
+
+ region->offset = 128 + (16 * section);
+ region->length = 13;
+
+ return 0;
+}
+
+static int w25n04lw_ooblayout_free(struct mtd_info *mtd, int section,
+ struct mtd_oob_region *region)
+{
+ if (section > 7)
+ return -ERANGE;
+
+ region->offset = (16 * section) + 2;
+ region->length = 14;
+
+ return 0;
+}
+
static const struct mtd_ooblayout_ops w25n01kv_ooblayout = {
.ecc = w25n01kv_ooblayout_ecc,
.free = w25n02kv_ooblayout_free,
@@ -345,6 +369,11 @@ static const struct mtd_ooblayout_ops w25n02kv_ooblayout = {
.free = w25n02kv_ooblayout_free,
};
+static const struct mtd_ooblayout_ops w25n04lw_ooblayout = {
+ .ecc = w25n04lw_ooblayout_ecc,
+ .free = w25n04lw_ooblayout_free,
+};
+
static int w25n01jw_ooblayout_ecc(struct mtd_info *mtd, int section,
struct mtd_oob_region *region)
{
@@ -768,6 +797,15 @@ static const struct spinand_info winbond_spinand_table[] = {
&update_cache_variants),
0,
SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
+ SPINAND_INFO("W25N04LW", /* 1.8V */
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb2, 0x23),
+ NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
+ NAND_ECCREQ(8, 512),
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
+ &write_cache_variants,
+ &update_cache_variants),
+ 0,
+ SPINAND_ECCINFO(&w25n04lw_ooblayout, w25n02kv_ecc_get_status)),
SPINAND_INFO("W35N04JW", /* 1.8V */
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xdf, 0x23),
NAND_MEMORG(1, 4096, 128, 64, 512, 10, 1, 4, 1),
-----------------
Thanks,
--
Dominique Martinet | Asmadeus
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW
2026-08-10 8:28 ` Dominique MARTINET
@ 2026-08-10 12:43 ` Miquel Raynal
0 siblings, 0 replies; 7+ messages in thread
From: Miquel Raynal @ 2026-08-10 12:43 UTC (permalink / raw)
To: Dominique MARTINET
Cc: Md Sadre Alam, richard, vigneshr, tudor.ambarus, s-k6, linux-mtd,
linux-kernel, varadarajan.narayanan
Hi Dominique,
On 10/08/2026 at 17:28:32 +09, Dominique MARTINET <dominique.martinet@atmark-techno.com> wrote:
> Md Sadre Alam wrote on Fri, Aug 07, 2026 at 12:13:38PM +0530:
>> Add support for Winbond W25N04LW 4Gbit SPI-NAND.
>> It has 8-bit on-die ECC and a 4096+256 byte page
>> (4096 byte main area, 128 byte usable OOB once
>> on-chip ECC hides the 128 byte parity area),
>> organized as 2048 blocks of 64 pages each, unlike
>> the existing 2048 byte page W25N04KV/W25N04KW parts.
>
> This is pretty good timing, I was just looking at sending a patch for
> W25N04LW myself!
>
> I agree with Miquèl that your patch looks odd, you wrote
>> + NAND_MEMORG(1, 4096, 128, 64, 2048, 40, 1, 1, 1),
> but the erase blocks are 256K long so it should be
> + NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
>
> did you actually test this device?
>
> If it helps, the datasheet for W25N04LWZExx / W25N04LWTBxx is freely
> available from digikey here[1]
> [1] https://mm.digikey.com/Volume0/opasdata/d220001/medias/docus/7182/W25N04LWZExx_W25N04LWTBxx_RevD_2025-08-05.pdf
Thanks for all the feedback, Sadre, can you please propose an udpate
with these details and changes?
> (And it also supports continuous read, so I'm curious to see if it'd
> work with the recent continous read support from Miquèl[2] merged in
> 7.2... I'm not familiar with the subsystem so will need a bit of time to
> plug all the hooks in properly)
> [2]
> https://lore.kernel.org/linux-mtd/20260429-winbond-v6-18-rc1-cont-read-v3-0-0f38b3c229ad@bootlin.com/
If it has continuous read, it requires the flag and a hook to
enable/disable the feature. The existing Winbond helper may already be
enough for it. You can test it with a recent version of mtd-utils, I
added options to nanddump, nandbiterrs and flash_speed for that.
If Sadre dooesn't do it, you can propose a follow-up patch.
Thanks,
Miquèl
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-08-10 12:44 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-07 6:43 [PATCH 0/2] mtd: spinand: winbond: add support for additional SPI-NAND devices Md Sadre Alam
2026-08-07 6:43 ` [PATCH 1/2] mtd: spinand: winbond: add support for W25N04LW Md Sadre Alam
2026-08-07 13:52 ` Miquel Raynal
2026-08-10 8:28 ` Dominique MARTINET
2026-08-10 12:43 ` Miquel Raynal
2026-08-07 6:43 ` [PATCH 2/2] mtd: spinand: winbond: add support for W25N01KW and W25N02LW Md Sadre Alam
2026-08-07 13:50 ` Miquel Raynal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox