kernel: mtd: spinand: esmt: add support for F50L1G41LC
authorHauke Mehrtens <[email protected]>
Thu, 27 Nov 2025 20:13:04 +0000 (21:13 +0100)
committerHauke Mehrtens <[email protected]>
Fri, 28 Nov 2025 22:42:29 +0000 (23:42 +0100)
Backport upstream patch to add support for the ESMT F50L1G41LC flash
chip. It is used in multiple Cudy products manufactured starting
November 2025.

Link: https://github.com/openwrt/openwrt/pull/20962
Signed-off-by: Hauke Mehrtens <[email protected]>
target/linux/airoha/patches-6.12/901-snand-mtk-bmt-support.patch
target/linux/econet/patches-6.12/902-snand-mtk-bmt-support.patch
target/linux/generic/backport-6.12/422-v6.19-mtd-spinand-esmt-add-support-for-F50L1G41LC.patch [new file with mode: 0644]
target/linux/generic/pending-6.12/487-mtd-spinand-Add-support-for-Etron-EM73D044VCx.patch
target/linux/mediatek/patches-6.12/330-snand-mtk-bmt-support.patch
target/linux/mediatek/patches-6.12/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch
target/linux/mediatek/patches-6.12/435-drivers-mtd-spinand-Add-calibration-support-for-spin.patch
target/linux/mediatek/patches-6.12/436-drivers-mtd-spi-nor-Add-calibration-support-for-spi-.patch
target/linux/mediatek/patches-6.12/863-arm64-dts-mt7986-add-sound-wm8960.patch
target/linux/mediatek/patches-6.12/960-asus-hack-u-boot-ignore-mtdparts.patch
target/linux/qualcommax/patches-6.12/0055-v6.16-mtd-spinand-esmt-fix-id-code-for-F50D1G41LB.patch

