Lines Matching full:nand
10 #define pr_fmt(fmt) "spi-nand: " fmt
53 struct nand_device *nand = spinand_to_nand(spinand); in spinand_get_cfg() local
56 spinand->cur_target >= nand->memorg.ntargets)) in spinand_get_cfg()
65 struct nand_device *nand = spinand_to_nand(spinand); in spinand_set_cfg() local
69 spinand->cur_target >= nand->memorg.ntargets)) in spinand_set_cfg()
109 * spinand_select_target() - Select a specific NAND target/die
119 struct nand_device *nand = spinand_to_nand(spinand); in spinand_select_target() local
122 if (WARN_ON(target >= nand->memorg.ntargets)) in spinand_select_target()
128 if (nand->memorg.ntargets == 1) { in spinand_select_target()
143 struct nand_device *nand = spinand_to_nand(spinand); in spinand_read_cfg() local
147 for (target = 0; target < nand->memorg.ntargets; target++) { in spinand_read_cfg()
167 struct nand_device *nand = spinand_to_nand(spinand); in spinand_init_cfg_cache() local
171 nand->memorg.ntargets, in spinand_init_cfg_cache()
211 struct nand_device *nand = spinand_to_nand(spinand); in spinand_check_ecc_status() local
226 return nanddev_get_ecc_conf(nand)->strength; in spinand_check_ecc_status()
262 static int spinand_ondie_ecc_init_ctx(struct nand_device *nand) in spinand_ondie_ecc_init_ctx() argument
264 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_ondie_ecc_init_ctx()
265 struct mtd_info *mtd = nanddev_to_mtd(nand); in spinand_ondie_ecc_init_ctx()
268 nand->ecc.ctx.conf.engine_type = NAND_ECC_ENGINE_TYPE_ON_DIE; in spinand_ondie_ecc_init_ctx()
269 nand->ecc.ctx.conf.step_size = nand->ecc.requirements.step_size; in spinand_ondie_ecc_init_ctx()
270 nand->ecc.ctx.conf.strength = nand->ecc.requirements.strength; in spinand_ondie_ecc_init_ctx()
276 nand->ecc.ctx.priv = engine_conf; in spinand_ondie_ecc_init_ctx()
286 static void spinand_ondie_ecc_cleanup_ctx(struct nand_device *nand) in spinand_ondie_ecc_cleanup_ctx() argument
288 kfree(nand->ecc.ctx.priv); in spinand_ondie_ecc_cleanup_ctx()
291 static int spinand_ondie_ecc_prepare_io_req(struct nand_device *nand, in spinand_ondie_ecc_prepare_io_req() argument
294 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_ondie_ecc_prepare_io_req()
300 memset(spinand->oobbuf, 0xff, nanddev_per_page_oobsize(nand)); in spinand_ondie_ecc_prepare_io_req()
306 static int spinand_ondie_ecc_finish_io_req(struct nand_device *nand, in spinand_ondie_ecc_finish_io_req() argument
309 struct spinand_ondie_ecc_conf *engine_conf = nand->ecc.ctx.priv; in spinand_ondie_ecc_finish_io_req()
310 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_ondie_ecc_finish_io_req()
335 pages = req->datalen / nanddev_page_size(nand); in spinand_ondie_ecc_finish_io_req()
354 static void spinand_ondie_ecc_save_status(struct nand_device *nand, u8 status) in spinand_ondie_ecc_save_status() argument
356 struct spinand_ondie_ecc_conf *engine_conf = nand->ecc.ctx.priv; in spinand_ondie_ecc_save_status()
358 if (nand->ecc.ctx.conf.engine_type == NAND_ECC_ENGINE_TYPE_ON_DIE && in spinand_ondie_ecc_save_status()
373 struct nand_device *nand = spinand_to_nand(spinand); in spinand_load_page_op() local
374 unsigned int row = nanddev_pos_to_row(nand, &req->pos); in spinand_load_page_op()
383 struct nand_device *nand = spinand_to_nand(spinand); in spinand_read_from_cache_op() local
394 nbytes = nanddev_page_size(nand); in spinand_read_from_cache_op()
397 nanddev_page_size(nand)); in spinand_read_from_cache_op()
402 nbytes += nanddev_per_page_oobsize(nand); in spinand_read_from_cache_op()
405 column = nanddev_page_size(nand); in spinand_read_from_cache_op()
415 column |= req->pos.plane << fls(nanddev_page_size(nand)); in spinand_read_from_cache_op()
458 struct nand_device *nand = spinand_to_nand(spinand); in spinand_write_to_cache_op() local
475 nbytes = nanddev_page_size(nand) + nanddev_per_page_oobsize(nand); in spinand_write_to_cache_op()
476 memset(spinand->databuf, 0xff, nanddev_page_size(nand)); in spinand_write_to_cache_op()
499 column |= req->pos.plane << fls(nanddev_page_size(nand)); in spinand_write_to_cache_op()
520 struct nand_device *nand = spinand_to_nand(spinand); in spinand_program_op() local
521 unsigned int row = nanddev_pos_to_row(nand, &req->pos); in spinand_program_op()
530 struct nand_device *nand = spinand_to_nand(spinand); in spinand_erase_op() local
531 unsigned int row = nanddev_pos_to_row(nand, pos); in spinand_erase_op()
628 struct nand_device *nand = spinand_to_nand(spinand); in spinand_read_page() local
632 ret = nand_ecc_prepare_io_req(nand, (struct nand_page_io_req *)req); in spinand_read_page()
647 spinand_ondie_ecc_save_status(nand, status); in spinand_read_page()
653 return nand_ecc_finish_io_req(nand, (struct nand_page_io_req *)req); in spinand_read_page()
667 struct nand_device *nand = spinand_to_nand(spinand); in spinand_write_page() local
671 ret = nand_ecc_prepare_io_req(nand, (struct nand_page_io_req *)req); in spinand_write_page()
694 return nand_ecc_finish_io_req(nand, (struct nand_page_io_req *)req); in spinand_write_page()
702 struct nand_device *nand = mtd_to_nanddev(mtd); in spinand_mtd_regular_page_read() local
715 nanddev_io_for_each_page(nand, NAND_PAGE_READ, from, ops, &iter) { in spinand_mtd_regular_page_read()
773 struct nand_device *nand = mtd_to_nanddev(mtd); in spinand_mtd_continuous_page_read() local
790 nanddev_io_for_each_block(nand, NAND_PAGE_READ, from, ops, &iter) { in spinand_mtd_continuous_page_read()
795 ret = nand_ecc_prepare_io_req(nand, &iter.req); in spinand_mtd_continuous_page_read()
818 spinand_ondie_ecc_save_status(nand, status); in spinand_mtd_continuous_page_read()
820 ret = nand_ecc_finish_io_req(nand, &iter.req); in spinand_mtd_continuous_page_read()
843 struct nand_device *nand = spinand_to_nand(spinand); in spinand_cont_read_init() local
844 enum nand_ecc_engine_type engine_type = nand->ecc.ctx.conf.engine_type; in spinand_cont_read_init()
857 struct nand_device *nand = mtd_to_nanddev(mtd); in spinand_use_cont_read() local
858 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_use_cont_read()
868 nanddev_offs_to_pos(nand, from, &start_pos); in spinand_use_cont_read()
869 nanddev_offs_to_pos(nand, from + ops->len - 1, &end_pos); in spinand_use_cont_read()
920 struct nand_device *nand = mtd_to_nanddev(mtd); in spinand_mtd_write() local
930 nanddev_io_for_each_page(nand, NAND_PAGE_WRITE, to, ops, &iter) { in spinand_mtd_write()
951 static bool spinand_isbad(struct nand_device *nand, const struct nand_pos *pos) in spinand_isbad() argument
953 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_isbad()
981 struct nand_device *nand = mtd_to_nanddev(mtd); in spinand_mtd_block_isbad() local
982 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_mtd_block_isbad()
986 nanddev_offs_to_pos(nand, offs, &pos); in spinand_mtd_block_isbad()
988 ret = nanddev_isbad(nand, &pos); in spinand_mtd_block_isbad()
994 static int spinand_markbad(struct nand_device *nand, const struct nand_pos *pos) in spinand_markbad() argument
996 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_markbad()
1023 struct nand_device *nand = mtd_to_nanddev(mtd); in spinand_mtd_block_markbad() local
1024 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_mtd_block_markbad()
1028 nanddev_offs_to_pos(nand, offs, &pos); in spinand_mtd_block_markbad()
1030 ret = nanddev_markbad(nand, &pos); in spinand_mtd_block_markbad()
1036 static int spinand_erase(struct nand_device *nand, const struct nand_pos *pos) in spinand_erase() argument
1038 struct spinand_device *spinand = nand_to_spinand(nand); in spinand_erase()
1081 struct nand_device *nand = mtd_to_nanddev(mtd); in spinand_mtd_block_isreserved() local
1085 nanddev_offs_to_pos(nand, offs, &pos); in spinand_mtd_block_isreserved()
1087 ret = nanddev_isreserved(nand, &pos); in spinand_mtd_block_isreserved()
1096 struct nand_device *nand = spinand_to_nand(spinand); in spinand_create_dirmap() local
1098 .length = nanddev_page_size(nand) + in spinand_create_dirmap()
1099 nanddev_per_page_oobsize(nand), in spinand_create_dirmap()
1104 info.length = nanddev_eraseblock_size(nand); in spinand_create_dirmap()
1107 info.offset = plane << fls(nand->memorg.pagesize); in spinand_create_dirmap()
1125 if (nand->ecc.engine->integration != NAND_ECC_ENGINE_INTEGRATION_PIPELINED) { in spinand_create_dirmap()
1155 struct nand_device *nand = spinand_to_nand(spinand); in spinand_create_dirmaps() local
1160 nand->memorg.planes_per_lun, in spinand_create_dirmaps()
1165 for (i = 0; i < nand->memorg.planes_per_lun; i++) { in spinand_create_dirmaps()
1270 struct nand_device *nand = spinand_to_nand(spinand); in spinand_select_op_variant() local
1281 nbytes = nanddev_per_page_oobsize(nand) + in spinand_select_op_variant()
1282 nanddev_page_size(nand); in spinand_select_op_variant()
1312 * @spinand: SPI NAND object
1313 * @table: SPI NAND device description table
1318 * entry in the SPI NAND description table. If a match is found, the spinand
1330 struct nand_device *nand = spinand_to_nand(spinand); in spinand_match_and_init() local
1343 nand->memorg = table[i].memorg; in spinand_match_and_init()
1344 nanddev_set_ecc_requirements(nand, &table[i].eccreq); in spinand_match_and_init()
1382 struct nand_device *nand = spinand_to_nand(spinand); in spinand_detect() local
1396 if (nand->memorg.ntargets > 1 && !spinand->select_target) { in spinand_detect()
1403 "%s SPI NAND was found.\n", spinand->manufacturer->name); in spinand_detect()
1406 nanddev_size(nand) >> 20, nanddev_eraseblock_size(nand) >> 10, in spinand_detect()
1407 nanddev_page_size(nand), nanddev_per_page_oobsize(nand)); in spinand_detect()
1415 struct nand_device *nand = spinand_to_nand(spinand); in spinand_init_flash() local
1433 "Failed to initialize the SPI NAND chip (err = %d)\n", in spinand_init_flash()
1439 for (i = 0; i < nand->memorg.ntargets; i++) { in spinand_init_flash()
1475 struct nand_device *nand = mtd_to_nanddev(mtd); in spinand_init() local
1495 spinand->databuf = kzalloc(nanddev_eraseblock_size(nand), in spinand_init()
1502 spinand->oobbuf = spinand->databuf + nanddev_page_size(nand); in spinand_init()
1512 ret = nanddev_init(nand, &spinand_ops, THIS_MODULE); in spinand_init()
1516 /* SPI-NAND default ECC engine is on-die */ in spinand_init()
1517 nand->ecc.defaults.engine_type = NAND_ECC_ENGINE_TYPE_ON_DIE; in spinand_init()
1518 nand->ecc.ondie_engine = &spinand_ondie_ecc_engine; in spinand_init()
1521 ret = nanddev_ecc_engine_init(nand); in spinand_init()
1546 if (nand->ecc.engine) { in spinand_init()
1555 mtd->ecc_strength = nanddev_get_ecc_conf(nand)->strength; in spinand_init()
1556 mtd->ecc_step_size = nanddev_get_ecc_conf(nand)->step_size; in spinand_init()
1570 nanddev_ecc_engine_cleanup(nand); in spinand_init()
1573 nanddev_cleanup(nand); in spinand_init()
1586 struct nand_device *nand = spinand_to_nand(spinand); in spinand_cleanup() local
1588 nanddev_cleanup(nand); in spinand_cleanup()
1647 { .name = "spi-nand" },
1654 { .compatible = "spi-nand" },
1664 .name = "spi-nand",
1673 MODULE_DESCRIPTION("SPI NAND framework");