1a508e887SPeter Pan // SPDX-License-Identifier: GPL-2.0 2a508e887SPeter Pan /* 3a508e887SPeter Pan * Copyright (c) 2016-2017 Micron Technology, Inc. 4a508e887SPeter Pan * 5a508e887SPeter Pan * Authors: 6a508e887SPeter Pan * Peter Pan <peterpandong@micron.com> 7a508e887SPeter Pan */ 8a508e887SPeter Pan 9a508e887SPeter Pan #include <linux/device.h> 10a508e887SPeter Pan #include <linux/kernel.h> 11a508e887SPeter Pan #include <linux/mtd/spinand.h> 12a508e887SPeter Pan 13a508e887SPeter Pan #define SPINAND_MFR_MICRON 0x2c 14a508e887SPeter Pan 15a508e887SPeter Pan #define MICRON_STATUS_ECC_MASK GENMASK(7, 4) 16a508e887SPeter Pan #define MICRON_STATUS_ECC_NO_BITFLIPS (0 << 4) 17a508e887SPeter Pan #define MICRON_STATUS_ECC_1TO3_BITFLIPS (1 << 4) 18a508e887SPeter Pan #define MICRON_STATUS_ECC_4TO6_BITFLIPS (3 << 4) 19a508e887SPeter Pan #define MICRON_STATUS_ECC_7TO8_BITFLIPS (5 << 4) 20a508e887SPeter Pan 210bc68af9SShivamurthy Shastri #define MICRON_CFG_CR BIT(0) 220bc68af9SShivamurthy Shastri 239f9ae0c2SShivamurthy Shastri /* 249f9ae0c2SShivamurthy Shastri * As per datasheet, die selection is done by the 6th bit of Die 259f9ae0c2SShivamurthy Shastri * Select Register (Address 0xD0). 269f9ae0c2SShivamurthy Shastri */ 279f9ae0c2SShivamurthy Shastri #define MICRON_DIE_SELECT_REG 0xD0 289f9ae0c2SShivamurthy Shastri 299f9ae0c2SShivamurthy Shastri #define MICRON_SELECT_DIE(x) ((x) << 6) 309f9ae0c2SShivamurthy Shastri 31bdb84a22SThirumalesha Narasimhappa static SPINAND_OP_VARIANTS(quadio_read_cache_variants, 32a508e887SPeter Pan SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), 33a508e887SPeter Pan SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), 34a508e887SPeter Pan SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0), 35a508e887SPeter Pan SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), 36a508e887SPeter Pan SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), 37a508e887SPeter Pan SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); 38a508e887SPeter Pan 39bdb84a22SThirumalesha Narasimhappa static SPINAND_OP_VARIANTS(x4_write_cache_variants, 40a508e887SPeter Pan SPINAND_PROG_LOAD_X4(true, 0, NULL, 0), 41a508e887SPeter Pan SPINAND_PROG_LOAD(true, 0, NULL, 0)); 42a508e887SPeter Pan 43bdb84a22SThirumalesha Narasimhappa static SPINAND_OP_VARIANTS(x4_update_cache_variants, 44a508e887SPeter Pan SPINAND_PROG_LOAD_X4(false, 0, NULL, 0), 45a508e887SPeter Pan SPINAND_PROG_LOAD(false, 0, NULL, 0)); 46a508e887SPeter Pan 47*8c573d94SThirumalesha Narasimhappa /* Micron MT29F2G01AAAED Device */ 48*8c573d94SThirumalesha Narasimhappa static SPINAND_OP_VARIANTS(x4_read_cache_variants, 49*8c573d94SThirumalesha Narasimhappa SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0), 50*8c573d94SThirumalesha Narasimhappa SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0), 51*8c573d94SThirumalesha Narasimhappa SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0), 52*8c573d94SThirumalesha Narasimhappa SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); 53*8c573d94SThirumalesha Narasimhappa 54*8c573d94SThirumalesha Narasimhappa static SPINAND_OP_VARIANTS(x1_write_cache_variants, 55*8c573d94SThirumalesha Narasimhappa SPINAND_PROG_LOAD(true, 0, NULL, 0)); 56*8c573d94SThirumalesha Narasimhappa 57*8c573d94SThirumalesha Narasimhappa static SPINAND_OP_VARIANTS(x1_update_cache_variants, 58*8c573d94SThirumalesha Narasimhappa SPINAND_PROG_LOAD(false, 0, NULL, 0)); 59*8c573d94SThirumalesha Narasimhappa 60d3137043SShivamurthy Shastri static int micron_8_ooblayout_ecc(struct mtd_info *mtd, int section, 61a508e887SPeter Pan struct mtd_oob_region *region) 62a508e887SPeter Pan { 63a508e887SPeter Pan if (section) 64a508e887SPeter Pan return -ERANGE; 65a508e887SPeter Pan 66d3137043SShivamurthy Shastri region->offset = mtd->oobsize / 2; 67d3137043SShivamurthy Shastri region->length = mtd->oobsize / 2; 68a508e887SPeter Pan 69a508e887SPeter Pan return 0; 70a508e887SPeter Pan } 71a508e887SPeter Pan 72d3137043SShivamurthy Shastri static int micron_8_ooblayout_free(struct mtd_info *mtd, int section, 73a508e887SPeter Pan struct mtd_oob_region *region) 74a508e887SPeter Pan { 75a508e887SPeter Pan if (section) 76a508e887SPeter Pan return -ERANGE; 77a508e887SPeter Pan 78a508e887SPeter Pan /* Reserve 2 bytes for the BBM. */ 79a508e887SPeter Pan region->offset = 2; 80d3137043SShivamurthy Shastri region->length = (mtd->oobsize / 2) - 2; 81a508e887SPeter Pan 82a508e887SPeter Pan return 0; 83a508e887SPeter Pan } 84a508e887SPeter Pan 85d3137043SShivamurthy Shastri static const struct mtd_ooblayout_ops micron_8_ooblayout = { 86d3137043SShivamurthy Shastri .ecc = micron_8_ooblayout_ecc, 87d3137043SShivamurthy Shastri .free = micron_8_ooblayout_free, 88a508e887SPeter Pan }; 89a508e887SPeter Pan 90*8c573d94SThirumalesha Narasimhappa static int micron_4_ooblayout_ecc(struct mtd_info *mtd, int section, 91*8c573d94SThirumalesha Narasimhappa struct mtd_oob_region *region) 92*8c573d94SThirumalesha Narasimhappa { 93*8c573d94SThirumalesha Narasimhappa struct spinand_device *spinand = mtd_to_spinand(mtd); 94*8c573d94SThirumalesha Narasimhappa 95*8c573d94SThirumalesha Narasimhappa if (section >= spinand->base.memorg.pagesize / 96*8c573d94SThirumalesha Narasimhappa mtd->ecc_step_size) 97*8c573d94SThirumalesha Narasimhappa return -ERANGE; 98*8c573d94SThirumalesha Narasimhappa 99*8c573d94SThirumalesha Narasimhappa region->offset = (section * 16) + 8; 100*8c573d94SThirumalesha Narasimhappa region->length = 8; 101*8c573d94SThirumalesha Narasimhappa 102*8c573d94SThirumalesha Narasimhappa return 0; 103*8c573d94SThirumalesha Narasimhappa } 104*8c573d94SThirumalesha Narasimhappa 105*8c573d94SThirumalesha Narasimhappa static int micron_4_ooblayout_free(struct mtd_info *mtd, int section, 106*8c573d94SThirumalesha Narasimhappa struct mtd_oob_region *region) 107*8c573d94SThirumalesha Narasimhappa { 108*8c573d94SThirumalesha Narasimhappa struct spinand_device *spinand = mtd_to_spinand(mtd); 109*8c573d94SThirumalesha Narasimhappa 110*8c573d94SThirumalesha Narasimhappa if (section >= spinand->base.memorg.pagesize / 111*8c573d94SThirumalesha Narasimhappa mtd->ecc_step_size) 112*8c573d94SThirumalesha Narasimhappa return -ERANGE; 113*8c573d94SThirumalesha Narasimhappa 114*8c573d94SThirumalesha Narasimhappa if (section) { 115*8c573d94SThirumalesha Narasimhappa region->offset = 16 * section; 116*8c573d94SThirumalesha Narasimhappa region->length = 8; 117*8c573d94SThirumalesha Narasimhappa } else { 118*8c573d94SThirumalesha Narasimhappa /* section 0 has two bytes reserved for the BBM */ 119*8c573d94SThirumalesha Narasimhappa region->offset = 2; 120*8c573d94SThirumalesha Narasimhappa region->length = 6; 121*8c573d94SThirumalesha Narasimhappa } 122*8c573d94SThirumalesha Narasimhappa 123*8c573d94SThirumalesha Narasimhappa return 0; 124*8c573d94SThirumalesha Narasimhappa } 125*8c573d94SThirumalesha Narasimhappa 126*8c573d94SThirumalesha Narasimhappa static const struct mtd_ooblayout_ops micron_4_ooblayout = { 127*8c573d94SThirumalesha Narasimhappa .ecc = micron_4_ooblayout_ecc, 128*8c573d94SThirumalesha Narasimhappa .free = micron_4_ooblayout_free, 129*8c573d94SThirumalesha Narasimhappa }; 130*8c573d94SThirumalesha Narasimhappa 1319f9ae0c2SShivamurthy Shastri static int micron_select_target(struct spinand_device *spinand, 1329f9ae0c2SShivamurthy Shastri unsigned int target) 1339f9ae0c2SShivamurthy Shastri { 1349f9ae0c2SShivamurthy Shastri struct spi_mem_op op = SPINAND_SET_FEATURE_OP(MICRON_DIE_SELECT_REG, 1359f9ae0c2SShivamurthy Shastri spinand->scratchbuf); 1369f9ae0c2SShivamurthy Shastri 1379f9ae0c2SShivamurthy Shastri if (target > 1) 1389f9ae0c2SShivamurthy Shastri return -EINVAL; 1399f9ae0c2SShivamurthy Shastri 1409f9ae0c2SShivamurthy Shastri *spinand->scratchbuf = MICRON_SELECT_DIE(target); 1419f9ae0c2SShivamurthy Shastri 1429f9ae0c2SShivamurthy Shastri return spi_mem_exec_op(spinand->spimem, &op); 1439f9ae0c2SShivamurthy Shastri } 1449f9ae0c2SShivamurthy Shastri 145d3137043SShivamurthy Shastri static int micron_8_ecc_get_status(struct spinand_device *spinand, 146a508e887SPeter Pan u8 status) 147a508e887SPeter Pan { 148a508e887SPeter Pan switch (status & MICRON_STATUS_ECC_MASK) { 149a508e887SPeter Pan case STATUS_ECC_NO_BITFLIPS: 150a508e887SPeter Pan return 0; 151a508e887SPeter Pan 152a508e887SPeter Pan case STATUS_ECC_UNCOR_ERROR: 153a508e887SPeter Pan return -EBADMSG; 154a508e887SPeter Pan 155a508e887SPeter Pan case MICRON_STATUS_ECC_1TO3_BITFLIPS: 156a508e887SPeter Pan return 3; 157a508e887SPeter Pan 158a508e887SPeter Pan case MICRON_STATUS_ECC_4TO6_BITFLIPS: 159a508e887SPeter Pan return 6; 160a508e887SPeter Pan 161a508e887SPeter Pan case MICRON_STATUS_ECC_7TO8_BITFLIPS: 162a508e887SPeter Pan return 8; 163a508e887SPeter Pan 164a508e887SPeter Pan default: 165a508e887SPeter Pan break; 166a508e887SPeter Pan } 167a508e887SPeter Pan 168a508e887SPeter Pan return -EINVAL; 169a508e887SPeter Pan } 170a508e887SPeter Pan 171a508e887SPeter Pan static const struct spinand_info micron_spinand_table[] = { 1728511a3a9SShivamurthy Shastri /* M79A 2Gb 3.3V */ 173f1541773SChuanhong Guo SPINAND_INFO("MT29F2G01ABAGD", 174f1541773SChuanhong Guo SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x24), 175377e517bSBoris Brezillon NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1), 176a508e887SPeter Pan NAND_ECCREQ(8, 512), 177bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 178bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 179bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 180a508e887SPeter Pan 0, 181d3137043SShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 182d3137043SShivamurthy Shastri micron_8_ecc_get_status)), 183a15335a1SShivamurthy Shastri /* M79A 2Gb 1.8V */ 184a15335a1SShivamurthy Shastri SPINAND_INFO("MT29F2G01ABBGD", 185a15335a1SShivamurthy Shastri SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x25), 186a15335a1SShivamurthy Shastri NAND_MEMORG(1, 2048, 128, 64, 2048, 40, 2, 1, 1), 187a15335a1SShivamurthy Shastri NAND_ECCREQ(8, 512), 188bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 189bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 190bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 191a15335a1SShivamurthy Shastri 0, 192a15335a1SShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 193a15335a1SShivamurthy Shastri micron_8_ecc_get_status)), 194a15335a1SShivamurthy Shastri /* M78A 1Gb 3.3V */ 195a15335a1SShivamurthy Shastri SPINAND_INFO("MT29F1G01ABAFD", 196a15335a1SShivamurthy Shastri SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x14), 197a15335a1SShivamurthy Shastri NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), 198a15335a1SShivamurthy Shastri NAND_ECCREQ(8, 512), 199bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 200bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 201bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 202a15335a1SShivamurthy Shastri 0, 203a15335a1SShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 204a15335a1SShivamurthy Shastri micron_8_ecc_get_status)), 205a15335a1SShivamurthy Shastri /* M78A 1Gb 1.8V */ 206a15335a1SShivamurthy Shastri SPINAND_INFO("MT29F1G01ABAFD", 207a15335a1SShivamurthy Shastri SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x15), 208a15335a1SShivamurthy Shastri NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), 209a15335a1SShivamurthy Shastri NAND_ECCREQ(8, 512), 210bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 211bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 212bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 213a15335a1SShivamurthy Shastri 0, 214a15335a1SShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 215a15335a1SShivamurthy Shastri micron_8_ecc_get_status)), 2169f9ae0c2SShivamurthy Shastri /* M79A 4Gb 3.3V */ 2179f9ae0c2SShivamurthy Shastri SPINAND_INFO("MT29F4G01ADAGD", 2189f9ae0c2SShivamurthy Shastri SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x36), 2199f9ae0c2SShivamurthy Shastri NAND_MEMORG(1, 2048, 128, 64, 2048, 80, 2, 1, 2), 2209f9ae0c2SShivamurthy Shastri NAND_ECCREQ(8, 512), 221bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 222bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 223bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 2249f9ae0c2SShivamurthy Shastri 0, 2259f9ae0c2SShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 2269f9ae0c2SShivamurthy Shastri micron_8_ecc_get_status), 2279f9ae0c2SShivamurthy Shastri SPINAND_SELECT_TARGET(micron_select_target)), 228a7e5daccSShivamurthy Shastri /* M70A 4Gb 3.3V */ 229a7e5daccSShivamurthy Shastri SPINAND_INFO("MT29F4G01ABAFD", 230a7e5daccSShivamurthy Shastri SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x34), 231a7e5daccSShivamurthy Shastri NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), 232a7e5daccSShivamurthy Shastri NAND_ECCREQ(8, 512), 233bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 234bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 235bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 236a7e5daccSShivamurthy Shastri SPINAND_HAS_CR_FEAT_BIT, 237a7e5daccSShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 238a7e5daccSShivamurthy Shastri micron_8_ecc_get_status)), 239a7e5daccSShivamurthy Shastri /* M70A 4Gb 1.8V */ 240a7e5daccSShivamurthy Shastri SPINAND_INFO("MT29F4G01ABBFD", 241a7e5daccSShivamurthy Shastri SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x35), 242a7e5daccSShivamurthy Shastri NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), 243a7e5daccSShivamurthy Shastri NAND_ECCREQ(8, 512), 244bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 245bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 246bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 247a7e5daccSShivamurthy Shastri SPINAND_HAS_CR_FEAT_BIT, 248a7e5daccSShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 249a7e5daccSShivamurthy Shastri micron_8_ecc_get_status)), 2509f9ae0c2SShivamurthy Shastri /* M70A 8Gb 3.3V */ 2519f9ae0c2SShivamurthy Shastri SPINAND_INFO("MT29F8G01ADAFD", 2529f9ae0c2SShivamurthy Shastri SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x46), 2539f9ae0c2SShivamurthy Shastri NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 2), 2549f9ae0c2SShivamurthy Shastri NAND_ECCREQ(8, 512), 255bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 256bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 257bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 2589f9ae0c2SShivamurthy Shastri SPINAND_HAS_CR_FEAT_BIT, 2599f9ae0c2SShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 2609f9ae0c2SShivamurthy Shastri micron_8_ecc_get_status), 2619f9ae0c2SShivamurthy Shastri SPINAND_SELECT_TARGET(micron_select_target)), 2629f9ae0c2SShivamurthy Shastri /* M70A 8Gb 1.8V */ 2639f9ae0c2SShivamurthy Shastri SPINAND_INFO("MT29F8G01ADBFD", 2649f9ae0c2SShivamurthy Shastri SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x47), 2659f9ae0c2SShivamurthy Shastri NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 2), 2669f9ae0c2SShivamurthy Shastri NAND_ECCREQ(8, 512), 267bdb84a22SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&quadio_read_cache_variants, 268bdb84a22SThirumalesha Narasimhappa &x4_write_cache_variants, 269bdb84a22SThirumalesha Narasimhappa &x4_update_cache_variants), 2709f9ae0c2SShivamurthy Shastri SPINAND_HAS_CR_FEAT_BIT, 2719f9ae0c2SShivamurthy Shastri SPINAND_ECCINFO(µn_8_ooblayout, 2729f9ae0c2SShivamurthy Shastri micron_8_ecc_get_status), 2739f9ae0c2SShivamurthy Shastri SPINAND_SELECT_TARGET(micron_select_target)), 274*8c573d94SThirumalesha Narasimhappa /* M69A 2Gb 3.3V */ 275*8c573d94SThirumalesha Narasimhappa SPINAND_INFO("MT29F2G01AAAED", 276*8c573d94SThirumalesha Narasimhappa SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x9F), 277*8c573d94SThirumalesha Narasimhappa NAND_MEMORG(1, 2048, 64, 64, 2048, 80, 2, 1, 1), 278*8c573d94SThirumalesha Narasimhappa NAND_ECCREQ(4, 512), 279*8c573d94SThirumalesha Narasimhappa SPINAND_INFO_OP_VARIANTS(&x4_read_cache_variants, 280*8c573d94SThirumalesha Narasimhappa &x1_write_cache_variants, 281*8c573d94SThirumalesha Narasimhappa &x1_update_cache_variants), 282*8c573d94SThirumalesha Narasimhappa 0, 283*8c573d94SThirumalesha Narasimhappa SPINAND_ECCINFO(µn_4_ooblayout, NULL)), 284a508e887SPeter Pan }; 285a508e887SPeter Pan 2860bc68af9SShivamurthy Shastri static int micron_spinand_init(struct spinand_device *spinand) 2870bc68af9SShivamurthy Shastri { 2880bc68af9SShivamurthy Shastri /* 2890bc68af9SShivamurthy Shastri * M70A device series enable Continuous Read feature at Power-up, 2900bc68af9SShivamurthy Shastri * which is not supported. Disable this bit to avoid any possible 2910bc68af9SShivamurthy Shastri * failure. 2920bc68af9SShivamurthy Shastri */ 2930bc68af9SShivamurthy Shastri if (spinand->flags & SPINAND_HAS_CR_FEAT_BIT) 2940bc68af9SShivamurthy Shastri return spinand_upd_cfg(spinand, MICRON_CFG_CR, 0); 2950bc68af9SShivamurthy Shastri 2960bc68af9SShivamurthy Shastri return 0; 2970bc68af9SShivamurthy Shastri } 2980bc68af9SShivamurthy Shastri 299a508e887SPeter Pan static const struct spinand_manufacturer_ops micron_spinand_manuf_ops = { 3000bc68af9SShivamurthy Shastri .init = micron_spinand_init, 301a508e887SPeter Pan }; 302a508e887SPeter Pan 303a508e887SPeter Pan const struct spinand_manufacturer micron_spinand_manufacturer = { 304a508e887SPeter Pan .id = SPINAND_MFR_MICRON, 305a508e887SPeter Pan .name = "Micron", 306f1541773SChuanhong Guo .chips = micron_spinand_table, 307f1541773SChuanhong Guo .nchips = ARRAY_SIZE(micron_spinand_table), 308a508e887SPeter Pan .ops = µn_spinand_manuf_ops, 309a508e887SPeter Pan }; 310