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()
630 chip->cmd_ctrl(mtd, command, ctrl); in nand_command()
640 chip->cmd_ctrl(mtd, column, ctrl); in nand_command()
644 chip->cmd_ctrl(mtd, page_addr, ctrl); in nand_command()
646 chip->cmd_ctrl(mtd, page_addr >> 8, ctrl); in nand_command()
649 chip->cmd_ctrl(mtd, page_addr >> 16, ctrl); in nand_command()
651 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); in nand_command()
671 chip->cmd_ctrl(mtd, NAND_CMD_STATUS, in nand_command()
673 chip->cmd_ctrl(mtd, in nand_command()
676 nand_wait_status_ready(mtd, 250); in nand_command()
696 nand_wait_ready(mtd); in nand_command()
710 static void nand_command_lp(struct mtd_info *mtd, unsigned int command, in nand_command_lp() argument
713 register struct nand_chip *chip = mtd->priv; in nand_command_lp()
717 column += mtd->writesize; in nand_command_lp()
723 chip->cmd_ctrl(mtd, command, in nand_command_lp()
735 chip->cmd_ctrl(mtd, column, ctrl); in nand_command_lp()
737 chip->cmd_ctrl(mtd, column >> 8, ctrl); in nand_command_lp()
740 chip->cmd_ctrl(mtd, page_addr, ctrl); in nand_command_lp()
741 chip->cmd_ctrl(mtd, page_addr >> 8, in nand_command_lp()
745 chip->cmd_ctrl(mtd, page_addr >> 16, in nand_command_lp()
749 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); in nand_command_lp()
771 chip->cmd_ctrl(mtd, NAND_CMD_STATUS, in nand_command_lp()
773 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
776 nand_wait_status_ready(mtd, 250); in nand_command_lp()
781 chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART, in nand_command_lp()
783 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
788 chip->cmd_ctrl(mtd, NAND_CMD_READSTART, in nand_command_lp()
790 chip->cmd_ctrl(mtd, NAND_CMD_NONE, in nand_command_lp()
811 nand_wait_ready(mtd); in nand_command_lp()
823 struct mtd_info *mtd, int new_state) in panic_nand_get_device() argument
838 nand_get_device(struct mtd_info *mtd, int new_state) in nand_get_device() argument
840 struct nand_chip *chip = mtd->priv; in nand_get_device()
881 static void panic_nand_wait(struct mtd_info *mtd, struct nand_chip *chip, in panic_nand_wait() argument
887 if (chip->dev_ready(mtd)) in panic_nand_wait()
890 if (chip->read_byte(mtd) & NAND_STATUS_READY) in panic_nand_wait()
904 static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip) in nand_wait() argument
918 chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); in nand_wait()
921 panic_nand_wait(mtd, chip, timeo); in nand_wait()
926 if (chip->dev_ready(mtd)) in nand_wait()
929 if (chip->read_byte(mtd) & NAND_STATUS_READY) in nand_wait()
937 status = (int)chip->read_byte(mtd); in nand_wait()
955 static int __nand_unlock(struct mtd_info *mtd, loff_t ofs, in __nand_unlock() argument
960 struct nand_chip *chip = mtd->priv; in __nand_unlock()
964 chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask); in __nand_unlock()
968 chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1, in __nand_unlock()
972 status = chip->waitfunc(mtd, chip); in __nand_unlock()
991 int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in nand_unlock() argument
995 struct nand_chip *chip = mtd->priv; in nand_unlock()
1000 if (check_offs_len(mtd, ofs, len)) in nand_unlock()
1004 if (ofs + len == mtd->size) in nand_unlock()
1005 len -= mtd->erasesize; in nand_unlock()
1007 nand_get_device(mtd, FL_UNLOCKING); in nand_unlock()
1012 chip->select_chip(mtd, chipnr); in nand_unlock()
1021 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_unlock()
1024 if (nand_check_wp(mtd)) { in nand_unlock()
1031 ret = __nand_unlock(mtd, ofs, len, 0); in nand_unlock()
1034 chip->select_chip(mtd, -1); in nand_unlock()
1035 nand_release_device(mtd); in nand_unlock()
1054 int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in nand_lock() argument
1058 struct nand_chip *chip = mtd->priv; in nand_lock()
1063 if (check_offs_len(mtd, ofs, len)) in nand_lock()
1066 nand_get_device(mtd, FL_LOCKING); in nand_lock()
1071 chip->select_chip(mtd, chipnr); in nand_lock()
1080 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_lock()
1083 if (nand_check_wp(mtd)) { in nand_lock()
1093 chip->cmdfunc(mtd, NAND_CMD_LOCK, -1, page & chip->pagemask); in nand_lock()
1096 status = chip->waitfunc(mtd, chip); in nand_lock()
1105 ret = __nand_unlock(mtd, ofs, len, 0x1); in nand_lock()
1108 chip->select_chip(mtd, -1); in nand_lock()
1109 nand_release_device(mtd); in nand_lock()
1253 static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_raw() argument
1256 chip->read_buf(mtd, buf, mtd->writesize); in nand_read_page_raw()
1258 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_raw()
1272 static int nand_read_page_raw_syndrome(struct mtd_info *mtd, in nand_read_page_raw_syndrome() argument
1282 chip->read_buf(mtd, buf, eccsize); in nand_read_page_raw_syndrome()
1286 chip->read_buf(mtd, oob, chip->ecc.prepad); in nand_read_page_raw_syndrome()
1290 chip->read_buf(mtd, oob, eccbytes); in nand_read_page_raw_syndrome()
1294 chip->read_buf(mtd, oob, chip->ecc.postpad); in nand_read_page_raw_syndrome()
1299 size = mtd->oobsize - (oob - chip->oob_poi); in nand_read_page_raw_syndrome()
1301 chip->read_buf(mtd, oob, size); in nand_read_page_raw_syndrome()
1314 static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_swecc() argument
1326 chip->ecc.read_page_raw(mtd, chip, buf, 1, page); in nand_read_page_swecc()
1329 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_swecc()
1340 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in nand_read_page_swecc()
1342 mtd->ecc_stats.failed++; in nand_read_page_swecc()
1344 mtd->ecc_stats.corrected += stat; in nand_read_page_swecc()
1360 static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_subpage() argument
1386 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_col_addr, -1); in nand_read_subpage()
1389 chip->read_buf(mtd, p, datafrag_len); in nand_read_subpage()
1393 chip->ecc.calculate(mtd, p, &chip->buffers->ecccalc[i]); in nand_read_subpage()
1406 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1); in nand_read_subpage()
1407 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_subpage()
1420 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, in nand_read_subpage()
1421 mtd->writesize + aligned_pos, -1); in nand_read_subpage()
1422 chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len); in nand_read_subpage()
1432 stat = chip->ecc.correct(mtd, p, in nand_read_subpage()
1435 mtd->ecc_stats.failed++; in nand_read_subpage()
1437 mtd->ecc_stats.corrected += stat; in nand_read_subpage()
1454 static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_hwecc() argument
1467 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_hwecc()
1468 chip->read_buf(mtd, p, eccsize); in nand_read_page_hwecc()
1469 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_hwecc()
1471 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_hwecc()
1482 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in nand_read_page_hwecc()
1484 mtd->ecc_stats.failed++; in nand_read_page_hwecc()
1486 mtd->ecc_stats.corrected += stat; in nand_read_page_hwecc()
1507 static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd, in nand_read_page_hwecc_oob_first() argument
1520 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); in nand_read_page_hwecc_oob_first()
1521 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_page_hwecc_oob_first()
1522 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page); in nand_read_page_hwecc_oob_first()
1530 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_hwecc_oob_first()
1531 chip->read_buf(mtd, p, eccsize); in nand_read_page_hwecc_oob_first()
1532 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_read_page_hwecc_oob_first()
1534 stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL); in nand_read_page_hwecc_oob_first()
1536 mtd->ecc_stats.failed++; in nand_read_page_hwecc_oob_first()
1538 mtd->ecc_stats.corrected += stat; in nand_read_page_hwecc_oob_first()
1556 static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_page_syndrome() argument
1569 chip->ecc.hwctl(mtd, NAND_ECC_READ); in nand_read_page_syndrome()
1570 chip->read_buf(mtd, p, eccsize); in nand_read_page_syndrome()
1573 chip->read_buf(mtd, oob, chip->ecc.prepad); in nand_read_page_syndrome()
1577 chip->ecc.hwctl(mtd, NAND_ECC_READSYN); in nand_read_page_syndrome()
1578 chip->read_buf(mtd, oob, eccbytes); in nand_read_page_syndrome()
1579 stat = chip->ecc.correct(mtd, p, oob, NULL); in nand_read_page_syndrome()
1582 mtd->ecc_stats.failed++; in nand_read_page_syndrome()
1584 mtd->ecc_stats.corrected += stat; in nand_read_page_syndrome()
1591 chip->read_buf(mtd, oob, chip->ecc.postpad); in nand_read_page_syndrome()
1597 i = mtd->oobsize - (oob - chip->oob_poi); in nand_read_page_syndrome()
1599 chip->read_buf(mtd, oob, i); in nand_read_page_syndrome()
1661 static int nand_setup_read_retry(struct mtd_info *mtd, int retry_mode) in nand_setup_read_retry() argument
1663 struct nand_chip *chip = mtd->priv; in nand_setup_read_retry()
1673 return chip->setup_read_retry(mtd, retry_mode); in nand_setup_read_retry()
1684 static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, in nand_do_read_ops() argument
1688 struct nand_chip *chip = mtd->priv; in nand_do_read_ops()
1693 mtd->oobavail : mtd->oobsize; in nand_do_read_ops()
1702 chip->select_chip(mtd, chipnr); in nand_do_read_ops()
1707 col = (int)(from & (mtd->writesize - 1)); in nand_do_read_ops()
1714 unsigned int ecc_failures = mtd->ecc_stats.failed; in nand_do_read_ops()
1716 bytes = min(mtd->writesize - col, readlen); in nand_do_read_ops()
1717 aligned = (bytes == mtd->writesize); in nand_do_read_ops()
1735 chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page); in nand_do_read_ops()
1742 ret = chip->ecc.read_page_raw(mtd, chip, bufpoi, in nand_do_read_ops()
1747 ret = chip->ecc.read_subpage(mtd, chip, in nand_do_read_ops()
1751 ret = chip->ecc.read_page(mtd, chip, bufpoi, in nand_do_read_ops()
1765 !(mtd->ecc_stats.failed - ecc_failures) && in nand_do_read_ops()
1791 nand_wait_ready(mtd); in nand_do_read_ops()
1794 if (mtd->ecc_stats.failed - ecc_failures) { in nand_do_read_ops()
1797 ret = nand_setup_read_retry(mtd, in nand_do_read_ops()
1803 mtd->ecc_stats.failed = ecc_failures; in nand_do_read_ops()
1823 ret = nand_setup_read_retry(mtd, 0); in nand_do_read_ops()
1841 chip->select_chip(mtd, -1); in nand_do_read_ops()
1842 chip->select_chip(mtd, chipnr); in nand_do_read_ops()
1845 chip->select_chip(mtd, -1); in nand_do_read_ops()
1870 static int nand_read(struct mtd_info *mtd, loff_t from, size_t len, in nand_read() argument
1876 nand_get_device(mtd, FL_READING); in nand_read()
1881 ret = nand_do_read_ops(mtd, from, &ops); in nand_read()
1883 nand_release_device(mtd); in nand_read()
1893 static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_oob_std() argument
1896 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); in nand_read_oob_std()
1897 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_read_oob_std()
1908 static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip, in nand_read_oob_syndrome() argument
1911 int length = mtd->oobsize; in nand_read_oob_syndrome()
1917 chip->cmdfunc(mtd, NAND_CMD_READ0, chip->ecc.size, page); in nand_read_oob_syndrome()
1921 if (mtd->writesize > 512) in nand_read_oob_syndrome()
1922 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, pos, -1); in nand_read_oob_syndrome()
1924 chip->cmdfunc(mtd, NAND_CMD_READ0, pos, page); in nand_read_oob_syndrome()
1928 chip->read_buf(mtd, bufpoi, toread); in nand_read_oob_syndrome()
1933 chip->read_buf(mtd, bufpoi, length); in nand_read_oob_syndrome()
1944 static int nand_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_oob_std() argument
1949 int length = mtd->oobsize; in nand_write_oob_std()
1951 chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page); in nand_write_oob_std()
1952 chip->write_buf(mtd, buf, length); in nand_write_oob_std()
1954 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_oob_std()
1956 status = chip->waitfunc(mtd, chip); in nand_write_oob_std()
1968 static int nand_write_oob_syndrome(struct mtd_info *mtd, in nand_write_oob_syndrome() argument
1972 int eccsize = chip->ecc.size, length = mtd->oobsize; in nand_write_oob_syndrome()
1987 chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page); in nand_write_oob_syndrome()
1990 if (mtd->writesize <= 512) { in nand_write_oob_syndrome()
1996 chip->write_buf(mtd, (uint8_t *)&fill, in nand_write_oob_syndrome()
2002 chip->cmdfunc(mtd, NAND_CMD_RNDIN, pos, -1); in nand_write_oob_syndrome()
2007 chip->write_buf(mtd, bufpoi, len); in nand_write_oob_syndrome()
2012 chip->write_buf(mtd, bufpoi, length); in nand_write_oob_syndrome()
2014 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_oob_syndrome()
2015 status = chip->waitfunc(mtd, chip); in nand_write_oob_syndrome()
2028 static int nand_do_read_oob(struct mtd_info *mtd, loff_t from, in nand_do_read_oob() argument
2033 struct nand_chip *chip = mtd->priv; in nand_do_read_oob()
2043 stats = mtd->ecc_stats; in nand_do_read_oob()
2048 len = mtd->oobsize; in nand_do_read_oob()
2057 if (unlikely(from >= mtd->size || in nand_do_read_oob()
2058 ops->ooboffs + readlen > ((mtd->size >> chip->page_shift) - in nand_do_read_oob()
2066 chip->select_chip(mtd, chipnr); in nand_do_read_oob()
2074 ret = chip->ecc.read_oob_raw(mtd, chip, page); in nand_do_read_oob()
2076 ret = chip->ecc.read_oob(mtd, chip, page); in nand_do_read_oob()
2089 nand_wait_ready(mtd); in nand_do_read_oob()
2105 chip->select_chip(mtd, -1); in nand_do_read_oob()
2106 chip->select_chip(mtd, chipnr); in nand_do_read_oob()
2109 chip->select_chip(mtd, -1); in nand_do_read_oob()
2116 if (mtd->ecc_stats.failed - stats.failed) in nand_do_read_oob()
2130 static int nand_read_oob(struct mtd_info *mtd, loff_t from, in nand_read_oob() argument
2138 if (ops->datbuf && (from + ops->len) > mtd->size) { in nand_read_oob()
2144 nand_get_device(mtd, FL_READING); in nand_read_oob()
2157 ret = nand_do_read_oob(mtd, from, ops); in nand_read_oob()
2159 ret = nand_do_read_ops(mtd, from, ops); in nand_read_oob()
2162 nand_release_device(mtd); in nand_read_oob()
2177 static int nand_write_page_raw(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_raw() argument
2180 chip->write_buf(mtd, buf, mtd->writesize); in nand_write_page_raw()
2182 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_page_raw()
2197 static int nand_write_page_raw_syndrome(struct mtd_info *mtd, in nand_write_page_raw_syndrome() argument
2208 chip->write_buf(mtd, buf, eccsize); in nand_write_page_raw_syndrome()
2212 chip->write_buf(mtd, oob, chip->ecc.prepad); in nand_write_page_raw_syndrome()
2216 chip->write_buf(mtd, oob, eccbytes); in nand_write_page_raw_syndrome()
2220 chip->write_buf(mtd, oob, chip->ecc.postpad); in nand_write_page_raw_syndrome()
2225 size = mtd->oobsize - (oob - chip->oob_poi); in nand_write_page_raw_syndrome()
2227 chip->write_buf(mtd, oob, size); in nand_write_page_raw_syndrome()
2239 static int nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_swecc() argument
2252 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_write_page_swecc()
2257 return chip->ecc.write_page_raw(mtd, chip, buf, 1, page); in nand_write_page_swecc()
2268 static int nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page_hwecc() argument
2280 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_page_hwecc()
2281 chip->write_buf(mtd, p, eccsize); in nand_write_page_hwecc()
2282 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in nand_write_page_hwecc()
2288 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_page_hwecc()
2304 static int nand_write_subpage_hwecc(struct mtd_info *mtd, in nand_write_subpage_hwecc() argument
2317 int oob_bytes = mtd->oobsize / ecc_steps; in nand_write_subpage_hwecc()
2322 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_subpage_hwecc()
2325 chip->write_buf(mtd, buf, ecc_size); in nand_write_subpage_hwecc()
2331 chip->ecc.calculate(mtd, buf, ecc_calc); in nand_write_subpage_hwecc()
2350 chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); in nand_write_subpage_hwecc()
2367 static int nand_write_page_syndrome(struct mtd_info *mtd, in nand_write_page_syndrome() argument
2380 chip->ecc.hwctl(mtd, NAND_ECC_WRITE); in nand_write_page_syndrome()
2381 chip->write_buf(mtd, p, eccsize); in nand_write_page_syndrome()
2384 chip->write_buf(mtd, oob, chip->ecc.prepad); in nand_write_page_syndrome()
2388 chip->ecc.calculate(mtd, p, oob); in nand_write_page_syndrome()
2389 chip->write_buf(mtd, oob, eccbytes); in nand_write_page_syndrome()
2393 chip->write_buf(mtd, oob, chip->ecc.postpad); in nand_write_page_syndrome()
2399 i = mtd->oobsize - (oob - chip->oob_poi); in nand_write_page_syndrome()
2401 chip->write_buf(mtd, oob, i); in nand_write_page_syndrome()
2418 static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, in nand_write_page() argument
2426 subpage = offset || (data_len < mtd->writesize); in nand_write_page()
2430 chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page); in nand_write_page()
2433 status = chip->ecc.write_page_raw(mtd, chip, buf, in nand_write_page()
2436 status = chip->ecc.write_subpage(mtd, chip, offset, data_len, in nand_write_page()
2439 status = chip->ecc.write_page(mtd, chip, buf, oob_required, in nand_write_page()
2453 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); in nand_write_page()
2454 status = chip->waitfunc(mtd, chip); in nand_write_page()
2460 status = chip->errstat(mtd, chip, FL_WRITING, status, in nand_write_page()
2466 chip->cmdfunc(mtd, NAND_CMD_CACHEDPROG, -1, -1); in nand_write_page()
2467 status = chip->waitfunc(mtd, chip); in nand_write_page()
2480 static uint8_t *nand_fill_oob(struct mtd_info *mtd, uint8_t *oob, size_t len, in nand_fill_oob() argument
2483 struct nand_chip *chip = mtd->priv; in nand_fill_oob()
2489 memset(chip->oob_poi, 0xff, mtd->oobsize); in nand_fill_oob()
2539 static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, in nand_do_write_ops() argument
2543 struct nand_chip *chip = mtd->priv; in nand_do_write_ops()
2548 mtd->oobavail : mtd->oobsize; in nand_do_write_ops()
2566 column = to & (mtd->writesize - 1); in nand_do_write_ops()
2569 chip->select_chip(mtd, chipnr); in nand_do_write_ops()
2572 if (nand_check_wp(mtd)) { in nand_do_write_ops()
2593 int bytes = mtd->writesize; in nand_do_write_ops()
2597 int part_pagewr = (column || writelen < mtd->writesize); in nand_do_write_ops()
2614 memset(chip->buffers->databuf, 0xff, mtd->writesize); in nand_do_write_ops()
2621 oob = nand_fill_oob(mtd, oob, len, ops); in nand_do_write_ops()
2625 memset(chip->oob_poi, 0xff, mtd->oobsize); in nand_do_write_ops()
2627 ret = chip->write_page(mtd, chip, column, bytes, wbuf, in nand_do_write_ops()
2645 chip->select_chip(mtd, -1); in nand_do_write_ops()
2646 chip->select_chip(mtd, chipnr); in nand_do_write_ops()
2655 chip->select_chip(mtd, -1); in nand_do_write_ops()
2670 static int panic_nand_write(struct mtd_info *mtd, loff_t to, size_t len, in panic_nand_write() argument
2673 struct nand_chip *chip = mtd->priv; in panic_nand_write()
2679 panic_nand_get_device(chip, mtd, FL_WRITING); in panic_nand_write()
2681 chip->select_chip(mtd, chipnr); in panic_nand_write()
2684 panic_nand_wait(mtd, chip, 400); in panic_nand_write()
2691 ret = nand_do_write_ops(mtd, to, &ops); in panic_nand_write()
2707 static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, in nand_write() argument
2713 nand_get_device(mtd, FL_WRITING); in nand_write()
2718 ret = nand_do_write_ops(mtd, to, &ops); in nand_write()
2720 nand_release_device(mtd); in nand_write()
2732 static int nand_do_write_oob(struct mtd_info *mtd, loff_t to, in nand_do_write_oob() argument
2736 struct nand_chip *chip = mtd->priv; in nand_do_write_oob()
2744 len = mtd->oobsize; in nand_do_write_oob()
2760 if (unlikely(to >= mtd->size || in nand_do_write_oob()
2762 ((mtd->size >> chip->page_shift) - in nand_do_write_oob()
2770 chip->select_chip(mtd, chipnr); in nand_do_write_oob()
2781 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_do_write_oob()
2784 if (nand_check_wp(mtd)) { in nand_do_write_oob()
2785 chip->select_chip(mtd, -1); in nand_do_write_oob()
2793 nand_fill_oob(mtd, ops->oobbuf, ops->ooblen, ops); in nand_do_write_oob()
2796 status = chip->ecc.write_oob_raw(mtd, chip, page & chip->pagemask); in nand_do_write_oob()
2798 status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask); in nand_do_write_oob()
2800 chip->select_chip(mtd, -1); in nand_do_write_oob()
2816 static int nand_write_oob(struct mtd_info *mtd, loff_t to, in nand_write_oob() argument
2824 if (ops->datbuf && (to + ops->len) > mtd->size) { in nand_write_oob()
2830 nand_get_device(mtd, FL_WRITING); in nand_write_oob()
2843 ret = nand_do_write_oob(mtd, to, ops); in nand_write_oob()
2845 ret = nand_do_write_ops(mtd, to, ops); in nand_write_oob()
2848 nand_release_device(mtd); in nand_write_oob()
2859 static int single_erase(struct mtd_info *mtd, int page) in single_erase() argument
2861 struct nand_chip *chip = mtd->priv; in single_erase()
2863 chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page); in single_erase()
2864 chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1); in single_erase()
2866 return chip->waitfunc(mtd, chip); in single_erase()
2876 static int nand_erase(struct mtd_info *mtd, struct erase_info *instr) in nand_erase() argument
2878 return nand_erase_nand(mtd, instr, 0); in nand_erase()
2889 int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, in nand_erase_nand() argument
2893 struct nand_chip *chip = mtd->priv; in nand_erase_nand()
2900 if (check_offs_len(mtd, instr->addr, instr->len)) in nand_erase_nand()
2904 nand_get_device(mtd, FL_ERASING); in nand_erase_nand()
2914 chip->select_chip(mtd, chipnr); in nand_erase_nand()
2917 if (nand_check_wp(mtd)) { in nand_erase_nand()
2931 if (nand_block_checkbad(mtd, ((loff_t) page) << in nand_erase_nand()
2947 status = chip->erase(mtd, page & chip->pagemask); in nand_erase_nand()
2954 status = chip->errstat(mtd, chip, FL_ERASING, in nand_erase_nand()
2974 chip->select_chip(mtd, -1); in nand_erase_nand()
2975 chip->select_chip(mtd, chipnr); in nand_erase_nand()
2985 chip->select_chip(mtd, -1); in nand_erase_nand()
2986 nand_release_device(mtd); in nand_erase_nand()
3002 static void nand_sync(struct mtd_info *mtd) in nand_sync() argument
3007 nand_get_device(mtd, FL_SYNCING); in nand_sync()
3009 nand_release_device(mtd); in nand_sync()
3017 static int nand_block_isbad(struct mtd_info *mtd, loff_t offs) in nand_block_isbad() argument
3019 return nand_block_checkbad(mtd, offs, 1, 0); in nand_block_isbad()
3027 static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs) in nand_block_markbad() argument
3031 ret = nand_block_isbad(mtd, ofs); in nand_block_markbad()
3039 return nand_block_markbad_lowlevel(mtd, ofs); in nand_block_markbad()
3049 static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip, in nand_onfi_set_features() argument
3060 chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1); in nand_onfi_set_features()
3062 chip->write_byte(mtd, subfeature_param[i]); in nand_onfi_set_features()
3064 status = chip->waitfunc(mtd, chip); in nand_onfi_set_features()
3077 static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip, in nand_onfi_get_features() argument
3087 chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1); in nand_onfi_get_features()
3089 *subfeature_param++ = chip->read_byte(mtd); in nand_onfi_get_features()
3097 static int nand_suspend(struct mtd_info *mtd) in nand_suspend() argument
3099 return nand_get_device(mtd, FL_PM_SUSPENDED); in nand_suspend()
3106 static void nand_resume(struct mtd_info *mtd) in nand_resume() argument
3108 struct nand_chip *chip = mtd->priv; in nand_resume()
3111 nand_release_device(mtd); in nand_resume()
3122 static void nand_shutdown(struct mtd_info *mtd) in nand_shutdown() argument
3124 nand_get_device(mtd, FL_PM_SUSPENDED); in nand_shutdown()
3208 static int nand_flash_detect_ext_param_page(struct mtd_info *mtd, in nand_flash_detect_ext_param_page() argument
3225 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1); in nand_flash_detect_ext_param_page()
3228 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, in nand_flash_detect_ext_param_page()
3232 chip->read_buf(mtd, (uint8_t *)ep, len); in nand_flash_detect_ext_param_page()
3278 static int nand_setup_read_retry_micron(struct mtd_info *mtd, int retry_mode) in nand_setup_read_retry_micron() argument
3280 struct nand_chip *chip = mtd->priv; in nand_setup_read_retry_micron()
3283 return chip->onfi_set_features(mtd, chip, ONFI_FEATURE_ADDR_READ_RETRY, in nand_setup_read_retry_micron()
3305 static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, in nand_flash_detect_onfi() argument
3313 chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1); in nand_flash_detect_onfi()
3314 if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' || in nand_flash_detect_onfi()
3315 chip->read_byte(mtd) != 'F' || chip->read_byte(mtd) != 'I') in nand_flash_detect_onfi()
3318 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0, -1); in nand_flash_detect_onfi()
3321 ((uint8_t *)p)[j] = chip->read_byte(mtd); in nand_flash_detect_onfi()
3353 if (!mtd->name) in nand_flash_detect_onfi()
3354 mtd->name = p->model; in nand_flash_detect_onfi()
3356 mtd->writesize = le32_to_cpu(p->byte_per_page); in nand_flash_detect_onfi()
3363 mtd->erasesize = 1 << (fls(le32_to_cpu(p->pages_per_block)) - 1); in nand_flash_detect_onfi()
3364 mtd->erasesize *= mtd->writesize; in nand_flash_detect_onfi()
3366 mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page); in nand_flash_detect_onfi()
3370 chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count; in nand_flash_detect_onfi()
3390 if (mtd->writesize > 512 && chip->cmdfunc == nand_command) in nand_flash_detect_onfi()
3394 if (nand_flash_detect_ext_param_page(mtd, chip, p)) in nand_flash_detect_onfi()
3409 static int nand_flash_detect_jedec(struct mtd_info *mtd, struct nand_chip *chip, in nand_flash_detect_jedec() argument
3418 chip->cmdfunc(mtd, NAND_CMD_READID, 0x40, -1); in nand_flash_detect_jedec()
3419 if (chip->read_byte(mtd) != 'J' || chip->read_byte(mtd) != 'E' || in nand_flash_detect_jedec()
3420 chip->read_byte(mtd) != 'D' || chip->read_byte(mtd) != 'E' || in nand_flash_detect_jedec()
3421 chip->read_byte(mtd) != 'C') in nand_flash_detect_jedec()
3424 chip->cmdfunc(mtd, NAND_CMD_PARAM, 0x40, -1); in nand_flash_detect_jedec()
3427 ((uint8_t *)p)[j] = chip->read_byte(mtd); in nand_flash_detect_jedec()
3453 if (!mtd->name) in nand_flash_detect_jedec()
3454 mtd->name = p->model; in nand_flash_detect_jedec()
3456 mtd->writesize = le32_to_cpu(p->byte_per_page); in nand_flash_detect_jedec()
3459 mtd->erasesize = 1 << (fls(le32_to_cpu(p->pages_per_block)) - 1); in nand_flash_detect_jedec()
3460 mtd->erasesize *= mtd->writesize; in nand_flash_detect_jedec()
3462 mtd->oobsize = le16_to_cpu(p->spare_bytes_per_page); in nand_flash_detect_jedec()
3466 chip->chipsize *= (uint64_t)mtd->erasesize * p->lun_count; in nand_flash_detect_jedec()
3561 static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip, in nand_decode_ext_id() argument
3584 mtd->writesize = 2048 << (extid & 0x03); in nand_decode_ext_id()
3589 mtd->oobsize = 128; in nand_decode_ext_id()
3592 mtd->oobsize = 218; in nand_decode_ext_id()
3595 mtd->oobsize = 400; in nand_decode_ext_id()
3598 mtd->oobsize = 436; in nand_decode_ext_id()
3601 mtd->oobsize = 512; in nand_decode_ext_id()
3604 mtd->oobsize = 640; in nand_decode_ext_id()
3608 mtd->oobsize = 1024; in nand_decode_ext_id()
3613 mtd->erasesize = (128 * 1024) << in nand_decode_ext_id()
3621 mtd->writesize = 2048 << (extid & 0x03); in nand_decode_ext_id()
3626 mtd->oobsize = 128; in nand_decode_ext_id()
3629 mtd->oobsize = 224; in nand_decode_ext_id()
3632 mtd->oobsize = 448; in nand_decode_ext_id()
3635 mtd->oobsize = 64; in nand_decode_ext_id()
3638 mtd->oobsize = 32; in nand_decode_ext_id()
3641 mtd->oobsize = 16; in nand_decode_ext_id()
3644 mtd->oobsize = 640; in nand_decode_ext_id()
3651 mtd->erasesize = (128 * 1024) << tmp; in nand_decode_ext_id()
3653 mtd->erasesize = 768 * 1024; in nand_decode_ext_id()
3655 mtd->erasesize = (64 * 1024) << tmp; in nand_decode_ext_id()
3659 mtd->writesize = 1024 << (extid & 0x03); in nand_decode_ext_id()
3662 mtd->oobsize = (8 << (extid & 0x01)) * in nand_decode_ext_id()
3663 (mtd->writesize >> 9); in nand_decode_ext_id()
3666 mtd->erasesize = (64 * 1024) << (extid & 0x03); in nand_decode_ext_id()
3683 mtd->oobsize = 32 * mtd->writesize >> 9; in nand_decode_ext_id()
3694 static void nand_decode_id(struct mtd_info *mtd, struct nand_chip *chip, in nand_decode_id() argument
3700 mtd->erasesize = type->erasesize; in nand_decode_id()
3701 mtd->writesize = type->pagesize; in nand_decode_id()
3702 mtd->oobsize = mtd->writesize / 32; in nand_decode_id()
3716 && mtd->writesize == 512) { in nand_decode_id()
3717 mtd->erasesize = 128 * 1024; in nand_decode_id()
3718 mtd->erasesize <<= ((id_data[3] & 0x03) << 1); in nand_decode_id()
3727 static void nand_decode_bbm_options(struct mtd_info *mtd, in nand_decode_bbm_options() argument
3733 if (mtd->writesize > 512 || (chip->options & NAND_BUSWIDTH_16)) in nand_decode_bbm_options()
3754 (mtd->writesize == 2048 && in nand_decode_bbm_options()
3764 static bool find_full_id_nand(struct mtd_info *mtd, struct nand_chip *chip, in find_full_id_nand() argument
3768 mtd->writesize = type->pagesize; in find_full_id_nand()
3769 mtd->erasesize = type->erasesize; in find_full_id_nand()
3770 mtd->oobsize = type->oobsize; in find_full_id_nand()
3782 if (!mtd->name) in find_full_id_nand()
3783 mtd->name = type->name; in find_full_id_nand()
3793 static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd, in nand_get_flash_type() argument
3803 chip->select_chip(mtd, 0); in nand_get_flash_type()
3809 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_get_flash_type()
3812 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_get_flash_type()
3815 *maf_id = chip->read_byte(mtd); in nand_get_flash_type()
3816 *dev_id = chip->read_byte(mtd); in nand_get_flash_type()
3825 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_get_flash_type()
3829 id_data[i] = chip->read_byte(mtd); in nand_get_flash_type()
3842 if (find_full_id_nand(mtd, chip, type, id_data, &busw)) in nand_get_flash_type()
3852 if (nand_flash_detect_onfi(mtd, chip, &busw)) in nand_get_flash_type()
3856 if (nand_flash_detect_jedec(mtd, chip, &busw)) in nand_get_flash_type()
3863 if (!mtd->name) in nand_get_flash_type()
3864 mtd->name = type->name; in nand_get_flash_type()
3870 nand_decode_ext_id(mtd, chip, id_data, &busw); in nand_get_flash_type()
3872 nand_decode_id(mtd, chip, type, id_data, &busw); in nand_get_flash_type()
3902 pr_info("%s %s\n", nand_manuf_ids[maf_idx].name, mtd->name); in nand_get_flash_type()
3909 nand_decode_bbm_options(mtd, chip, id_data); in nand_get_flash_type()
3912 chip->page_shift = ffs(mtd->writesize) - 1; in nand_get_flash_type()
3917 ffs(mtd->erasesize) - 1; in nand_get_flash_type()
3929 if (mtd->writesize > 512 && chip->cmdfunc == nand_command) in nand_get_flash_type()
3947 mtd->erasesize >> 10, mtd->writesize, mtd->oobsize); in nand_get_flash_type()
3951 static int nand_dt_init(struct mtd_info *mtd, struct nand_chip *chip, in nand_dt_init() argument
3994 int nand_scan_ident(struct mtd_info *mtd, int maxchips, in nand_scan_ident() argument
3998 struct nand_chip *chip = mtd->priv; in nand_scan_ident()
4003 ret = nand_dt_init(mtd, chip, chip->flash_node); in nand_scan_ident()
4008 if (!mtd->name && mtd->dev.parent) in nand_scan_ident()
4009 mtd->name = dev_name(mtd->dev.parent); in nand_scan_ident()
4015 type = nand_get_flash_type(mtd, chip, &nand_maf_id, in nand_scan_ident()
4021 chip->select_chip(mtd, -1); in nand_scan_ident()
4025 chip->select_chip(mtd, -1); in nand_scan_ident()
4029 chip->select_chip(mtd, i); in nand_scan_ident()
4031 chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); in nand_scan_ident()
4033 chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); in nand_scan_ident()
4035 if (nand_maf_id != chip->read_byte(mtd) || in nand_scan_ident()
4036 nand_dev_id != chip->read_byte(mtd)) { in nand_scan_ident()
4037 chip->select_chip(mtd, -1); in nand_scan_ident()
4040 chip->select_chip(mtd, -1); in nand_scan_ident()
4047 mtd->size = i * chip->chipsize; in nand_scan_ident()
4067 static bool nand_ecc_strength_good(struct mtd_info *mtd) in nand_ecc_strength_good() argument
4069 struct nand_chip *chip = mtd->priv; in nand_ecc_strength_good()
4081 corr = (mtd->writesize * ecc->strength) / ecc->size; in nand_ecc_strength_good()
4082 ds_corr = (mtd->writesize * chip->ecc_strength_ds) / chip->ecc_step_ds; in nand_ecc_strength_good()
4095 int nand_scan_tail(struct mtd_info *mtd) in nand_scan_tail() argument
4098 struct nand_chip *chip = mtd->priv; in nand_scan_tail()
4107 nbuf = kzalloc(sizeof(*nbuf) + mtd->writesize in nand_scan_tail()
4108 + mtd->oobsize * 3, GFP_KERNEL); in nand_scan_tail()
4112 nbuf->ecccode = nbuf->ecccalc + mtd->oobsize; in nand_scan_tail()
4113 nbuf->databuf = nbuf->ecccode + mtd->oobsize; in nand_scan_tail()
4122 chip->oob_poi = chip->buffers->databuf + mtd->writesize; in nand_scan_tail()
4128 switch (mtd->oobsize) { in nand_scan_tail()
4143 mtd->oobsize); in nand_scan_tail()
4208 if (mtd->writesize >= ecc->size) { in nand_scan_tail()
4216 ecc->size, mtd->writesize); in nand_scan_tail()
4254 if (!ecc->size && (mtd->oobsize >= 64)) { in nand_scan_tail()
4262 ecc->priv = nand_bch_init(mtd, ecc->size, ecc->bytes, in nand_scan_tail()
4278 ecc->size = mtd->writesize; in nand_scan_tail()
4302 mtd->oobavail = ecc->layout->oobavail; in nand_scan_tail()
4305 if (!nand_ecc_strength_good(mtd)) in nand_scan_tail()
4307 mtd->name); in nand_scan_tail()
4313 ecc->steps = mtd->writesize / ecc->size; in nand_scan_tail()
4314 if (ecc->steps * ecc->size != mtd->writesize) { in nand_scan_tail()
4324 mtd->subpage_sft = 1; in nand_scan_tail()
4329 mtd->subpage_sft = 2; in nand_scan_tail()
4333 chip->subpagesize = mtd->writesize >> mtd->subpage_sft; in nand_scan_tail()
4354 mtd->type = nand_is_slc(chip) ? MTD_NANDFLASH : MTD_MLCNANDFLASH; in nand_scan_tail()
4355 mtd->flags = (chip->options & NAND_ROM) ? MTD_CAP_ROM : in nand_scan_tail()
4357 mtd->_erase = nand_erase; in nand_scan_tail()
4358 mtd->_point = NULL; in nand_scan_tail()
4359 mtd->_unpoint = NULL; in nand_scan_tail()
4360 mtd->_read = nand_read; in nand_scan_tail()
4361 mtd->_write = nand_write; in nand_scan_tail()
4362 mtd->_panic_write = panic_nand_write; in nand_scan_tail()
4363 mtd->_read_oob = nand_read_oob; in nand_scan_tail()
4364 mtd->_write_oob = nand_write_oob; in nand_scan_tail()
4365 mtd->_sync = nand_sync; in nand_scan_tail()
4366 mtd->_lock = NULL; in nand_scan_tail()
4367 mtd->_unlock = NULL; in nand_scan_tail()
4368 mtd->_suspend = nand_suspend; in nand_scan_tail()
4369 mtd->_resume = nand_resume; in nand_scan_tail()
4370 mtd->_reboot = nand_shutdown; in nand_scan_tail()
4371 mtd->_block_isreserved = nand_block_isreserved; in nand_scan_tail()
4372 mtd->_block_isbad = nand_block_isbad; in nand_scan_tail()
4373 mtd->_block_markbad = nand_block_markbad; in nand_scan_tail()
4374 mtd->writebufsize = mtd->writesize; in nand_scan_tail()
4377 mtd->ecclayout = ecc->layout; in nand_scan_tail()
4378 mtd->ecc_strength = ecc->strength; in nand_scan_tail()
4379 mtd->ecc_step_size = ecc->size; in nand_scan_tail()
4385 if (!mtd->bitflip_threshold) in nand_scan_tail()
4386 mtd->bitflip_threshold = DIV_ROUND_UP(mtd->ecc_strength * 3, 4); in nand_scan_tail()
4393 return chip->scan_bbt(mtd); in nand_scan_tail()
4418 int nand_scan(struct mtd_info *mtd, int maxchips) in nand_scan() argument
4422 ret = nand_scan_ident(mtd, maxchips, NULL); in nand_scan()
4424 ret = nand_scan_tail(mtd); in nand_scan()
4455 void nand_release(struct mtd_info *mtd) in nand_release() argument
4457 mtd_device_unregister(mtd); in nand_release()
4458 nand_cleanup(mtd->priv); in nand_release()