1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2018 Macronix 4 * 5 * Author: Boris Brezillon <boris.brezillon@bootlin.com> 6 */ 7 8 #include <linux/bitfield.h> 9 #include <linux/device.h> 10 #include <linux/kernel.h> 11 #include <linux/mtd/spinand.h> 12 13 #define SPINAND_MFR_MACRONIX 0xC2 14 #define MACRONIX_ECCSR_BF_LAST_PAGE(eccsr) FIELD_GET(GENMASK(3, 0), eccsr) 15 #define MACRONIX_ECCSR_BF_ACCUMULATED_PAGES(eccsr) FIELD_GET(GENMASK(7, 4), eccsr) 16 #define MACRONIX_CFG_CONT_READ BIT(2) 17 #define MACRONIX_FEATURE_ADDR_READ_RETRY 0x70 18 #define MACRONIX_NUM_READ_RETRY_MODES 5 19 20 #define STATUS_ECC_HAS_BITFLIPS_THRESHOLD (3 << 4) 21 22 /* Bitflip theshold configuration register */ 23 #define REG_CFG_BFT 0x10 24 #define CFG_BFT(x) FIELD_PREP(GENMASK(7, 4), (x)) 25 26 struct macronix_priv { 27 bool cont_read; 28 }; 29 30 static SPINAND_OP_VARIANTS(read_cache_variants, 31 SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), 32 SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), 33 SPINAND_PAGE_READ_FROM_CACHE_FAST_OP(0, 1, NULL, 0), 34 SPINAND_PAGE_READ_FROM_CACHE_OP(0, 1, NULL, 0)); 35 36 static SPINAND_OP_VARIANTS(write_cache_variants, 37 SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), 38 SPINAND_PROG_LOAD(false, 0, NULL, 0)); 39 40 static SPINAND_OP_VARIANTS(update_cache_variants, 41 SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), 42 SPINAND_PROG_LOAD(false, 0, NULL, 0)); 43 44 static int mx35lfxge4ab_ooblayout_ecc(struct mtd_info *mtd, int section, 45 struct mtd_oob_region *region) 46 { 47 return -ERANGE; 48 } 49 50 static int mx35lfxge4ab_ooblayout_free(struct mtd_info *mtd, int section, 51 struct mtd_oob_region *region) 52 { 53 if (section) 54 return -ERANGE; 55 56 region->offset = 2; 57 region->length = mtd->oobsize - 2; 58 59 return 0; 60 } 61 62 static const struct mtd_ooblayout_ops mx35lfxge4ab_ooblayout = { 63 .ecc = mx35lfxge4ab_ooblayout_ecc, 64 .free = mx35lfxge4ab_ooblayout_free, 65 }; 66 67 static int macronix_get_eccsr(struct spinand_device *spinand, u8 *eccsr) 68 { 69 struct macronix_priv *priv = spinand->priv; 70 struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(0x7c, 1), 71 SPI_MEM_OP_NO_ADDR, 72 SPI_MEM_OP_DUMMY(1, 1), 73 SPI_MEM_OP_DATA_IN(1, eccsr, 1)); 74 75 int ret = spi_mem_exec_op(spinand->spimem, &op); 76 if (ret) 77 return ret; 78 79 /* 80 * ECCSR exposes the number of bitflips for the last read page in bits [3:0]. 81 * Continuous read compatible chips also expose the maximum number of 82 * bitflips for the whole (continuous) read operation in bits [7:4]. 83 */ 84 if (!priv->cont_read) 85 *eccsr = MACRONIX_ECCSR_BF_LAST_PAGE(*eccsr); 86 else 87 *eccsr = MACRONIX_ECCSR_BF_ACCUMULATED_PAGES(*eccsr); 88 89 return 0; 90 } 91 92 static int macronix_ecc_get_status(struct spinand_device *spinand, 93 u8 status) 94 { 95 struct nand_device *nand = spinand_to_nand(spinand); 96 u8 eccsr; 97 98 switch (status & STATUS_ECC_MASK) { 99 case STATUS_ECC_NO_BITFLIPS: 100 return 0; 101 102 case STATUS_ECC_UNCOR_ERROR: 103 return -EBADMSG; 104 105 case STATUS_ECC_HAS_BITFLIPS: 106 /* 107 * Let's try to retrieve the real maximum number of bitflips 108 * in order to avoid forcing the wear-leveling layer to move 109 * data around if it's not necessary. 110 */ 111 if (macronix_get_eccsr(spinand, spinand->scratchbuf)) 112 return nanddev_get_ecc_conf(nand)->strength; 113 114 eccsr = *spinand->scratchbuf; 115 if (WARN_ON(eccsr > nanddev_get_ecc_conf(nand)->strength || !eccsr)) 116 return nanddev_get_ecc_conf(nand)->strength; 117 118 return eccsr; 119 default: 120 break; 121 } 122 123 return -EINVAL; 124 } 125 126 static int macronix_set_cont_read(struct spinand_device *spinand, bool enable) 127 { 128 struct macronix_priv *priv = spinand->priv; 129 int ret; 130 131 ret = spinand_upd_cfg(spinand, MACRONIX_CFG_CONT_READ, 132 enable ? MACRONIX_CFG_CONT_READ : 0); 133 if (ret) 134 return ret; 135 136 priv->cont_read = enable; 137 138 return 0; 139 } 140 141 /** 142 * macronix_set_read_retry - Set the retry mode 143 * @spinand: SPI NAND device 144 * @retry_mode: Specify which retry mode to set 145 * 146 * Return: 0 on success, a negative error code otherwise. 147 */ 148 static int macronix_set_read_retry(struct spinand_device *spinand, 149 unsigned int retry_mode) 150 { 151 struct spi_mem_op op = SPINAND_SET_FEATURE_OP(MACRONIX_FEATURE_ADDR_READ_RETRY, 152 spinand->scratchbuf); 153 154 *spinand->scratchbuf = retry_mode; 155 return spi_mem_exec_op(spinand->spimem, &op); 156 } 157 158 static const struct spinand_info macronix_spinand_table[] = { 159 SPINAND_INFO("MX35LF1GE4AB", 160 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x12), 161 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), 162 NAND_ECCREQ(4, 512), 163 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 164 &write_cache_variants, 165 &update_cache_variants), 166 SPINAND_HAS_QE_BIT, 167 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 168 macronix_ecc_get_status)), 169 SPINAND_INFO("MX35LF2GE4AB", 170 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22), 171 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1), 172 NAND_ECCREQ(4, 512), 173 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 174 &write_cache_variants, 175 &update_cache_variants), 176 SPINAND_HAS_QE_BIT | 177 SPINAND_HAS_PROG_PLANE_SELECT_BIT | 178 SPINAND_HAS_READ_PLANE_SELECT_BIT, 179 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL)), 180 SPINAND_INFO("MX35LF2GE4AD", 181 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x26, 0x03), 182 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), 183 NAND_ECCREQ(8, 512), 184 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 185 &write_cache_variants, 186 &update_cache_variants), 187 SPINAND_HAS_QE_BIT, 188 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 189 macronix_ecc_get_status), 190 SPINAND_CONT_READ(macronix_set_cont_read), 191 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 192 macronix_set_read_retry)), 193 SPINAND_INFO("MX35LF4GE4AD", 194 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x37, 0x03), 195 NAND_MEMORG(1, 4096, 128, 64, 2048, 40, 1, 1, 1), 196 NAND_ECCREQ(8, 512), 197 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 198 &write_cache_variants, 199 &update_cache_variants), 200 SPINAND_HAS_QE_BIT, 201 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 202 macronix_ecc_get_status), 203 SPINAND_CONT_READ(macronix_set_cont_read), 204 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 205 macronix_set_read_retry)), 206 SPINAND_INFO("MX35LF1G24AD", 207 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x14, 0x03), 208 NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), 209 NAND_ECCREQ(8, 512), 210 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 211 &write_cache_variants, 212 &update_cache_variants), 213 SPINAND_HAS_QE_BIT, 214 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), 215 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 216 macronix_set_read_retry)), 217 SPINAND_INFO("MX35LF2G24AD", 218 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x24, 0x03), 219 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1), 220 NAND_ECCREQ(8, 512), 221 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 222 &write_cache_variants, 223 &update_cache_variants), 224 SPINAND_HAS_QE_BIT | 225 SPINAND_HAS_PROG_PLANE_SELECT_BIT, 226 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), 227 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 228 macronix_set_read_retry)), 229 SPINAND_INFO("MX35LF2G24AD-Z4I8", 230 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x64, 0x03), 231 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), 232 NAND_ECCREQ(8, 512), 233 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 234 &write_cache_variants, 235 &update_cache_variants), 236 SPINAND_HAS_QE_BIT, 237 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), 238 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 239 macronix_set_read_retry)), 240 SPINAND_INFO("MX35LF4G24AD", 241 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35, 0x03), 242 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1), 243 NAND_ECCREQ(8, 512), 244 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 245 &write_cache_variants, 246 &update_cache_variants), 247 SPINAND_HAS_QE_BIT | 248 SPINAND_HAS_PROG_PLANE_SELECT_BIT, 249 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), 250 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 251 macronix_set_read_retry)), 252 SPINAND_INFO("MX35LF4G24AD-Z4I8", 253 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x75, 0x03), 254 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), 255 NAND_ECCREQ(8, 512), 256 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 257 &write_cache_variants, 258 &update_cache_variants), 259 SPINAND_HAS_QE_BIT, 260 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, NULL), 261 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 262 macronix_set_read_retry)), 263 SPINAND_INFO("MX31LF1GE4BC", 264 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x1e), 265 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), 266 NAND_ECCREQ(8, 512), 267 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 268 &write_cache_variants, 269 &update_cache_variants), 270 SPINAND_HAS_QE_BIT, 271 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 272 macronix_ecc_get_status)), 273 SPINAND_INFO("MX31UF1GE4BC", 274 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x9e), 275 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), 276 NAND_ECCREQ(8, 512), 277 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 278 &write_cache_variants, 279 &update_cache_variants), 280 SPINAND_HAS_QE_BIT, 281 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 282 macronix_ecc_get_status)), 283 284 SPINAND_INFO("MX35LF2G14AC", 285 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x20), 286 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1), 287 NAND_ECCREQ(4, 512), 288 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 289 &write_cache_variants, 290 &update_cache_variants), 291 SPINAND_HAS_QE_BIT | 292 SPINAND_HAS_PROG_PLANE_SELECT_BIT | 293 SPINAND_HAS_READ_PLANE_SELECT_BIT, 294 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 295 macronix_ecc_get_status)), 296 SPINAND_INFO("MX35UF4G24AD", 297 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb5, 0x03), 298 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 2, 1, 1), 299 NAND_ECCREQ(8, 512), 300 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 301 &write_cache_variants, 302 &update_cache_variants), 303 SPINAND_HAS_QE_BIT | 304 SPINAND_HAS_PROG_PLANE_SELECT_BIT, 305 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 306 macronix_ecc_get_status), 307 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 308 macronix_set_read_retry)), 309 SPINAND_INFO("MX35UF4G24AD-Z4I8", 310 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xf5, 0x03), 311 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), 312 NAND_ECCREQ(8, 512), 313 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 314 &write_cache_variants, 315 &update_cache_variants), 316 SPINAND_HAS_QE_BIT, 317 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 318 macronix_ecc_get_status), 319 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 320 macronix_set_read_retry)), 321 SPINAND_INFO("MX35UF4GE4AD", 322 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xb7, 0x03), 323 NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), 324 NAND_ECCREQ(8, 512), 325 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 326 &write_cache_variants, 327 &update_cache_variants), 328 SPINAND_HAS_QE_BIT, 329 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 330 macronix_ecc_get_status), 331 SPINAND_CONT_READ(macronix_set_cont_read), 332 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 333 macronix_set_read_retry)), 334 SPINAND_INFO("MX35UF2G14AC", 335 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa0), 336 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 2, 1, 1), 337 NAND_ECCREQ(4, 512), 338 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 339 &write_cache_variants, 340 &update_cache_variants), 341 SPINAND_HAS_QE_BIT | 342 SPINAND_HAS_PROG_PLANE_SELECT_BIT | 343 SPINAND_HAS_READ_PLANE_SELECT_BIT, 344 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 345 macronix_ecc_get_status)), 346 SPINAND_INFO("MX35UF2G24AD", 347 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa4, 0x03), 348 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1), 349 NAND_ECCREQ(8, 512), 350 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 351 &write_cache_variants, 352 &update_cache_variants), 353 SPINAND_HAS_QE_BIT | 354 SPINAND_HAS_PROG_PLANE_SELECT_BIT, 355 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 356 macronix_ecc_get_status), 357 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 358 macronix_set_read_retry)), 359 SPINAND_INFO("MX35UF2G24AD-Z4I8", 360 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xe4, 0x03), 361 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), 362 NAND_ECCREQ(8, 512), 363 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 364 &write_cache_variants, 365 &update_cache_variants), 366 SPINAND_HAS_QE_BIT, 367 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 368 macronix_ecc_get_status), 369 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 370 macronix_set_read_retry)), 371 SPINAND_INFO("MX35UF2GE4AD", 372 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa6, 0x03), 373 NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 1, 1, 1), 374 NAND_ECCREQ(8, 512), 375 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 376 &write_cache_variants, 377 &update_cache_variants), 378 SPINAND_HAS_QE_BIT, 379 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 380 macronix_ecc_get_status), 381 SPINAND_CONT_READ(macronix_set_cont_read), 382 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 383 macronix_set_read_retry)), 384 SPINAND_INFO("MX35UF2GE4AC", 385 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xa2, 0x01), 386 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), 387 NAND_ECCREQ(4, 512), 388 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 389 &write_cache_variants, 390 &update_cache_variants), 391 SPINAND_HAS_QE_BIT, 392 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 393 macronix_ecc_get_status), 394 SPINAND_CONT_READ(macronix_set_cont_read)), 395 SPINAND_INFO("MX35UF1G14AC", 396 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x90), 397 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), 398 NAND_ECCREQ(4, 512), 399 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 400 &write_cache_variants, 401 &update_cache_variants), 402 SPINAND_HAS_QE_BIT, 403 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 404 macronix_ecc_get_status)), 405 SPINAND_INFO("MX35UF1G24AD", 406 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x94, 0x03), 407 NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), 408 NAND_ECCREQ(8, 512), 409 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 410 &write_cache_variants, 411 &update_cache_variants), 412 SPINAND_HAS_QE_BIT, 413 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 414 macronix_ecc_get_status), 415 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 416 macronix_set_read_retry)), 417 SPINAND_INFO("MX35UF1GE4AD", 418 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x96, 0x03), 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(&mx35lfxge4ab_ooblayout, 426 macronix_ecc_get_status), 427 SPINAND_CONT_READ(macronix_set_cont_read), 428 SPINAND_READ_RETRY(MACRONIX_NUM_READ_RETRY_MODES, 429 macronix_set_read_retry)), 430 SPINAND_INFO("MX35UF1GE4AC", 431 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x92, 0x01), 432 NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), 433 NAND_ECCREQ(4, 512), 434 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 435 &write_cache_variants, 436 &update_cache_variants), 437 SPINAND_HAS_QE_BIT, 438 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 439 macronix_ecc_get_status), 440 SPINAND_CONT_READ(macronix_set_cont_read)), 441 SPINAND_INFO("MX31LF2GE4BC", 442 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x2e), 443 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), 444 NAND_ECCREQ(8, 512), 445 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 446 &write_cache_variants, 447 &update_cache_variants), 448 SPINAND_HAS_QE_BIT, 449 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 450 macronix_ecc_get_status)), 451 SPINAND_INFO("MX3UF2GE4BC", 452 SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xae), 453 NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), 454 NAND_ECCREQ(8, 512), 455 SPINAND_INFO_OP_VARIANTS(&read_cache_variants, 456 &write_cache_variants, 457 &update_cache_variants), 458 SPINAND_HAS_QE_BIT, 459 SPINAND_ECCINFO(&mx35lfxge4ab_ooblayout, 460 macronix_ecc_get_status)), 461 }; 462 463 static int macronix_spinand_init(struct spinand_device *spinand) 464 { 465 struct macronix_priv *priv; 466 467 priv = kzalloc(sizeof(*priv), GFP_KERNEL); 468 if (!priv) 469 return -ENOMEM; 470 471 spinand->priv = priv; 472 473 return 0; 474 } 475 476 static void macronix_spinand_cleanup(struct spinand_device *spinand) 477 { 478 kfree(spinand->priv); 479 } 480 481 static const struct spinand_manufacturer_ops macronix_spinand_manuf_ops = { 482 .init = macronix_spinand_init, 483 .cleanup = macronix_spinand_cleanup, 484 }; 485 486 const struct spinand_manufacturer macronix_spinand_manufacturer = { 487 .id = SPINAND_MFR_MACRONIX, 488 .name = "Macronix", 489 .chips = macronix_spinand_table, 490 .nchips = ARRAY_SIZE(macronix_spinand_table), 491 .ops = ¯onix_spinand_manuf_ops, 492 }; 493