Lines Matching refs:mtd

96 static int nand_get_device(struct mtd_info *mtd, int new_state);
98 static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
107 static int check_offs_len(struct mtd_info *mtd, in check_offs_len() argument
110 struct nand_chip *chip = mtd->priv; in check_offs_len()
134 static void nand_release_device(struct mtd_info *mtd) in nand_release_device() argument
136 struct nand_chip *chip = mtd->priv; in nand_release_device()
152 static uint8_t nand_read_byte(struct mtd_info *mtd) in nand_read_byte() argument
154 struct nand_chip *chip = mtd->priv; in nand_read_byte()
165 static uint8_t nand_read_byte16(struct mtd_info *mtd) in nand_read_byte16() argument
167 struct nand_chip *chip = mtd->priv; in nand_read_byte16()
177 static u16 nand_read_word(struct mtd_info *mtd) in nand_read_word() argument
179 struct nand_chip *chip = mtd->priv; in nand_read_word()
190 static void nand_select_chip(struct mtd_info *mtd, int chipnr) in nand_select_chip() argument
192 struct nand_chip *chip = mtd->priv; in nand_select_chip()
196 chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE); in nand_select_chip()
213 static void nand_write_byte(struct mtd_info *mtd, uint8_t byte) in nand_write_byte() argument
215 struct nand_chip *chip = mtd->priv; in nand_write_byte()
217 chip->write_buf(mtd, &byte, 1); in nand_write_byte()
227 static void nand_write_byte16(struct mtd_info *mtd, uint8_t byte) in nand_write_byte16() argument
229 struct nand_chip *chip = mtd->priv; in nand_write_byte16()
248 chip->write_buf(mtd, (uint8_t *)&word, 2); in nand_write_byte16()
259 static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) in nand_write_buf() argument
261 struct nand_chip *chip = mtd->priv; in nand_write_buf()
274 static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) in nand_read_buf() argument
276 struct nand_chip *chip = mtd->priv; in nand_read_buf()
289 static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len) in nand_write_buf16() argument
291 struct nand_chip *chip = mtd->priv; in nand_write_buf16()
305 static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len) in nand_read_buf16() argument
307 struct nand_chip *chip = mtd->priv; in nand_read_buf16()
321 static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip) in nand_block_bad() argument
324 struct nand_chip *chip = mtd->priv; in nand_block_bad()
328 ofs += mtd->erasesize - mtd->writesize; in nand_block_bad()
335 nand_get_device(mtd, FL_READING); in nand_block_bad()
338 chip->select_chip(mtd, chipnr); in nand_block_bad()
343 chip->cmdfunc(mtd, NAND_CMD_READOOB, in nand_block_bad()
345 bad = cpu_to_le16(chip->read_word(mtd)); in nand_block_bad()
351 chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, in nand_block_bad()
353 bad = chip->read_byte(mtd); in nand_block_bad()
360 ofs += mtd->writesize; in nand_block_bad()
366 chip->select_chip(mtd, -1); in nand_block_bad()
367 nand_release_device(mtd); in nand_block_bad()
382 static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) in nand_default_block_markbad() argument
384 struct nand_chip *chip = mtd->priv; in nand_default_block_markbad()
402 ofs += mtd->erasesize - mtd->writesize; in nand_default_block_markbad()
404 res = nand_do_write_oob(mtd, ofs, &ops); in nand_default_block_markbad()
409 ofs += mtd->writesize; in nand_default_block_markbad()
432 static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs) in nand_block_markbad_lowlevel() argument
434 struct nand_chip *chip = mtd->priv; in nand_block_markbad_lowlevel()
442 einfo.mtd = mtd; in nand_block_markbad_lowlevel()
445 nand_erase_nand(mtd, &einfo, 0); in nand_block_markbad_lowlevel()
448 nand_get_device(mtd, FL_WRITING); in nand_block_markbad_lowlevel()
449 ret = chip->block_markbad(mtd, ofs); in nand_block_markbad_lowlevel()
450 nand_release_device(mtd); in nand_block_markbad_lowlevel()
455 res = nand_markbad_bbt(mtd, ofs); in nand_block_markbad_lowlevel()
461 mtd->ecc_stats.badblocks++; in nand_block_markbad_lowlevel()
473 static int nand_check_wp(struct mtd_info *mtd) in nand_check_wp() argument
475 struct nand_chip *chip = mtd->priv; in nand_check_wp()
482 chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); in nand_check_wp()
483 return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1; in nand_check_wp()
493 static int nand_block_isreserved(struct mtd_info *mtd, loff_t ofs) in nand_block_isreserved() argument
495 struct nand_chip *chip = mtd->priv; in nand_block_isreserved()
500 return nand_isreserved_bbt(mtd, ofs); in nand_block_isreserved()
513 static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip, in nand_block_checkbad() argument
516 struct nand_chip *chip = mtd->priv; in nand_block_checkbad()
519 return chip->block_bad(mtd, ofs, getchip); in nand_block_checkbad()
522 return nand_isbad_bbt(mtd, ofs, allowbbt); in nand_block_checkbad()
533 static void panic_nand_wait_ready(struct mtd_info *mtd, unsigned long timeo) in panic_nand_wait_ready() argument
535 struct nand_chip *chip = mtd->priv; in panic_nand_wait_ready()
540 if (chip->dev_ready(mtd)) in panic_nand_wait_ready()
548 void nand_wait_ready(struct mtd_info *mtd) in nand_wait_ready() argument
550 struct nand_chip *chip = mtd->priv; in nand_wait_ready()
555 return panic_nand_wait_ready(mtd, 400); in nand_wait_ready()
560 if (chip->dev_ready(mtd)) in nand_wait_ready()
575 static void nand_wait_status_ready(struct mtd_info *mtd, unsigned long timeo) in nand_wait_status_ready() argument
577 register struct nand_chip *chip = mtd->priv; in nand_wait_status_ready()
581 if ((chip->read_byte(mtd) & NAND_STATUS_READY)) in nand_wait_status_ready()
597 static void nand_command(struct mtd_info *mtd, unsigned int command, in nand_command() argument
600 register struct nand_chip *chip = mtd->priv; in nand_command()
607 if (column >= mtd->writesize) { in nand_command()
609 column -= mtd->writesize; in nand_command()
618 chip->cmd_ctrl(mtd, readcmd, ctrl); in nand_command()
621 chip->cmd_ctrl(mtd, command, ctrl); in nand_command()
631 chip->cmd_ctrl(mtd, column, ctrl); in nand_command()
635 chip->cmd_ctrl(mtd, page_addr, ctrl); in nand_command()
637 chip->cmd_ctrl(mtd, page_addr >> 8, ctrl); in nand_command()
640 chip->cmd_ctrl(mtd, page_addr >> 16, ctrl); in nand_command()
642 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); in nand_command()
661 chip->cmd_ctrl(mtd, NAND_CMD_STATUS, in nand_command()
663 chip->cmd_ctrl(mtd, in nand_command()
666 nand_wait_status_ready(mtd, 250); in nand_command()
686 nand_wait_ready(mtd); in nand_command()
700 static void nand_command_lp(struct mtd_info *mtd, unsigned int command, in nand_command_lp() argument
703 register struct nand_chip *chip = mtd->priv; in nand_command_lp()
707 column += mtd->writesize; in nand_command_lp()
712 chip->cmd_ctrl(mtd, command, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); in nand_command_lp()
723 chip->cmd_ctrl(mtd, column, ctrl); in nand_command_lp()
725 chip->cmd_ctrl(mtd, column >> 8, ctrl); in nand_command_lp()
728 chip->cmd_ctrl(mtd, page_addr, ctrl); in nand_command_lp()
729 chip->cmd_ctrl(mtd, page_addr >> 8, in nand_command_lp()
733 chip->cmd_ctrl(mtd, page_addr >> 16, in nand_command_lp()
737 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); in nand_command_lp()
758 chip->cmd_ctrl(mtd, NAND_CMD_STATUS, in nand_command_lp()
760 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
763 nand_wait_status_ready(mtd, 250); in nand_command_lp()
768 chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART, in nand_command_lp()
770 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
775 chip->cmd_ctrl(mtd, NAND_CMD_READSTART, in nand_command_lp()
777 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
798 nand_wait_ready(mtd); in nand_command_lp()
810 struct mtd_info *mtd, int new_state) in panic_nand_get_device() argument
825 nand_get_device(struct mtd_info *mtd, int new_state) in nand_get_device() argument
827 struct nand_chip *chip = mtd->priv; in nand_get_device()
868 static void panic_nand_wait(struct mtd_info *mtd, struct nand_chip *chip, in panic_nand_wait() argument
874 if (chip->dev_ready(mtd)) in panic_nand_wait()
877 if (chip->read_byte(mtd) & NAND_STATUS_READY) in panic_nand_wait()
893 static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip) in nand_wait() argument
907 chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); in nand_wait()
910 panic_nand_wait(mtd, chip, timeo); in nand_wait()
915 if (chip->dev_ready(mtd)) in nand_wait()
918 if (chip->read_byte(mtd) & NAND_STATUS_READY) in nand_wait()
926 status = (int)chip->read_byte(mtd); in nand_wait()
944 static int __nand_unlock(struct mtd_info *mtd, loff_t ofs, in __nand_unlock() argument
949 struct nand_chip *chip = mtd->priv; in __nand_unlock()
953 chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask); in __nand_unlock()
957 chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1, in __nand_unlock()
961 status = chip->waitfunc(mtd, chip); in __nand_unlock()
980 int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in nand_unlock() argument
984 struct nand_chip *chip = mtd->priv; in nand_unlock()
989 if (check_offs_len(mtd, ofs, len)) in nand_unlock()
993 if (ofs + len == mtd->size) in nand_unlock()
994 len -= mtd->erasesize; in nand_unlock()
996 nand_get_device(mtd, FL_UNLOCKING); in nand_unlock()
1001 chip->select_chip(mtd, chipnr); in nand_unlock()
1010 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_unlock()
1013 if (nand_check_wp(mtd)) { in nand_unlock()
1020 ret = __nand_unlock(mtd, ofs, len, 0); in nand_unlock()
1023 chip->select_chip(mtd, -1); in nand_unlock()
1024 nand_release_device(mtd); in nand_unlock()
1043 int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in nand_lock() argument
1047 struct nand_chip *chip = mtd->priv; in nand_lock()
1052 if (check_offs_len(mtd, ofs, len)) in nand_lock()
1055 nand_get_device(mtd, FL_LOCKING); in nand_lock()
1060 chip->select_chip(mtd, chipnr); in nand_lock()
1069 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_lock()
1072 if (nand_check_wp(mtd)) { in nand_lock()
1082 chip->cmdfunc(mtd, NAND_CMD_LOCK, -1, page & chip->pagemask); in nand_lock()
1085 status = chip->waitfunc(mtd, chip); in nand_lock()
1094 ret = __nand_unlock(mtd, ofs, len, 0x1); in nand_lock()
1097 chip->select_chip(mtd, -1); in nand_lock()
1098 nand_release_device(mtd); in nand_lock()
1114 static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_raw() argument
1117 chip->read_buf(mtd, buf, mtd->writesize); in nand_read_page_raw()
1119 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_raw()
1133 static int nand_read_page_raw_syndrome(struct mtd_info *mtd, in nand_read_page_raw_syndrome() argument
1143 chip->read_buf(mtd, buf, eccsize); in nand_read_page_raw_syndrome()
1147 chip->read_buf(mtd, oob, chip->ecc.prepad); in nand_read_page_raw_syndrome()
1151 chip->read_buf(mtd, oob, eccbytes); in nand_read_page_raw_syndrome()
1155 chip->read_buf(mtd, oob, chip->ecc.postpad); in nand_read_page_raw_syndrome()
1160 size = mtd->oobsize - (oob - chip->oob_poi); in nand_read_page_raw_syndrome()
1162 chip->read_buf(mtd, oob, size); in nand_read_page_raw_syndrome()
1175 static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_swecc() argument
1187 chip->ecc.read_page_raw(mtd, chip, buf, 1, page); in nand_read_page_swecc()
1190 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_swecc()
1201 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in nand_read_page_swecc()
1203 mtd->ecc_stats.failed++; in nand_read_page_swecc()
1205 mtd->ecc_stats.corrected += stat; in nand_read_page_swecc()
1221 static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_subpage() argument
1247 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_col_addr, -1); in nand_read_subpage()
1250 chip->read_buf(mtd, p, datafrag_len); in nand_read_subpage()
1254 chip->ecc.calculate(mtd, p, &chip->buffers->ecccalc[i]); in nand_read_subpage()
1267 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1); in nand_read_subpage()
1268 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_subpage()
1281 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, in nand_read_subpage()
1282 mtd->writesize + aligned_pos, -1); in nand_read_subpage()
1283 chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len); in nand_read_subpage()
1293 stat = chip->ecc.correct(mtd, p, in nand_read_subpage()
1296 mtd->ecc_stats.failed++; in nand_read_subpage()
1298 mtd->ecc_stats.corrected += stat; in nand_read_subpage()
1315 static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_hwecc() argument
1328 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_hwecc()
1329 chip->read_buf(mtd, p, eccsize); in nand_read_page_hwecc()
1330 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_hwecc()
1332 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_hwecc()
1343 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in nand_read_page_hwecc()
1345 mtd->ecc_stats.failed++; in nand_read_page_hwecc()
1347 mtd->ecc_stats.corrected += stat; in nand_read_page_hwecc()
1368 static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd, in nand_read_page_hwecc_oob_first() argument
1381 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); in nand_read_page_hwecc_oob_first()
1382 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_hwecc_oob_first()
1383 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page); in nand_read_page_hwecc_oob_first()
1391 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_hwecc_oob_first()
1392 chip->read_buf(mtd, p, eccsize); in nand_read_page_hwecc_oob_first()
1393 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_hwecc_oob_first()
1395 stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL); in nand_read_page_hwecc_oob_first()
1397 mtd->ecc_stats.failed++; in nand_read_page_hwecc_oob_first()
1399 mtd->ecc_stats.corrected += stat; in nand_read_page_hwecc_oob_first()
1417 static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_syndrome() argument
1430 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_syndrome()
1431 chip->read_buf(mtd, p, eccsize); in nand_read_page_syndrome()
1434 chip->read_buf(mtd, oob, chip->ecc.prepad); in nand_read_page_syndrome()
1438 chip->ecc.hwctl(mtd, NAND_ECC_READSYN); in nand_read_page_syndrome()
1439 chip->read_buf(mtd, oob, eccbytes); in nand_read_page_syndrome()
1440 stat = chip->ecc.correct(mtd, p, oob, NULL); in nand_read_page_syndrome()
1443 mtd->ecc_stats.failed++; in nand_read_page_syndrome()
1445 mtd->ecc_stats.corrected += stat; in nand_read_page_syndrome()
1452 chip->read_buf(mtd, oob, chip->ecc.postpad); in nand_read_page_syndrome()
1458 i = mtd->oobsize - (oob - chip->oob_poi); in nand_read_page_syndrome()
1460 chip->read_buf(mtd, oob, i); in nand_read_page_syndrome()
1522 static int nand_setup_read_retry(struct mtd_info *mtd, int retry_mode) in nand_setup_read_retry() argument
1524 struct nand_chip *chip = mtd->priv; in nand_setup_read_retry()
1534 return chip->setup_read_retry(mtd, retry_mode); in nand_setup_read_retry()
1545 static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, in nand_do_read_ops() argument
1549 struct nand_chip *chip = mtd->priv; in nand_do_read_ops()
1554 mtd->oobavail : mtd->oobsize; in nand_do_read_ops()
1563 chip->select_chip(mtd, chipnr); in nand_do_read_ops()
1568 col = (int)(from & (mtd->writesize - 1)); in nand_do_read_ops()
1575 unsigned int ecc_failures = mtd->ecc_stats.failed; in nand_do_read_ops()
1577 bytes = min(mtd->writesize - col, readlen); in nand_do_read_ops()
1578 aligned = (bytes == mtd->writesize); in nand_do_read_ops()
1596 chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page); in nand_do_read_ops()
1603 ret = chip->ecc.read_page_raw(mtd, chip, bufpoi, in nand_do_read_ops()
1608 ret = chip->ecc.read_subpage(mtd, chip, in nand_do_read_ops()
1612 ret = chip->ecc.read_page(mtd, chip, bufpoi, in nand_do_read_ops()
1626 !(mtd->ecc_stats.failed - ecc_failures) && in nand_do_read_ops()
1652 nand_wait_ready(mtd); in nand_do_read_ops()
1655 if (mtd->ecc_stats.failed - ecc_failures) { in nand_do_read_ops()
1658 ret = nand_setup_read_retry(mtd, in nand_do_read_ops()
1664 mtd->ecc_stats.failed = ecc_failures; in nand_do_read_ops()
1684 ret = nand_setup_read_retry(mtd, 0); in nand_do_read_ops()
1702 chip->select_chip(mtd, -1); in nand_do_read_ops()
1703 chip->select_chip(mtd, chipnr); in nand_do_read_ops()
1706 chip->select_chip(mtd, -1); in nand_do_read_ops()
1731 static int nand_read(struct mtd_info *mtd, loff_t from, size_t len, in nand_read() argument
1737 nand_get_device(mtd, FL_READING); in nand_read()
1742 ret = nand_do_read_ops(mtd, from, &ops); in nand_read()
1744 nand_release_device(mtd); in nand_read()
1754 static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_oob_std() argument
1757 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); in nand_read_oob_std()
1758 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_oob_std()
1769 static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_oob_syndrome() argument
1772 int length = mtd->oobsize; in nand_read_oob_syndrome()
1778 chip->cmdfunc(mtd, NAND_CMD_READ0, chip->ecc.size, page); in nand_read_oob_syndrome()
1782 if (mtd->writesize > 512) in nand_read_oob_syndrome()
1783 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, pos, -1); in nand_read_oob_syndrome()
1785 chip->cmdfunc(mtd, NAND_CMD_READ0, pos, page); in nand_read_oob_syndrome()
1789 chip->read_buf(mtd, bufpoi, toread); in nand_read_oob_syndrome()
1794 chip->read_buf(mtd, bufpoi, length); in nand_read_oob_syndrome()
1805 static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_oob_std() argument
1810 int length = mtd->oobsize; in nand_write_oob_std()
1812 chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page); in nand_write_oob_std()
1813 chip->write_buf(mtd, buf, length); in nand_write_oob_std()
1815 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_oob_std()
1817 status = chip->waitfunc(mtd, chip); in nand_write_oob_std()
1829 static int nand_write_oob_syndrome(struct mtd_info *mtd, in nand_write_oob_syndrome() argument
1833 int eccsize = chip->ecc.size, length = mtd->oobsize; in nand_write_oob_syndrome()
1848 chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page); in nand_write_oob_syndrome()
1851 if (mtd->writesize <= 512) { in nand_write_oob_syndrome()
1857 chip->write_buf(mtd, (uint8_t *)&fill, in nand_write_oob_syndrome()
1863 chip->cmdfunc(mtd, NAND_CMD_RNDIN, pos, -1); in nand_write_oob_syndrome()
1868 chip->write_buf(mtd, bufpoi, len); in nand_write_oob_syndrome()
1873 chip->write_buf(mtd, bufpoi, length); in nand_write_oob_syndrome()
1875 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_oob_syndrome()
1876 status = chip->waitfunc(mtd, chip); in nand_write_oob_syndrome()
1889 static int nand_do_read_oob(struct mtd_info *mtd, loff_t from, in nand_do_read_oob() argument
1893 struct nand_chip *chip = mtd->priv; in nand_do_read_oob()
1903 stats = mtd->ecc_stats; in nand_do_read_oob()
1908 len = mtd->oobsize; in nand_do_read_oob()
1917 if (unlikely(from >= mtd->size || in nand_do_read_oob()
1918 ops->ooboffs + readlen > ((mtd->size >> chip->page_shift) - in nand_do_read_oob()
1926 chip->select_chip(mtd, chipnr); in nand_do_read_oob()
1934 ret = chip->ecc.read_oob_raw(mtd, chip, page); in nand_do_read_oob()
1936 ret = chip->ecc.read_oob(mtd, chip, page); in nand_do_read_oob()
1949 nand_wait_ready(mtd); in nand_do_read_oob()
1963 chip->select_chip(mtd, -1); in nand_do_read_oob()
1964 chip->select_chip(mtd, chipnr); in nand_do_read_oob()
1967 chip->select_chip(mtd, -1); in nand_do_read_oob()
1974 if (mtd->ecc_stats.failed - stats.failed) in nand_do_read_oob()
1977 return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0; in nand_do_read_oob()
1988 static int nand_read_oob(struct mtd_info *mtd, loff_t from, in nand_read_oob() argument
1996 if (ops->datbuf && (from + ops->len) > mtd->size) { in nand_read_oob()
2002 nand_get_device(mtd, FL_READING); in nand_read_oob()
2015 ret = nand_do_read_oob(mtd, from, ops); in nand_read_oob()
2017 ret = nand_do_read_ops(mtd, from, ops); in nand_read_oob()
2020 nand_release_device(mtd); in nand_read_oob()
2034 static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_raw() argument
2037 chip->write_buf(mtd, buf, mtd->writesize); in nand_write_page_raw()
2039 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_page_raw()
2053 static int nand_write_page_raw_syndrome(struct mtd_info *mtd, in nand_write_page_raw_syndrome() argument
2063 chip->write_buf(mtd, buf, eccsize); in nand_write_page_raw_syndrome()
2067 chip->write_buf(mtd, oob, chip->ecc.prepad); in nand_write_page_raw_syndrome()
2071 chip->write_buf(mtd, oob, eccbytes); in nand_write_page_raw_syndrome()
2075 chip->write_buf(mtd, oob, chip->ecc.postpad); in nand_write_page_raw_syndrome()
2080 size = mtd->oobsize - (oob - chip->oob_poi); in nand_write_page_raw_syndrome()
2082 chip->write_buf(mtd, oob, size); in nand_write_page_raw_syndrome()
2093 static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_swecc() argument
2105 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_write_page_swecc()
2110 return chip->ecc.write_page_raw(mtd, chip, buf, 1); in nand_write_page_swecc()
2120 static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_hwecc() argument
2131 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_page_hwecc()
2132 chip->write_buf(mtd, p, eccsize); in nand_write_page_hwecc()
2133 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_write_page_hwecc()
2139 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_page_hwecc()
2154 static int nand_write_subpage_hwecc(struct mtd_info *mtd, in nand_write_subpage_hwecc() argument
2167 int oob_bytes = mtd->oobsize / ecc_steps; in nand_write_subpage_hwecc()
2172 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_subpage_hwecc()
2175 chip->write_buf(mtd, buf, ecc_size); in nand_write_subpage_hwecc()
2181 chip->ecc.calculate(mtd, buf, ecc_calc); in nand_write_subpage_hwecc()
2200 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_subpage_hwecc()
2216 static int nand_write_page_syndrome(struct mtd_info *mtd, in nand_write_page_syndrome() argument
2228 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_page_syndrome()
2229 chip->write_buf(mtd, p, eccsize); in nand_write_page_syndrome()
2232 chip->write_buf(mtd, oob, chip->ecc.prepad); in nand_write_page_syndrome()
2236 chip->ecc.calculate(mtd, p, oob); in nand_write_page_syndrome()
2237 chip->write_buf(mtd, oob, eccbytes); in nand_write_page_syndrome()
2241 chip->write_buf(mtd, oob, chip->ecc.postpad); in nand_write_page_syndrome()
2247 i = mtd->oobsize - (oob - chip->oob_poi); in nand_write_page_syndrome()
2249 chip->write_buf(mtd, oob, i); in nand_write_page_syndrome()
2266 static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page() argument
2274 subpage = offset || (data_len < mtd->writesize); in nand_write_page()
2278 chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page); in nand_write_page()
2281 status = chip->ecc.write_page_raw(mtd, chip, buf, in nand_write_page()
2284 status = chip->ecc.write_subpage(mtd, chip, offset, data_len, in nand_write_page()
2287 status = chip->ecc.write_page(mtd, chip, buf, oob_required); in nand_write_page()
2300 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_page()
2301 status = chip->waitfunc(mtd, chip); in nand_write_page()
2307 status = chip->errstat(mtd, chip, FL_WRITING, status, in nand_write_page()
2313 chip->cmdfunc(mtd, NAND_CMD_CACHEDPROG, -1, -1); in nand_write_page()
2314 status = chip->waitfunc(mtd, chip); in nand_write_page()
2327 static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len, in nand_fill_oob() argument
2330 struct nand_chip *chip = mtd->priv; in nand_fill_oob()
2336 memset(chip->oob_poi, 0xff, mtd->oobsize); in nand_fill_oob()
2386 static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, in nand_do_write_ops() argument
2390 struct nand_chip *chip = mtd->priv; in nand_do_write_ops()
2395 mtd->oobavail : mtd->oobsize; in nand_do_write_ops()
2413 column = to & (mtd->writesize - 1); in nand_do_write_ops()
2416 chip->select_chip(mtd, chipnr); in nand_do_write_ops()
2419 if (nand_check_wp(mtd)) { in nand_do_write_ops()
2440 int bytes = mtd->writesize; in nand_do_write_ops()
2444 int part_pagewr = (column || writelen < (mtd->writesize - 1)); in nand_do_write_ops()
2461 memset(chip->buffers->databuf, 0xff, mtd->writesize); in nand_do_write_ops()
2468 oob = nand_fill_oob(mtd, oob, len, ops); in nand_do_write_ops()
2472 memset(chip->oob_poi, 0xff, mtd->oobsize); in nand_do_write_ops()
2474 ret = chip->write_page(mtd, chip, column, bytes, wbuf, in nand_do_write_ops()
2492 chip->select_chip(mtd, -1); in nand_do_write_ops()
2493 chip->select_chip(mtd, chipnr); in nand_do_write_ops()
2502 chip->select_chip(mtd, -1); in nand_do_write_ops()
2517 static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len, in panic_nand_write() argument
2520 struct nand_chip *chip = mtd->priv; in panic_nand_write()
2525 panic_nand_wait(mtd, chip, 400); in panic_nand_write()
2528 panic_nand_get_device(chip, mtd, FL_WRITING); in panic_nand_write()
2535 ret = nand_do_write_ops(mtd, to, &ops); in panic_nand_write()
2551 static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, in nand_write() argument
2557 nand_get_device(mtd, FL_WRITING); in nand_write()
2562 ret = nand_do_write_ops(mtd, to, &ops); in nand_write()
2564 nand_release_device(mtd); in nand_write()
2576 static int nand_do_write_oob(struct mtd_info *mtd, loff_t to, in nand_do_write_oob() argument
2580 struct nand_chip *chip = mtd->priv; in nand_do_write_oob()
2588 len = mtd->oobsize; in nand_do_write_oob()
2604 if (unlikely(to >= mtd->size || in nand_do_write_oob()
2606 ((mtd->size >> chip->page_shift) - in nand_do_write_oob()
2614 chip->select_chip(mtd, chipnr); in nand_do_write_oob()
2625 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_do_write_oob()
2628 if (nand_check_wp(mtd)) { in nand_do_write_oob()
2629 chip->select_chip(mtd, -1); in nand_do_write_oob()
2637 nand_fill_oob(mtd, ops->oobbuf, ops->ooblen, ops); in nand_do_write_oob()
2640 status = chip->ecc.write_oob_raw(mtd, chip, page & chip->pagemask); in nand_do_write_oob()
2642 status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask); in nand_do_write_oob()
2644 chip->select_chip(mtd, -1); in nand_do_write_oob()
2660 static int nand_write_oob(struct mtd_info *mtd, loff_t to, in nand_write_oob() argument
2668 if (ops->datbuf && (to + ops->len) > mtd->size) { in nand_write_oob()
2674 nand_get_device(mtd, FL_WRITING); in nand_write_oob()
2687 ret = nand_do_write_oob(mtd, to, ops); in nand_write_oob()
2689 ret = nand_do_write_ops(mtd, to, ops); in nand_write_oob()
2692 nand_release_device(mtd); in nand_write_oob()
2703 static int single_erase(struct mtd_info *mtd, int page) in single_erase() argument
2705 struct nand_chip *chip = mtd->priv; in single_erase()
2707 chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page); in single_erase()
2708 chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1); in single_erase()
2710 return chip->waitfunc(mtd, chip); in single_erase()
2720 static int nand_erase(struct mtd_info *mtd, struct erase_info *instr) in nand_erase() argument
2722 return nand_erase_nand(mtd, instr, 0); in nand_erase()
2733 int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, in nand_erase_nand() argument
2737 struct nand_chip *chip = mtd->priv; in nand_erase_nand()
2744 if (check_offs_len(mtd, instr->addr, instr->len)) in nand_erase_nand()
2748 nand_get_device(mtd, FL_ERASING); in nand_erase_nand()
2758 chip->select_chip(mtd, chipnr); in nand_erase_nand()
2761 if (nand_check_wp(mtd)) { in nand_erase_nand()
2775 if (nand_block_checkbad(mtd, ((loff_t) page) << in nand_erase_nand()
2791 status = chip->erase(mtd, page & chip->pagemask); in nand_erase_nand()
2798 status = chip->errstat(mtd, chip, FL_ERASING, in nand_erase_nand()
2818 chip->select_chip(mtd, -1); in nand_erase_nand()
2819 chip->select_chip(mtd, chipnr); in nand_erase_nand()
2829 chip->select_chip(mtd, -1); in nand_erase_nand()
2830 nand_release_device(mtd); in nand_erase_nand()
2846 static void nand_sync(struct mtd_info *mtd) in nand_sync() argument
2851 nand_get_device(mtd, FL_SYNCING); in nand_sync()
2853 nand_release_device(mtd); in nand_sync()
2861 static int nand_block_isbad(struct mtd_info *mtd, loff_t offs) in nand_block_isbad() argument
2863 return nand_block_checkbad(mtd, offs, 1, 0); in nand_block_isbad()
2871 static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs) in nand_block_markbad() argument
2875 ret = nand_block_isbad(mtd, ofs); in nand_block_markbad()
2883 return nand_block_markbad_lowlevel(mtd, ofs); in nand_block_markbad()
2893 static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip, in nand_onfi_set_features() argument
2904 chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1); in nand_onfi_set_features()
2906 chip->write_byte(mtd, subfeature_param[i]); in nand_onfi_set_features()
2908 status = chip->waitfunc(mtd, chip); in nand_onfi_set_features()
2921 static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip, in nand_onfi_get_features() argument
2934 chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1); in nand_onfi_get_features()
2936 *subfeature_param++ = chip->read_byte(mtd); in nand_onfi_get_features()
2944 static int nand_suspend(struct mtd_info *mtd) in nand_suspend() argument
2946 return nand_get_device(mtd, FL_PM_SUSPENDED); in nand_suspend()
2953 static void nand_resume(struct mtd_info *mtd) in nand_resume() argument
2955 struct nand_chip *chip = mtd->priv; in nand_resume()
2958 nand_release_device(mtd); in nand_resume()
2969 static void nand_shutdown(struct mtd_info *mtd) in nand_shutdown() argument
2971 nand_get_device(mtd, FL_SHUTDOWN); in nand_shutdown()
3055 static int nand_flash_detect_ext_param_page(struct mtd_info *mtd, in nand_flash_detect_ext_param_page() argument
3072 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1); in nand_flash_detect_ext_param_page()
3075 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, in nand_flash_detect_ext_param_page()
3079 chip->read_buf(mtd, (uint8_t *)ep, len); in nand_flash_detect_ext_param_page()
3125 static int nand_setup_read_retry_micron(struct mtd_info *mtd, int retry_mode) in nand_setup_read_retry_micron() argument
3127 struct nand_chip *chip = mtd->priv; in nand_setup_read_retry_micron()
3130 return chip->onfi_set_features(mtd, chip, ONFI_FEATURE_ADDR_READ_RETRY, in nand_setup_read_retry_micron()
3152 static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, in nand_flash_detect_onfi() argument
3160 chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1); in nand_flash_detect_onfi()
3161 if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' || in nand_flash_detect_onfi()
3162 chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I') in nand_flash_detect_onfi()
3165 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1); in nand_flash_detect_onfi()
3168 ((uint8_t *)p)[j] = chip->read_byte(mtd); in nand_flash_detect_onfi()
3200 if (!mtd->name) in nand_flash_detect_onfi()
3201 mtd->name = p->model; in nand_flash_detect_onfi()
3203 mtd->writesize = le32_to_cpu(p->byte_per_page); in nand_flash_detect_onfi()
3210 mtd->erasesize = 1 << (fls(le32_to_cpu(p->pages_per_block)) - 1); in nand_flash_detect_onfi()
3211 mtd->erasesize *= mtd->writesize; in nand_flash_detect_onfi()
3213 mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page); in nand_flash_detect_onfi()
3217 chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count; in nand_flash_detect_onfi()
3237 if (mtd->writesize > 512 && chip->cmdfunc == nand_command) in nand_flash_detect_onfi()
3241 if (nand_flash_detect_ext_param_page(mtd, chip, p)) in nand_flash_detect_onfi()
3256 static int nand_flash_detect_jedec(struct mtd_info *mtd, struct nand_chip *chip, in nand_flash_detect_jedec() argument
3265 chip->cmdfunc(mtd, NAND_CMD_READID, 0x40, -1); in nand_flash_detect_jedec()
3266 if (chip->read_byte(mtd) != 'J' || chip->read_byte(mtd) != 'E' || in nand_flash_detect_jedec()
3267 chip->read_byte(mtd) != 'D' || chip->read_byte(mtd) != 'E' || in nand_flash_detect_jedec()
3268 chip->read_byte(mtd) != 'C') in nand_flash_detect_jedec()
3271 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0x40, -1); in nand_flash_detect_jedec()
3274 ((uint8_t *)p)[j] = chip->read_byte(mtd); in nand_flash_detect_jedec()
3300 if (!mtd->name) in nand_flash_detect_jedec()
3301 mtd->name = p->model; in nand_flash_detect_jedec()
3303 mtd->writesize = le32_to_cpu(p->byte_per_page); in nand_flash_detect_jedec()
3306 mtd->erasesize = 1 << (fls(le32_to_cpu(p->pages_per_block)) - 1); in nand_flash_detect_jedec()
3307 mtd->erasesize *= mtd->writesize; in nand_flash_detect_jedec()
3309 mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page); in nand_flash_detect_jedec()
3313 chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count; in nand_flash_detect_jedec()
3408 static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip, in nand_decode_ext_id() argument
3431 mtd->writesize = 2048 << (extid & 0x03); in nand_decode_ext_id()
3436 mtd->oobsize = 128; in nand_decode_ext_id()
3439 mtd->oobsize = 218; in nand_decode_ext_id()
3442 mtd->oobsize = 400; in nand_decode_ext_id()
3445 mtd->oobsize = 436; in nand_decode_ext_id()
3448 mtd->oobsize = 512; in nand_decode_ext_id()
3451 mtd->oobsize = 640; in nand_decode_ext_id()
3455 mtd->oobsize = 1024; in nand_decode_ext_id()
3460 mtd->erasesize = (128 * 1024) << in nand_decode_ext_id()
3468 mtd->writesize = 2048 << (extid & 0x03); in nand_decode_ext_id()
3473 mtd->oobsize = 128; in nand_decode_ext_id()
3476 mtd->oobsize = 224; in nand_decode_ext_id()
3479 mtd->oobsize = 448; in nand_decode_ext_id()
3482 mtd->oobsize = 64; in nand_decode_ext_id()
3485 mtd->oobsize = 32; in nand_decode_ext_id()
3488 mtd->oobsize = 16; in nand_decode_ext_id()
3491 mtd->oobsize = 640; in nand_decode_ext_id()
3498 mtd->erasesize = (128 * 1024) << tmp; in nand_decode_ext_id()
3500 mtd->erasesize = 768 * 1024; in nand_decode_ext_id()
3502 mtd->erasesize = (64 * 1024) << tmp; in nand_decode_ext_id()
3506 mtd->writesize = 1024 << (extid & 0x03); in nand_decode_ext_id()
3509 mtd->oobsize = (8 << (extid & 0x01)) * in nand_decode_ext_id()
3510 (mtd->writesize >> 9); in nand_decode_ext_id()
3513 mtd->erasesize = (64 * 1024) << (extid & 0x03); in nand_decode_ext_id()
3530 mtd->oobsize = 32 * mtd->writesize >> 9; in nand_decode_ext_id()
3541 static void nand_decode_id(struct mtd_info *mtd, struct nand_chip *chip, in nand_decode_id() argument
3547 mtd->erasesize = type->erasesize; in nand_decode_id()
3548 mtd->writesize = type->pagesize; in nand_decode_id()
3549 mtd->oobsize = mtd->writesize / 32; in nand_decode_id()
3563 && mtd->writesize == 512) { in nand_decode_id()
3564 mtd->erasesize = 128 * 1024; in nand_decode_id()
3565 mtd->erasesize <<= ((id_data[3] & 0x03) << 1); in nand_decode_id()
3574 static void nand_decode_bbm_options(struct mtd_info *mtd, in nand_decode_bbm_options() argument
3580 if (mtd->writesize > 512 || (chip->options & NAND_BUSWIDTH_16)) in nand_decode_bbm_options()
3601 (mtd->writesize == 2048 && in nand_decode_bbm_options()
3611 static bool find_full_id_nand(struct mtd_info *mtd, struct nand_chip *chip, in find_full_id_nand() argument
3615 mtd->writesize = type->pagesize; in find_full_id_nand()
3616 mtd->erasesize = type->erasesize; in find_full_id_nand()
3617 mtd->oobsize = type->oobsize; in find_full_id_nand()
3629 if (!mtd->name) in find_full_id_nand()
3630 mtd->name = type->name; in find_full_id_nand()
3640 static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, in nand_get_flash_type() argument
3650 chip->select_chip(mtd, 0); in nand_get_flash_type()
3656 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_get_flash_type()
3659 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_get_flash_type()
3662 *maf_id = chip->read_byte(mtd); in nand_get_flash_type()
3663 *dev_id = chip->read_byte(mtd); in nand_get_flash_type()
3672 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_get_flash_type()
3676 id_data[i] = chip->read_byte(mtd); in nand_get_flash_type()
3689 if (find_full_id_nand(mtd, chip, type, id_data, &busw)) in nand_get_flash_type()
3699 if (nand_flash_detect_onfi(mtd, chip, &busw)) in nand_get_flash_type()
3703 if (nand_flash_detect_jedec(mtd, chip, &busw)) in nand_get_flash_type()
3710 if (!mtd->name) in nand_get_flash_type()
3711 mtd->name = type->name; in nand_get_flash_type()
3717 busw = chip->init_size(mtd, chip, id_data); in nand_get_flash_type()
3720 nand_decode_ext_id(mtd, chip, id_data, &busw); in nand_get_flash_type()
3722 nand_decode_id(mtd, chip, type, id_data, &busw); in nand_get_flash_type()
3752 pr_info("%s %s\n", nand_manuf_ids[maf_idx].name, mtd->name); in nand_get_flash_type()
3759 nand_decode_bbm_options(mtd, chip, id_data); in nand_get_flash_type()
3762 chip->page_shift = ffs(mtd->writesize) - 1; in nand_get_flash_type()
3767 ffs(mtd->erasesize) - 1; in nand_get_flash_type()
3779 if (mtd->writesize > 512 && chip->cmdfunc == nand_command) in nand_get_flash_type()
3797 mtd->erasesize >> 10, mtd->writesize, mtd->oobsize); in nand_get_flash_type()
3812 int nand_scan_ident(struct mtd_info *mtd, int maxchips, in nand_scan_ident() argument
3816 struct nand_chip *chip = mtd->priv; in nand_scan_ident()
3823 type = nand_get_flash_type(mtd, chip, &nand_maf_id, in nand_scan_ident()
3829 chip->select_chip(mtd, -1); in nand_scan_ident()
3833 chip->select_chip(mtd, -1); in nand_scan_ident()
3837 chip->select_chip(mtd, i); in nand_scan_ident()
3839 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_scan_ident()
3841 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_scan_ident()
3843 if (nand_maf_id != chip->read_byte(mtd) || in nand_scan_ident()
3844 nand_dev_id != chip->read_byte(mtd)) { in nand_scan_ident()
3845 chip->select_chip(mtd, -1); in nand_scan_ident()
3848 chip->select_chip(mtd, -1); in nand_scan_ident()
3855 mtd->size = i * chip->chipsize; in nand_scan_ident()
3875 static bool nand_ecc_strength_good(struct mtd_info *mtd) in nand_ecc_strength_good() argument
3877 struct nand_chip *chip = mtd->priv; in nand_ecc_strength_good()
3889 corr = (mtd->writesize * ecc->strength) / ecc->size; in nand_ecc_strength_good()
3890 ds_corr = (mtd->writesize * chip->ecc_strength_ds) / chip->ecc_step_ds; in nand_ecc_strength_good()
3903 int nand_scan_tail(struct mtd_info *mtd) in nand_scan_tail() argument
3906 struct nand_chip *chip = mtd->priv; in nand_scan_tail()
3915 nbuf = kzalloc(sizeof(*nbuf) + mtd->writesize in nand_scan_tail()
3916 + mtd->oobsize * 3, GFP_KERNEL); in nand_scan_tail()
3920 nbuf->ecccode = nbuf->ecccalc + mtd->oobsize; in nand_scan_tail()
3921 nbuf->databuf = nbuf->ecccode + mtd->oobsize; in nand_scan_tail()
3930 chip->oob_poi = chip->buffers->databuf + mtd->writesize; in nand_scan_tail()
3936 switch (mtd->oobsize) { in nand_scan_tail()
3951 mtd->oobsize); in nand_scan_tail()
4016 if (mtd->writesize >= ecc->size) { in nand_scan_tail()
4024 ecc->size, mtd->writesize); in nand_scan_tail()
4062 if (!ecc->size && (mtd->oobsize >= 64)) { in nand_scan_tail()
4070 ecc->priv = nand_bch_init(mtd, ecc->size, ecc->bytes, in nand_scan_tail()
4086 ecc->size = mtd->writesize; in nand_scan_tail()
4110 mtd->oobavail = ecc->layout->oobavail; in nand_scan_tail()
4113 if (!nand_ecc_strength_good(mtd)) in nand_scan_tail()
4115 mtd->name); in nand_scan_tail()
4121 ecc->steps = mtd->writesize / ecc->size; in nand_scan_tail()
4122 if (ecc->steps * ecc->size != mtd->writesize) { in nand_scan_tail()
4132 mtd->subpage_sft = 1; in nand_scan_tail()
4137 mtd->subpage_sft = 2; in nand_scan_tail()
4141 chip->subpagesize = mtd->writesize >> mtd->subpage_sft; in nand_scan_tail()
4162 mtd->type = nand_is_slc(chip) ? MTD_NANDFLASH : MTD_MLCNANDFLASH; in nand_scan_tail()
4163 mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM : in nand_scan_tail()
4165 mtd->_erase = nand_erase; in nand_scan_tail()
4166 mtd->_point = NULL; in nand_scan_tail()
4167 mtd->_unpoint = NULL; in nand_scan_tail()
4168 mtd->_read = nand_read; in nand_scan_tail()
4169 mtd->_write = nand_write; in nand_scan_tail()
4170 mtd->_panic_write = panic_nand_write; in nand_scan_tail()
4171 mtd->_read_oob = nand_read_oob; in nand_scan_tail()
4172 mtd->_write_oob = nand_write_oob; in nand_scan_tail()
4173 mtd->_sync = nand_sync; in nand_scan_tail()
4174 mtd->_lock = NULL; in nand_scan_tail()
4175 mtd->_unlock = NULL; in nand_scan_tail()
4176 mtd->_suspend = nand_suspend; in nand_scan_tail()
4177 mtd->_resume = nand_resume; in nand_scan_tail()
4178 mtd->_reboot = nand_shutdown; in nand_scan_tail()
4179 mtd->_block_isreserved = nand_block_isreserved; in nand_scan_tail()
4180 mtd->_block_isbad = nand_block_isbad; in nand_scan_tail()
4181 mtd->_block_markbad = nand_block_markbad; in nand_scan_tail()
4182 mtd->writebufsize = mtd->writesize; in nand_scan_tail()
4185 mtd->ecclayout = ecc->layout; in nand_scan_tail()
4186 mtd->ecc_strength = ecc->strength; in nand_scan_tail()
4187 mtd->ecc_step_size = ecc->size; in nand_scan_tail()
4193 if (!mtd->bitflip_threshold) in nand_scan_tail()
4194 mtd->bitflip_threshold = DIV_ROUND_UP(mtd->ecc_strength * 3, 4); in nand_scan_tail()
4201 return chip->scan_bbt(mtd); in nand_scan_tail()
4227 int nand_scan(struct mtd_info *mtd, int maxchips) in nand_scan() argument
4232 if (!mtd->owner && caller_is_module()) { in nand_scan()
4237 ret = nand_scan_ident(mtd, maxchips, NULL); in nand_scan()
4239 ret = nand_scan_tail(mtd); in nand_scan()
4248 void nand_release(struct mtd_info *mtd) in nand_release() argument
4250 struct nand_chip *chip = mtd->priv; in nand_release()
4255 mtd_device_unregister(mtd); in nand_release()