Lines Matching refs:mtd

95 static int nand_get_device(struct mtd_info *mtd, int new_state);
97 static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
106 static int check_offs_len(struct mtd_info *mtd, in check_offs_len() argument
109 struct nand_chip *chip = mtd->priv; in check_offs_len()
133 static void nand_release_device(struct mtd_info *mtd) in nand_release_device() argument
135 struct nand_chip *chip = mtd->priv; in nand_release_device()
151 static uint8_t nand_read_byte(struct mtd_info *mtd) in nand_read_byte() argument
153 struct nand_chip *chip = mtd->priv; in nand_read_byte()
164 static uint8_t nand_read_byte16(struct mtd_info *mtd) in nand_read_byte16() argument
166 struct nand_chip *chip = mtd->priv; in nand_read_byte16()
176 static u16 nand_read_word(struct mtd_info *mtd) in nand_read_word() argument
178 struct nand_chip *chip = mtd->priv; in nand_read_word()
189 static void nand_select_chip(struct mtd_info *mtd, int chipnr) in nand_select_chip() argument
191 struct nand_chip *chip = mtd->priv; in nand_select_chip()
195 chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE); in nand_select_chip()
212 static void nand_write_byte(struct mtd_info *mtd, uint8_t byte) in nand_write_byte() argument
214 struct nand_chip *chip = mtd->priv; in nand_write_byte()
216 chip->write_buf(mtd, &byte, 1); in nand_write_byte()
226 static void nand_write_byte16(struct mtd_info *mtd, uint8_t byte) in nand_write_byte16() argument
228 struct nand_chip *chip = mtd->priv; in nand_write_byte16()
247 chip->write_buf(mtd, (uint8_t *)&word, 2); in nand_write_byte16()
258 static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len) in nand_write_buf() argument
260 struct nand_chip *chip = mtd->priv; in nand_write_buf()
273 static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len) in nand_read_buf() argument
275 struct nand_chip *chip = mtd->priv; in nand_read_buf()
288 static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len) in nand_write_buf16() argument
290 struct nand_chip *chip = mtd->priv; in nand_write_buf16()
304 static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len) in nand_read_buf16() argument
306 struct nand_chip *chip = mtd->priv; in nand_read_buf16()
320 static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip) in nand_block_bad() argument
323 struct nand_chip *chip = mtd->priv; in nand_block_bad()
327 ofs += mtd->erasesize - mtd->writesize; in nand_block_bad()
334 nand_get_device(mtd, FL_READING); in nand_block_bad()
337 chip->select_chip(mtd, chipnr); in nand_block_bad()
342 chip->cmdfunc(mtd, NAND_CMD_READOOB, in nand_block_bad()
344 bad = cpu_to_le16(chip->read_word(mtd)); in nand_block_bad()
350 chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, in nand_block_bad()
352 bad = chip->read_byte(mtd); in nand_block_bad()
359 ofs += mtd->writesize; in nand_block_bad()
365 chip->select_chip(mtd, -1); in nand_block_bad()
366 nand_release_device(mtd); in nand_block_bad()
381 static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) in nand_default_block_markbad() argument
383 struct nand_chip *chip = mtd->priv; in nand_default_block_markbad()
401 ofs += mtd->erasesize - mtd->writesize; in nand_default_block_markbad()
403 res = nand_do_write_oob(mtd, ofs, &ops); in nand_default_block_markbad()
408 ofs += mtd->writesize; in nand_default_block_markbad()
431 static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs) in nand_block_markbad_lowlevel() argument
433 struct nand_chip *chip = mtd->priv; in nand_block_markbad_lowlevel()
441 einfo.mtd = mtd; in nand_block_markbad_lowlevel()
444 nand_erase_nand(mtd, &einfo, 0); in nand_block_markbad_lowlevel()
447 nand_get_device(mtd, FL_WRITING); in nand_block_markbad_lowlevel()
448 ret = chip->block_markbad(mtd, ofs); in nand_block_markbad_lowlevel()
449 nand_release_device(mtd); in nand_block_markbad_lowlevel()
454 res = nand_markbad_bbt(mtd, ofs); in nand_block_markbad_lowlevel()
460 mtd->ecc_stats.badblocks++; in nand_block_markbad_lowlevel()
472 static int nand_check_wp(struct mtd_info *mtd) in nand_check_wp() argument
474 struct nand_chip *chip = mtd->priv; in nand_check_wp()
481 chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); in nand_check_wp()
482 return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1; in nand_check_wp()
492 static int nand_block_isreserved(struct mtd_info *mtd, loff_t ofs) in nand_block_isreserved() argument
494 struct nand_chip *chip = mtd->priv; in nand_block_isreserved()
499 return nand_isreserved_bbt(mtd, ofs); in nand_block_isreserved()
512 static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip, in nand_block_checkbad() argument
515 struct nand_chip *chip = mtd->priv; in nand_block_checkbad()
518 return chip->block_bad(mtd, ofs, getchip); in nand_block_checkbad()
521 return nand_isbad_bbt(mtd, ofs, allowbbt); in nand_block_checkbad()
532 static void panic_nand_wait_ready(struct mtd_info *mtd, unsigned long timeo) in panic_nand_wait_ready() argument
534 struct nand_chip *chip = mtd->priv; in panic_nand_wait_ready()
539 if (chip->dev_ready(mtd)) in panic_nand_wait_ready()
552 void nand_wait_ready(struct mtd_info *mtd) in nand_wait_ready() argument
554 struct nand_chip *chip = mtd->priv; in nand_wait_ready()
558 return panic_nand_wait_ready(mtd, timeo); in nand_wait_ready()
564 if (chip->dev_ready(mtd)) in nand_wait_ready()
583 static void nand_wait_status_ready(struct mtd_info *mtd, unsigned long timeo) in nand_wait_status_ready() argument
585 register struct nand_chip *chip = mtd->priv; in nand_wait_status_ready()
589 if ((chip->read_byte(mtd) & NAND_STATUS_READY)) in nand_wait_status_ready()
605 static void nand_command(struct mtd_info *mtd, unsigned int command, in nand_command() argument
608 register struct nand_chip *chip = mtd->priv; in nand_command()
615 if (column >= mtd->writesize) { in nand_command()
617 column -= mtd->writesize; in nand_command()
626 chip->cmd_ctrl(mtd, readcmd, ctrl); in nand_command()
629 chip->cmd_ctrl(mtd, command, ctrl); in nand_command()
639 chip->cmd_ctrl(mtd, column, ctrl); in nand_command()
643 chip->cmd_ctrl(mtd, page_addr, ctrl); in nand_command()
645 chip->cmd_ctrl(mtd, page_addr >> 8, ctrl); in nand_command()
648 chip->cmd_ctrl(mtd, page_addr >> 16, ctrl); in nand_command()
650 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); in nand_command()
669 chip->cmd_ctrl(mtd, NAND_CMD_STATUS, in nand_command()
671 chip->cmd_ctrl(mtd, in nand_command()
674 nand_wait_status_ready(mtd, 250); in nand_command()
694 nand_wait_ready(mtd); in nand_command()
708 static void nand_command_lp(struct mtd_info *mtd, unsigned int command, in nand_command_lp() argument
711 register struct nand_chip *chip = mtd->priv; in nand_command_lp()
715 column += mtd->writesize; in nand_command_lp()
720 chip->cmd_ctrl(mtd, command, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE); in nand_command_lp()
731 chip->cmd_ctrl(mtd, column, ctrl); in nand_command_lp()
733 chip->cmd_ctrl(mtd, column >> 8, ctrl); in nand_command_lp()
736 chip->cmd_ctrl(mtd, page_addr, ctrl); in nand_command_lp()
737 chip->cmd_ctrl(mtd, page_addr >> 8, in nand_command_lp()
741 chip->cmd_ctrl(mtd, page_addr >> 16, in nand_command_lp()
745 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); in nand_command_lp()
766 chip->cmd_ctrl(mtd, NAND_CMD_STATUS, in nand_command_lp()
768 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
771 nand_wait_status_ready(mtd, 250); in nand_command_lp()
776 chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART, in nand_command_lp()
778 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
783 chip->cmd_ctrl(mtd, NAND_CMD_READSTART, in nand_command_lp()
785 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
806 nand_wait_ready(mtd); in nand_command_lp()
818 struct mtd_info *mtd, int new_state) in panic_nand_get_device() argument
833 nand_get_device(struct mtd_info *mtd, int new_state) in nand_get_device() argument
835 struct nand_chip *chip = mtd->priv; in nand_get_device()
876 static void panic_nand_wait(struct mtd_info *mtd, struct nand_chip *chip, in panic_nand_wait() argument
882 if (chip->dev_ready(mtd)) in panic_nand_wait()
885 if (chip->read_byte(mtd) & NAND_STATUS_READY) in panic_nand_wait()
899 static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip) in nand_wait() argument
913 chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); in nand_wait()
916 panic_nand_wait(mtd, chip, timeo); in nand_wait()
921 if (chip->dev_ready(mtd)) in nand_wait()
924 if (chip->read_byte(mtd) & NAND_STATUS_READY) in nand_wait()
932 status = (int)chip->read_byte(mtd); in nand_wait()
950 static int __nand_unlock(struct mtd_info *mtd, loff_t ofs, in __nand_unlock() argument
955 struct nand_chip *chip = mtd->priv; in __nand_unlock()
959 chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask); in __nand_unlock()
963 chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1, in __nand_unlock()
967 status = chip->waitfunc(mtd, chip); in __nand_unlock()
986 int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in nand_unlock() argument
990 struct nand_chip *chip = mtd->priv; in nand_unlock()
995 if (check_offs_len(mtd, ofs, len)) in nand_unlock()
999 if (ofs + len == mtd->size) in nand_unlock()
1000 len -= mtd->erasesize; in nand_unlock()
1002 nand_get_device(mtd, FL_UNLOCKING); in nand_unlock()
1007 chip->select_chip(mtd, chipnr); in nand_unlock()
1016 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_unlock()
1019 if (nand_check_wp(mtd)) { in nand_unlock()
1026 ret = __nand_unlock(mtd, ofs, len, 0); in nand_unlock()
1029 chip->select_chip(mtd, -1); in nand_unlock()
1030 nand_release_device(mtd); in nand_unlock()
1049 int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in nand_lock() argument
1053 struct nand_chip *chip = mtd->priv; in nand_lock()
1058 if (check_offs_len(mtd, ofs, len)) in nand_lock()
1061 nand_get_device(mtd, FL_LOCKING); in nand_lock()
1066 chip->select_chip(mtd, chipnr); in nand_lock()
1075 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_lock()
1078 if (nand_check_wp(mtd)) { in nand_lock()
1088 chip->cmdfunc(mtd, NAND_CMD_LOCK, -1, page & chip->pagemask); in nand_lock()
1091 status = chip->waitfunc(mtd, chip); in nand_lock()
1100 ret = __nand_unlock(mtd, ofs, len, 0x1); in nand_lock()
1103 chip->select_chip(mtd, -1); in nand_lock()
1104 nand_release_device(mtd); in nand_lock()
1248 static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_raw() argument
1251 chip->read_buf(mtd, buf, mtd->writesize); in nand_read_page_raw()
1253 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_raw()
1267 static int nand_read_page_raw_syndrome(struct mtd_info *mtd, in nand_read_page_raw_syndrome() argument
1277 chip->read_buf(mtd, buf, eccsize); in nand_read_page_raw_syndrome()
1281 chip->read_buf(mtd, oob, chip->ecc.prepad); in nand_read_page_raw_syndrome()
1285 chip->read_buf(mtd, oob, eccbytes); in nand_read_page_raw_syndrome()
1289 chip->read_buf(mtd, oob, chip->ecc.postpad); in nand_read_page_raw_syndrome()
1294 size = mtd->oobsize - (oob - chip->oob_poi); in nand_read_page_raw_syndrome()
1296 chip->read_buf(mtd, oob, size); in nand_read_page_raw_syndrome()
1309 static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_swecc() argument
1321 chip->ecc.read_page_raw(mtd, chip, buf, 1, page); in nand_read_page_swecc()
1324 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_swecc()
1335 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in nand_read_page_swecc()
1337 mtd->ecc_stats.failed++; in nand_read_page_swecc()
1339 mtd->ecc_stats.corrected += stat; in nand_read_page_swecc()
1355 static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_subpage() argument
1381 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_col_addr, -1); in nand_read_subpage()
1384 chip->read_buf(mtd, p, datafrag_len); in nand_read_subpage()
1388 chip->ecc.calculate(mtd, p, &chip->buffers->ecccalc[i]); in nand_read_subpage()
1401 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1); in nand_read_subpage()
1402 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_subpage()
1415 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, in nand_read_subpage()
1416 mtd->writesize + aligned_pos, -1); in nand_read_subpage()
1417 chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len); in nand_read_subpage()
1427 stat = chip->ecc.correct(mtd, p, in nand_read_subpage()
1430 mtd->ecc_stats.failed++; in nand_read_subpage()
1432 mtd->ecc_stats.corrected += stat; in nand_read_subpage()
1449 static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_hwecc() argument
1462 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_hwecc()
1463 chip->read_buf(mtd, p, eccsize); in nand_read_page_hwecc()
1464 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_hwecc()
1466 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_hwecc()
1477 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in nand_read_page_hwecc()
1479 mtd->ecc_stats.failed++; in nand_read_page_hwecc()
1481 mtd->ecc_stats.corrected += stat; in nand_read_page_hwecc()
1502 static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd, in nand_read_page_hwecc_oob_first() argument
1515 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); in nand_read_page_hwecc_oob_first()
1516 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_hwecc_oob_first()
1517 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page); in nand_read_page_hwecc_oob_first()
1525 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_hwecc_oob_first()
1526 chip->read_buf(mtd, p, eccsize); in nand_read_page_hwecc_oob_first()
1527 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_hwecc_oob_first()
1529 stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL); in nand_read_page_hwecc_oob_first()
1531 mtd->ecc_stats.failed++; in nand_read_page_hwecc_oob_first()
1533 mtd->ecc_stats.corrected += stat; in nand_read_page_hwecc_oob_first()
1551 static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_syndrome() argument
1564 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_syndrome()
1565 chip->read_buf(mtd, p, eccsize); in nand_read_page_syndrome()
1568 chip->read_buf(mtd, oob, chip->ecc.prepad); in nand_read_page_syndrome()
1572 chip->ecc.hwctl(mtd, NAND_ECC_READSYN); in nand_read_page_syndrome()
1573 chip->read_buf(mtd, oob, eccbytes); in nand_read_page_syndrome()
1574 stat = chip->ecc.correct(mtd, p, oob, NULL); in nand_read_page_syndrome()
1577 mtd->ecc_stats.failed++; in nand_read_page_syndrome()
1579 mtd->ecc_stats.corrected += stat; in nand_read_page_syndrome()
1586 chip->read_buf(mtd, oob, chip->ecc.postpad); in nand_read_page_syndrome()
1592 i = mtd->oobsize - (oob - chip->oob_poi); in nand_read_page_syndrome()
1594 chip->read_buf(mtd, oob, i); in nand_read_page_syndrome()
1656 static int nand_setup_read_retry(struct mtd_info *mtd, int retry_mode) in nand_setup_read_retry() argument
1658 struct nand_chip *chip = mtd->priv; in nand_setup_read_retry()
1668 return chip->setup_read_retry(mtd, retry_mode); in nand_setup_read_retry()
1679 static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, in nand_do_read_ops() argument
1683 struct nand_chip *chip = mtd->priv; in nand_do_read_ops()
1688 mtd->oobavail : mtd->oobsize; in nand_do_read_ops()
1697 chip->select_chip(mtd, chipnr); in nand_do_read_ops()
1702 col = (int)(from & (mtd->writesize - 1)); in nand_do_read_ops()
1709 unsigned int ecc_failures = mtd->ecc_stats.failed; in nand_do_read_ops()
1711 bytes = min(mtd->writesize - col, readlen); in nand_do_read_ops()
1712 aligned = (bytes == mtd->writesize); in nand_do_read_ops()
1730 chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page); in nand_do_read_ops()
1737 ret = chip->ecc.read_page_raw(mtd, chip, bufpoi, in nand_do_read_ops()
1742 ret = chip->ecc.read_subpage(mtd, chip, in nand_do_read_ops()
1746 ret = chip->ecc.read_page(mtd, chip, bufpoi, in nand_do_read_ops()
1760 !(mtd->ecc_stats.failed - ecc_failures) && in nand_do_read_ops()
1786 nand_wait_ready(mtd); in nand_do_read_ops()
1789 if (mtd->ecc_stats.failed - ecc_failures) { in nand_do_read_ops()
1792 ret = nand_setup_read_retry(mtd, in nand_do_read_ops()
1798 mtd->ecc_stats.failed = ecc_failures; in nand_do_read_ops()
1818 ret = nand_setup_read_retry(mtd, 0); in nand_do_read_ops()
1836 chip->select_chip(mtd, -1); in nand_do_read_ops()
1837 chip->select_chip(mtd, chipnr); in nand_do_read_ops()
1840 chip->select_chip(mtd, -1); in nand_do_read_ops()
1865 static int nand_read(struct mtd_info *mtd, loff_t from, size_t len, in nand_read() argument
1871 nand_get_device(mtd, FL_READING); in nand_read()
1876 ret = nand_do_read_ops(mtd, from, &ops); in nand_read()
1878 nand_release_device(mtd); in nand_read()
1888 static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_oob_std() argument
1891 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); in nand_read_oob_std()
1892 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_oob_std()
1903 static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_oob_syndrome() argument
1906 int length = mtd->oobsize; in nand_read_oob_syndrome()
1912 chip->cmdfunc(mtd, NAND_CMD_READ0, chip->ecc.size, page); in nand_read_oob_syndrome()
1916 if (mtd->writesize > 512) in nand_read_oob_syndrome()
1917 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, pos, -1); in nand_read_oob_syndrome()
1919 chip->cmdfunc(mtd, NAND_CMD_READ0, pos, page); in nand_read_oob_syndrome()
1923 chip->read_buf(mtd, bufpoi, toread); in nand_read_oob_syndrome()
1928 chip->read_buf(mtd, bufpoi, length); in nand_read_oob_syndrome()
1939 static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_oob_std() argument
1944 int length = mtd->oobsize; in nand_write_oob_std()
1946 chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page); in nand_write_oob_std()
1947 chip->write_buf(mtd, buf, length); in nand_write_oob_std()
1949 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_oob_std()
1951 status = chip->waitfunc(mtd, chip); in nand_write_oob_std()
1963 static int nand_write_oob_syndrome(struct mtd_info *mtd, in nand_write_oob_syndrome() argument
1967 int eccsize = chip->ecc.size, length = mtd->oobsize; in nand_write_oob_syndrome()
1982 chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page); in nand_write_oob_syndrome()
1985 if (mtd->writesize <= 512) { in nand_write_oob_syndrome()
1991 chip->write_buf(mtd, (uint8_t *)&fill, in nand_write_oob_syndrome()
1997 chip->cmdfunc(mtd, NAND_CMD_RNDIN, pos, -1); in nand_write_oob_syndrome()
2002 chip->write_buf(mtd, bufpoi, len); in nand_write_oob_syndrome()
2007 chip->write_buf(mtd, bufpoi, length); in nand_write_oob_syndrome()
2009 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_oob_syndrome()
2010 status = chip->waitfunc(mtd, chip); in nand_write_oob_syndrome()
2023 static int nand_do_read_oob(struct mtd_info *mtd, loff_t from, in nand_do_read_oob() argument
2027 struct nand_chip *chip = mtd->priv; in nand_do_read_oob()
2037 stats = mtd->ecc_stats; in nand_do_read_oob()
2042 len = mtd->oobsize; in nand_do_read_oob()
2051 if (unlikely(from >= mtd->size || in nand_do_read_oob()
2052 ops->ooboffs + readlen > ((mtd->size >> chip->page_shift) - in nand_do_read_oob()
2060 chip->select_chip(mtd, chipnr); in nand_do_read_oob()
2068 ret = chip->ecc.read_oob_raw(mtd, chip, page); in nand_do_read_oob()
2070 ret = chip->ecc.read_oob(mtd, chip, page); in nand_do_read_oob()
2083 nand_wait_ready(mtd); in nand_do_read_oob()
2097 chip->select_chip(mtd, -1); in nand_do_read_oob()
2098 chip->select_chip(mtd, chipnr); in nand_do_read_oob()
2101 chip->select_chip(mtd, -1); in nand_do_read_oob()
2108 if (mtd->ecc_stats.failed - stats.failed) in nand_do_read_oob()
2111 return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0; in nand_do_read_oob()
2122 static int nand_read_oob(struct mtd_info *mtd, loff_t from, in nand_read_oob() argument
2130 if (ops->datbuf && (from + ops->len) > mtd->size) { in nand_read_oob()
2136 nand_get_device(mtd, FL_READING); in nand_read_oob()
2149 ret = nand_do_read_oob(mtd, from, ops); in nand_read_oob()
2151 ret = nand_do_read_ops(mtd, from, ops); in nand_read_oob()
2154 nand_release_device(mtd); in nand_read_oob()
2169 static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_raw() argument
2172 chip->write_buf(mtd, buf, mtd->writesize); in nand_write_page_raw()
2174 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_page_raw()
2189 static int nand_write_page_raw_syndrome(struct mtd_info *mtd, in nand_write_page_raw_syndrome() argument
2200 chip->write_buf(mtd, buf, eccsize); in nand_write_page_raw_syndrome()
2204 chip->write_buf(mtd, oob, chip->ecc.prepad); in nand_write_page_raw_syndrome()
2208 chip->write_buf(mtd, oob, eccbytes); in nand_write_page_raw_syndrome()
2212 chip->write_buf(mtd, oob, chip->ecc.postpad); in nand_write_page_raw_syndrome()
2217 size = mtd->oobsize - (oob - chip->oob_poi); in nand_write_page_raw_syndrome()
2219 chip->write_buf(mtd, oob, size); in nand_write_page_raw_syndrome()
2231 static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_swecc() argument
2244 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_write_page_swecc()
2249 return chip->ecc.write_page_raw(mtd, chip, buf, 1, page); in nand_write_page_swecc()
2260 static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_hwecc() argument
2272 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_page_hwecc()
2273 chip->write_buf(mtd, p, eccsize); in nand_write_page_hwecc()
2274 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_write_page_hwecc()
2280 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_page_hwecc()
2296 static int nand_write_subpage_hwecc(struct mtd_info *mtd, in nand_write_subpage_hwecc() argument
2309 int oob_bytes = mtd->oobsize / ecc_steps; in nand_write_subpage_hwecc()
2314 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_subpage_hwecc()
2317 chip->write_buf(mtd, buf, ecc_size); in nand_write_subpage_hwecc()
2323 chip->ecc.calculate(mtd, buf, ecc_calc); in nand_write_subpage_hwecc()
2342 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_subpage_hwecc()
2359 static int nand_write_page_syndrome(struct mtd_info *mtd, in nand_write_page_syndrome() argument
2372 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_page_syndrome()
2373 chip->write_buf(mtd, p, eccsize); in nand_write_page_syndrome()
2376 chip->write_buf(mtd, oob, chip->ecc.prepad); in nand_write_page_syndrome()
2380 chip->ecc.calculate(mtd, p, oob); in nand_write_page_syndrome()
2381 chip->write_buf(mtd, oob, eccbytes); in nand_write_page_syndrome()
2385 chip->write_buf(mtd, oob, chip->ecc.postpad); in nand_write_page_syndrome()
2391 i = mtd->oobsize - (oob - chip->oob_poi); in nand_write_page_syndrome()
2393 chip->write_buf(mtd, oob, i); in nand_write_page_syndrome()
2410 static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page() argument
2418 subpage = offset || (data_len < mtd->writesize); in nand_write_page()
2422 chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page); in nand_write_page()
2425 status = chip->ecc.write_page_raw(mtd, chip, buf, in nand_write_page()
2428 status = chip->ecc.write_subpage(mtd, chip, offset, data_len, in nand_write_page()
2431 status = chip->ecc.write_page(mtd, chip, buf, oob_required, in nand_write_page()
2445 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_page()
2446 status = chip->waitfunc(mtd, chip); in nand_write_page()
2452 status = chip->errstat(mtd, chip, FL_WRITING, status, in nand_write_page()
2458 chip->cmdfunc(mtd, NAND_CMD_CACHEDPROG, -1, -1); in nand_write_page()
2459 status = chip->waitfunc(mtd, chip); in nand_write_page()
2472 static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len, in nand_fill_oob() argument
2475 struct nand_chip *chip = mtd->priv; in nand_fill_oob()
2481 memset(chip->oob_poi, 0xff, mtd->oobsize); in nand_fill_oob()
2531 static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, in nand_do_write_ops() argument
2535 struct nand_chip *chip = mtd->priv; in nand_do_write_ops()
2540 mtd->oobavail : mtd->oobsize; in nand_do_write_ops()
2558 column = to & (mtd->writesize - 1); in nand_do_write_ops()
2561 chip->select_chip(mtd, chipnr); in nand_do_write_ops()
2564 if (nand_check_wp(mtd)) { in nand_do_write_ops()
2585 int bytes = mtd->writesize; in nand_do_write_ops()
2589 int part_pagewr = (column || writelen < (mtd->writesize - 1)); in nand_do_write_ops()
2606 memset(chip->buffers->databuf, 0xff, mtd->writesize); in nand_do_write_ops()
2613 oob = nand_fill_oob(mtd, oob, len, ops); in nand_do_write_ops()
2617 memset(chip->oob_poi, 0xff, mtd->oobsize); in nand_do_write_ops()
2619 ret = chip->write_page(mtd, chip, column, bytes, wbuf, in nand_do_write_ops()
2637 chip->select_chip(mtd, -1); in nand_do_write_ops()
2638 chip->select_chip(mtd, chipnr); in nand_do_write_ops()
2647 chip->select_chip(mtd, -1); in nand_do_write_ops()
2662 static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len, in panic_nand_write() argument
2665 struct nand_chip *chip = mtd->priv; in panic_nand_write()
2670 panic_nand_wait(mtd, chip, 400); in panic_nand_write()
2673 panic_nand_get_device(chip, mtd, FL_WRITING); in panic_nand_write()
2680 ret = nand_do_write_ops(mtd, to, &ops); in panic_nand_write()
2696 static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, in nand_write() argument
2702 nand_get_device(mtd, FL_WRITING); in nand_write()
2707 ret = nand_do_write_ops(mtd, to, &ops); in nand_write()
2709 nand_release_device(mtd); in nand_write()
2721 static int nand_do_write_oob(struct mtd_info *mtd, loff_t to, in nand_do_write_oob() argument
2725 struct nand_chip *chip = mtd->priv; in nand_do_write_oob()
2733 len = mtd->oobsize; in nand_do_write_oob()
2749 if (unlikely(to >= mtd->size || in nand_do_write_oob()
2751 ((mtd->size >> chip->page_shift) - in nand_do_write_oob()
2759 chip->select_chip(mtd, chipnr); in nand_do_write_oob()
2770 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_do_write_oob()
2773 if (nand_check_wp(mtd)) { in nand_do_write_oob()
2774 chip->select_chip(mtd, -1); in nand_do_write_oob()
2782 nand_fill_oob(mtd, ops->oobbuf, ops->ooblen, ops); in nand_do_write_oob()
2785 status = chip->ecc.write_oob_raw(mtd, chip, page & chip->pagemask); in nand_do_write_oob()
2787 status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask); in nand_do_write_oob()
2789 chip->select_chip(mtd, -1); in nand_do_write_oob()
2805 static int nand_write_oob(struct mtd_info *mtd, loff_t to, in nand_write_oob() argument
2813 if (ops->datbuf && (to + ops->len) > mtd->size) { in nand_write_oob()
2819 nand_get_device(mtd, FL_WRITING); in nand_write_oob()
2832 ret = nand_do_write_oob(mtd, to, ops); in nand_write_oob()
2834 ret = nand_do_write_ops(mtd, to, ops); in nand_write_oob()
2837 nand_release_device(mtd); in nand_write_oob()
2848 static int single_erase(struct mtd_info *mtd, int page) in single_erase() argument
2850 struct nand_chip *chip = mtd->priv; in single_erase()
2852 chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page); in single_erase()
2853 chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1); in single_erase()
2855 return chip->waitfunc(mtd, chip); in single_erase()
2865 static int nand_erase(struct mtd_info *mtd, struct erase_info *instr) in nand_erase() argument
2867 return nand_erase_nand(mtd, instr, 0); in nand_erase()
2878 int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, in nand_erase_nand() argument
2882 struct nand_chip *chip = mtd->priv; in nand_erase_nand()
2889 if (check_offs_len(mtd, instr->addr, instr->len)) in nand_erase_nand()
2893 nand_get_device(mtd, FL_ERASING); in nand_erase_nand()
2903 chip->select_chip(mtd, chipnr); in nand_erase_nand()
2906 if (nand_check_wp(mtd)) { in nand_erase_nand()
2920 if (nand_block_checkbad(mtd, ((loff_t) page) << in nand_erase_nand()
2936 status = chip->erase(mtd, page & chip->pagemask); in nand_erase_nand()
2943 status = chip->errstat(mtd, chip, FL_ERASING, in nand_erase_nand()
2963 chip->select_chip(mtd, -1); in nand_erase_nand()
2964 chip->select_chip(mtd, chipnr); in nand_erase_nand()
2974 chip->select_chip(mtd, -1); in nand_erase_nand()
2975 nand_release_device(mtd); in nand_erase_nand()
2991 static void nand_sync(struct mtd_info *mtd) in nand_sync() argument
2996 nand_get_device(mtd, FL_SYNCING); in nand_sync()
2998 nand_release_device(mtd); in nand_sync()
3006 static int nand_block_isbad(struct mtd_info *mtd, loff_t offs) in nand_block_isbad() argument
3008 return nand_block_checkbad(mtd, offs, 1, 0); in nand_block_isbad()
3016 static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs) in nand_block_markbad() argument
3020 ret = nand_block_isbad(mtd, ofs); in nand_block_markbad()
3028 return nand_block_markbad_lowlevel(mtd, ofs); in nand_block_markbad()
3038 static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip, in nand_onfi_set_features() argument
3049 chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1); in nand_onfi_set_features()
3051 chip->write_byte(mtd, subfeature_param[i]); in nand_onfi_set_features()
3053 status = chip->waitfunc(mtd, chip); in nand_onfi_set_features()
3066 static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip, in nand_onfi_get_features() argument
3076 chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1); in nand_onfi_get_features()
3078 *subfeature_param++ = chip->read_byte(mtd); in nand_onfi_get_features()
3086 static int nand_suspend(struct mtd_info *mtd) in nand_suspend() argument
3088 return nand_get_device(mtd, FL_PM_SUSPENDED); in nand_suspend()
3095 static void nand_resume(struct mtd_info *mtd) in nand_resume() argument
3097 struct nand_chip *chip = mtd->priv; in nand_resume()
3100 nand_release_device(mtd); in nand_resume()
3111 static void nand_shutdown(struct mtd_info *mtd) in nand_shutdown() argument
3113 nand_get_device(mtd, FL_PM_SUSPENDED); in nand_shutdown()
3197 static int nand_flash_detect_ext_param_page(struct mtd_info *mtd, in nand_flash_detect_ext_param_page() argument
3214 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1); in nand_flash_detect_ext_param_page()
3217 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, in nand_flash_detect_ext_param_page()
3221 chip->read_buf(mtd, (uint8_t *)ep, len); in nand_flash_detect_ext_param_page()
3267 static int nand_setup_read_retry_micron(struct mtd_info *mtd, int retry_mode) in nand_setup_read_retry_micron() argument
3269 struct nand_chip *chip = mtd->priv; in nand_setup_read_retry_micron()
3272 return chip->onfi_set_features(mtd, chip, ONFI_FEATURE_ADDR_READ_RETRY, in nand_setup_read_retry_micron()
3294 static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, in nand_flash_detect_onfi() argument
3302 chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1); in nand_flash_detect_onfi()
3303 if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' || in nand_flash_detect_onfi()
3304 chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I') in nand_flash_detect_onfi()
3307 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1); in nand_flash_detect_onfi()
3310 ((uint8_t *)p)[j] = chip->read_byte(mtd); in nand_flash_detect_onfi()
3342 if (!mtd->name) in nand_flash_detect_onfi()
3343 mtd->name = p->model; in nand_flash_detect_onfi()
3345 mtd->writesize = le32_to_cpu(p->byte_per_page); in nand_flash_detect_onfi()
3352 mtd->erasesize = 1 << (fls(le32_to_cpu(p->pages_per_block)) - 1); in nand_flash_detect_onfi()
3353 mtd->erasesize *= mtd->writesize; in nand_flash_detect_onfi()
3355 mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page); in nand_flash_detect_onfi()
3359 chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count; in nand_flash_detect_onfi()
3379 if (mtd->writesize > 512 && chip->cmdfunc == nand_command) in nand_flash_detect_onfi()
3383 if (nand_flash_detect_ext_param_page(mtd, chip, p)) in nand_flash_detect_onfi()
3398 static int nand_flash_detect_jedec(struct mtd_info *mtd, struct nand_chip *chip, in nand_flash_detect_jedec() argument
3407 chip->cmdfunc(mtd, NAND_CMD_READID, 0x40, -1); in nand_flash_detect_jedec()
3408 if (chip->read_byte(mtd) != 'J' || chip->read_byte(mtd) != 'E' || in nand_flash_detect_jedec()
3409 chip->read_byte(mtd) != 'D' || chip->read_byte(mtd) != 'E' || in nand_flash_detect_jedec()
3410 chip->read_byte(mtd) != 'C') in nand_flash_detect_jedec()
3413 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0x40, -1); in nand_flash_detect_jedec()
3416 ((uint8_t *)p)[j] = chip->read_byte(mtd); in nand_flash_detect_jedec()
3442 if (!mtd->name) in nand_flash_detect_jedec()
3443 mtd->name = p->model; in nand_flash_detect_jedec()
3445 mtd->writesize = le32_to_cpu(p->byte_per_page); in nand_flash_detect_jedec()
3448 mtd->erasesize = 1 << (fls(le32_to_cpu(p->pages_per_block)) - 1); in nand_flash_detect_jedec()
3449 mtd->erasesize *= mtd->writesize; in nand_flash_detect_jedec()
3451 mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page); in nand_flash_detect_jedec()
3455 chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count; in nand_flash_detect_jedec()
3550 static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip, in nand_decode_ext_id() argument
3573 mtd->writesize = 2048 << (extid & 0x03); in nand_decode_ext_id()
3578 mtd->oobsize = 128; in nand_decode_ext_id()
3581 mtd->oobsize = 218; in nand_decode_ext_id()
3584 mtd->oobsize = 400; in nand_decode_ext_id()
3587 mtd->oobsize = 436; in nand_decode_ext_id()
3590 mtd->oobsize = 512; in nand_decode_ext_id()
3593 mtd->oobsize = 640; in nand_decode_ext_id()
3597 mtd->oobsize = 1024; in nand_decode_ext_id()
3602 mtd->erasesize = (128 * 1024) << in nand_decode_ext_id()
3610 mtd->writesize = 2048 << (extid & 0x03); in nand_decode_ext_id()
3615 mtd->oobsize = 128; in nand_decode_ext_id()
3618 mtd->oobsize = 224; in nand_decode_ext_id()
3621 mtd->oobsize = 448; in nand_decode_ext_id()
3624 mtd->oobsize = 64; in nand_decode_ext_id()
3627 mtd->oobsize = 32; in nand_decode_ext_id()
3630 mtd->oobsize = 16; in nand_decode_ext_id()
3633 mtd->oobsize = 640; in nand_decode_ext_id()
3640 mtd->erasesize = (128 * 1024) << tmp; in nand_decode_ext_id()
3642 mtd->erasesize = 768 * 1024; in nand_decode_ext_id()
3644 mtd->erasesize = (64 * 1024) << tmp; in nand_decode_ext_id()
3648 mtd->writesize = 1024 << (extid & 0x03); in nand_decode_ext_id()
3651 mtd->oobsize = (8 << (extid & 0x01)) * in nand_decode_ext_id()
3652 (mtd->writesize >> 9); in nand_decode_ext_id()
3655 mtd->erasesize = (64 * 1024) << (extid & 0x03); in nand_decode_ext_id()
3672 mtd->oobsize = 32 * mtd->writesize >> 9; in nand_decode_ext_id()
3683 static void nand_decode_id(struct mtd_info *mtd, struct nand_chip *chip, in nand_decode_id() argument
3689 mtd->erasesize = type->erasesize; in nand_decode_id()
3690 mtd->writesize = type->pagesize; in nand_decode_id()
3691 mtd->oobsize = mtd->writesize / 32; in nand_decode_id()
3705 && mtd->writesize == 512) { in nand_decode_id()
3706 mtd->erasesize = 128 * 1024; in nand_decode_id()
3707 mtd->erasesize <<= ((id_data[3] & 0x03) << 1); in nand_decode_id()
3716 static void nand_decode_bbm_options(struct mtd_info *mtd, in nand_decode_bbm_options() argument
3722 if (mtd->writesize > 512 || (chip->options & NAND_BUSWIDTH_16)) in nand_decode_bbm_options()
3743 (mtd->writesize == 2048 && in nand_decode_bbm_options()
3753 static bool find_full_id_nand(struct mtd_info *mtd, struct nand_chip *chip, in find_full_id_nand() argument
3757 mtd->writesize = type->pagesize; in find_full_id_nand()
3758 mtd->erasesize = type->erasesize; in find_full_id_nand()
3759 mtd->oobsize = type->oobsize; in find_full_id_nand()
3771 if (!mtd->name) in find_full_id_nand()
3772 mtd->name = type->name; in find_full_id_nand()
3782 static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, in nand_get_flash_type() argument
3792 chip->select_chip(mtd, 0); in nand_get_flash_type()
3798 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_get_flash_type()
3801 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_get_flash_type()
3804 *maf_id = chip->read_byte(mtd); in nand_get_flash_type()
3805 *dev_id = chip->read_byte(mtd); in nand_get_flash_type()
3814 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_get_flash_type()
3818 id_data[i] = chip->read_byte(mtd); in nand_get_flash_type()
3831 if (find_full_id_nand(mtd, chip, type, id_data, &busw)) in nand_get_flash_type()
3841 if (nand_flash_detect_onfi(mtd, chip, &busw)) in nand_get_flash_type()
3845 if (nand_flash_detect_jedec(mtd, chip, &busw)) in nand_get_flash_type()
3852 if (!mtd->name) in nand_get_flash_type()
3853 mtd->name = type->name; in nand_get_flash_type()
3859 nand_decode_ext_id(mtd, chip, id_data, &busw); in nand_get_flash_type()
3861 nand_decode_id(mtd, chip, type, id_data, &busw); in nand_get_flash_type()
3891 pr_info("%s %s\n", nand_manuf_ids[maf_idx].name, mtd->name); in nand_get_flash_type()
3898 nand_decode_bbm_options(mtd, chip, id_data); in nand_get_flash_type()
3901 chip->page_shift = ffs(mtd->writesize) - 1; in nand_get_flash_type()
3906 ffs(mtd->erasesize) - 1; in nand_get_flash_type()
3918 if (mtd->writesize > 512 && chip->cmdfunc == nand_command) in nand_get_flash_type()
3936 mtd->erasesize >> 10, mtd->writesize, mtd->oobsize); in nand_get_flash_type()
3940 static int nand_dt_init(struct mtd_info *mtd, struct nand_chip *chip, in nand_dt_init() argument
3983 int nand_scan_ident(struct mtd_info *mtd, int maxchips, in nand_scan_ident() argument
3987 struct nand_chip *chip = mtd->priv; in nand_scan_ident()
3992 ret = nand_dt_init(mtd, chip, chip->flash_node); in nand_scan_ident()
3997 if (!mtd->name && mtd->dev.parent) in nand_scan_ident()
3998 mtd->name = dev_name(mtd->dev.parent); in nand_scan_ident()
4004 type = nand_get_flash_type(mtd, chip, &nand_maf_id, in nand_scan_ident()
4010 chip->select_chip(mtd, -1); in nand_scan_ident()
4014 chip->select_chip(mtd, -1); in nand_scan_ident()
4018 chip->select_chip(mtd, i); in nand_scan_ident()
4020 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_scan_ident()
4022 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_scan_ident()
4024 if (nand_maf_id != chip->read_byte(mtd) || in nand_scan_ident()
4025 nand_dev_id != chip->read_byte(mtd)) { in nand_scan_ident()
4026 chip->select_chip(mtd, -1); in nand_scan_ident()
4029 chip->select_chip(mtd, -1); in nand_scan_ident()
4036 mtd->size = i * chip->chipsize; in nand_scan_ident()
4056 static bool nand_ecc_strength_good(struct mtd_info *mtd) in nand_ecc_strength_good() argument
4058 struct nand_chip *chip = mtd->priv; in nand_ecc_strength_good()
4070 corr = (mtd->writesize * ecc->strength) / ecc->size; in nand_ecc_strength_good()
4071 ds_corr = (mtd->writesize * chip->ecc_strength_ds) / chip->ecc_step_ds; in nand_ecc_strength_good()
4084 int nand_scan_tail(struct mtd_info *mtd) in nand_scan_tail() argument
4087 struct nand_chip *chip = mtd->priv; in nand_scan_tail()
4096 nbuf = kzalloc(sizeof(*nbuf) + mtd->writesize in nand_scan_tail()
4097 + mtd->oobsize * 3, GFP_KERNEL); in nand_scan_tail()
4101 nbuf->ecccode = nbuf->ecccalc + mtd->oobsize; in nand_scan_tail()
4102 nbuf->databuf = nbuf->ecccode + mtd->oobsize; in nand_scan_tail()
4111 chip->oob_poi = chip->buffers->databuf + mtd->writesize; in nand_scan_tail()
4117 switch (mtd->oobsize) { in nand_scan_tail()
4132 mtd->oobsize); in nand_scan_tail()
4197 if (mtd->writesize >= ecc->size) { in nand_scan_tail()
4205 ecc->size, mtd->writesize); in nand_scan_tail()
4243 if (!ecc->size && (mtd->oobsize >= 64)) { in nand_scan_tail()
4251 ecc->priv = nand_bch_init(mtd, ecc->size, ecc->bytes, in nand_scan_tail()
4267 ecc->size = mtd->writesize; in nand_scan_tail()
4291 mtd->oobavail = ecc->layout->oobavail; in nand_scan_tail()
4294 if (!nand_ecc_strength_good(mtd)) in nand_scan_tail()
4296 mtd->name); in nand_scan_tail()
4302 ecc->steps = mtd->writesize / ecc->size; in nand_scan_tail()
4303 if (ecc->steps * ecc->size != mtd->writesize) { in nand_scan_tail()
4313 mtd->subpage_sft = 1; in nand_scan_tail()
4318 mtd->subpage_sft = 2; in nand_scan_tail()
4322 chip->subpagesize = mtd->writesize >> mtd->subpage_sft; in nand_scan_tail()
4343 mtd->type = nand_is_slc(chip) ? MTD_NANDFLASH : MTD_MLCNANDFLASH; in nand_scan_tail()
4344 mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM : in nand_scan_tail()
4346 mtd->_erase = nand_erase; in nand_scan_tail()
4347 mtd->_point = NULL; in nand_scan_tail()
4348 mtd->_unpoint = NULL; in nand_scan_tail()
4349 mtd->_read = nand_read; in nand_scan_tail()
4350 mtd->_write = nand_write; in nand_scan_tail()
4351 mtd->_panic_write = panic_nand_write; in nand_scan_tail()
4352 mtd->_read_oob = nand_read_oob; in nand_scan_tail()
4353 mtd->_write_oob = nand_write_oob; in nand_scan_tail()
4354 mtd->_sync = nand_sync; in nand_scan_tail()
4355 mtd->_lock = NULL; in nand_scan_tail()
4356 mtd->_unlock = NULL; in nand_scan_tail()
4357 mtd->_suspend = nand_suspend; in nand_scan_tail()
4358 mtd->_resume = nand_resume; in nand_scan_tail()
4359 mtd->_reboot = nand_shutdown; in nand_scan_tail()
4360 mtd->_block_isreserved = nand_block_isreserved; in nand_scan_tail()
4361 mtd->_block_isbad = nand_block_isbad; in nand_scan_tail()
4362 mtd->_block_markbad = nand_block_markbad; in nand_scan_tail()
4363 mtd->writebufsize = mtd->writesize; in nand_scan_tail()
4366 mtd->ecclayout = ecc->layout; in nand_scan_tail()
4367 mtd->ecc_strength = ecc->strength; in nand_scan_tail()
4368 mtd->ecc_step_size = ecc->size; in nand_scan_tail()
4374 if (!mtd->bitflip_threshold) in nand_scan_tail()
4375 mtd->bitflip_threshold = DIV_ROUND_UP(mtd->ecc_strength * 3, 4); in nand_scan_tail()
4382 return chip->scan_bbt(mtd); in nand_scan_tail()
4407 int nand_scan(struct mtd_info *mtd, int maxchips) in nand_scan() argument
4411 ret = nand_scan_ident(mtd, maxchips, NULL); in nand_scan()
4413 ret = nand_scan_tail(mtd); in nand_scan()
4422 void nand_release(struct mtd_info *mtd) in nand_release() argument
4424 struct nand_chip *chip = mtd->priv; in nand_release()
4429 mtd_device_unregister(mtd); in nand_release()