xref: /linux/drivers/mtd/nand/spi/gigadevice.c (revision e3966940559d52aa1800a008dcfeec218dd31f88)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Author:
4  *	Chuanhong Guo <gch981213@gmail.com>
5  */
6 
7 #include <linux/bitfield.h>
8 #include <linux/device.h>
9 #include <linux/kernel.h>
10 #include <linux/mtd/spinand.h>
11 
12 #define SPINAND_MFR_GIGADEVICE			0xC8
13 
14 #define GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS	(1 << 4)
15 #define GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS	(3 << 4)
16 
17 #define GD5FXGQ5XE_STATUS_ECC_1_4_BITFLIPS	(1 << 4)
18 #define GD5FXGQ5XE_STATUS_ECC_4_BITFLIPS	(3 << 4)
19 
20 #define GD5FXGQXXEXXG_REG_STATUS2		0xf0
21 
22 #define GD5FXGQ4UXFXXG_STATUS_ECC_MASK		(7 << 4)
23 #define GD5FXGQ4UXFXXG_STATUS_ECC_NO_BITFLIPS	(0 << 4)
24 #define GD5FXGQ4UXFXXG_STATUS_ECC_1_3_BITFLIPS	(1 << 4)
25 #define GD5FXGQ4UXFXXG_STATUS_ECC_UNCOR_ERROR	(7 << 4)
26 
27 /* Feature bit definitions */
28 #define GD_FEATURE_NR	BIT(3)	/* Normal Read(1=normal,0=continuous) */
29 #define GD_FEATURE_CRDC	BIT(2)	/* Continuous Read Dummy */
30 
31 /* ECC status extraction helpers */
32 #define GD_ECCSR_LAST_PAGE(eccsr)	FIELD_GET(GENMASK(3, 0), eccsr)
33 #define GD_ECCSR_ACCUMULATED(eccsr)	FIELD_GET(GENMASK(7, 4), eccsr)
34 
35 struct gigadevice_priv {
36 	bool continuous_read;
37 };
38 
39 static SPINAND_OP_VARIANTS(read_cache_variants,
40 		SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP(0, 1, NULL, 0, 0),
41 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_4S_OP(0, 1, NULL, 0, 0),
42 		SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP(0, 1, NULL, 0, 0),
43 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_2S_OP(0, 1, NULL, 0, 0),
44 		SPINAND_PAGE_READ_FROM_CACHE_FAST_1S_1S_1S_OP(0, 1, NULL, 0, 0),
45 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_1S_OP(0, 1, NULL, 0, 0));
46 
47 static SPINAND_OP_VARIANTS(read_cache_variants_f,
48 		SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP(0, 1, NULL, 0, 0),
49 		SPINAND_PAGE_READ_FROM_CACHE_3A_1S_1S_4S_OP(0, 1, NULL, 0, 0),
50 		SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP(0, 1, NULL, 0, 0),
51 		SPINAND_PAGE_READ_FROM_CACHE_3A_1S_1S_2S_OP(0, 1, NULL, 0, 0),
52 		SPINAND_PAGE_READ_FROM_CACHE_FAST_3A_1S_1S_1S_OP(0, 1, NULL, 0, 0),
53 		SPINAND_PAGE_READ_FROM_CACHE_3A_1S_1S_1S_OP(0, 0, NULL, 0, 0));
54 
55 static SPINAND_OP_VARIANTS(read_cache_variants_1gq5,
56 		SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP(0, 2, NULL, 0, 0),
57 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_4S_OP(0, 1, NULL, 0, 0),
58 		SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP(0, 1, NULL, 0, 0),
59 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_2S_OP(0, 1, NULL, 0, 0),
60 		SPINAND_PAGE_READ_FROM_CACHE_FAST_1S_1S_1S_OP(0, 1, NULL, 0, 0),
61 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_1S_OP(0, 1, NULL, 0, 0));
62 
63 static SPINAND_OP_VARIANTS(read_cache_variants_2gq5,
64 		SPINAND_PAGE_READ_FROM_CACHE_1S_4S_4S_OP(0, 4, NULL, 0, 0),
65 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_4S_OP(0, 1, NULL, 0, 0),
66 		SPINAND_PAGE_READ_FROM_CACHE_1S_2S_2S_OP(0, 2, NULL, 0, 0),
67 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_2S_OP(0, 1, NULL, 0, 0),
68 		SPINAND_PAGE_READ_FROM_CACHE_FAST_1S_1S_1S_OP(0, 1, NULL, 0, 0),
69 		SPINAND_PAGE_READ_FROM_CACHE_1S_1S_1S_OP(0, 1, NULL, 0, 0));
70 
71 static SPINAND_OP_VARIANTS(write_cache_variants,
72 		SPINAND_PROG_LOAD_1S_1S_4S_OP(true, 0, NULL, 0),
73 		SPINAND_PROG_LOAD_1S_1S_1S_OP(true, 0, NULL, 0));
74 
75 static SPINAND_OP_VARIANTS(update_cache_variants,
76 		SPINAND_PROG_LOAD_1S_1S_4S_OP(false, 0, NULL, 0),
77 		SPINAND_PROG_LOAD_1S_1S_1S_OP(false, 0, NULL, 0));
78 
79 static int gd5fxgm9_get_eccsr(struct spinand_device *spinand, u8 *eccsr)
80 {
81 	struct gigadevice_priv *priv = spinand->priv;
82 	struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(0x7c, 1),
83 					SPI_MEM_OP_NO_ADDR,
84 					SPI_MEM_OP_DUMMY(1, 1),
85 					SPI_MEM_OP_DATA_IN(1, eccsr, 1));
86 	int ret;
87 
88 	ret = spi_mem_exec_op(spinand->spimem, &op);
89 	if (ret)
90 		return ret;
91 
92 	if (priv->continuous_read)
93 		*eccsr = GD_ECCSR_ACCUMULATED(*eccsr);
94 	else
95 		*eccsr = GD_ECCSR_LAST_PAGE(*eccsr);
96 
97 	return 0;
98 }
99 
100 static int gd5fxgm9_ecc_get_status(struct spinand_device *spinand, u8 status)
101 {
102 	struct nand_device *nand = spinand_to_nand(spinand);
103 	u8 eccsr;
104 	int ret;
105 
106 	switch (status & STATUS_ECC_MASK) {
107 	case STATUS_ECC_NO_BITFLIPS:
108 		return 0;
109 
110 	case GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS:
111 		ret = gd5fxgm9_get_eccsr(spinand, spinand->scratchbuf);
112 		if (ret)
113 			return nanddev_get_ecc_conf(nand)->strength;
114 
115 		eccsr = *spinand->scratchbuf;
116 		if (WARN_ON(!eccsr || eccsr > nanddev_get_ecc_conf(nand)->strength))
117 			return nanddev_get_ecc_conf(nand)->strength;
118 
119 		return eccsr;
120 
121 	case GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS:
122 		return 8;
123 
124 	case STATUS_ECC_UNCOR_ERROR:
125 		return -EBADMSG;
126 
127 	default:
128 		return -EINVAL;
129 	}
130 }
131 
132 static int gd5fxgm9_set_continuous_read(struct spinand_device *spinand, bool enable)
133 {
134 	struct gigadevice_priv *priv = spinand->priv;
135 	int ret;
136 
137 	ret = spinand_upd_cfg(spinand, GD_FEATURE_NR,
138 				enable ? 0 : GD_FEATURE_NR);
139 	if (ret)
140 		return ret;
141 
142 	priv->continuous_read = enable;
143 
144 	return 0;
145 }
146 
147 static int gd5fxgq4xa_ooblayout_ecc(struct mtd_info *mtd, int section,
148 				  struct mtd_oob_region *region)
149 {
150 	if (section > 3)
151 		return -ERANGE;
152 
153 	region->offset = (16 * section) + 8;
154 	region->length = 8;
155 
156 	return 0;
157 }
158 
159 static int gd5fxgq4xa_ooblayout_free(struct mtd_info *mtd, int section,
160 				   struct mtd_oob_region *region)
161 {
162 	if (section > 3)
163 		return -ERANGE;
164 
165 	if (section) {
166 		region->offset = 16 * section;
167 		region->length = 8;
168 	} else {
169 		/* section 0 has one byte reserved for bad block mark */
170 		region->offset = 1;
171 		region->length = 7;
172 	}
173 	return 0;
174 }
175 
176 static const struct mtd_ooblayout_ops gd5fxgq4xa_ooblayout = {
177 	.ecc = gd5fxgq4xa_ooblayout_ecc,
178 	.free = gd5fxgq4xa_ooblayout_free,
179 };
180 
181 static int gd5fxgq4xa_ecc_get_status(struct spinand_device *spinand,
182 					 u8 status)
183 {
184 	switch (status & STATUS_ECC_MASK) {
185 	case STATUS_ECC_NO_BITFLIPS:
186 		return 0;
187 
188 	case GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS:
189 		/* 1-7 bits are flipped. return the maximum. */
190 		return 7;
191 
192 	case GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS:
193 		return 8;
194 
195 	case STATUS_ECC_UNCOR_ERROR:
196 		return -EBADMSG;
197 
198 	default:
199 		break;
200 	}
201 
202 	return -EINVAL;
203 }
204 
205 static int gd5fxgqx_variant2_ooblayout_ecc(struct mtd_info *mtd, int section,
206 				       struct mtd_oob_region *region)
207 {
208 	if (section)
209 		return -ERANGE;
210 
211 	region->offset = 64;
212 	region->length = 64;
213 
214 	return 0;
215 }
216 
217 static int gd5fxgqx_variant2_ooblayout_free(struct mtd_info *mtd, int section,
218 					struct mtd_oob_region *region)
219 {
220 	if (section)
221 		return -ERANGE;
222 
223 	/* Reserve 1 bytes for the BBM. */
224 	region->offset = 1;
225 	region->length = 63;
226 
227 	return 0;
228 }
229 
230 /* Valid for Q4/Q5 and Q6 (untested) devices */
231 static const struct mtd_ooblayout_ops gd5fxgqx_variant2_ooblayout = {
232 	.ecc = gd5fxgqx_variant2_ooblayout_ecc,
233 	.free = gd5fxgqx_variant2_ooblayout_free,
234 };
235 
236 static int gd5fxgq4xc_ooblayout_256_ecc(struct mtd_info *mtd, int section,
237 					struct mtd_oob_region *oobregion)
238 {
239 	if (section)
240 		return -ERANGE;
241 
242 	oobregion->offset = 128;
243 	oobregion->length = 128;
244 
245 	return 0;
246 }
247 
248 static int gd5fxgq4xc_ooblayout_256_free(struct mtd_info *mtd, int section,
249 					 struct mtd_oob_region *oobregion)
250 {
251 	if (section)
252 		return -ERANGE;
253 
254 	oobregion->offset = 1;
255 	oobregion->length = 127;
256 
257 	return 0;
258 }
259 
260 static const struct mtd_ooblayout_ops gd5fxgq4xc_oob_256_ops = {
261 	.ecc = gd5fxgq4xc_ooblayout_256_ecc,
262 	.free = gd5fxgq4xc_ooblayout_256_free,
263 };
264 
265 static int gd5fxgq4uexxg_ecc_get_status(struct spinand_device *spinand,
266 					u8 status)
267 {
268 	u8 status2;
269 	struct spi_mem_op op = SPINAND_GET_FEATURE_1S_1S_1S_OP(GD5FXGQXXEXXG_REG_STATUS2,
270 						      spinand->scratchbuf);
271 	int ret;
272 
273 	switch (status & STATUS_ECC_MASK) {
274 	case STATUS_ECC_NO_BITFLIPS:
275 		return 0;
276 
277 	case GD5FXGQ4XA_STATUS_ECC_1_7_BITFLIPS:
278 		/*
279 		 * Read status2 register to determine a more fine grained
280 		 * bit error status
281 		 */
282 		ret = spi_mem_exec_op(spinand->spimem, &op);
283 		if (ret)
284 			return ret;
285 
286 		/*
287 		 * 4 ... 7 bits are flipped (1..4 can't be detected, so
288 		 * report the maximum of 4 in this case
289 		 */
290 		/* bits sorted this way (3...0): ECCS1,ECCS0,ECCSE1,ECCSE0 */
291 		status2 = *(spinand->scratchbuf);
292 		return ((status & STATUS_ECC_MASK) >> 2) |
293 			((status2 & STATUS_ECC_MASK) >> 4);
294 
295 	case GD5FXGQ4XA_STATUS_ECC_8_BITFLIPS:
296 		return 8;
297 
298 	case STATUS_ECC_UNCOR_ERROR:
299 		return -EBADMSG;
300 
301 	default:
302 		break;
303 	}
304 
305 	return -EINVAL;
306 }
307 
308 static int gd5fxgq5xexxg_ecc_get_status(struct spinand_device *spinand,
309 					u8 status)
310 {
311 	u8 status2;
312 	struct spi_mem_op op = SPINAND_GET_FEATURE_1S_1S_1S_OP(GD5FXGQXXEXXG_REG_STATUS2,
313 						      spinand->scratchbuf);
314 	int ret;
315 
316 	switch (status & STATUS_ECC_MASK) {
317 	case STATUS_ECC_NO_BITFLIPS:
318 		return 0;
319 
320 	case GD5FXGQ5XE_STATUS_ECC_1_4_BITFLIPS:
321 		/*
322 		 * Read status2 register to determine a more fine grained
323 		 * bit error status
324 		 */
325 		ret = spi_mem_exec_op(spinand->spimem, &op);
326 		if (ret)
327 			return ret;
328 
329 		/*
330 		 * 1 ... 4 bits are flipped (and corrected)
331 		 */
332 		/* bits sorted this way (1...0): ECCSE1, ECCSE0 */
333 		status2 = *(spinand->scratchbuf);
334 		return ((status2 & STATUS_ECC_MASK) >> 4) + 1;
335 
336 	case STATUS_ECC_UNCOR_ERROR:
337 		return -EBADMSG;
338 
339 	default:
340 		break;
341 	}
342 
343 	return -EINVAL;
344 }
345 
346 static int gd5fxgq4ufxxg_ecc_get_status(struct spinand_device *spinand,
347 					u8 status)
348 {
349 	switch (status & GD5FXGQ4UXFXXG_STATUS_ECC_MASK) {
350 	case GD5FXGQ4UXFXXG_STATUS_ECC_NO_BITFLIPS:
351 		return 0;
352 
353 	case GD5FXGQ4UXFXXG_STATUS_ECC_1_3_BITFLIPS:
354 		return 3;
355 
356 	case GD5FXGQ4UXFXXG_STATUS_ECC_UNCOR_ERROR:
357 		return -EBADMSG;
358 
359 	default: /* (2 << 4) through (6 << 4) are 4-8 corrected errors */
360 		return ((status & GD5FXGQ4UXFXXG_STATUS_ECC_MASK) >> 4) + 2;
361 	}
362 
363 	return -EINVAL;
364 }
365 
366 static const struct spinand_info gigadevice_spinand_table[] = {
367 	SPINAND_INFO("GD5F1GQ4xA",
368 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xf1),
369 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
370 		     NAND_ECCREQ(8, 512),
371 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
372 					      &write_cache_variants,
373 					      &update_cache_variants),
374 		     SPINAND_HAS_QE_BIT,
375 		     SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
376 				     gd5fxgq4xa_ecc_get_status)),
377 	SPINAND_INFO("GD5F2GQ4xA",
378 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xf2),
379 		     NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
380 		     NAND_ECCREQ(8, 512),
381 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
382 					      &write_cache_variants,
383 					      &update_cache_variants),
384 		     SPINAND_HAS_QE_BIT,
385 		     SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
386 				     gd5fxgq4xa_ecc_get_status)),
387 	SPINAND_INFO("GD5F4GQ4xA",
388 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xf4),
389 		     NAND_MEMORG(1, 2048, 64, 64, 4096, 80, 1, 1, 1),
390 		     NAND_ECCREQ(8, 512),
391 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
392 					      &write_cache_variants,
393 					      &update_cache_variants),
394 		     SPINAND_HAS_QE_BIT,
395 		     SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout,
396 				     gd5fxgq4xa_ecc_get_status)),
397 	SPINAND_INFO("GD5F4GQ4RC",
398 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xa4, 0x68),
399 		     NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
400 		     NAND_ECCREQ(8, 512),
401 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_f,
402 					      &write_cache_variants,
403 					      &update_cache_variants),
404 		     SPINAND_HAS_QE_BIT,
405 		     SPINAND_ECCINFO(&gd5fxgq4xc_oob_256_ops,
406 				     gd5fxgq4ufxxg_ecc_get_status)),
407 	SPINAND_INFO("GD5F4GQ4UC",
408 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb4, 0x68),
409 		     NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1),
410 		     NAND_ECCREQ(8, 512),
411 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_f,
412 					      &write_cache_variants,
413 					      &update_cache_variants),
414 		     SPINAND_HAS_QE_BIT,
415 		     SPINAND_ECCINFO(&gd5fxgq4xc_oob_256_ops,
416 				     gd5fxgq4ufxxg_ecc_get_status)),
417 	SPINAND_INFO("GD5F1GQ4UExxG",
418 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd1),
419 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
420 		     NAND_ECCREQ(8, 512),
421 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
422 					      &write_cache_variants,
423 					      &update_cache_variants),
424 		     SPINAND_HAS_QE_BIT,
425 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
426 				     gd5fxgq4uexxg_ecc_get_status)),
427 	SPINAND_INFO("GD5F1GQ4RExxG",
428 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc1),
429 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
430 		     NAND_ECCREQ(8, 512),
431 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
432 					      &write_cache_variants,
433 					      &update_cache_variants),
434 		     SPINAND_HAS_QE_BIT,
435 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
436 				     gd5fxgq4uexxg_ecc_get_status)),
437 	SPINAND_INFO("GD5F2GQ4UExxG",
438 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd2),
439 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
440 		     NAND_ECCREQ(8, 512),
441 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
442 					      &write_cache_variants,
443 					      &update_cache_variants),
444 		     SPINAND_HAS_QE_BIT,
445 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
446 				     gd5fxgq4uexxg_ecc_get_status)),
447 	SPINAND_INFO("GD5F2GQ4RExxG",
448 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xc2),
449 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
450 		     NAND_ECCREQ(8, 512),
451 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
452 					      &write_cache_variants,
453 					      &update_cache_variants),
454 		     SPINAND_HAS_QE_BIT,
455 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
456 				     gd5fxgq4uexxg_ecc_get_status)),
457 	SPINAND_INFO("GD5F1GQ4UFxxG",
458 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb1, 0x48),
459 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
460 		     NAND_ECCREQ(8, 512),
461 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_f,
462 					      &write_cache_variants,
463 					      &update_cache_variants),
464 		     SPINAND_HAS_QE_BIT,
465 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
466 				     gd5fxgq4ufxxg_ecc_get_status)),
467 	SPINAND_INFO("GD5F1GQ5UExxG",
468 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x51),
469 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
470 		     NAND_ECCREQ(4, 512),
471 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
472 					      &write_cache_variants,
473 					      &update_cache_variants),
474 		     SPINAND_HAS_QE_BIT,
475 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
476 				     gd5fxgq5xexxg_ecc_get_status)),
477 	SPINAND_INFO("GD5F1GQ5RExxG",
478 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x41),
479 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
480 		     NAND_ECCREQ(4, 512),
481 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
482 					      &write_cache_variants,
483 					      &update_cache_variants),
484 		     SPINAND_HAS_QE_BIT,
485 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
486 				     gd5fxgq5xexxg_ecc_get_status)),
487 	SPINAND_INFO("GD5F2GQ5UExxG",
488 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x52),
489 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
490 		     NAND_ECCREQ(4, 512),
491 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
492 					      &write_cache_variants,
493 					      &update_cache_variants),
494 		     SPINAND_HAS_QE_BIT,
495 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
496 				     gd5fxgq5xexxg_ecc_get_status)),
497 	SPINAND_INFO("GD5F2GQ5RExxG",
498 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x42),
499 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
500 		     NAND_ECCREQ(4, 512),
501 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
502 					      &write_cache_variants,
503 					      &update_cache_variants),
504 		     SPINAND_HAS_QE_BIT,
505 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
506 				     gd5fxgq5xexxg_ecc_get_status)),
507 	SPINAND_INFO("GD5F4GQ6UExxG",
508 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x55),
509 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 2, 1),
510 		     NAND_ECCREQ(4, 512),
511 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
512 					      &write_cache_variants,
513 					      &update_cache_variants),
514 		     SPINAND_HAS_QE_BIT,
515 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
516 				     gd5fxgq5xexxg_ecc_get_status)),
517 	SPINAND_INFO("GD5F4GQ6RExxG",
518 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x45),
519 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 2, 1),
520 		     NAND_ECCREQ(4, 512),
521 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
522 					      &write_cache_variants,
523 					      &update_cache_variants),
524 		     SPINAND_HAS_QE_BIT,
525 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
526 				     gd5fxgq5xexxg_ecc_get_status)),
527 	SPINAND_INFO("GD5F1GM7UExxG",
528 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91),
529 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
530 		     NAND_ECCREQ(8, 512),
531 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
532 					      &write_cache_variants,
533 					      &update_cache_variants),
534 		     SPINAND_HAS_QE_BIT,
535 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
536 				     gd5fxgq4uexxg_ecc_get_status)),
537 	SPINAND_INFO("GD5F1GM7RExxG",
538 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81),
539 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
540 		     NAND_ECCREQ(8, 512),
541 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
542 					      &write_cache_variants,
543 					      &update_cache_variants),
544 		     SPINAND_HAS_QE_BIT,
545 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
546 				     gd5fxgq4uexxg_ecc_get_status)),
547 	SPINAND_INFO("GD5F2GM7UExxG",
548 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92),
549 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
550 		     NAND_ECCREQ(8, 512),
551 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
552 					      &write_cache_variants,
553 					      &update_cache_variants),
554 		     SPINAND_HAS_QE_BIT,
555 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
556 				     gd5fxgq4uexxg_ecc_get_status)),
557 	SPINAND_INFO("GD5F2GM7RExxG",
558 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x82),
559 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1),
560 		     NAND_ECCREQ(8, 512),
561 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
562 					      &write_cache_variants,
563 					      &update_cache_variants),
564 		     SPINAND_HAS_QE_BIT,
565 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
566 				     gd5fxgq4uexxg_ecc_get_status)),
567 	SPINAND_INFO("GD5F4GM8UExxG",
568 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x95),
569 		     NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
570 		     NAND_ECCREQ(8, 512),
571 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
572 					      &write_cache_variants,
573 					      &update_cache_variants),
574 		     SPINAND_HAS_QE_BIT,
575 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
576 				     gd5fxgq4uexxg_ecc_get_status)),
577 	SPINAND_INFO("GD5F4GM8RExxG",
578 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x85),
579 		     NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1),
580 		     NAND_ECCREQ(8, 512),
581 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
582 					      &write_cache_variants,
583 					      &update_cache_variants),
584 		     SPINAND_HAS_QE_BIT,
585 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
586 				     gd5fxgq4uexxg_ecc_get_status)),
587 	SPINAND_INFO("GD5F2GQ5xExxH",
588 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22),
589 		     NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1),
590 		     NAND_ECCREQ(4, 512),
591 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5,
592 					      &write_cache_variants,
593 					      &update_cache_variants),
594 		     SPINAND_HAS_QE_BIT,
595 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
596 				     gd5fxgq4uexxg_ecc_get_status)),
597 	SPINAND_INFO("GD5F1GQ5RExxH",
598 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x21),
599 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
600 		     NAND_ECCREQ(4, 512),
601 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
602 					      &write_cache_variants,
603 					      &update_cache_variants),
604 		     SPINAND_HAS_QE_BIT,
605 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
606 				     gd5fxgq4uexxg_ecc_get_status)),
607 	SPINAND_INFO("GD5F1GQ4RExxH",
608 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xc9),
609 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1),
610 		     NAND_ECCREQ(4, 512),
611 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
612 					      &write_cache_variants,
613 					      &update_cache_variants),
614 		     SPINAND_HAS_QE_BIT,
615 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
616 				     gd5fxgq4uexxg_ecc_get_status)),
617 	SPINAND_INFO("GD5F1GM9UExxG",
618 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91, 0x01),
619 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
620 		     NAND_ECCREQ(8, 512),
621 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
622 					      &write_cache_variants,
623 					      &update_cache_variants),
624 		     SPINAND_HAS_QE_BIT,
625 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
626 				     gd5fxgm9_ecc_get_status),
627 			SPINAND_CONT_READ(gd5fxgm9_set_continuous_read)),
628 	SPINAND_INFO("GD5F1GM9RExxG",
629 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81, 0x01),
630 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1),
631 		     NAND_ECCREQ(8, 512),
632 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5,
633 					      &write_cache_variants,
634 					      &update_cache_variants),
635 		     SPINAND_HAS_QE_BIT,
636 		     SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout,
637 				     gd5fxgm9_ecc_get_status),
638 			SPINAND_CONT_READ(gd5fxgm9_set_continuous_read)),
639 };
640 
641 static int gd5fxgm9_spinand_init(struct spinand_device *spinand)
642 {
643 	struct gigadevice_priv *priv;
644 
645 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
646 	if (!priv)
647 		return -ENOMEM;
648 
649 	spinand->priv =  priv;
650 
651 	return 0;
652 }
653 
654 static void gd5fxgm9_spinand_cleanup(struct spinand_device *spinand)
655 {
656 	kfree(spinand->priv);
657 }
658 
659 static const struct spinand_manufacturer_ops gigadevice_spinand_manuf_ops = {
660 	.init = gd5fxgm9_spinand_init,
661 	.cleanup = gd5fxgm9_spinand_cleanup,
662 };
663 
664 const struct spinand_manufacturer gigadevice_spinand_manufacturer = {
665 	.id = SPINAND_MFR_GIGADEVICE,
666 	.name = "GigaDevice",
667 	.chips = gigadevice_spinand_table,
668 	.nchips = ARRAY_SIZE(gigadevice_spinand_table),
669 	.ops = &gigadevice_spinand_manuf_ops,
670 };
671