mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-20 14:13:16 +00:00
kernel: v5.10: backport GigaDevice SPI-NAND supports
This backports GD SPI NAND support from nand/next to v5.10 Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
This commit is contained in:
parent
42186888f5
commit
55be011a71
@ -0,0 +1,172 @@
|
|||||||
|
From bd568cc04c675b7fa97214d278a54794c2ecc2ad Mon Sep 17 00:00:00 2001
|
||||||
|
From: Reto Schneider <reto.schneider@husqvarnagroup.com>
|
||||||
|
Date: Thu, 11 Feb 2021 12:36:19 +0100
|
||||||
|
Subject: [PATCH] mtd: spinand: gigadevice: Support GD5F1GQ5UExxG
|
||||||
|
|
||||||
|
The relevant changes to the already existing GD5F1GQ4UExxG support has
|
||||||
|
been determined by consulting the GigaDevice product change notice
|
||||||
|
AN-0392-10, version 1.0 from November 30, 2020.
|
||||||
|
|
||||||
|
As the overlaps are huge, variable names have been generalized
|
||||||
|
accordingly.
|
||||||
|
|
||||||
|
Apart from the lowered ECC strength (4 instead of 8 bits per 512 bytes),
|
||||||
|
the new device ID, and the extra quad IO dummy byte, no changes had to
|
||||||
|
be taken into account.
|
||||||
|
|
||||||
|
New hardware features are not supported, namely:
|
||||||
|
- Power on reset
|
||||||
|
- Unique ID
|
||||||
|
- Double transfer rate (DTR)
|
||||||
|
- Parameter page
|
||||||
|
- Random data quad IO
|
||||||
|
|
||||||
|
The inverted semantic of the "driver strength" register bits, defaulting
|
||||||
|
to 100% instead of 50% for the Q5 devices, got ignored as the driver has
|
||||||
|
never touched them anyway.
|
||||||
|
|
||||||
|
The no longer supported "read from cache during block erase"
|
||||||
|
functionality is not reflected as the current SPI NAND core does not
|
||||||
|
support it anyway.
|
||||||
|
|
||||||
|
Implementation has been tested on MediaTek MT7688 based GARDENA smart
|
||||||
|
Gateways using both, GigaDevice GD5F1GQ5UEYIG and GD5F1GQ4UBYIG.
|
||||||
|
|
||||||
|
Signed-off-by: Reto Schneider <reto.schneider@husqvarnagroup.com>
|
||||||
|
Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de>
|
||||||
|
Reviewed-by: Stefan Roese <sr@denx.de>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
Link: https://lore.kernel.org/linux-mtd/20210211113619.3502-1-code@reto-schneider.ch
|
||||||
|
(cherry picked from commit 469b992489852b500d39048aa0013639dfe9f2e6)
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/spi/gigadevice.c | 69 +++++++++++++++++++++++++++----
|
||||||
|
1 file changed, 60 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
+++ b/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
@@ -13,7 +13,10 @@
|
||||||
|
#define GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS (1 << 4)
|
||||||
|
#define GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS (3 << 4)
|
||||||
|
|
||||||
|
-#define GD5FXGQ4UEXXG_REG_STATUS2 0xf0
|
||||||
|
+#define GD5FXGQ5XE_STATUS_ECC_1_4_BITFLIPS (1 << 4)
|
||||||
|
+#define GD5FXGQ5XE_STATUS_ECC_4_BITFLIPS (3 << 4)
|
||||||
|
+
|
||||||
|
+#define GD5FXGQXXEXXG_REG_STATUS2 0xf0
|
||||||
|
|
||||||
|
#define GD5FXGQ4UXFXXG_STATUS_ECC_MASK (7 << 4)
|
||||||
|
#define GD5FXGQ4UXFXXG_STATUS_ECC_NO_BITFLIPS (0 << 4)
|
||||||
|
@@ -102,7 +105,7 @@ static int gd5fxgq4xa_ecc_get_status(str
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int gd5fxgq4_variant2_ooblayout_ecc(struct mtd_info *mtd, int section,
|
||||||
|
+static int gd5fxgqx_variant2_ooblayout_ecc(struct mtd_info *mtd, int section,
|
||||||
|
struct mtd_oob_region *region)
|
||||||
|
{
|
||||||
|
if (section)
|
||||||
|
@@ -114,7 +117,7 @@ static int gd5fxgq4_variant2_ooblayout_e
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int gd5fxgq4_variant2_ooblayout_free(struct mtd_info *mtd, int section,
|
||||||
|
+static int gd5fxgqx_variant2_ooblayout_free(struct mtd_info *mtd, int section,
|
||||||
|
struct mtd_oob_region *region)
|
||||||
|
{
|
||||||
|
if (section)
|
||||||
|
@@ -127,9 +130,10 @@ static int gd5fxgq4_variant2_ooblayout_f
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static const struct mtd_ooblayout_ops gd5fxgq4_variant2_ooblayout = {
|
||||||
|
- .ecc = gd5fxgq4_variant2_ooblayout_ecc,
|
||||||
|
- .free = gd5fxgq4_variant2_ooblayout_free,
|
||||||
|
+/* Valid for Q4/Q5 and Q6 (untested) devices */
|
||||||
|
+static const struct mtd_ooblayout_ops gd5fxgqx_variant2_ooblayout = {
|
||||||
|
+ .ecc = gd5fxgqx_variant2_ooblayout_ecc,
|
||||||
|
+ .free = gd5fxgqx_variant2_ooblayout_free,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int gd5fxgq4xc_ooblayout_256_ecc(struct mtd_info *mtd, int section,
|
||||||
|
@@ -165,7 +169,7 @@ static int gd5fxgq4uexxg_ecc_get_status(
|
||||||
|
u8 status)
|
||||||
|
{
|
||||||
|
u8 status2;
|
||||||
|
- struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQ4UEXXG_REG_STATUS2,
|
||||||
|
+ struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQXXEXXG_REG_STATUS2,
|
||||||
|
&status2);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
@@ -203,6 +207,43 @@ static int gd5fxgq4uexxg_ecc_get_status(
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand,
|
||||||
|
+ u8 status)
|
||||||
|
+{
|
||||||
|
+ u8 status2;
|
||||||
|
+ struct spi_mem_op op = SPINAND_GET_FEATURE_OP(GD5FXGQXXEXXG_REG_STATUS2,
|
||||||
|
+ &status2);
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ switch (status & STATUS_ECC_MASK) {
|
||||||
|
+ case STATUS_ECC_NO_BITFLIPS:
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ case GD5FXGQ5XE_STATUS_ECC_1_4_BITFLIPS:
|
||||||
|
+ /*
|
||||||
|
+ * Read status2 register to determine a more fine grained
|
||||||
|
+ * bit error status
|
||||||
|
+ */
|
||||||
|
+ ret = spi_mem_exec_op(spinand->spimem, &op);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * 1 ... 4 bits are flipped (and corrected)
|
||||||
|
+ */
|
||||||
|
+ /* bits sorted this way (1...0): ECCSE1, ECCSE0 */
|
||||||
|
+ return ((status2 & STATUS_ECC_MASK) >> 4) + 1;
|
||||||
|
+
|
||||||
|
+ case STATUS_ECC_UNCOR_ERROR:
|
||||||
|
+ return -EBADMSG;
|
||||||
|
+
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return -EINVAL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int gd5fxgq4ufxxg_ecc_get_status(struct spinand_device *spinand,
|
||||||
|
u8 status)
|
||||||
|
{
|
||||||
|
@@ -282,7 +323,7 @@ static const struct spinand_info gigadev
|
||||||
|
&write_cache_variants,
|
||||||
|
&update_cache_variants),
|
||||||
|
SPINAND_HAS_QE_BIT,
|
||||||
|
- SPINAND_ECCINFO(&gd5fxgq4_variant2_ooblayout,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
SPINAND_INFO("GD5F1GQ4UFxxG",
|
||||||
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb1, 0x48),
|
||||||
|
@@ -292,8 +333,18 @@ static const struct spinand_info gigadev
|
||||||
|
&write_cache_variants,
|
||||||
|
&update_cache_variants),
|
||||||
|
SPINAND_HAS_QE_BIT,
|
||||||
|
- SPINAND_ECCINFO(&gd5fxgq4_variant2_ooblayout,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
gd5fxgq4ufxxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F1GQ5UExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x51),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(4, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = {
|
@ -0,0 +1,44 @@
|
|||||||
|
From a4f9dd55c5e1bb951db6f1dee20e62e0103f3438 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Date: Sun, 20 Mar 2022 17:59:57 +0800
|
||||||
|
Subject: [PATCH 1/5] mtd: spinand: gigadevice: fix Quad IO for GD5F1GQ5UExxG
|
||||||
|
|
||||||
|
Read From Cache Quad IO (EBH) uses 2 dummy bytes on this chip according
|
||||||
|
to page 23 of the datasheet[0].
|
||||||
|
|
||||||
|
[0]: https://www.gigadevice.com/datasheet/gd5f1gq5xexxg/
|
||||||
|
|
||||||
|
Fixes: 469b99248985 ("mtd: spinand: gigadevice: Support GD5F1GQ5UExxG")
|
||||||
|
Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-2-gch981213@gmail.com
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/spi/gigadevice.c | 10 +++++++++-
|
||||||
|
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
+++ b/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
@@ -39,6 +39,14 @@ static SPINAND_OP_VARIANTS(read_cache_va
|
||||||
|
SPINAND_PAGE_READ_FROM_CACHE_OP_3A(true, 0, 1, NULL, 0),
|
||||||
|
SPINAND_PAGE_READ_FROM_CACHE_OP_3A(false, 0, 0, NULL, 0));
|
||||||
|
|
||||||
|
+static SPINAND_OP_VARIANTS(read_cache_variants_1gq5,
|
||||||
|
+ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
|
||||||
|
+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
|
||||||
|
+ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_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));
|
||||||
|
@@ -339,7 +347,7 @@ static const struct spinand_info gigadev
|
||||||
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x51),
|
||||||
|
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||||
|
NAND_ECCREQ(4, 512),
|
||||||
|
- SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
|
||||||
|
&write_cache_variants,
|
||||||
|
&update_cache_variants),
|
||||||
|
SPINAND_HAS_QE_BIT,
|
@ -0,0 +1,58 @@
|
|||||||
|
From 573eec222bc82fb5e724586267fbbb1aed9ffd03 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Date: Sun, 20 Mar 2022 17:59:58 +0800
|
||||||
|
Subject: [PATCH 2/5] mtd: spinand: gigadevice: add support for GD5FxGQ4xExxG
|
||||||
|
|
||||||
|
Add support for:
|
||||||
|
GD5F1GQ4RExxG
|
||||||
|
GD5F2GQ4{U,R}ExxG
|
||||||
|
|
||||||
|
These chips differ from GD5F1GQ4UExxG only in chip ID, voltage
|
||||||
|
and capacity.
|
||||||
|
|
||||||
|
Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-3-gch981213@gmail.com
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/spi/gigadevice.c | 30 ++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 30 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
+++ b/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
@@ -333,6 +333,36 @@ static const struct spinand_info gigadev
|
||||||
|
SPINAND_HAS_QE_BIT,
|
||||||
|
SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F1GQ4RExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc1),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(8, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F2GQ4UExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd2),
|
||||||
|
+ 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),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F2GQ4RExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc2),
|
||||||
|
+ 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),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
SPINAND_INFO("GD5F1GQ4UFxxG",
|
||||||
|
SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb1, 0x48),
|
||||||
|
NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
@ -0,0 +1,33 @@
|
|||||||
|
From 620a988813403318023296b61228ee8f3fcdb8e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Date: Sun, 20 Mar 2022 17:59:59 +0800
|
||||||
|
Subject: [PATCH 3/5] mtd: spinand: gigadevice: add support for GD5F1GQ5RExxG
|
||||||
|
|
||||||
|
This chip is the 1.8v version of GD5F1GQ5UExxG.
|
||||||
|
|
||||||
|
Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-4-gch981213@gmail.com
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/spi/gigadevice.c | 10 ++++++++++
|
||||||
|
1 file changed, 10 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
+++ b/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
@@ -383,6 +383,16 @@ static const struct spinand_info gigadev
|
||||||
|
SPINAND_HAS_QE_BIT,
|
||||||
|
SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F1GQ5RExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x41),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(4, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = {
|
@ -0,0 +1,84 @@
|
|||||||
|
From 194ec04b3a9e7fa97d1fbef296410631bc3cf1c8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Date: Sun, 20 Mar 2022 18:00:00 +0800
|
||||||
|
Subject: [PATCH 4/5] mtd: spinand: gigadevice: add support for GD5F{2,
|
||||||
|
4}GQ5xExxG
|
||||||
|
|
||||||
|
Add support for:
|
||||||
|
GD5F2GQ5{U,R}ExxG
|
||||||
|
GD5F4GQ6{U,R}ExxG
|
||||||
|
|
||||||
|
These chips uses 4 dummy bytes for quad io and 2 dummy bytes for dual io.
|
||||||
|
Besides that and memory layout, they are identical to their 1G variant.
|
||||||
|
|
||||||
|
Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-5-gch981213@gmail.com
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/spi/gigadevice.c | 48 +++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 48 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
+++ b/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
@@ -47,6 +47,14 @@ static SPINAND_OP_VARIANTS(read_cache_va
|
||||||
|
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(read_cache_variants_2gq5,
|
||||||
|
+ SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 4, NULL, 0),
|
||||||
|
+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
|
||||||
|
+ SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 2, 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));
|
||||||
|
@@ -391,6 +399,46 @@ static const struct spinand_info gigadev
|
||||||
|
&write_cache_variants,
|
||||||
|
&update_cache_variants),
|
||||||
|
SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F2GQ5UExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x52),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(4, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F2GQ5RExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x42),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(4, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F4GQ6UExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x55),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 2, 1),
|
||||||
|
+ NAND_ECCREQ(4, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F4GQ6RExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x45),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 2, 1),
|
||||||
|
+ NAND_ECCREQ(4, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
};
|
@ -0,0 +1,91 @@
|
|||||||
|
From 54647cd003c08b714474a5b599a147ec6a160486 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Date: Sun, 20 Mar 2022 18:00:01 +0800
|
||||||
|
Subject: [PATCH 5/5] mtd: spinand: gigadevice: add support for GD5FxGM7xExxG
|
||||||
|
|
||||||
|
Add support for:
|
||||||
|
GD5F{1,2}GM7{U,R}ExxG
|
||||||
|
GD5F4GM8{U,R}ExxG
|
||||||
|
|
||||||
|
These are new 27nm counterparts for the GD5FxGQ4 chips from GigaDevice
|
||||||
|
with 8b/512b on-die ECC capability.
|
||||||
|
These chips (and currently supported GD5FxGQ5 chips) have QIO DTR
|
||||||
|
instruction for reading page cache. It isn't added in this patch because
|
||||||
|
I don't have a DTR spi controller for testing.
|
||||||
|
|
||||||
|
Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
|
||||||
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||||
|
Link: https://lore.kernel.org/linux-mtd/20220320100001.247905-6-gch981213@gmail.com
|
||||||
|
---
|
||||||
|
drivers/mtd/nand/spi/gigadevice.c | 60 +++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 60 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
+++ b/drivers/mtd/nand/spi/gigadevice.c
|
||||||
|
@@ -441,6 +441,66 @@ static const struct spinand_info gigadev
|
||||||
|
SPINAND_HAS_QE_BIT,
|
||||||
|
SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
gd5fxgq5xexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F1GM7UExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(8, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F1GM7RExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(8, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F2GM7UExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(8, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F2GM7RExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x82),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(8, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F4GM8UExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x95),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(8, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
+ SPINAND_INFO("GD5F4GM8RExxG",
|
||||||
|
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x85),
|
||||||
|
+ NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
|
||||||
|
+ NAND_ECCREQ(8, 512),
|
||||||
|
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
|
||||||
|
+ &write_cache_variants,
|
||||||
|
+ &update_cache_variants),
|
||||||
|
+ SPINAND_HAS_QE_BIT,
|
||||||
|
+ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
|
||||||
|
+ gd5fxgq4uexxg_ecc_get_status)),
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = {
|
Loading…
Reference in New Issue
Block a user