Skip to content

Commit 5348e2e

Browse files
chbgdnAnsuel
authored andcommitted
generic: mtd: spinand: add support for FORESEE F35SQA002G
Add support for FORESEE F35SQA002G SPI NAND. Datasheet: https://www.longsys.com/uploads/LM-00006FORESEEF35SQA002GDatasheet_1650183701.pdf Refresh all affected patch with make target/linux/refresh. Signed-off-by: Martin Kurbanov <mmkurbanov@salutedevices.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Bohdan Chubuk <chbgdn@gmail.com> Link: openwrt/openwrt#16915 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
1 parent 025dbeb commit 5348e2e

7 files changed

+163
-17
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
From 49c8e854869d673df8452f24dfa8989cd0f615a8 Mon Sep 17 00:00:00 2001
2+
From: Martin Kurbanov <mmkurbanov@salutedevices.com>
3+
Date: Mon, 2 Oct 2023 17:04:58 +0300
4+
Subject: [PATCH] mtd: spinand: add support for FORESEE F35SQA002G
5+
6+
Add support for FORESEE F35SQA002G SPI NAND.
7+
Datasheet:
8+
https://www.longsys.com/uploads/LM-00006FORESEEF35SQA002GDatasheet_1650183701.pdf
9+
10+
Signed-off-by: Martin Kurbanov <mmkurbanov@salutedevices.com>
11+
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
12+
Link: https://lore.kernel.org/linux-mtd/20231002140458.147605-1-mmkurbanov@salutedevices.com
13+
---
14+
drivers/mtd/nand/spi/Makefile | 2 +-
15+
drivers/mtd/nand/spi/core.c | 1 +
16+
drivers/mtd/nand/spi/foresee.c | 95 ++++++++++++++++++++++++++++++++++
17+
include/linux/mtd/spinand.h | 1 +
18+
4 files changed, 98 insertions(+), 1 deletion(-)
19+
create mode 100644 drivers/mtd/nand/spi/foresee.c
20+
21+
--- a/drivers/mtd/nand/spi/Makefile
22+
+++ b/drivers/mtd/nand/spi/Makefile
23+
@@ -1,4 +1,4 @@
24+
# SPDX-License-Identifier: GPL-2.0
25+
-spinand-objs := core.o alliancememory.o ato.o esmt.o gigadevice.o macronix.o
26+
+spinand-objs := core.o alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o
27+
spinand-objs += micron.o paragon.o toshiba.o winbond.o xtx.o
28+
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
29+
--- a/drivers/mtd/nand/spi/core.c
30+
+++ b/drivers/mtd/nand/spi/core.c
31+
@@ -940,6 +940,7 @@ static const struct spinand_manufacturer
32+
&alliancememory_spinand_manufacturer,
33+
&ato_spinand_manufacturer,
34+
&esmt_c8_spinand_manufacturer,
35+
+ &foresee_spinand_manufacturer,
36+
&gigadevice_spinand_manufacturer,
37+
&macronix_spinand_manufacturer,
38+
&micron_spinand_manufacturer,
39+
--- /dev/null
40+
+++ b/drivers/mtd/nand/spi/foresee.c
41+
@@ -0,0 +1,95 @@
42+
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
43+
+/*
44+
+ * Copyright (c) 2023, SberDevices. All Rights Reserved.
45+
+ *
46+
+ * Author: Martin Kurbanov <mmkurbanov@salutedevices.com>
47+
+ */
48+
+
49+
+#include <linux/device.h>
50+
+#include <linux/kernel.h>
51+
+#include <linux/mtd/spinand.h>
52+
+
53+
+#define SPINAND_MFR_FORESEE 0xCD
54+
+
55+
+static SPINAND_OP_VARIANTS(read_cache_variants,
56+
+ SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
57+
+ SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
58+
+ SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
59+
+ SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
60+
+
61+
+static SPINAND_OP_VARIANTS(write_cache_variants,
62+
+ SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
63+
+ SPINAND_PROG_LOAD(true, 0, NULL, 0));
64+
+
65+
+static SPINAND_OP_VARIANTS(update_cache_variants,
66+
+ SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
67+
+ SPINAND_PROG_LOAD(false, 0, NULL, 0));
68+
+
69+
+static int f35sqa002g_ooblayout_ecc(struct mtd_info *mtd, int section,
70+
+ struct mtd_oob_region *region)
71+
+{
72+
+ return -ERANGE;
73+
+}
74+
+
75+
+static int f35sqa002g_ooblayout_free(struct mtd_info *mtd, int section,
76+
+ struct mtd_oob_region *region)
77+
+{
78+
+ if (section)
79+
+ return -ERANGE;
80+
+
81+
+ /* Reserve 2 bytes for the BBM. */
82+
+ region->offset = 2;
83+
+ region->length = 62;
84+
+
85+
+ return 0;
86+
+}
87+
+
88+
+static const struct mtd_ooblayout_ops f35sqa002g_ooblayout = {
89+
+ .ecc = f35sqa002g_ooblayout_ecc,
90+
+ .free = f35sqa002g_ooblayout_free,
91+
+};
92+
+
93+
+static int f35sqa002g_ecc_get_status(struct spinand_device *spinand, u8 status)
94+
+{
95+
+ struct nand_device *nand = spinand_to_nand(spinand);
96+
+
97+
+ switch (status & STATUS_ECC_MASK) {
98+
+ case STATUS_ECC_NO_BITFLIPS:
99+
+ return 0;
100+
+
101+
+ case STATUS_ECC_HAS_BITFLIPS:
102+
+ return nanddev_get_ecc_conf(nand)->strength;
103+
+
104+
+ default:
105+
+ break;
106+
+ }
107+
+
108+
+ /* More than 1-bit error was detected in one or more sectors and
109+
+ * cannot be corrected.
110+
+ */
111+
+ return -EBADMSG;
112+
+}
113+
+
114+
+static const struct spinand_info foresee_spinand_table[] = {
115+
+ SPINAND_INFO("F35SQA002G",
116+
+ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x72, 0x72),
117+
+ NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
118+
+ NAND_ECCREQ(1, 512),
119+
+ SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
120+
+ &write_cache_variants,
121+
+ &update_cache_variants),
122+
+ SPINAND_HAS_QE_BIT,
123+
+ SPINAND_ECCINFO(&f35sqa002g_ooblayout,
124+
+ f35sqa002g_ecc_get_status)),
125+
+};
126+
+
127+
+static const struct spinand_manufacturer_ops foresee_spinand_manuf_ops = {
128+
+};
129+
+
130+
+const struct spinand_manufacturer foresee_spinand_manufacturer = {
131+
+ .id = SPINAND_MFR_FORESEE,
132+
+ .name = "FORESEE",
133+
+ .chips = foresee_spinand_table,
134+
+ .nchips = ARRAY_SIZE(foresee_spinand_table),
135+
+ .ops = &foresee_spinand_manuf_ops,
136+
+};
137+
--- a/include/linux/mtd/spinand.h
138+
+++ b/include/linux/mtd/spinand.h
139+
@@ -263,6 +263,7 @@ struct spinand_manufacturer {
140+
extern const struct spinand_manufacturer alliancememory_spinand_manufacturer;
141+
extern const struct spinand_manufacturer ato_spinand_manufacturer;
142+
extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer;
143+
+extern const struct spinand_manufacturer foresee_spinand_manufacturer;
144+
extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;
145+
extern const struct spinand_manufacturer macronix_spinand_manufacturer;
146+
extern const struct spinand_manufacturer micron_spinand_manufacturer;

target/linux/generic/pending-6.6/410-mtd-spinand-set-bitflip_threshold-to-75-of-ECC-strength.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
5353

5454
--- a/drivers/mtd/nand/spi/core.c
5555
+++ b/drivers/mtd/nand/spi/core.c
56-
@@ -1286,6 +1286,7 @@ static int spinand_init(struct spinand_d
56+
@@ -1287,6 +1287,7 @@ static int spinand_init(struct spinand_d
5757
/* Propagate ECC information to mtd_info */
5858
mtd->ecc_strength = nanddev_get_ecc_conf(nand)->strength;
5959
mtd->ecc_step_size = nanddev_get_ecc_conf(nand)->step_size;

target/linux/generic/pending-6.6/487-mtd-spinand-Add-support-for-Etron-EM73D044VCx.patch

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ Submitted-by: Daniel Danzberger <daniel@dd-wrt.com>
4242
+++ b/drivers/mtd/nand/spi/Makefile
4343
@@ -1,4 +1,4 @@
4444
# SPDX-License-Identifier: GPL-2.0
45-
-spinand-objs := core.o alliancememory.o ato.o esmt.o gigadevice.o macronix.o
45+
-spinand-objs := core.o alliancememory.o ato.o esmt.o foresee.o gigadevice.o macronix.o
4646
-spinand-objs += micron.o paragon.o toshiba.o winbond.o xtx.o
47-
+spinand-objs := core.o alliancememory.o ato.o esmt.o etron.o gigadevice.o
47+
+spinand-objs := core.o alliancememory.o ato.o esmt.o etron.o foresee.o gigadevice.o
4848
+spinand-objs += macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o
4949
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
5050
--- a/drivers/mtd/nand/spi/core.c
@@ -54,9 +54,9 @@ Submitted-by: Daniel Danzberger <daniel@dd-wrt.com>
5454
&ato_spinand_manufacturer,
5555
&esmt_c8_spinand_manufacturer,
5656
+ &etron_spinand_manufacturer,
57+
&foresee_spinand_manufacturer,
5758
&gigadevice_spinand_manufacturer,
5859
&macronix_spinand_manufacturer,
59-
&micron_spinand_manufacturer,
6060
--- /dev/null
6161
+++ b/drivers/mtd/nand/spi/etron.c
6262
@@ -0,0 +1,98 @@
@@ -165,6 +165,6 @@ Submitted-by: Daniel Danzberger <daniel@dd-wrt.com>
165165
extern const struct spinand_manufacturer ato_spinand_manufacturer;
166166
extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer;
167167
+extern const struct spinand_manufacturer etron_spinand_manufacturer;
168+
extern const struct spinand_manufacturer foresee_spinand_manufacturer;
168169
extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;
169170
extern const struct spinand_manufacturer macronix_spinand_manufacturer;
170-
extern const struct spinand_manufacturer micron_spinand_manufacturer;

target/linux/mediatek/patches-6.6/330-snand-mtk-bmt-support.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@
88

99
static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)
1010
{
11-
@@ -1346,6 +1347,7 @@ static int spinand_probe(struct spi_mem
11+
@@ -1347,6 +1348,7 @@ static int spinand_probe(struct spi_mem
1212
if (ret)
1313
return ret;
1414

1515
+ mtk_bmt_attach(mtd);
1616
ret = mtd_device_register(mtd, NULL, 0);
1717
if (ret)
1818
goto err_spinand_cleanup;
19-
@@ -1353,6 +1355,7 @@ static int spinand_probe(struct spi_mem
19+
@@ -1354,6 +1356,7 @@ static int spinand_probe(struct spi_mem
2020
return 0;
2121

2222
err_spinand_cleanup:
2323
+ mtk_bmt_detach(mtd);
2424
spinand_cleanup(spinand);
2525

2626
return ret;
27-
@@ -1371,6 +1374,7 @@ static int spinand_remove(struct spi_mem
27+
@@ -1372,6 +1375,7 @@ static int spinand_remove(struct spi_mem
2828
if (ret)
2929
return ret;
3030

target/linux/mediatek/patches-6.6/340-mtd-spinand-Add-support-for-the-Fidelix-FM35X1GA.patch

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@ Signed-off-by: Davide Fioravanti <pantanastyle@gmail.com>
1818
+++ b/drivers/mtd/nand/spi/Makefile
1919
@@ -1,4 +1,4 @@
2020
# SPDX-License-Identifier: GPL-2.0
21-
-spinand-objs := core.o alliancememory.o ato.o esmt.o etron.o gigadevice.o
22-
+spinand-objs := core.o alliancememory.o ato.o esmt.o etron.o fidelix.o gigadevice.o
21+
-spinand-objs := core.o alliancememory.o ato.o esmt.o etron.o foresee.o gigadevice.o
22+
+spinand-objs := core.o alliancememory.o ato.o esmt.o etron.o fidelix.o foresee.o gigadevice.o
2323
spinand-objs += macronix.o micron.o paragon.o toshiba.o winbond.o xtx.o
2424
obj-$(CONFIG_MTD_SPI_NAND) += spinand.o
2525
--- a/drivers/mtd/nand/spi/core.c
2626
+++ b/drivers/mtd/nand/spi/core.c
27-
@@ -941,6 +941,7 @@ static const struct spinand_manufacturer
28-
&alliancememory_spinand_manufacturer,
27+
@@ -942,6 +942,7 @@ static const struct spinand_manufacturer
2928
&ato_spinand_manufacturer,
3029
&esmt_c8_spinand_manufacturer,
31-
+ &fidelix_spinand_manufacturer,
3230
&etron_spinand_manufacturer,
31+
+ &fidelix_spinand_manufacturer,
32+
&foresee_spinand_manufacturer,
3333
&gigadevice_spinand_manufacturer,
3434
&macronix_spinand_manufacturer,
3535
--- /dev/null
@@ -118,6 +118,6 @@ Signed-off-by: Davide Fioravanti <pantanastyle@gmail.com>
118118
extern const struct spinand_manufacturer esmt_c8_spinand_manufacturer;
119119
extern const struct spinand_manufacturer etron_spinand_manufacturer;
120120
+extern const struct spinand_manufacturer fidelix_spinand_manufacturer;
121+
extern const struct spinand_manufacturer foresee_spinand_manufacturer;
121122
extern const struct spinand_manufacturer gigadevice_spinand_manufacturer;
122123
extern const struct spinand_manufacturer macronix_spinand_manufacturer;
123-
extern const struct spinand_manufacturer micron_spinand_manufacturer;

target/linux/mediatek/patches-6.6/435-drivers-mtd-spinand-Add-calibration-support-for-spin.patch

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
1111

1212
--- a/drivers/mtd/nand/spi/core.c
1313
+++ b/drivers/mtd/nand/spi/core.c
14-
@@ -979,6 +979,56 @@ static int spinand_manufacturer_match(st
14+
@@ -980,6 +980,56 @@ static int spinand_manufacturer_match(st
1515
return -ENOTSUPP;
1616
}
1717

@@ -68,7 +68,7 @@ Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
6868
static int spinand_id_detect(struct spinand_device *spinand)
6969
{
7070
u8 *id = spinand->id.data;
71-
@@ -1229,6 +1279,10 @@ static int spinand_init(struct spinand_d
71+
@@ -1230,6 +1280,10 @@ static int spinand_init(struct spinand_d
7272
if (!spinand->scratchbuf)
7373
return -ENOMEM;
7474

target/linux/mediatek/patches-6.6/436-drivers-mtd-spi-nor-Add-calibration-support-for-spi-.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
1212

1313
--- a/drivers/mtd/nand/spi/core.c
1414
+++ b/drivers/mtd/nand/spi/core.c
15-
@@ -1020,7 +1020,10 @@ int spinand_cal_read(void *priv, u32 *ad
15+
@@ -1021,7 +1021,10 @@ int spinand_cal_read(void *priv, u32 *ad
1616
if (ret)
1717
return ret;
1818

0 commit comments

Comments
 (0)