Lines Matching defs:nand
92 /* nand flash controller delay 3 ns */
110 struct nand_chip nand;
219 static struct meson_nfc_nand_chip *to_meson_nand(struct nand_chip *nand)
221 return container_of(nand, struct meson_nfc_nand_chip, nand);
224 static void meson_nfc_select_chip(struct nand_chip *nand, int chip)
226 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
227 struct meson_nfc *nfc = nand_get_controller_data(nand);
267 static void meson_nfc_cmd_access(struct nand_chip *nand, int raw, bool dir,
270 struct mtd_info *mtd = nand_to_mtd(nand);
272 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
276 pagesize = nand->ecc.size;
285 pages = len / nand->ecc.size;
333 static u8 *meson_nfc_oob_ptr(struct nand_chip *nand, int i)
335 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
338 len = nand->ecc.size * (i + 1) + (nand->ecc.bytes + 2) * i;
343 static u8 *meson_nfc_data_ptr(struct nand_chip *nand, int i)
345 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
348 temp = nand->ecc.size + nand->ecc.bytes;
354 static void meson_nfc_get_data_oob(struct nand_chip *nand,
360 oob_len = nand->ecc.bytes + 2;
361 for (i = 0; i < nand->ecc.steps; i++) {
363 dsrc = meson_nfc_data_ptr(nand, i);
364 memcpy(buf, dsrc, nand->ecc.size);
365 buf += nand->ecc.size;
367 osrc = meson_nfc_oob_ptr(nand, i);
373 static void meson_nfc_set_data_oob(struct nand_chip *nand,
379 oob_len = nand->ecc.bytes + 2;
380 for (i = 0; i < nand->ecc.steps; i++) {
382 dsrc = meson_nfc_data_ptr(nand, i);
383 memcpy(dsrc, buf, nand->ecc.size);
384 buf += nand->ecc.size;
386 osrc = meson_nfc_oob_ptr(nand, i);
420 static void meson_nfc_set_user_byte(struct nand_chip *nand, u8 *oob_buf)
422 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
426 for (i = 0, count = 0; i < nand->ecc.steps; i++, count += 2) {
433 static void meson_nfc_get_user_byte(struct nand_chip *nand, u8 *oob_buf)
435 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
439 for (i = 0, count = 0; i < nand->ecc.steps; i++, count += 2) {
446 static int meson_nfc_ecc_correct(struct nand_chip *nand, u32 *bitflips,
449 struct mtd_info *mtd = nand_to_mtd(nand);
450 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
454 for (i = 0; i < nand->ecc.steps; i++) {
462 if ((nand->options & NAND_NEED_SCRAMBLING) &&
463 ECC_ZERO_CNT(*info) < nand->ecc.strength) {
475 static int meson_nfc_dma_buffer_setup(struct nand_chip *nand, void *databuf,
479 struct meson_nfc *nfc = nand_get_controller_data(nand);
515 static void meson_nfc_dma_buffer_release(struct nand_chip *nand,
519 struct meson_nfc *nfc = nand_get_controller_data(nand);
528 static int meson_nfc_read_buf(struct nand_chip *nand, u8 *buf, int len)
530 struct meson_nfc *nfc = nand_get_controller_data(nand);
539 ret = meson_nfc_dma_buffer_setup(nand, buf, len, info,
549 meson_nfc_dma_buffer_release(nand, len, PER_INFO_BYTE, DMA_FROM_DEVICE);
557 static int meson_nfc_write_buf(struct nand_chip *nand, u8 *buf, int len)
559 struct meson_nfc *nfc = nand_get_controller_data(nand);
563 ret = meson_nfc_dma_buffer_setup(nand, buf, len, NULL,
573 meson_nfc_dma_buffer_release(nand, len, 0, DMA_TO_DEVICE);
578 static int meson_nfc_rw_cmd_prepare_and_execute(struct nand_chip *nand,
582 nand_get_sdr_timings(nand_get_interface_config(nand));
583 struct mtd_info *mtd = nand_to_mtd(nand);
584 struct meson_nfc *nfc = nand_get_controller_data(nand);
607 if (nand->options & NAND_ROW_ADDR_3)
631 static int meson_nfc_write_page_sub(struct nand_chip *nand,
635 nand_get_sdr_timings(nand_get_interface_config(nand));
636 struct mtd_info *mtd = nand_to_mtd(nand);
637 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
638 struct meson_nfc *nfc = nand_get_controller_data(nand);
643 meson_nfc_select_chip(nand, nand->cur_cs);
646 info_len = nand->ecc.steps * PER_INFO_BYTE;
648 ret = meson_nfc_rw_cmd_prepare_and_execute(nand, page, DIRWRITE);
652 ret = meson_nfc_dma_buffer_setup(nand, meson_chip->data_buf,
658 if (nand->options & NAND_NEED_SCRAMBLING) {
660 meson_nfc_cmd_access(nand, raw, DIRWRITE,
663 meson_nfc_cmd_access(nand, raw, DIRWRITE,
671 meson_nfc_dma_buffer_release(nand, data_len, info_len, DMA_TO_DEVICE);
676 static int meson_nfc_write_page_raw(struct nand_chip *nand, const u8 *buf,
679 u8 *oob_buf = nand->oob_poi;
681 meson_nfc_set_data_oob(nand, buf, oob_buf);
683 return meson_nfc_write_page_sub(nand, page, 1);
686 static int meson_nfc_write_page_hwecc(struct nand_chip *nand,
689 struct mtd_info *mtd = nand_to_mtd(nand);
690 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
691 u8 *oob_buf = nand->oob_poi;
694 memset(meson_chip->info_buf, 0, nand->ecc.steps * PER_INFO_BYTE);
695 meson_nfc_set_user_byte(nand, oob_buf);
697 return meson_nfc_write_page_sub(nand, page, 0);
701 struct nand_chip *nand, int raw)
703 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
708 neccpages = raw ? 1 : nand->ecc.steps;
720 static int meson_nfc_read_page_sub(struct nand_chip *nand,
723 struct mtd_info *mtd = nand_to_mtd(nand);
724 struct meson_nfc *nfc = nand_get_controller_data(nand);
725 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
729 meson_nfc_select_chip(nand, nand->cur_cs);
732 info_len = nand->ecc.steps * PER_INFO_BYTE;
734 ret = meson_nfc_rw_cmd_prepare_and_execute(nand, page, DIRREAD);
738 ret = meson_nfc_dma_buffer_setup(nand, meson_chip->data_buf,
744 if (nand->options & NAND_NEED_SCRAMBLING) {
746 meson_nfc_cmd_access(nand, raw, DIRREAD,
749 meson_nfc_cmd_access(nand, raw, DIRREAD,
754 meson_nfc_check_ecc_pages_valid(nfc, nand, raw);
756 meson_nfc_dma_buffer_release(nand, data_len, info_len, DMA_FROM_DEVICE);
761 static int meson_nfc_read_page_raw(struct nand_chip *nand, u8 *buf,
764 u8 *oob_buf = nand->oob_poi;
767 ret = meson_nfc_read_page_sub(nand, page, 1);
771 meson_nfc_get_data_oob(nand, buf, oob_buf);
776 static int meson_nfc_read_page_hwecc(struct nand_chip *nand, u8 *buf,
779 struct mtd_info *mtd = nand_to_mtd(nand);
780 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
781 struct nand_ecc_ctrl *ecc = &nand->ecc;
784 u8 *oob_buf = nand->oob_poi;
787 ret = meson_nfc_read_page_sub(nand, page, 0);
791 meson_nfc_get_user_byte(nand, oob_buf);
792 ret = meson_nfc_ecc_correct(nand, &bitflips, &correct_bitmap);
798 if ((nand->options & NAND_NEED_SCRAMBLING) || !buf) {
802 ret = meson_nfc_read_page_raw(nand, buf, 0, page);
806 for (i = 0; i < nand->ecc.steps ; i++) {
808 u8 *oob = nand->oob_poi + i * (ecc->bytes + 2);
830 static int meson_nfc_read_oob_raw(struct nand_chip *nand, int page)
832 return meson_nfc_read_page_raw(nand, NULL, 1, page);
835 static int meson_nfc_read_oob(struct nand_chip *nand, int page)
837 return meson_nfc_read_page_hwecc(nand, NULL, 1, page);
902 static int meson_nfc_exec_op(struct nand_chip *nand,
905 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
906 struct meson_nfc *nfc = nand_get_controller_data(nand);
915 meson_nfc_select_chip(nand, op->cs);
942 meson_nfc_read_buf(nand, buf, instr->ctx.data.len);
950 meson_nfc_write_buf(nand, buf, instr->ctx.data.len);
968 struct nand_chip *nand = mtd_to_nand(mtd);
970 if (section >= nand->ecc.steps)
973 oobregion->offset = 2 + (section * (2 + nand->ecc.bytes));
974 oobregion->length = nand->ecc.bytes;
982 struct nand_chip *nand = mtd_to_nand(mtd);
984 if (section >= nand->ecc.steps)
987 oobregion->offset = section * (2 + nand->ecc.bytes);
1080 static void meson_nfc_free_buffer(struct nand_chip *nand)
1082 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
1088 static int meson_chip_buffer_init(struct nand_chip *nand)
1090 struct mtd_info *mtd = nand_to_mtd(nand);
1091 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
1094 nsectors = mtd->writesize / nand->ecc.size;
1113 int meson_nfc_setup_interface(struct nand_chip *nand, int csline,
1116 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
1155 static int meson_nand_bch_mode(struct nand_chip *nand)
1157 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
1160 if (nand->ecc.strength > 60 || nand->ecc.strength < 8)
1164 if (meson_ecc[i].strength == nand->ecc.strength) {
1173 static void meson_nand_detach_chip(struct nand_chip *nand)
1175 meson_nfc_free_buffer(nand);
1178 static int meson_nand_attach_chip(struct nand_chip *nand)
1180 struct meson_nfc *nfc = nand_get_controller_data(nand);
1181 struct meson_nfc_nand_chip *meson_chip = to_meson_nand(nand);
1182 struct mtd_info *mtd = nand_to_mtd(nand);
1187 "%s:nand%d",
1194 if (nand->bbt_options & NAND_BBT_USE_FLASH)
1195 nand->bbt_options |= NAND_BBT_NO_OOB;
1197 nand->options |= NAND_NO_SUBPAGE_WRITE;
1199 ret = nand_ecc_choose_conf(nand, nfc->data->ecc_caps,
1208 ret = meson_nand_bch_mode(nand);
1212 nand->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
1213 nand->ecc.write_page_raw = meson_nfc_write_page_raw;
1214 nand->ecc.write_page = meson_nfc_write_page_hwecc;
1215 nand->ecc.write_oob_raw = nand_write_oob_std;
1216 nand->ecc.write_oob = nand_write_oob_std;
1218 nand->ecc.read_page_raw = meson_nfc_read_page_raw;
1219 nand->ecc.read_page = meson_nfc_read_page_hwecc;
1220 nand->ecc.read_oob_raw = meson_nfc_read_oob_raw;
1221 nand->ecc.read_oob = meson_nfc_read_oob;
1223 if (nand->options & NAND_BUSWIDTH_16) {
1227 ret = meson_chip_buffer_init(nand);
1246 struct nand_chip *nand;
1278 nand = &meson_chip->nand;
1279 nand->controller = &nfc->controller;
1280 nand->controller->ops = &meson_nand_controller_ops;
1281 nand_set_flash_node(nand, np);
1282 nand_set_controller_data(nand, nfc);
1284 nand->options |= NAND_USES_DMA;
1285 mtd = nand_to_mtd(nand);
1289 ret = nand_scan(nand, nsels);
1296 nand_cleanup(nand);
1314 mtd = nand_to_mtd(&meson_chip->nand);
1319 nand_cleanup(&meson_chip->nand);
1473 .name = "meson-nand",