192d9c1d9SJon Lin /* SPDX-License-Identifier: GPL-2.0 */
292d9c1d9SJon Lin /*
392d9c1d9SJon Lin * Copyright (c) 2024 Rockchip Electronics Co., Ltd
492d9c1d9SJon Lin *
592d9c1d9SJon Lin * Authors:
692d9c1d9SJon Lin * Dingqiang Lin <jon.lin@rock-chips.com>
792d9c1d9SJon Lin */
892d9c1d9SJon Lin
992d9c1d9SJon Lin #ifndef __UBOOT__
1092d9c1d9SJon Lin #include <linux/device.h>
1192d9c1d9SJon Lin #include <linux/kernel.h>
1292d9c1d9SJon Lin #endif
1392d9c1d9SJon Lin #include <linux/mtd/spinand.h>
1492d9c1d9SJon Lin
1592d9c1d9SJon Lin #define SPINAND_MFR_ZBIT 0x5E
1692d9c1d9SJon Lin
1792d9c1d9SJon Lin static SPINAND_OP_VARIANTS(read_cache_variants,
1892d9c1d9SJon Lin SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0),
1992d9c1d9SJon Lin SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
2092d9c1d9SJon Lin SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP(0, 1, NULL, 0),
2192d9c1d9SJon Lin SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
2292d9c1d9SJon Lin SPINAND_PAGE_READ_FROM_CACHE_OP(true, 0, 1, NULL, 0),
2392d9c1d9SJon Lin SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0));
2492d9c1d9SJon Lin
2592d9c1d9SJon Lin static SPINAND_OP_VARIANTS(write_cache_variants,
2692d9c1d9SJon Lin SPINAND_PROG_LOAD_X4(true, 0, NULL, 0),
2792d9c1d9SJon Lin SPINAND_PROG_LOAD(true, 0, NULL, 0));
2892d9c1d9SJon Lin
2992d9c1d9SJon Lin static SPINAND_OP_VARIANTS(update_cache_variants,
3092d9c1d9SJon Lin SPINAND_PROG_LOAD_X4(false, 0, NULL, 0),
3192d9c1d9SJon Lin SPINAND_PROG_LOAD(false, 0, NULL, 0));
3292d9c1d9SJon Lin
zb35q01b_ooblayout_ecc(struct mtd_info * mtd,int section,struct mtd_oob_region * region)3392d9c1d9SJon Lin static int zb35q01b_ooblayout_ecc(struct mtd_info *mtd, int section,
3492d9c1d9SJon Lin struct mtd_oob_region *region)
3592d9c1d9SJon Lin {
3692d9c1d9SJon Lin return -ERANGE;
3792d9c1d9SJon Lin }
3892d9c1d9SJon Lin
zb35q01b_ooblayout_free(struct mtd_info * mtd,int section,struct mtd_oob_region * region)3992d9c1d9SJon Lin static int zb35q01b_ooblayout_free(struct mtd_info *mtd, int section,
4092d9c1d9SJon Lin struct mtd_oob_region *region)
4192d9c1d9SJon Lin {
4292d9c1d9SJon Lin if (section)
4392d9c1d9SJon Lin return -ERANGE;
4492d9c1d9SJon Lin
4592d9c1d9SJon Lin /* Reserve 2 bytes for the BBM. */
4692d9c1d9SJon Lin region->offset = 2;
4792d9c1d9SJon Lin region->length = mtd->oobsize - 2;
4892d9c1d9SJon Lin
4992d9c1d9SJon Lin return 0;
5092d9c1d9SJon Lin }
5192d9c1d9SJon Lin
5292d9c1d9SJon Lin static const struct mtd_ooblayout_ops zb35q01b_ooblayout = {
5392d9c1d9SJon Lin .ecc = zb35q01b_ooblayout_ecc,
5492d9c1d9SJon Lin .rfree = zb35q01b_ooblayout_free,
5592d9c1d9SJon Lin };
5692d9c1d9SJon Lin
5792d9c1d9SJon Lin static const struct spinand_info zbit_spinand_table[] = {
5892d9c1d9SJon Lin SPINAND_INFO("ZB35Q01BYIG",
5992d9c1d9SJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xA1),
6092d9c1d9SJon Lin NAND_MEMORG(1, 2048, 128, 64, 1024, 1, 1, 1),
6192d9c1d9SJon Lin NAND_ECCREQ(8, 512),
6292d9c1d9SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
6392d9c1d9SJon Lin &write_cache_variants,
6492d9c1d9SJon Lin &update_cache_variants),
6592d9c1d9SJon Lin 0,
6692d9c1d9SJon Lin SPINAND_ECCINFO(&zb35q01b_ooblayout, NULL)),
67*22427850SJon Lin SPINAND_INFO("ZB35Q04BYIG",
68*22427850SJon Lin SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xA3),
69*22427850SJon Lin NAND_MEMORG(1, 2048, 128, 128, 2048, 1, 1, 1),
70*22427850SJon Lin NAND_ECCREQ(8, 512),
71*22427850SJon Lin SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
72*22427850SJon Lin &write_cache_variants,
73*22427850SJon Lin &update_cache_variants),
74*22427850SJon Lin SPINAND_HAS_QE_BIT,
75*22427850SJon Lin SPINAND_ECCINFO(&zb35q01b_ooblayout, NULL)),
7692d9c1d9SJon Lin };
7792d9c1d9SJon Lin
7892d9c1d9SJon Lin static const struct spinand_manufacturer_ops zbit_spinand_manuf_ops = {
7992d9c1d9SJon Lin };
8092d9c1d9SJon Lin
8192d9c1d9SJon Lin const struct spinand_manufacturer zbit_spinand_manufacturer = {
8292d9c1d9SJon Lin .id = SPINAND_MFR_ZBIT,
8392d9c1d9SJon Lin .name = "ZBIT",
8492d9c1d9SJon Lin .chips = zbit_spinand_table,
8592d9c1d9SJon Lin .nchips = ARRAY_SIZE(zbit_spinand_table),
8692d9c1d9SJon Lin .ops = &zbit_spinand_manuf_ops,
8792d9c1d9SJon Lin };
88