1fc656fc3SJon Lin // SPDX-License-Identifier: GPL-2.0 2fc656fc3SJon Lin /* 3fc656fc3SJon Lin * Copyright (c) 2020 Rockchip Electronics Co., Ltd 4fc656fc3SJon Lin * 5fc656fc3SJon Lin * Authors: 6fc656fc3SJon Lin * Dingqiang Lin <jon.lin@rock-chips.com> 7fc656fc3SJon Lin */ 8fc656fc3SJon Lin 9fc656fc3SJon Lin #ifndef __UBOOT__ 10fc656fc3SJon Lin #include <linux/device.h> 11fc656fc3SJon Lin #include <linux/kernel.h> 12fc656fc3SJon Lin #endif 13fc656fc3SJon Lin #include <linux/mtd/spinand.h> 14fc656fc3SJon Lin 15fc656fc3SJon Lin #define SPINAND_MFR_XTX 0x0B 16fc656fc3SJon Lin 17fc656fc3SJon Lin static SPINAND_OP_VARIANTS(read_cache_variants, 18fc656fc3SJon Lin SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), 19fc656fc3SJon Lin SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), 20fc656fc3SJon Lin SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), 21fc656fc3SJon Lin SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); 22fc656fc3SJon Lin 23fc656fc3SJon Lin static SPINAND_OP_VARIANTS(write_cache_variants, 24fc656fc3SJon Lin SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), 25fc656fc3SJon Lin SPINAND_PROG_LOAD(true, 0, NULL, 0)); 26fc656fc3SJon Lin 27fc656fc3SJon Lin static SPINAND_OP_VARIANTS(update_cache_variants, 28fc656fc3SJon Lin SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), 29fc656fc3SJon Lin SPINAND_PROG_LOAD(false, 0, NULL, 0)); 30fc656fc3SJon Lin 31fc656fc3SJon Lin static int xt26g0xa_ooblayout_ecc(struct mtd_info *mtd, int section, 32fc656fc3SJon Lin struct mtd_oob_region *region) 33fc656fc3SJon Lin { 34fc656fc3SJon Lin if (section) 35fc656fc3SJon Lin return -ERANGE; 36fc656fc3SJon Lin 37fc656fc3SJon Lin region->offset = 48; 38fc656fc3SJon Lin region->length = 16; 39fc656fc3SJon Lin 40fc656fc3SJon Lin return 0; 41fc656fc3SJon Lin } 42fc656fc3SJon Lin 43fc656fc3SJon Lin static int xt26g0xa_ooblayout_free(struct mtd_info *mtd, int section, 44fc656fc3SJon Lin struct mtd_oob_region *region) 45fc656fc3SJon Lin { 46fc656fc3SJon Lin if (section) 47fc656fc3SJon Lin return -ERANGE; 48fc656fc3SJon Lin 49fc656fc3SJon Lin region->offset = 2; 50fc656fc3SJon Lin region->length = mtd->oobsize - 18; 51fc656fc3SJon Lin 52fc656fc3SJon Lin return 0; 53fc656fc3SJon Lin } 54fc656fc3SJon Lin 55fc656fc3SJon Lin static const struct mtd_ooblayout_ops xt26g0xa_ooblayout = { 56fc656fc3SJon Lin .ecc = xt26g0xa_ooblayout_ecc, 57fc656fc3SJon Lin .rfree = xt26g0xa_ooblayout_free, 58fc656fc3SJon Lin }; 59fc656fc3SJon Lin 60fc656fc3SJon Lin static int xt26g01b_ooblayout_ecc(struct mtd_info *mtd, int section, 61fc656fc3SJon Lin struct mtd_oob_region *region) 62fc656fc3SJon Lin { 63fc656fc3SJon Lin return -ERANGE; 64fc656fc3SJon Lin } 65fc656fc3SJon Lin 66fc656fc3SJon Lin static int xt26g01b_ooblayout_free(struct mtd_info *mtd, int section, 67fc656fc3SJon Lin struct mtd_oob_region *region) 68fc656fc3SJon Lin { 69fc656fc3SJon Lin if (section) 70fc656fc3SJon Lin return -ERANGE; 71fc656fc3SJon Lin 72fc656fc3SJon Lin region->offset = 2; 73fc656fc3SJon Lin region->length = mtd->oobsize - 2; 74fc656fc3SJon Lin 75fc656fc3SJon Lin return 0; 76fc656fc3SJon Lin } 77fc656fc3SJon Lin 78fc656fc3SJon Lin static const struct mtd_ooblayout_ops xt26g01b_ooblayout = { 79fc656fc3SJon Lin .ecc = xt26g01b_ooblayout_ecc, 80fc656fc3SJon Lin .rfree = xt26g01b_ooblayout_free, 81fc656fc3SJon Lin }; 82fc656fc3SJon Lin 83fc656fc3SJon Lin static int xt26g02b_ooblayout_ecc(struct mtd_info *mtd, int section, 84fc656fc3SJon Lin struct mtd_oob_region *region) 85fc656fc3SJon Lin { 86fc656fc3SJon Lin if (section > 3) 87fc656fc3SJon Lin return -ERANGE; 88fc656fc3SJon Lin 89fc656fc3SJon Lin region->offset = (16 * section) + 8; 90fc656fc3SJon Lin region->length = 8; 91fc656fc3SJon Lin 92fc656fc3SJon Lin return 0; 93fc656fc3SJon Lin } 94fc656fc3SJon Lin 95fc656fc3SJon Lin static int xt26g02b_ooblayout_free(struct mtd_info *mtd, int section, 96fc656fc3SJon Lin struct mtd_oob_region *region) 97fc656fc3SJon Lin { 98fc656fc3SJon Lin if (section > 3) 99fc656fc3SJon Lin return -ERANGE; 100fc656fc3SJon Lin 101fc656fc3SJon Lin region->offset = (16 * section) + 2; 102fc656fc3SJon Lin region->length = 6; 103fc656fc3SJon Lin 104fc656fc3SJon Lin return 0; 105fc656fc3SJon Lin } 106fc656fc3SJon Lin 107fc656fc3SJon Lin static const struct mtd_ooblayout_ops xt26g02b_ooblayout = { 108fc656fc3SJon Lin .ecc = xt26g02b_ooblayout_ecc, 109fc656fc3SJon Lin .rfree = xt26g02b_ooblayout_free, 110fc656fc3SJon Lin }; 111fc656fc3SJon Lin 112c925bb36SJon Lin static int xt26g01c_ooblayout_ecc(struct mtd_info *mtd, int section, 113c925bb36SJon Lin struct mtd_oob_region *region) 114c925bb36SJon Lin { 115c925bb36SJon Lin if (section) 116c925bb36SJon Lin return -ERANGE; 117c925bb36SJon Lin 118c925bb36SJon Lin region->offset = mtd->oobsize / 2; 119c925bb36SJon Lin region->length = mtd->oobsize / 2; 120c925bb36SJon Lin 121c925bb36SJon Lin return 0; 122c925bb36SJon Lin } 123c925bb36SJon Lin 124c925bb36SJon Lin static int xt26g01c_ooblayout_free(struct mtd_info *mtd, int section, 125c925bb36SJon Lin struct mtd_oob_region *region) 126c925bb36SJon Lin { 127c925bb36SJon Lin if (section) 128c925bb36SJon Lin return -ERANGE; 129c925bb36SJon Lin 130c925bb36SJon Lin region->offset = 2; 131c925bb36SJon Lin region->length = mtd->oobsize / 2 - 2; 132c925bb36SJon Lin 133c925bb36SJon Lin return 0; 134c925bb36SJon Lin } 135c925bb36SJon Lin 136c925bb36SJon Lin static const struct mtd_ooblayout_ops xt26g01c_ooblayout = { 137c925bb36SJon Lin .ecc = xt26g01c_ooblayout_ecc, 138c925bb36SJon Lin .rfree = xt26g01c_ooblayout_free, 139c925bb36SJon Lin }; 140c925bb36SJon Lin 141fc656fc3SJon Lin /* 142fc656fc3SJon Lin * ecc bits: 0xC0[2,5] 143fc656fc3SJon Lin * [0x0000], No bit errors were detected; 144fc656fc3SJon Lin * [0x0001, 0x0111], Bit errors were detected and corrected. Not 145fc656fc3SJon Lin * reach Flipping Bits; 146fc656fc3SJon Lin * [0x1000], Multiple bit errors were detected and 147fc656fc3SJon Lin * not corrected. 148fc656fc3SJon Lin * [0x1100], Bit error count equals the bit flip 149fc656fc3SJon Lin * detectionthreshold 150fc656fc3SJon Lin * else, reserved 151fc656fc3SJon Lin */ 152fc656fc3SJon Lin static int xt26g0xa_ecc_get_status(struct spinand_device *spinand, 153fc656fc3SJon Lin u8 status) 154fc656fc3SJon Lin { 155fc656fc3SJon Lin u8 eccsr = (status & GENMASK(5, 2)) >> 2; 156fc656fc3SJon Lin 157fc656fc3SJon Lin if (eccsr <= 7) 158fc656fc3SJon Lin return eccsr; 159fc656fc3SJon Lin else if (eccsr == 12) 160fc656fc3SJon Lin return 8; 161fc656fc3SJon Lin else 162fc656fc3SJon Lin return -EBADMSG; 163fc656fc3SJon Lin } 164fc656fc3SJon Lin 165fc656fc3SJon Lin /* 166fc656fc3SJon Lin * ecc bits: 0xC0[4,6] 167fc656fc3SJon Lin * [0x0], No bit errors were detected; 168fc656fc3SJon Lin * [0x001, 0x011], Bit errors were detected and corrected. Not 169fc656fc3SJon Lin * reach Flipping Bits; 170fc656fc3SJon Lin * [0x100], Bit error count equals the bit flip 171fc656fc3SJon Lin * detectionthreshold 172fc656fc3SJon Lin * [0x101, 0x110], Reserved; 173fc656fc3SJon Lin * [0x111], Multiple bit errors were detected and 174fc656fc3SJon Lin * not corrected. 175fc656fc3SJon Lin */ 176fc656fc3SJon Lin static int xt26g02b_ecc_get_status(struct spinand_device *spinand, 177fc656fc3SJon Lin u8 status) 178fc656fc3SJon Lin { 179fc656fc3SJon Lin u8 eccsr = (status & GENMASK(6, 4)) >> 4; 180fc656fc3SJon Lin 181fc656fc3SJon Lin if (eccsr <= 4) 182fc656fc3SJon Lin return eccsr; 183fc656fc3SJon Lin else 184fc656fc3SJon Lin return -EBADMSG; 185fc656fc3SJon Lin } 186fc656fc3SJon Lin 187ad6355f7SJon Lin /* 188ad6355f7SJon Lin * ecc bits: 0xC0[4,7] 189ad6355f7SJon Lin * [0b0000], No bit errors were detected; 190ad6355f7SJon Lin * [0b0001, 0b0111], 1-7 Bit errors were detected and corrected. Not 191ad6355f7SJon Lin * reach Flipping Bits; 192ad6355f7SJon Lin * [0b1000], 8 Bit errors were detected and corrected. Bit error count 193ad6355f7SJon Lin * equals the bit flip detectionthreshold; 194ad6355f7SJon Lin * [0b1111], Bit errors greater than ECC capability(8 bits) and not corrected; 195ad6355f7SJon Lin * others, Reserved. 196ad6355f7SJon Lin */ 197ad6355f7SJon Lin static int xt26g01c_ecc_get_status(struct spinand_device *spinand, 198ad6355f7SJon Lin u8 status) 199ad6355f7SJon Lin { 200ad6355f7SJon Lin u8 eccsr = (status & GENMASK(7, 4)) >> 4; 201ad6355f7SJon Lin 202ad6355f7SJon Lin if (eccsr <= 8) 203ad6355f7SJon Lin return eccsr; 204ad6355f7SJon Lin else 205ad6355f7SJon Lin return -EBADMSG; 206ad6355f7SJon Lin } 207ad6355f7SJon Lin 208a4f910faSJon Lin static int xt26g11c_ecc_get_status(struct spinand_device *spinand, 209a4f910faSJon Lin u8 status) 210a4f910faSJon Lin { 211a4f910faSJon Lin struct nand_device *nand = spinand_to_nand(spinand); 212a4f910faSJon Lin 213a4f910faSJon Lin switch (status & STATUS_ECC_MASK) { 214a4f910faSJon Lin case STATUS_ECC_NO_BITFLIPS: 215a4f910faSJon Lin return 0; 216a4f910faSJon Lin 217a4f910faSJon Lin case STATUS_ECC_UNCOR_ERROR: 218a4f910faSJon Lin return -EBADMSG; 219a4f910faSJon Lin 220a4f910faSJon Lin case STATUS_ECC_HAS_BITFLIPS: 221a4f910faSJon Lin return 1; 222a4f910faSJon Lin 223a4f910faSJon Lin default: 224a4f910faSJon Lin return nand->eccreq.strength; 225a4f910faSJon Lin } 226a4f910faSJon Lin 227a4f910faSJon Lin return -EINVAL; 228a4f910faSJon Lin } 229a4f910faSJon Lin 230fc656fc3SJon Lin static const struct spinand_info xtx_spinand_table[] = { 23181afcfe1SJon Lin SPINAND_INFO("XT26G01A", 232820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE1), 233fc656fc3SJon Lin NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), 234fc656fc3SJon Lin NAND_ECCREQ(8, 512), 235fc656fc3SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 236fc656fc3SJon Lin &write_cache_variants, 237fc656fc3SJon Lin &update_cache_variants), 238fc656fc3SJon Lin SPINAND_HAS_QE_BIT, 239fc656fc3SJon Lin SPINAND_ECCINFO(&xt26g0xa_ooblayout, 240fc656fc3SJon Lin xt26g0xa_ecc_get_status)), 24181afcfe1SJon Lin SPINAND_INFO("XT26G02A", 242820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE2), 243fc656fc3SJon Lin NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1), 244fc656fc3SJon Lin NAND_ECCREQ(8, 512), 245fc656fc3SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 246fc656fc3SJon Lin &write_cache_variants, 247fc656fc3SJon Lin &update_cache_variants), 248fc656fc3SJon Lin SPINAND_HAS_QE_BIT, 249fc656fc3SJon Lin SPINAND_ECCINFO(&xt26g0xa_ooblayout, 250fc656fc3SJon Lin xt26g0xa_ecc_get_status)), 25181afcfe1SJon Lin SPINAND_INFO("XT26G04A", 252820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xE3), 253fc656fc3SJon Lin NAND_MEMORG(1, 2048, 64, 128, 2048, 1, 1, 1), 254fc656fc3SJon Lin NAND_ECCREQ(8, 512), 255fc656fc3SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 256fc656fc3SJon Lin &write_cache_variants, 257fc656fc3SJon Lin &update_cache_variants), 258fc656fc3SJon Lin SPINAND_HAS_QE_BIT, 259fc656fc3SJon Lin SPINAND_ECCINFO(&xt26g0xa_ooblayout, 260fc656fc3SJon Lin xt26g0xa_ecc_get_status)), 26181afcfe1SJon Lin SPINAND_INFO("XT26G01B", 262820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xF1), 263fc656fc3SJon Lin NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), 264fc656fc3SJon Lin NAND_ECCREQ(8, 512), 265fc656fc3SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 266fc656fc3SJon Lin &write_cache_variants, 267fc656fc3SJon Lin &update_cache_variants), 268fc656fc3SJon Lin SPINAND_HAS_QE_BIT, 269fc656fc3SJon Lin SPINAND_ECCINFO(&xt26g01b_ooblayout, 270fc656fc3SJon Lin xt26g0xa_ecc_get_status)), 27181afcfe1SJon Lin SPINAND_INFO("XT26G02B", 272820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xF2), 273fc656fc3SJon Lin NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1), 274fc656fc3SJon Lin NAND_ECCREQ(4, 512), 275fc656fc3SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 276fc656fc3SJon Lin &write_cache_variants, 277fc656fc3SJon Lin &update_cache_variants), 278fc656fc3SJon Lin SPINAND_HAS_QE_BIT, 279fc656fc3SJon Lin SPINAND_ECCINFO(&xt26g02b_ooblayout, 280fc656fc3SJon Lin xt26g02b_ecc_get_status)), 28181afcfe1SJon Lin SPINAND_INFO("XT26G01C", 282820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x11), 283c925bb36SJon Lin NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), 284ad6355f7SJon Lin NAND_ECCREQ(8, 512), 285ad6355f7SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 286ad6355f7SJon Lin &write_cache_variants, 287ad6355f7SJon Lin &update_cache_variants), 288ad6355f7SJon Lin SPINAND_HAS_QE_BIT, 289c925bb36SJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, 290ad6355f7SJon Lin xt26g01c_ecc_get_status)), 29181afcfe1SJon Lin SPINAND_INFO("XT26G02C", 292820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x12), 293d46ff1abSJon Lin NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1), 294d46ff1abSJon Lin NAND_ECCREQ(8, 512), 295d46ff1abSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 296d46ff1abSJon Lin &write_cache_variants, 297d46ff1abSJon Lin &update_cache_variants), 298d46ff1abSJon Lin SPINAND_HAS_QE_BIT, 299c925bb36SJon Lin SPINAND_ECCINFO(&xt26g0xa_ooblayout, 300d46ff1abSJon Lin xt26g01c_ecc_get_status)), 30181afcfe1SJon Lin SPINAND_INFO("XT26G04C", 302820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x13), 303c925bb36SJon Lin NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1), 3048d4402d3SJon Lin NAND_ECCREQ(8, 512), 3058d4402d3SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 3068d4402d3SJon Lin &write_cache_variants, 3078d4402d3SJon Lin &update_cache_variants), 3088d4402d3SJon Lin SPINAND_HAS_QE_BIT, 309c925bb36SJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, 310c925bb36SJon Lin xt26g01c_ecc_get_status)), 31181afcfe1SJon Lin SPINAND_INFO("XT26G11C", 312820217bdSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x15), 313c925bb36SJon Lin NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), 314c925bb36SJon Lin NAND_ECCREQ(8, 512), 315c925bb36SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 316c925bb36SJon Lin &write_cache_variants, 317c925bb36SJon Lin &update_cache_variants), 318c925bb36SJon Lin SPINAND_HAS_QE_BIT, 319c925bb36SJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, 320a4f910faSJon Lin xt26g11c_ecc_get_status)), 321380548cbSJon Lin SPINAND_INFO("XT26Q02DWSIGA", 322380548cbSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x52), 323380548cbSJon Lin NAND_MEMORG(1, 2048, 128, 64, 2048, 1, 1, 1), 324380548cbSJon Lin NAND_ECCREQ(8, 512), 325380548cbSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 326380548cbSJon Lin &write_cache_variants, 327380548cbSJon Lin &update_cache_variants), 328380548cbSJon Lin SPINAND_HAS_QE_BIT, 329380548cbSJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, xt26g11c_ecc_get_status)), 330380548cbSJon Lin SPINAND_INFO("XT26Q01DWSIGA", 331380548cbSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x51), 332380548cbSJon Lin NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), 333380548cbSJon Lin NAND_ECCREQ(8, 512), 334380548cbSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 335380548cbSJon Lin &write_cache_variants, 336380548cbSJon Lin &update_cache_variants), 337380548cbSJon Lin SPINAND_HAS_QE_BIT, 338380548cbSJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, xt26g11c_ecc_get_status)), 339380548cbSJon Lin SPINAND_INFO("XT26Q04DWSIGA", 340380548cbSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x53), 341380548cbSJon Lin NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1), 342380548cbSJon Lin NAND_ECCREQ(8, 512), 343380548cbSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 344380548cbSJon Lin &write_cache_variants, 345380548cbSJon Lin &update_cache_variants), 346380548cbSJon Lin SPINAND_HAS_QE_BIT, 347380548cbSJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, xt26g11c_ecc_get_status)), 348d850640dSJon Lin SPINAND_INFO("XT26G01DWSIGA", 349d850640dSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x31), 350d850640dSJon Lin NAND_MEMORG(1, 2048, 64, 64, 1024, 1, 1, 1), 351d850640dSJon Lin NAND_ECCREQ(8, 512), 352d850640dSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 353d850640dSJon Lin &write_cache_variants, 354d850640dSJon Lin &update_cache_variants), 355d850640dSJon Lin SPINAND_HAS_QE_BIT, 356d850640dSJon Lin SPINAND_ECCINFO(&xt26g01b_ooblayout, xt26g11c_ecc_get_status)), 357d850640dSJon Lin SPINAND_INFO("XT26G02DWSIGA", 358d850640dSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x32), 359d850640dSJon Lin NAND_MEMORG(1, 2048, 64, 64, 2048, 1, 1, 1), 360d850640dSJon Lin NAND_ECCREQ(8, 512), 361d850640dSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 362d850640dSJon Lin &write_cache_variants, 363d850640dSJon Lin &update_cache_variants), 364d850640dSJon Lin SPINAND_HAS_QE_BIT, 365d850640dSJon Lin SPINAND_ECCINFO(&xt26g01b_ooblayout, xt26g11c_ecc_get_status)), 366d850640dSJon Lin SPINAND_INFO("XT26G04DWSIGA", 367d850640dSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x33), 368d850640dSJon Lin NAND_MEMORG(1, 4096, 256, 64, 2048, 1, 1, 1), 369d850640dSJon Lin NAND_ECCREQ(8, 512), 370d850640dSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 371d850640dSJon Lin &write_cache_variants, 372d850640dSJon Lin &update_cache_variants), 373d850640dSJon Lin SPINAND_HAS_QE_BIT, 374d850640dSJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, xt26g11c_ecc_get_status)), 375632d1a6fSJon Lin SPINAND_INFO("XT26Q04DWSIGT-B", 376632d1a6fSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x53), 377632d1a6fSJon Lin NAND_MEMORG(1, 4096, 128, 64, 2048, 1, 1, 1), 378632d1a6fSJon Lin NAND_ECCREQ(14, 512), 379632d1a6fSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 380632d1a6fSJon Lin &write_cache_variants, 381632d1a6fSJon Lin &update_cache_variants), 382632d1a6fSJon Lin SPINAND_HAS_QE_BIT, 383632d1a6fSJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, xt26g11c_ecc_get_status)), 384*1695171cSJon Lin SPINAND_INFO("XT26Q01DWSIGA", 385*1695171cSJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x51), 386*1695171cSJon Lin NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1), 387*1695171cSJon Lin NAND_ECCREQ(8, 512), 388*1695171cSJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 389*1695171cSJon Lin &write_cache_variants, 390*1695171cSJon Lin &update_cache_variants), 391*1695171cSJon Lin SPINAND_HAS_QE_BIT, 392*1695171cSJon Lin SPINAND_ECCINFO(&xt26g01c_ooblayout, xt26g11c_ecc_get_status)), 393fc656fc3SJon Lin }; 394fc656fc3SJon Lin 395fc656fc3SJon Lin static const struct spinand_manufacturer_ops xtx_spinand_manuf_ops = { 396fc656fc3SJon Lin }; 397fc656fc3SJon Lin 398fc656fc3SJon Lin const struct spinand_manufacturer xtx_spinand_manufacturer = { 399fc656fc3SJon Lin .id = SPINAND_MFR_XTX, 400fc656fc3SJon Lin .name = "xtx", 40181afcfe1SJon Lin .chips = xtx_spinand_table, 40281afcfe1SJon Lin .nchips = ARRAY_SIZE(xtx_spinand_table), 403fc656fc3SJon Lin .ops = &xtx_spinand_manuf_ops, 404fc656fc3SJon Lin }; 405