1b02308afSBoris Brezillon // SPDX-License-Identifier: GPL-2.0
2b02308afSBoris Brezillon /*
3b02308afSBoris Brezillon * Copyright (c) 2018 Macronix
4b02308afSBoris Brezillon *
5b02308afSBoris Brezillon * Author: Boris Brezillon <boris.brezillon@bootlin.com>
6b02308afSBoris Brezillon */
7b02308afSBoris Brezillon
8b02308afSBoris Brezillon #include <linux/device.h>
9b02308afSBoris Brezillon #include <linux/kernel.h>
10b02308afSBoris Brezillon #include <linux/mtd/spinand.h>
11b02308afSBoris Brezillon
12b02308afSBoris Brezillon #define SPINAND_MFR_MACRONIX 0xC2
13f4cb4d7bSEmil Lenngren #define MACRONIX_ECCSR_MASK 0x0F
14b02308afSBoris Brezillon
15b02308afSBoris Brezillon static SPINAND_OP_VARIANTS(read_cache_variants,
16b02308afSBoris Brezillon SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
17b02308afSBoris Brezillon SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
18b02308afSBoris Brezillon SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
19b02308afSBoris Brezillon SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
20b02308afSBoris Brezillon
21b02308afSBoris Brezillon static SPINAND_OP_VARIANTS(write_cache_variants,
22b02308afSBoris Brezillon SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
231d46963dSMason Yang SPINAND_PROG_LOAD(false, 0, NULL, 0));
24b02308afSBoris Brezillon
25b02308afSBoris Brezillon static SPINAND_OP_VARIANTS(update_cache_variants,
26b02308afSBoris Brezillon SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
27b02308afSBoris Brezillon SPINAND_PROG_LOAD(false, 0, NULL, 0));
28b02308afSBoris Brezillon
mx35lfxge4ab_ooblayout_ecc(struct mtd_info * mtd,int section,struct mtd_oob_region * region)29b02308afSBoris Brezillon static int mx35lfxge4ab_ooblayout_ecc(struct mtd_info *mtd, int section,
30b02308afSBoris Brezillon struct mtd_oob_region *region)
31b02308afSBoris Brezillon {
32b02308afSBoris Brezillon return -ERANGE;
33b02308afSBoris Brezillon }
34b02308afSBoris Brezillon
mx35lfxge4ab_ooblayout_free(struct mtd_info * mtd,int section,struct mtd_oob_region * region)35b02308afSBoris Brezillon static int mx35lfxge4ab_ooblayout_free(struct mtd_info *mtd, int section,
36b02308afSBoris Brezillon struct mtd_oob_region *region)
37b02308afSBoris Brezillon {
38b02308afSBoris Brezillon if (section)
39b02308afSBoris Brezillon return -ERANGE;
40b02308afSBoris Brezillon
41b02308afSBoris Brezillon region->offset = 2;
42b02308afSBoris Brezillon region->length = mtd->oobsize - 2;
43b02308afSBoris Brezillon
44b02308afSBoris Brezillon return 0;
45b02308afSBoris Brezillon }
46b02308afSBoris Brezillon
47b02308afSBoris Brezillon static const struct mtd_ooblayout_ops mx35lfxge4ab_ooblayout = {
48b02308afSBoris Brezillon .ecc = mx35lfxge4ab_ooblayout_ecc,
49b02308afSBoris Brezillon .free = mx35lfxge4ab_ooblayout_free,
50b02308afSBoris Brezillon };
51b02308afSBoris Brezillon
mx35lf1ge4ab_get_eccsr(struct spinand_device * spinand,u8 * eccsr)52b02308afSBoris Brezillon static int mx35lf1ge4ab_get_eccsr(struct spinand_device *spinand, u8 *eccsr)
53b02308afSBoris Brezillon {
54b02308afSBoris Brezillon struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(0x7c, 1),
55b02308afSBoris Brezillon SPI_MEM_OP_NO_ADDR,
56b02308afSBoris Brezillon SPI_MEM_OP_DUMMY(1, 1),
57b02308afSBoris Brezillon SPI_MEM_OP_DATA_IN(1, eccsr, 1));
58b02308afSBoris Brezillon
59f4cb4d7bSEmil Lenngren int ret = spi_mem_exec_op(spinand->spimem, &op);
60f4cb4d7bSEmil Lenngren if (ret)
61f4cb4d7bSEmil Lenngren return ret;
62f4cb4d7bSEmil Lenngren
63f4cb4d7bSEmil Lenngren *eccsr &= MACRONIX_ECCSR_MASK;
64f4cb4d7bSEmil Lenngren return 0;
65b02308afSBoris Brezillon }
66b02308afSBoris Brezillon
mx35lf1ge4ab_ecc_get_status(struct spinand_device * spinand,u8 status)67b02308afSBoris Brezillon static int mx35lf1ge4ab_ecc_get_status(struct spinand_device *spinand,
68b02308afSBoris Brezillon u8 status)
69b02308afSBoris Brezillon {
70b02308afSBoris Brezillon struct nand_device *nand = spinand_to_nand(spinand);
71b02308afSBoris Brezillon u8 eccsr;
72b02308afSBoris Brezillon
73b02308afSBoris Brezillon switch (status & STATUS_ECC_MASK) {
74b02308afSBoris Brezillon case STATUS_ECC_NO_BITFLIPS:
75b02308afSBoris Brezillon return 0;
76b02308afSBoris Brezillon
77b02308afSBoris Brezillon case STATUS_ECC_UNCOR_ERROR:
78b02308afSBoris Brezillon return -EBADMSG;
79b02308afSBoris Brezillon
80b02308afSBoris Brezillon case STATUS_ECC_HAS_BITFLIPS:
81b02308afSBoris Brezillon /*
82b02308afSBoris Brezillon * Let's try to retrieve the real maximum number of bitflips
83b02308afSBoris Brezillon * in order to avoid forcing the wear-leveling layer to move
84b02308afSBoris Brezillon * data around if it's not necessary.
85b02308afSBoris Brezillon */
86ebed787aSDaniel Golle if (mx35lf1ge4ab_get_eccsr(spinand, spinand->scratchbuf))
879a333a72SMiquel Raynal return nanddev_get_ecc_conf(nand)->strength;
88b02308afSBoris Brezillon
89ebed787aSDaniel Golle eccsr = *spinand->scratchbuf;
909a333a72SMiquel Raynal if (WARN_ON(eccsr > nanddev_get_ecc_conf(nand)->strength ||
919a333a72SMiquel Raynal !eccsr))
929a333a72SMiquel Raynal return nanddev_get_ecc_conf(nand)->strength;
93b02308afSBoris Brezillon
94b02308afSBoris Brezillon return eccsr;
95b02308afSBoris Brezillon
96b02308afSBoris Brezillon default:
97b02308afSBoris Brezillon break;
98b02308afSBoris Brezillon }
99b02308afSBoris Brezillon
100b02308afSBoris Brezillon return -EINVAL;
101b02308afSBoris Brezillon }
102b02308afSBoris Brezillon
103b02308afSBoris Brezillon static const struct spinand_info macronix_spinand_table[] = {
104f1541773SChuanhong Guo SPINAND_INFO("MX35LF1GE4AB",
105f1541773SChuanhong Guo SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x12),
106a126483eSFrieder Schrempf NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
107b02308afSBoris Brezillon NAND_ECCREQ(4, 512),
108b02308afSBoris Brezillon SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
109b02308afSBoris Brezillon &write_cache_variants,
110b02308afSBoris Brezillon &update_cache_variants),
111b02308afSBoris Brezillon SPINAND_HAS_QE_BIT,
112b02308afSBoris Brezillon SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
113b02308afSBoris Brezillon mx35lf1ge4ab_ecc_get_status)),
114f1541773SChuanhong Guo SPINAND_INFO("MX35LF2GE4AB",
115f1541773SChuanhong Guo SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22),
116a126483eSFrieder Schrempf NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
1173dfa025fSMiquel Raynal NAND_ECCREQ(4, 512),
1183dfa025fSMiquel Raynal SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
1193dfa025fSMiquel Raynal &write_cache_variants,
1203dfa025fSMiquel Raynal &update_cache_variants),
1213dfa025fSMiquel Raynal SPINAND_HAS_QE_BIT,
1223dfa025fSMiquel Raynal SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
1235ece78deSYouChing Lin SPINAND_INFO("MX35LF2GE4AD",
1245ece78deSYouChing Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x26),
1255ece78deSYouChing Lin NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
1265ece78deSYouChing Lin NAND_ECCREQ(8, 512),
1275ece78deSYouChing Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
1285ece78deSYouChing Lin &write_cache_variants,
1295ece78deSYouChing Lin &update_cache_variants),
1306f802696SJaime Liao SPINAND_HAS_QE_BIT,
1315ece78deSYouChing Lin SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
1325ece78deSYouChing Lin mx35lf1ge4ab_ecc_get_status)),
1335ece78deSYouChing Lin SPINAND_INFO("MX35LF4GE4AD",
1345ece78deSYouChing Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x37),
1355ece78deSYouChing Lin NAND_MEMORG(1, 4096, 128, 64, 2048, 40, 1, 1, 1),
1365ece78deSYouChing Lin NAND_ECCREQ(8, 512),
1375ece78deSYouChing Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
1385ece78deSYouChing Lin &write_cache_variants,
1395ece78deSYouChing Lin &update_cache_variants),
1406f802696SJaime Liao SPINAND_HAS_QE_BIT,
1415ece78deSYouChing Lin SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
1425ece78deSYouChing Lin mx35lf1ge4ab_ecc_get_status)),
143ee4e0eafSYouChing Lin SPINAND_INFO("MX35LF1G24AD",
144ee4e0eafSYouChing Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x14),
145ee4e0eafSYouChing Lin NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
146ee4e0eafSYouChing Lin NAND_ECCREQ(8, 512),
147ee4e0eafSYouChing Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
148ee4e0eafSYouChing Lin &write_cache_variants,
149ee4e0eafSYouChing Lin &update_cache_variants),
1506f802696SJaime Liao SPINAND_HAS_QE_BIT,
151ee4e0eafSYouChing Lin SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
152ee4e0eafSYouChing Lin SPINAND_INFO("MX35LF2G24AD",
153ee4e0eafSYouChing Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x24),
1546f802696SJaime Liao NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
155ee4e0eafSYouChing Lin NAND_ECCREQ(8, 512),
156ee4e0eafSYouChing Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
157ee4e0eafSYouChing Lin &write_cache_variants,
158ee4e0eafSYouChing Lin &update_cache_variants),
1596f802696SJaime Liao SPINAND_HAS_QE_BIT,
160ee4e0eafSYouChing Lin SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
161ee4e0eafSYouChing Lin SPINAND_INFO("MX35LF4G24AD",
162ee4e0eafSYouChing Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35),
163ee4e0eafSYouChing Lin NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1),
164ee4e0eafSYouChing Lin NAND_ECCREQ(8, 512),
165ee4e0eafSYouChing Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
166ee4e0eafSYouChing Lin &write_cache_variants,
167ee4e0eafSYouChing Lin &update_cache_variants),
1686f802696SJaime Liao SPINAND_HAS_QE_BIT,
169ee4e0eafSYouChing Lin SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
170051e070dSYouChing Lin SPINAND_INFO("MX31LF1GE4BC",
171051e070dSYouChing Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x1e),
172051e070dSYouChing Lin NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
173051e070dSYouChing Lin NAND_ECCREQ(8, 512),
174051e070dSYouChing Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
175051e070dSYouChing Lin &write_cache_variants,
176051e070dSYouChing Lin &update_cache_variants),
1776f802696SJaime Liao SPINAND_HAS_QE_BIT,
178051e070dSYouChing Lin SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
179051e070dSYouChing Lin mx35lf1ge4ab_ecc_get_status)),
18075b049bbSYouChing Lin SPINAND_INFO("MX31UF1GE4BC",
18175b049bbSYouChing Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x9e),
18275b049bbSYouChing Lin NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
18375b049bbSYouChing Lin NAND_ECCREQ(8, 512),
18475b049bbSYouChing Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
18575b049bbSYouChing Lin &write_cache_variants,
18675b049bbSYouChing Lin &update_cache_variants),
1876f802696SJaime Liao SPINAND_HAS_QE_BIT,
18875b049bbSYouChing Lin SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
18975b049bbSYouChing Lin mx35lf1ge4ab_ecc_get_status)),
190c374839fSJaime Liao
191c374839fSJaime Liao SPINAND_INFO("MX35LF2G14AC",
192c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x20),
193c374839fSJaime Liao NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
194c374839fSJaime Liao NAND_ECCREQ(4, 512),
195c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
196c374839fSJaime Liao &write_cache_variants,
197c374839fSJaime Liao &update_cache_variants),
198c374839fSJaime Liao SPINAND_HAS_QE_BIT,
199c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
200c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
201c374839fSJaime Liao SPINAND_INFO("MX35UF4G24AD",
202c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb5),
203c374839fSJaime Liao NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1),
204c374839fSJaime Liao NAND_ECCREQ(8, 512),
205c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
206c374839fSJaime Liao &write_cache_variants,
207c374839fSJaime Liao &update_cache_variants),
208c374839fSJaime Liao SPINAND_HAS_QE_BIT,
209c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
210c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
211c374839fSJaime Liao SPINAND_INFO("MX35UF4GE4AD",
212c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb7),
213c374839fSJaime Liao NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
214c374839fSJaime Liao NAND_ECCREQ(8, 512),
215c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
216c374839fSJaime Liao &write_cache_variants,
217c374839fSJaime Liao &update_cache_variants),
218c374839fSJaime Liao SPINAND_HAS_QE_BIT,
219c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
220c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
221c374839fSJaime Liao SPINAND_INFO("MX35UF2G14AC",
222c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa0),
223c374839fSJaime Liao NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1),
224c374839fSJaime Liao NAND_ECCREQ(4, 512),
225c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
226c374839fSJaime Liao &write_cache_variants,
227c374839fSJaime Liao &update_cache_variants),
228c374839fSJaime Liao SPINAND_HAS_QE_BIT,
229c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
230c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
231c374839fSJaime Liao SPINAND_INFO("MX35UF2G24AD",
232c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa4),
233c374839fSJaime Liao NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1),
234c374839fSJaime Liao NAND_ECCREQ(8, 512),
235c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
236c374839fSJaime Liao &write_cache_variants,
237c374839fSJaime Liao &update_cache_variants),
238c374839fSJaime Liao SPINAND_HAS_QE_BIT,
239c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
240c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
241c374839fSJaime Liao SPINAND_INFO("MX35UF2GE4AD",
242c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa6),
243c374839fSJaime Liao NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
244c374839fSJaime Liao NAND_ECCREQ(8, 512),
245c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
246c374839fSJaime Liao &write_cache_variants,
247c374839fSJaime Liao &update_cache_variants),
248c374839fSJaime Liao SPINAND_HAS_QE_BIT,
249c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
250c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
251c374839fSJaime Liao SPINAND_INFO("MX35UF2GE4AC",
252c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa2),
253c374839fSJaime Liao NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
254c374839fSJaime Liao NAND_ECCREQ(4, 512),
255c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
256c374839fSJaime Liao &write_cache_variants,
257c374839fSJaime Liao &update_cache_variants),
258c374839fSJaime Liao SPINAND_HAS_QE_BIT,
259c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
260c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
261c374839fSJaime Liao SPINAND_INFO("MX35UF1G14AC",
262c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x90),
263c374839fSJaime Liao NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
264c374839fSJaime Liao NAND_ECCREQ(4, 512),
265c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
266c374839fSJaime Liao &write_cache_variants,
267c374839fSJaime Liao &update_cache_variants),
268c374839fSJaime Liao SPINAND_HAS_QE_BIT,
269c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
270c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
271c374839fSJaime Liao SPINAND_INFO("MX35UF1G24AD",
272c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x94),
273c374839fSJaime Liao NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
274c374839fSJaime Liao NAND_ECCREQ(8, 512),
275c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
276c374839fSJaime Liao &write_cache_variants,
277c374839fSJaime Liao &update_cache_variants),
278c374839fSJaime Liao SPINAND_HAS_QE_BIT,
279c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
280c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
281c374839fSJaime Liao SPINAND_INFO("MX35UF1GE4AD",
282c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x96),
283c374839fSJaime Liao NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
284c374839fSJaime Liao NAND_ECCREQ(8, 512),
285c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
286c374839fSJaime Liao &write_cache_variants,
287c374839fSJaime Liao &update_cache_variants),
288c374839fSJaime Liao SPINAND_HAS_QE_BIT,
289c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
290c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
291c374839fSJaime Liao SPINAND_INFO("MX35UF1GE4AC",
292c374839fSJaime Liao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92),
293c374839fSJaime Liao NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
294c374839fSJaime Liao NAND_ECCREQ(4, 512),
295c374839fSJaime Liao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
296c374839fSJaime Liao &write_cache_variants,
297c374839fSJaime Liao &update_cache_variants),
298c374839fSJaime Liao SPINAND_HAS_QE_BIT,
299c374839fSJaime Liao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
300c374839fSJaime Liao mx35lf1ge4ab_ecc_get_status)),
301c374839fSJaime Liao
302*1a50947dSJaimeLiao SPINAND_INFO("MX31LF2GE4BC",
303*1a50947dSJaimeLiao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x2e),
304*1a50947dSJaimeLiao NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
305*1a50947dSJaimeLiao NAND_ECCREQ(8, 512),
306*1a50947dSJaimeLiao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
307*1a50947dSJaimeLiao &write_cache_variants,
308*1a50947dSJaimeLiao &update_cache_variants),
309*1a50947dSJaimeLiao SPINAND_HAS_QE_BIT,
310*1a50947dSJaimeLiao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
311*1a50947dSJaimeLiao mx35lf1ge4ab_ecc_get_status)),
312*1a50947dSJaimeLiao SPINAND_INFO("MX3UF2GE4BC",
313*1a50947dSJaimeLiao SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xae),
314*1a50947dSJaimeLiao NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
315*1a50947dSJaimeLiao NAND_ECCREQ(8, 512),
316*1a50947dSJaimeLiao SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
317*1a50947dSJaimeLiao &write_cache_variants,
318*1a50947dSJaimeLiao &update_cache_variants),
319*1a50947dSJaimeLiao SPINAND_HAS_QE_BIT,
320*1a50947dSJaimeLiao SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
321*1a50947dSJaimeLiao mx35lf1ge4ab_ecc_get_status)),
322b02308afSBoris Brezillon };
323b02308afSBoris Brezillon
324b02308afSBoris Brezillon static const struct spinand_manufacturer_ops macronix_spinand_manuf_ops = {
325b02308afSBoris Brezillon };
326b02308afSBoris Brezillon
327b02308afSBoris Brezillon const struct spinand_manufacturer macronix_spinand_manufacturer = {
328b02308afSBoris Brezillon .id = SPINAND_MFR_MACRONIX,
329b02308afSBoris Brezillon .name = "Macronix",
330f1541773SChuanhong Guo .chips = macronix_spinand_table,
331f1541773SChuanhong Guo .nchips = ARRAY_SIZE(macronix_spinand_table),
332b02308afSBoris Brezillon .ops = ¯onix_spinand_manuf_ops,
333b02308afSBoris Brezillon };
334