Re: [PATCH v2 1/1] mtd: spinand: add support for ESMT F50x1G41LB

2023-12-14 Thread Jagan Teki
On Wed, Oct 18, 2023 at 12:59 AM Igor Prusov  wrote:
>
> Adaptation of Linux commit d74c36480a67
>
> This patch adds support for ESMT F50L1G41LB and F50D1G41LB.
> It seems that ESMT likes to use random JEDEC ID from other vendors.
> Their 1G chips uses 0xc8 from GigaDevice and 2G/4G chips uses 0x2c from
> Micron. For this reason, the ESMT entry is named esmt_c8 with explicit
> JEDEC ID in variable name.
>
> Datasheets:
> https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F50L1G41LB(2M).pdf
> https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F50D1G41LB(2M).pdf
>
> Signed-off-by: Igor Prusov 
> Signed-off-by: Chuanhong Guo 
> Signed-off-by: Martin Kurbanov 
> Signed-off-by: Dmitry Rokosov 
> Tested-by: Martin Kurbanov 
> ---

Applied to u-boot-spi/master


Re: [PATCH v2 1/1] mtd: spinand: add support for ESMT F50x1G41LB

2023-10-24 Thread Frieder Schrempf
On 17.10.23 21:29, Igor Prusov wrote:
> Adaptation of Linux commit d74c36480a67
> 
> This patch adds support for ESMT F50L1G41LB and F50D1G41LB.
> It seems that ESMT likes to use random JEDEC ID from other vendors.
> Their 1G chips uses 0xc8 from GigaDevice and 2G/4G chips uses 0x2c from
> Micron. For this reason, the ESMT entry is named esmt_c8 with explicit
> JEDEC ID in variable name.
> 
> Datasheets:
> https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F50L1G41LB(2M).pdf
> https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F50D1G41LB(2M).pdf
> 
> Signed-off-by: Igor Prusov 
> Signed-off-by: Chuanhong Guo 
> Signed-off-by: Martin Kurbanov 
> Signed-off-by: Dmitry Rokosov 
> Tested-by: Martin Kurbanov 

Reviewed-by: Frieder Schrempf 


[PATCH v2 1/1] mtd: spinand: add support for ESMT F50x1G41LB

2023-10-17 Thread Igor Prusov
Adaptation of Linux commit d74c36480a67

This patch adds support for ESMT F50L1G41LB and F50D1G41LB.
It seems that ESMT likes to use random JEDEC ID from other vendors.
Their 1G chips uses 0xc8 from GigaDevice and 2G/4G chips uses 0x2c from
Micron. For this reason, the ESMT entry is named esmt_c8 with explicit
JEDEC ID in variable name.

Datasheets:
https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F50L1G41LB(2M).pdf
https://www.esmt.com.tw/upload/pdf/ESMT/datasheets/F50D1G41LB(2M).pdf

Signed-off-by: Igor Prusov 
Signed-off-by: Chuanhong Guo 
Signed-off-by: Martin Kurbanov 
Signed-off-by: Dmitry Rokosov 
Tested-by: Martin Kurbanov 
---
 drivers/mtd/nand/spi/Makefile |   3 +-
 drivers/mtd/nand/spi/core.c   |   1 +
 drivers/mtd/nand/spi/esmt.c   | 137 ++
 include/linux/mtd/spinand.h   |   1 +
 4 files changed, 141 insertions(+), 1 deletion(-)
 create mode 100644 drivers/mtd/nand/spi/esmt.c

diff --git a/drivers/mtd/nand/spi/Makefile b/drivers/mtd/nand/spi/Makefile
index 3051de4f7e..f172f4787f 100644
--- a/drivers/mtd/nand/spi/Makefile
+++ b/drivers/mtd/nand/spi/Makefile
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
 
-spinand-objs := core.o gigadevice.o macronix.o micron.o paragon.o toshiba.o 
winbond.o
+spinand-objs := core.o esmt.o gigadevice.o macronix.o micron.o paragon.o
+spinand-objs += toshiba.o winbond.o
 obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
index 597b088ca7..8ca33459f9 100644
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -828,6 +828,7 @@ static const struct spinand_manufacturer 
*spinand_manufacturers[] = {
_spinand_manufacturer,
_spinand_manufacturer,
_spinand_manufacturer,
+   _c8_spinand_manufacturer,
 };
 
 static int spinand_manufacturer_match(struct spinand_device *spinand,
diff --git a/drivers/mtd/nand/spi/esmt.c b/drivers/mtd/nand/spi/esmt.c
new file mode 100644
index 00..7e07b26827
--- /dev/null
+++ b/drivers/mtd/nand/spi/esmt.c
@@ -0,0 +1,137 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Author:
+ * Chuanhong Guo  - the main driver logic
+ * Martin Kurbanov  - OOB layout
+ */
+
+#ifndef __UBOOT__
+#include 
+#include 
+#endif
+#include 
+
+/* ESMT uses GigaDevice 0xc8 JECDEC ID on some SPI NANDs */
+#define SPINAND_MFR_ESMT_C80xc8
+
+static SPINAND_OP_VARIANTS(read_cache_variants,
+  SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
+  SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
+  SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
+  SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 
0));
+
+static SPINAND_OP_VARIANTS(write_cache_variants,
+  SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
+  SPINAND_PROG_LOAD(true, 0, NULL, 0));
+
+static SPINAND_OP_VARIANTS(update_cache_variants,
+  SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
+  SPINAND_PROG_LOAD(false, 0, NULL, 0));
+
+/*
+ * OOB spare area map (64 bytes)
+ *
+ * Bad Block Markers
+ * filled by HW and kernel Reserved
+ *   | +---+---+
+ *   | |   |   |
+ *   | |OOB free data Area |non ECC protected  |
+ *   |   +-|-+-|-+-|-+
+ *   |   | | | | | | |
+ * 
+-|---|--+--|-|--+--|-|--+--|-|--+
+ * | |   | section0 |  | |section1  |  | |section2  |  | | 
   section3  |
+ * 
+-v-+-v-+---++--v--+--v--+-+-+--v--+--v--+-+-+--v--+--v--+-+-+
+ * |   |   |   || | | | | | | | | |
 | | |
+ * 
|0:1|2:3|4:7|8:15|16:17|18:19|20:23|24:31|32:33|34:35|36:39|40:47|48:49|50:51|52:55|56:63|
+ * |   |   |   || | | | | | | | | |
 | | |
+ * 
+---+---+-^-+--^-+-+-+--^--+--^--+-+-+--^--+--^--+-+-+--^--+--^--+
+ *   ||| | | | 
| |
+ *   |
+|-+-|-+-|-+
+ *   | ECC Area|(Main + Spare) - filled|by ESMT NAND HW
|
+ *   | |   |   
|
+ *   
+-+---+---+
+ * OOB ECC protected Area - not used due to
+ * partial programming from some filesystems
+ * (like JFFS2 with cleanmarkers)
+ */
+
+#define ESMT_OOB_SECTION_COUNT