// SPDX-License-Identifier: GPL-2.0 /* * Author: * Chuanhong Guo */ #include "spinand.h" #include "common.h" #define SPINAND_MFR_DOSILICON 0XE5 extern int spinand_disable_ecc(struct spinand_device * spinand); extern int spinand_select_target(struct spinand_device *spinand, unsigned int target); static int dosilicon_check_ecc(unsigned char val) { if ((val & (1 << 5)) != 0 && (val & (1 << 4)) == 0) return 1; else return 0; } static const struct spinand_info dosilicon_spinand_table[] = { SPINAND_INFO("DS35M12C-IBR", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0x25), NAND_MEMORG(1, 2048, 128, 64, 512, 10, 1, 1, 1), NAND_ECCREQ(8, 512, 1)), }; static int dosilicon_spinand_init(struct spinand_device *spinand) { struct nand_device *nand = spinand_to_nand(spinand); unsigned int i = 0; for (i = 0; i < nand->memorg.ntargets; i++) { spinand_select_target(spinand, i); /* Special initialization of Vendor */ /* Enable ECC */ spinand_disable_ecc(spinand); } return 0; } static const struct spinand_manufacturer_ops dosilicon_spinand_manuf_ops = { .init = dosilicon_spinand_init, .check_ecc = dosilicon_check_ecc, }; const struct spinand_manufacturer dosilicon_spinand_manufacturer = { .id = SPINAND_MFR_DOSILICON, .name = "DOSILICON", .chips = dosilicon_spinand_table, .nchips = ARRAY_SIZE(dosilicon_spinand_table), .ops = &dosilicon_spinand_manuf_ops, };