xref: /rk3399_rockchip-uboot/drivers/mtd/nand/spi/macronix.c (revision 3eff7b81d73608372bc017d1e66e43ae888d8a3b)
180c0c832SBoris Brezillon // SPDX-License-Identifier: GPL-2.0
280c0c832SBoris Brezillon /*
380c0c832SBoris Brezillon  * Copyright (c) 2018 Macronix
480c0c832SBoris Brezillon  *
580c0c832SBoris Brezillon  * Author: Boris Brezillon <boris.brezillon@bootlin.com>
680c0c832SBoris Brezillon  */
780c0c832SBoris Brezillon 
880c0c832SBoris Brezillon #ifndef __UBOOT__
980c0c832SBoris Brezillon #include <linux/device.h>
1080c0c832SBoris Brezillon #include <linux/kernel.h>
1180c0c832SBoris Brezillon #endif
1280c0c832SBoris Brezillon #include <linux/mtd/spinand.h>
1380c0c832SBoris Brezillon 
1480c0c832SBoris Brezillon #define SPINAND_MFR_MACRONIX		0xC2
15767dd6d6SJon Lin #define MACRONIX_ECCSR_MASK		0x0F
1680c0c832SBoris Brezillon 
1780c0c832SBoris Brezillon static SPINAND_OP_VARIANTS(read_cache_variants,
1880c0c832SBoris Brezillon 		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
1980c0c832SBoris Brezillon 		SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
2080c0c832SBoris Brezillon 		SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
2180c0c832SBoris Brezillon 		SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
2280c0c832SBoris Brezillon 
2380c0c832SBoris Brezillon static SPINAND_OP_VARIANTS(write_cache_variants,
2480c0c832SBoris Brezillon 		SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
2580c0c832SBoris Brezillon 		SPINAND_PROG_LOAD(true, 0, NULL, 0));
2680c0c832SBoris Brezillon 
2780c0c832SBoris Brezillon static SPINAND_OP_VARIANTS(update_cache_variants,
2880c0c832SBoris Brezillon 		SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
2980c0c832SBoris Brezillon 		SPINAND_PROG_LOAD(false, 0, NULL, 0));
3080c0c832SBoris Brezillon 
mx35lfxge4ab_ooblayout_ecc(struct mtd_info * mtd,int section,struct mtd_oob_region * region)31ecae5b47SMiquel Raynal static int mx35lfxge4ab_ooblayout_ecc(struct mtd_info *mtd, int section,
3280c0c832SBoris Brezillon 				      struct mtd_oob_region *region)
3380c0c832SBoris Brezillon {
3480c0c832SBoris Brezillon 	return -ERANGE;
3580c0c832SBoris Brezillon }
3680c0c832SBoris Brezillon 
mx35lfxge4ab_ooblayout_free(struct mtd_info * mtd,int section,struct mtd_oob_region * region)37ecae5b47SMiquel Raynal static int mx35lfxge4ab_ooblayout_free(struct mtd_info *mtd, int section,
3880c0c832SBoris Brezillon 				       struct mtd_oob_region *region)
3980c0c832SBoris Brezillon {
4080c0c832SBoris Brezillon 	if (section)
4180c0c832SBoris Brezillon 		return -ERANGE;
4280c0c832SBoris Brezillon 
4380c0c832SBoris Brezillon 	region->offset = 2;
4480c0c832SBoris Brezillon 	region->length = mtd->oobsize - 2;
4580c0c832SBoris Brezillon 
4680c0c832SBoris Brezillon 	return 0;
4780c0c832SBoris Brezillon }
4880c0c832SBoris Brezillon 
49ecae5b47SMiquel Raynal static const struct mtd_ooblayout_ops mx35lfxge4ab_ooblayout = {
50ecae5b47SMiquel Raynal 	.ecc = mx35lfxge4ab_ooblayout_ecc,
51301f8dd1SSimon Glass 	.rfree = mx35lfxge4ab_ooblayout_free,
5280c0c832SBoris Brezillon };
5380c0c832SBoris Brezillon 
mx35lf1ge4ab_get_eccsr(struct spinand_device * spinand,u8 * eccsr)5480c0c832SBoris Brezillon static int mx35lf1ge4ab_get_eccsr(struct spinand_device *spinand, u8 *eccsr)
5580c0c832SBoris Brezillon {
5680c0c832SBoris Brezillon 	struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(0x7c, 1),
5780c0c832SBoris Brezillon 					  SPI_MEM_OP_NO_ADDR,
5880c0c832SBoris Brezillon 					  SPI_MEM_OP_DUMMY(1, 1),
5980c0c832SBoris Brezillon 					  SPI_MEM_OP_DATA_IN(1, eccsr, 1));
6080c0c832SBoris Brezillon 
61767dd6d6SJon Lin 	int ret = spi_mem_exec_op(spinand->slave, &op);
62767dd6d6SJon Lin 	if (ret)
63767dd6d6SJon Lin 		return ret;
64767dd6d6SJon Lin 
65767dd6d6SJon Lin 	*eccsr &= MACRONIX_ECCSR_MASK;
66767dd6d6SJon Lin 	return 0;
6780c0c832SBoris Brezillon }
6880c0c832SBoris Brezillon 
mx35lf1ge4ab_ecc_get_status(struct spinand_device * spinand,u8 status)6980c0c832SBoris Brezillon static int mx35lf1ge4ab_ecc_get_status(struct spinand_device *spinand,
7080c0c832SBoris Brezillon 				       u8 status)
7180c0c832SBoris Brezillon {
7280c0c832SBoris Brezillon 	struct nand_device *nand = spinand_to_nand(spinand);
7380c0c832SBoris Brezillon 	u8 eccsr;
7480c0c832SBoris Brezillon 
7580c0c832SBoris Brezillon 	switch (status & STATUS_ECC_MASK) {
7680c0c832SBoris Brezillon 	case STATUS_ECC_NO_BITFLIPS:
7780c0c832SBoris Brezillon 		return 0;
7880c0c832SBoris Brezillon 
7980c0c832SBoris Brezillon 	case STATUS_ECC_UNCOR_ERROR:
8080c0c832SBoris Brezillon 		return -EBADMSG;
8180c0c832SBoris Brezillon 
8280c0c832SBoris Brezillon 	case STATUS_ECC_HAS_BITFLIPS:
8380c0c832SBoris Brezillon 		/*
8480c0c832SBoris Brezillon 		 * Let's try to retrieve the real maximum number of bitflips
8580c0c832SBoris Brezillon 		 * in order to avoid forcing the wear-leveling layer to move
8680c0c832SBoris Brezillon 		 * data around if it's not necessary.
8780c0c832SBoris Brezillon 		 */
8880c0c832SBoris Brezillon 		if (mx35lf1ge4ab_get_eccsr(spinand, &eccsr))
8980c0c832SBoris Brezillon 			return nand->eccreq.strength;
9080c0c832SBoris Brezillon 
9180c0c832SBoris Brezillon 		if (WARN_ON(eccsr > nand->eccreq.strength || !eccsr))
9280c0c832SBoris Brezillon 			return nand->eccreq.strength;
9380c0c832SBoris Brezillon 
9480c0c832SBoris Brezillon 		return eccsr;
9580c0c832SBoris Brezillon 
9680c0c832SBoris Brezillon 	default:
9780c0c832SBoris Brezillon 		break;
9880c0c832SBoris Brezillon 	}
9980c0c832SBoris Brezillon 
10080c0c832SBoris Brezillon 	return -EINVAL;
10180c0c832SBoris Brezillon }
10280c0c832SBoris Brezillon 
10380c0c832SBoris Brezillon static const struct spinand_info macronix_spinand_table[] = {
10481afcfe1SJon Lin 	SPINAND_INFO("MX35LF1GE4AB",
10581afcfe1SJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x12),
10680c0c832SBoris Brezillon 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
10780c0c832SBoris Brezillon 		     NAND_ECCREQ(4, 512),
10880c0c832SBoris Brezillon 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
10980c0c832SBoris Brezillon 					      &write_cache_variants,
11080c0c832SBoris Brezillon 					      &update_cache_variants),
11180c0c832SBoris Brezillon 		     SPINAND_HAS_QE_BIT,
112ecae5b47SMiquel Raynal 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
11380c0c832SBoris Brezillon 				     mx35lf1ge4ab_ecc_get_status)),
11481afcfe1SJon Lin 	SPINAND_INFO("MX35LF2GE4AB",
11581afcfe1SJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22),
116ecae5b47SMiquel Raynal 		     NAND_MEMORG(1, 2048, 64, 64, 2048, 2, 1, 1),
117ecae5b47SMiquel Raynal 		     NAND_ECCREQ(4, 512),
118ecae5b47SMiquel Raynal 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
119ecae5b47SMiquel Raynal 					      &write_cache_variants,
120ecae5b47SMiquel Raynal 					      &update_cache_variants),
121ecae5b47SMiquel Raynal 		     SPINAND_HAS_QE_BIT,
122ecae5b47SMiquel Raynal 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
12381afcfe1SJon Lin 	SPINAND_INFO("MX35LF2GE4AD",
12481afcfe1SJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x26),
12543108afaSJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1),
126d30345d6SJon Lin 		     NAND_ECCREQ(8, 512),
127d30345d6SJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
128d30345d6SJon Lin 					      &write_cache_variants,
129d30345d6SJon Lin 					      &update_cache_variants),
130d30345d6SJon Lin 		     SPINAND_HAS_QE_BIT,
131d30345d6SJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
132d30345d6SJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
13381afcfe1SJon Lin 	SPINAND_INFO("MX35LF4GE4AD",
13481afcfe1SJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x37),
13543108afaSJon Lin 		     NAND_MEMORG(1, 4096, 128, 64, 2048, 1, 1, 1),
13643108afaSJon Lin 		     NAND_ECCREQ(8, 512),
13743108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
13843108afaSJon Lin 					      &write_cache_variants,
13943108afaSJon Lin 					      &update_cache_variants),
14043108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
14143108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
14243108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
14343108afaSJon Lin 	SPINAND_INFO("MX35LF1G24AD",
14443108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x14),
14543108afaSJon Lin 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
14643108afaSJon Lin 		     NAND_ECCREQ(8, 512),
14743108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
14843108afaSJon Lin 					      &write_cache_variants,
14943108afaSJon Lin 					      &update_cache_variants),
15043108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
15143108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
15243108afaSJon Lin 	SPINAND_INFO("MX35LF2G24AD",
15343108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x24),
15443108afaSJon Lin 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 2, 1, 1),
15543108afaSJon Lin 		     NAND_ECCREQ(8, 512),
15643108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
15743108afaSJon Lin 					      &write_cache_variants,
15843108afaSJon Lin 					      &update_cache_variants),
15943108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
16043108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
16143108afaSJon Lin 	SPINAND_INFO("MX35LF4G24AD",
16243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35),
16343108afaSJon Lin 		     NAND_MEMORG(1, 4096, 256, 64, 2048, 2, 1, 1),
16443108afaSJon Lin 		     NAND_ECCREQ(8, 512),
16543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
16643108afaSJon Lin 					      &write_cache_variants,
16743108afaSJon Lin 					      &update_cache_variants),
16843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
16943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)),
17043108afaSJon Lin 	SPINAND_INFO("MX31LF1GE4BC",
17143108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x1e),
17243108afaSJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
17343108afaSJon Lin 		     NAND_ECCREQ(8, 512),
17443108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
17543108afaSJon Lin 					      &write_cache_variants,
17643108afaSJon Lin 					      &update_cache_variants),
17743108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
17843108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
17943108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
18043108afaSJon Lin 	SPINAND_INFO("MX31UF1GE4BC",
18143108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x9e),
18243108afaSJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
18343108afaSJon Lin 		     NAND_ECCREQ(8, 512),
18443108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
18543108afaSJon Lin 					      &write_cache_variants,
18643108afaSJon Lin 					      &update_cache_variants),
18743108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
18843108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
18943108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
19043108afaSJon Lin 
19143108afaSJon Lin 	SPINAND_INFO("MX35LF2G14AC",
19243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x20),
19343108afaSJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 2048, 2, 1, 1),
19443108afaSJon Lin 		     NAND_ECCREQ(4, 512),
19543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
19643108afaSJon Lin 					      &write_cache_variants,
19743108afaSJon Lin 					      &update_cache_variants),
19843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
19943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
20043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
20143108afaSJon Lin 	SPINAND_INFO("MX35UF4G24AD",
20243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb5),
20343108afaSJon Lin 		     NAND_MEMORG(1, 4096, 256, 64, 2048, 2, 1, 1),
20443108afaSJon Lin 		     NAND_ECCREQ(8, 512),
20543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
20643108afaSJon Lin 					      &write_cache_variants,
20743108afaSJon Lin 					      &update_cache_variants),
20843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
20943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
21043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
21143108afaSJon Lin 	SPINAND_INFO("MX35UF4GE4AD",
21243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb7),
21343108afaSJon Lin 		     NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1),
21443108afaSJon Lin 		     NAND_ECCREQ(8, 512),
21543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
21643108afaSJon Lin 					      &write_cache_variants,
21743108afaSJon Lin 					      &update_cache_variants),
21843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
21943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
22043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
22143108afaSJon Lin 	SPINAND_INFO("MX35UF2G14AC",
22243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa0),
22343108afaSJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 2048, 2, 1, 1),
22443108afaSJon Lin 		     NAND_ECCREQ(4, 512),
22543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
22643108afaSJon Lin 					      &write_cache_variants,
22743108afaSJon Lin 					      &update_cache_variants),
22843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
22943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
23043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
23143108afaSJon Lin 	SPINAND_INFO("MX35UF2G24AD",
23243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa4),
23343108afaSJon Lin 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 2, 1, 1),
23443108afaSJon Lin 		     NAND_ECCREQ(8, 512),
23543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
23643108afaSJon Lin 					      &write_cache_variants,
23743108afaSJon Lin 					      &update_cache_variants),
23843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
23943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
24043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
24143108afaSJon Lin 	SPINAND_INFO("MX35UF2GE4AD",
24243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa6),
24343108afaSJon Lin 		     NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1),
24443108afaSJon Lin 		     NAND_ECCREQ(8, 512),
24543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
24643108afaSJon Lin 					      &write_cache_variants,
24743108afaSJon Lin 					      &update_cache_variants),
24843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
24943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
25043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
25143108afaSJon Lin 	SPINAND_INFO("MX35UF2GE4AC",
25243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa2),
25343108afaSJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1),
25443108afaSJon Lin 		     NAND_ECCREQ(4, 512),
25543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
25643108afaSJon Lin 					      &write_cache_variants,
25743108afaSJon Lin 					      &update_cache_variants),
25843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
25943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
26043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
26143108afaSJon Lin 	SPINAND_INFO("MX35UF1G14AC",
26243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x90),
26343108afaSJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
26443108afaSJon Lin 		     NAND_ECCREQ(4, 512),
26543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
26643108afaSJon Lin 					      &write_cache_variants,
26743108afaSJon Lin 					      &update_cache_variants),
26843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
26943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
27043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
27143108afaSJon Lin 	SPINAND_INFO("MX35UF1G24AD",
27243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x94),
27343108afaSJon Lin 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
27443108afaSJon Lin 		     NAND_ECCREQ(8, 512),
27543108afaSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
27643108afaSJon Lin 					      &write_cache_variants,
27743108afaSJon Lin 					      &update_cache_variants),
27843108afaSJon Lin 		     SPINAND_HAS_QE_BIT,
27943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
28043108afaSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
28143108afaSJon Lin 	SPINAND_INFO("MX35UF1GE4AD",
28243108afaSJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x96),
28343108afaSJon Lin 		     NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
284247c5a81SJon Lin 		     NAND_ECCREQ(8, 512),
285247c5a81SJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
286247c5a81SJon Lin 					      &write_cache_variants,
287247c5a81SJon Lin 					      &update_cache_variants),
288247c5a81SJon Lin 		     SPINAND_HAS_QE_BIT,
289247c5a81SJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
290247c5a81SJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
29181afcfe1SJon Lin 	SPINAND_INFO("MX35UF1GE4AC",
29281afcfe1SJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92),
29355efc32aSJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
29455efc32aSJon Lin 		     NAND_ECCREQ(4, 512),
29555efc32aSJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
29655efc32aSJon Lin 					      &write_cache_variants,
29755efc32aSJon Lin 					      &update_cache_variants),
29855efc32aSJon Lin 		     SPINAND_HAS_QE_BIT,
29943108afaSJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
30055efc32aSJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
30152931183SJon Lin 	SPINAND_INFO("MX35UF1GE4AD",
30252931183SJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x96),
30352931183SJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1),
30452931183SJon Lin 		     NAND_ECCREQ(8, 512),
30552931183SJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
30652931183SJon Lin 					      &write_cache_variants,
30752931183SJon Lin 					      &update_cache_variants),
30852931183SJon Lin 		     SPINAND_HAS_QE_BIT,
30952931183SJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
31052931183SJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
31152931183SJon Lin 	SPINAND_INFO("MX35UF2GE4AD",
31252931183SJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA6),
31352931183SJon Lin 		     NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1),
31452931183SJon Lin 		     NAND_ECCREQ(8, 512),
31552931183SJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
31652931183SJon Lin 					      &write_cache_variants,
31752931183SJon Lin 					      &update_cache_variants),
31852931183SJon Lin 		     SPINAND_HAS_QE_BIT,
31952931183SJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
32052931183SJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
321*3eff7b81SJon Lin 	SPINAND_INFO("MX35UF4GE4AD",
322*3eff7b81SJon Lin 		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xB7),
323*3eff7b81SJon Lin 		     NAND_MEMORG(1, 4096, 128, 64, 2048, 1, 1, 1),
324*3eff7b81SJon Lin 		     NAND_ECCREQ(8, 512),
325*3eff7b81SJon Lin 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
326*3eff7b81SJon Lin 					      &write_cache_variants,
327*3eff7b81SJon Lin 					      &update_cache_variants),
328*3eff7b81SJon Lin 		     SPINAND_HAS_QE_BIT,
329*3eff7b81SJon Lin 		     SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout,
330*3eff7b81SJon Lin 				     mx35lf1ge4ab_ecc_get_status)),
33180c0c832SBoris Brezillon };
33280c0c832SBoris Brezillon 
33380c0c832SBoris Brezillon static const struct spinand_manufacturer_ops macronix_spinand_manuf_ops = {
33480c0c832SBoris Brezillon };
33580c0c832SBoris Brezillon 
33680c0c832SBoris Brezillon const struct spinand_manufacturer macronix_spinand_manufacturer = {
33780c0c832SBoris Brezillon 	.id = SPINAND_MFR_MACRONIX,
33880c0c832SBoris Brezillon 	.name = "Macronix",
33981afcfe1SJon Lin 	.chips = macronix_spinand_table,
34081afcfe1SJon Lin 	.nchips = ARRAY_SIZE(macronix_spinand_table),
34180c0c832SBoris Brezillon 	.ops = &macronix_spinand_manuf_ops,
34280c0c832SBoris Brezillon };
343