index eb77fde0668980bdec1eb33b3fe999a46394cf56..02566032d472eab5c0721a5229f4547cbfd1a957 100644 (file)
@@ -8,7 +8,7 @@
  
  static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)
  {
-@@ -1574,6 +1575,7 @@ static int spinand_probe(struct spi_mem
+@@ -1575,6 +1576,7 @@ static int spinand_probe(struct spi_mem
        if (ret)
                return ret;
  
@@ -16,7 +16,7 @@
        ret = mtd_device_register(mtd, NULL, 0);
        if (ret)
                goto err_spinand_cleanup;
-@@ -1581,6 +1583,7 @@ static int spinand_probe(struct spi_mem
+@@ -1582,6 +1584,7 @@ static int spinand_probe(struct spi_mem
        return 0;
  
  err_spinand_cleanup:
@@ -24,7 +24,7 @@
        spinand_cleanup(spinand);
  
        return ret;
-@@ -1599,6 +1602,7 @@ static int spinand_remove(struct spi_mem
+@@ -1600,6 +1603,7 @@ static int spinand_remove(struct spi_mem
        if (ret)
                return ret;
  
index eb77fde0668980bdec1eb33b3fe999a46394cf56..02566032d472eab5c0721a5229f4547cbfd1a957 100644 (file)
@@ -8,7 +8,7 @@
  
  static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)
  {
-@@ -1574,6 +1575,7 @@ static int spinand_probe(struct spi_mem
+@@ -1575,6 +1576,7 @@ static int spinand_probe(struct spi_mem
        if (ret)
                return ret;
  
@@ -16,7 +16,7 @@
        ret = mtd_device_register(mtd, NULL, 0);
        if (ret)
                goto err_spinand_cleanup;
-@@ -1581,6 +1583,7 @@ static int spinand_probe(struct spi_mem
+@@ -1582,6 +1584,7 @@ static int spinand_probe(struct spi_mem
        return 0;
  
  err_spinand_cleanup:
@@ -24,7 +24,7 @@
        spinand_cleanup(spinand);
  
        return ret;
-@@ -1599,6 +1602,7 @@ static int spinand_remove(struct spi_mem
+@@ -1600,6 +1603,7 @@ static int spinand_remove(struct spi_mem
        if (ret)
                return ret;
  
diff --git a/target/linux/generic/backport-6.12/422-v6.19-mtd-spinand-esmt-add-support-for-F50L1G41LC.patch b/target/linux/generic/backport-6.12/422-v6.19-mtd-spinand-esmt-add-support-for-F50L1G41LC.patch
new file mode 100644 (file)
index 0000000..b65df4e
--- /dev/null
@@ -0,0 +1,84 @@
+From b98994cb9bc24f5c7575c86650f96c384576fdfa Mon Sep 17 00:00:00 2001
+From: Daniel Golle <[email protected]>
+Date: Mon, 17 Nov 2025 02:54:19 +0000
+Subject: [PATCH] mtd: spinand: esmt: add support for F50L1G41LC
+
+This adds support for ESMT F50L1G41LC, which appears to be an updated
+version of the already supported F50L1G41LB.
+Add esmt_8c SPI_NAND manufacturer to account for the newly used vendor
+ID with support for the ESMT F50L1G41LC chip.
+
+Link: https://github.com/openwrt/openwrt/pull/15214#issuecomment-3514824435
+Signed-off-by: Daniel Golle <[email protected]>
+Signed-off-by: Miquel Raynal <[email protected]>
+---
+ drivers/mtd/nand/spi/core.c |  1 +
+ drivers/mtd/nand/spi/esmt.c | 24 ++++++++++++++++++++++++
+ include/linux/mtd/spinand.h |  1 +
+ 3 files changed, 26 insertions(+)
+
+--- a/drivers/mtd/nand/spi/core.c
++++ b/drivers/mtd/nand/spi/core.c
+@@ -1114,6 +1114,7 @@ static const struct nand_ops spinand_ops
+ static const struct spinand_manufacturer *spinand_manufacturers[] = {
+       &alliancememory_spinand_manufacturer,
+       &ato_spinand_manufacturer,
++      &esmt_8c_spinand_manufacturer,
+       &esmt_c8_spinand_manufacturer,
+       &fmsh_spinand_manufacturer,
+       &foresee_spinand_manufacturer,
+--- a/drivers/mtd/nand/spi/esmt.c
++++ b/drivers/mtd/nand/spi/esmt.c
+@@ -11,6 +11,7 @@
+ /* ESMT uses GigaDevice 0xc8 JECDEC ID on some SPI NANDs */
+ #define SPINAND_MFR_ESMT_C8                   0xc8
++#define SPINAND_MFR_ESMT_8C                   0x8c
+ static SPINAND_OP_VARIANTS(read_cache_variants,
+                          SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+@@ -102,6 +103,19 @@ static const struct mtd_ooblayout_ops f5
+       .free = f50l1g41lb_ooblayout_free,
+ };
++
++static const struct spinand_info esmt_8c_spinand_table[] = {
++      SPINAND_INFO("F50L1G41LC",
++                   SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x2C),
++                   NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
++                   NAND_ECCREQ(1, 512),
++                   SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
++                                            &write_cache_variants,
++                                            &update_cache_variants),
++                   0,
++                   SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)),
++};
++
+ static const struct spinand_info esmt_c8_spinand_table[] = {
+       SPINAND_INFO("F50L1G41LB",
+                    SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x01, 0x7f,
+@@ -138,6 +152,14 @@ static const struct spinand_info esmt_c8
+ static const struct spinand_manufacturer_ops esmt_spinand_manuf_ops = {
+ };
++const struct spinand_manufacturer esmt_8c_spinand_manufacturer = {
++      .id = SPINAND_MFR_ESMT_8C,
++      .name = "ESMT",
++      .chips = esmt_8c_spinand_table,
++      .nchips = ARRAY_SIZE(esmt_8c_spinand_table),
++      .ops = &esmt_spinand_manuf_ops,
++};
++
+ const struct spinand_manufacturer esmt_c8_spinand_manufacturer = {
+       .id = SPINAND_MFR_ESMT_C8,
+       .name = "ESMT",
+--- a/include/linux/mtd/spinand.h
++++ b/include/linux/mtd/spinand.h
+@@ -262,6 +262,7 @@ struct spinand_manufacturer {
+ /* SPI NAND manufacturers */
+ extern const struct spinand_manufacturer alliancememory_spinand_manufacturer;
+ extern const struct spinand_manufacturer ato_spinand_manufacturer;
++extern const struct spinand_manufacturer esmt_8c_spinand_manufacturer;
+ extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer;
+ extern const struct spinand_manufacturer fmsh_spinand_manufacturer;
+ extern const struct spinand_manufacturer foresee_spinand_manufacturer;
index 34fb47a5fb9062823953277e899abfec5e04152a..f326c61b3aafe2f127f5745da02c918bef22a288 100644 (file)
@@ -49,9 +49,9 @@ Submitted-by: Daniel Danzberger <[email protected]>
  obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
 --- a/drivers/mtd/nand/spi/core.c
 +++ b/drivers/mtd/nand/spi/core.c
-@@ -1159,6 +1159,7 @@ static const struct spinand_manufacturer
-       &alliancememory_spinand_manufacturer,
+@@ -1160,6 +1160,7 @@ static const struct spinand_manufacturer
        &ato_spinand_manufacturer,
+       &esmt_8c_spinand_manufacturer,
        &esmt_c8_spinand_manufacturer,
 +      &etron_spinand_manufacturer,
        &fmsh_spinand_manufacturer,
@@ -160,9 +160,9 @@ Submitted-by: Daniel Danzberger <[email protected]>
 +};
 --- a/include/linux/mtd/spinand.h
 +++ b/include/linux/mtd/spinand.h
-@@ -263,6 +263,7 @@ struct spinand_manufacturer {
- extern const struct spinand_manufacturer alliancememory_spinand_manufacturer;
+@@ -264,6 +264,7 @@ extern const struct spinand_manufacturer
  extern const struct spinand_manufacturer ato_spinand_manufacturer;
+ extern const struct spinand_manufacturer esmt_8c_spinand_manufacturer;
  extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer;
 +extern const struct spinand_manufacturer etron_spinand_manufacturer;
  extern const struct spinand_manufacturer fmsh_spinand_manufacturer;
index eb77fde0668980bdec1eb33b3fe999a46394cf56..02566032d472eab5c0721a5229f4547cbfd1a957 100644 (file)
@@ -8,7 +8,7 @@
  
  static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)
  {
-@@ -1574,6 +1575,7 @@ static int spinand_probe(struct spi_mem
+@@ -1575,6 +1576,7 @@ static int spinand_probe(struct spi_mem
        if (ret)
                return ret;
  
@@ -16,7 +16,7 @@
        ret = mtd_device_register(mtd, NULL, 0);
        if (ret)
                goto err_spinand_cleanup;
-@@ -1581,6 +1583,7 @@ static int spinand_probe(struct spi_mem
+@@ -1582,6 +1584,7 @@ static int spinand_probe(struct spi_mem
        return 0;
  
  err_spinand_cleanup:
@@ -24,7 +24,7 @@
        spinand_cleanup(spinand);
  
        return ret;
-@@ -1599,6 +1602,7 @@ static int spinand_remove(struct spi_mem
+@@ -1600,6 +1603,7 @@ static int spinand_remove(struct spi_mem
        if (ret)
                return ret;
  
index 7857f4c6aa9b57e31a8844a314044bd6ac9d1804..780f8413c11d6c1f71fad52622c0aa6b680b0db8 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Davide Fioravanti <[email protected]>
  obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
 --- a/drivers/mtd/nand/spi/core.c
 +++ b/drivers/mtd/nand/spi/core.c
-@@ -1162,6 +1162,7 @@ static const struct spinand_manufacturer
+@@ -1163,6 +1163,7 @@ static const struct spinand_manufacturer
        &esmt_c8_spinand_manufacturer,
        &etron_spinand_manufacturer,
        &fmsh_spinand_manufacturer,
@@ -113,7 +113,7 @@ Signed-off-by: Davide Fioravanti <[email protected]>
 +};
 --- a/include/linux/mtd/spinand.h
 +++ b/include/linux/mtd/spinand.h
-@@ -265,6 +265,7 @@ extern const struct spinand_manufacturer
+@@ -266,6 +266,7 @@ extern const struct spinand_manufacturer
  extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer;
  extern const struct spinand_manufacturer etron_spinand_manufacturer;
  extern const struct spinand_manufacturer fmsh_spinand_manufacturer;
index 258b8e19a3d0c3673d9cec10683dea850f3972e5..c33931ebc7fcbb0d8f247d630ddde1635981b316 100644 (file)
@@ -11,7 +11,7 @@ Signed-off-by: SkyLake.Huang <[email protected]>
 
 --- a/drivers/mtd/nand/spi/core.c
 +++ b/drivers/mtd/nand/spi/core.c
-@@ -1200,6 +1200,56 @@ static int spinand_manufacturer_match(st
+@@ -1201,6 +1201,56 @@ static int spinand_manufacturer_match(st
        return -EOPNOTSUPP;
  }
  
@@ -68,7 +68,7 @@ Signed-off-by: SkyLake.Huang <[email protected]>
  static int spinand_id_detect(struct spinand_device *spinand)
  {
        u8 *id = spinand->id.data;
-@@ -1451,6 +1501,10 @@ static int spinand_init(struct spinand_d
+@@ -1452,6 +1502,10 @@ static int spinand_init(struct spinand_d
        if (!spinand->scratchbuf)
                return -ENOMEM;
  
index b55f76eed7fd97443781ec052358868f338362e8..bcef0c1701a2c389160c4f6cd056009801767c17 100644 (file)
@@ -12,7 +12,7 @@ Signed-off-by: SkyLake.Huang <[email protected]>
 
 --- a/drivers/mtd/nand/spi/core.c
 +++ b/drivers/mtd/nand/spi/core.c
-@@ -1241,7 +1241,10 @@ static int spinand_cal_read(void *priv,
+@@ -1242,7 +1242,10 @@ static int spinand_cal_read(void *priv,
        if (ret)
                return ret;
  
index b16a63ada9d9bb7cfb5c55d17cb83e8b23b6cceb..db51bf17791b75cfc11071b62102469b36d1f420 100644 (file)
@@ -46,7 +46,7 @@ Subject: [PATCH] arm64: dts: mt7986: add sound wm8960
  };
  
  &spi0 {
-@@ -50,3 +80,13 @@
+@@ -48,3 +78,13 @@
  &wifi {
        mediatek,mtd-eeprom = <&factory 0>;
  };
index 8d1680d5d49e04386369e9f4f375a59d3c41425f..70ff4dd5b61c3797e5567d1e0ce56ee9f406c387 100644 (file)
@@ -29,7 +29,7 @@ Signed-off-by: Daniel Golle <[email protected]>
 
 --- a/drivers/mtd/nand/spi/core.c
 +++ b/drivers/mtd/nand/spi/core.c
-@@ -1668,6 +1668,7 @@ static int spinand_remove(struct spi_mem
+@@ -1669,6 +1669,7 @@ static int spinand_remove(struct spi_mem
  
  static const struct spi_device_id spinand_ids[] = {
        { .name = "spi-nand" },
@@ -37,7 +37,7 @@ Signed-off-by: Daniel Golle <[email protected]>
        { /* sentinel */ },
  };
  MODULE_DEVICE_TABLE(spi, spinand_ids);
-@@ -1675,6 +1676,7 @@ MODULE_DEVICE_TABLE(spi, spinand_ids);
+@@ -1676,6 +1677,7 @@ MODULE_DEVICE_TABLE(spi, spinand_ids);
  #ifdef CONFIG_OF
  static const struct of_device_id spinand_of_ids[] = {
        { .compatible = "spi-nand" },
index 379b77f117e0cb0cbd23d05a2351cdaf4cbccab9..29dea300fa83116db36bae4f7233b81f9b2734d8 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Miquel Raynal <[email protected]>
 
 --- a/drivers/mtd/nand/spi/esmt.c
 +++ b/drivers/mtd/nand/spi/esmt.c
-@@ -115,7 +115,7 @@ static const struct spinand_info esmt_c8
+@@ -129,7 +129,7 @@ static const struct spinand_info esmt_c8
                     SPINAND_ECCINFO(&f50l1g41lb_ooblayout, NULL)),
        SPINAND_INFO("F50D1G41LB",
                     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x11, 0x7f,