Lines Matching full:mtd

2  *  linux/drivers/mtd/onenand/onenand_base.c
25 #include <linux/mtd/mtd.h>
26 #include "linux/mtd/flashchip.h"
27 #include <linux/mtd/onenand.h>
290 * @param mtd MTD device structure
293 int flexonenand_region(struct mtd_info *mtd, loff_t addr) in flexonenand_region() argument
297 for (i = 0; i < mtd->numeraseregions; i++) in flexonenand_region()
298 if (addr < mtd->eraseregions[i].offset) in flexonenand_region()
317 * @param mtd MTD device structure
325 static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, in onenand_command() argument
328 struct onenand_chip *this = mtd->priv; in onenand_command()
461 * @param mtd MTD device structure
468 static int onenand_wait(struct mtd_info *mtd, int state) in onenand_wait() argument
470 struct onenand_chip *this = mtd->priv; in onenand_wait()
509 * @param mtd MTD data structure
515 static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area) in onenand_bufferram_offset() argument
517 struct onenand_chip *this = mtd->priv; in onenand_bufferram_offset()
521 return mtd->writesize; in onenand_bufferram_offset()
523 return mtd->oobsize; in onenand_bufferram_offset()
531 * @param mtd MTD data structure
539 static int onenand_read_bufferram(struct mtd_info *mtd, loff_t addr, int area, in onenand_read_bufferram() argument
543 struct onenand_chip *this = mtd->priv; in onenand_read_bufferram()
547 bufferram += onenand_bufferram_offset(mtd, area); in onenand_read_bufferram()
556 * @param mtd MTD data structure
564 static int onenand_sync_read_bufferram(struct mtd_info *mtd, loff_t addr, int area, in onenand_sync_read_bufferram() argument
568 struct onenand_chip *this = mtd->priv; in onenand_sync_read_bufferram()
572 bufferram += onenand_bufferram_offset(mtd, area); in onenand_sync_read_bufferram()
574 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ); in onenand_sync_read_bufferram()
578 this->mmcontrol(mtd, 0); in onenand_sync_read_bufferram()
585 * @param mtd MTD data structure
593 static int onenand_write_bufferram(struct mtd_info *mtd, loff_t addr, int area, in onenand_write_bufferram() argument
597 struct onenand_chip *this = mtd->priv; in onenand_write_bufferram()
601 bufferram += onenand_bufferram_offset(mtd, area); in onenand_write_bufferram()
610 * @param mtd MTD data structure
616 static int onenand_get_2x_blockpage(struct mtd_info *mtd, loff_t addr) in onenand_get_2x_blockpage() argument
618 struct onenand_chip *this = mtd->priv; in onenand_get_2x_blockpage()
634 * @param mtd MTD data structure
640 static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr) in onenand_check_bufferram() argument
642 struct onenand_chip *this = mtd->priv; in onenand_check_bufferram()
647 blockpage = onenand_get_2x_blockpage(mtd, addr); in onenand_check_bufferram()
676 * @param mtd MTD data structure
682 static int onenand_update_bufferram(struct mtd_info *mtd, loff_t addr, in onenand_update_bufferram() argument
685 struct onenand_chip *this = mtd->priv; in onenand_update_bufferram()
690 blockpage = onenand_get_2x_blockpage(mtd, addr); in onenand_update_bufferram()
711 * @param mtd MTD data structure
717 static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr, in onenand_invalidate_bufferram() argument
720 struct onenand_chip *this = mtd->priv; in onenand_invalidate_bufferram()
735 * @param mtd MTD device structure
740 static void onenand_get_device(struct mtd_info *mtd, int new_state) in onenand_get_device() argument
747 * @param mtd MTD device structure
751 static void onenand_release_device(struct mtd_info *mtd) in onenand_release_device() argument
758 * @param mtd MTD device structure
763 static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, in onenand_transfer_auto_oob() argument
766 struct onenand_chip *this = mtd->priv; in onenand_transfer_auto_oob()
783 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); in onenand_transfer_auto_oob()
802 * @param mtd MTD device structure
813 static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status) in onenand_recover_lsb() argument
815 struct onenand_chip *this = mtd->priv; in onenand_recover_lsb()
827 i = flexonenand_region(mtd, addr); in onenand_recover_lsb()
828 if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift)) in onenand_recover_lsb()
835 this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize); in onenand_recover_lsb()
836 return this->wait(mtd, FL_READING); in onenand_recover_lsb()
841 * @param mtd MTD device structure
847 static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, in onenand_read_ops_nolock() argument
850 struct onenand_chip *this = mtd->priv; in onenand_read_ops_nolock()
867 oobsize = mtd->oobsize; in onenand_read_ops_nolock()
869 oobcolumn = from & (mtd->oobsize - 1); in onenand_read_ops_nolock()
872 if ((from + len) > mtd->size) { in onenand_read_ops_nolock()
879 stats = mtd->ecc_stats; in onenand_read_ops_nolock()
886 if (!onenand_check_bufferram(mtd, from)) { in onenand_read_ops_nolock()
888 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_read_ops_nolock()
889 ret = this->wait(mtd, FL_READING); in onenand_read_ops_nolock()
891 ret = onenand_recover_lsb(mtd, from, ret); in onenand_read_ops_nolock()
892 onenand_update_bufferram(mtd, from, !ret); in onenand_read_ops_nolock()
908 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_read_ops_nolock()
924 this->read_bufferram(mtd, from - thislen, ONENAND_DATARAM, buf, column, thislen); in onenand_read_ops_nolock()
932 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen); in onenand_read_ops_nolock()
934 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); in onenand_read_ops_nolock()
941 this->command(mtd, ONENAND_CMD_READ, from, writesize); in onenand_read_ops_nolock()
942 ret = this->wait(mtd, FL_READING); in onenand_read_ops_nolock()
944 ret = onenand_recover_lsb(mtd, from, ret); in onenand_read_ops_nolock()
945 onenand_update_bufferram(mtd, from, !ret); in onenand_read_ops_nolock()
965 ret = this->wait(mtd, FL_READING); in onenand_read_ops_nolock()
966 onenand_update_bufferram(mtd, from, !ret); in onenand_read_ops_nolock()
983 if (mtd->ecc_stats.failed - stats.failed) in onenand_read_ops_nolock()
987 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0; in onenand_read_ops_nolock()
991 * onenand_read_oob_nolock - [MTD Interface] OneNAND read out-of-band
992 * @param mtd MTD device structure
998 static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, in onenand_read_oob_nolock() argument
1001 struct onenand_chip *this = mtd->priv; in onenand_read_oob_nolock()
1020 oobsize = mtd->oobsize; in onenand_read_oob_nolock()
1022 column = from & (mtd->oobsize - 1); in onenand_read_oob_nolock()
1030 if (unlikely(from >= mtd->size || in onenand_read_oob_nolock()
1031 column + len > ((mtd->size >> this->page_shift) - in onenand_read_oob_nolock()
1037 stats = mtd->ecc_stats; in onenand_read_oob_nolock()
1047 this->command(mtd, readcmd, from, mtd->oobsize); in onenand_read_oob_nolock()
1049 onenand_update_bufferram(mtd, from, 0); in onenand_read_oob_nolock()
1051 ret = this->wait(mtd, FL_READING); in onenand_read_oob_nolock()
1053 ret = onenand_recover_lsb(mtd, from, ret); in onenand_read_oob_nolock()
1061 onenand_transfer_auto_oob(mtd, buf, column, thislen); in onenand_read_oob_nolock()
1063 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, buf, column, thislen); in onenand_read_oob_nolock()
1075 from += mtd->writesize; in onenand_read_oob_nolock()
1085 if (mtd->ecc_stats.failed - stats.failed) in onenand_read_oob_nolock()
1092 * onenand_read - [MTD Interface] MTD compability function for onenand_read_ecc
1093 * @param mtd MTD device structure
1101 int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, in onenand_read() argument
1112 onenand_get_device(mtd, FL_READING); in onenand_read()
1113 ret = onenand_read_ops_nolock(mtd, from, &ops); in onenand_read()
1114 onenand_release_device(mtd); in onenand_read()
1121 * onenand_read_oob - [MTD Interface] OneNAND read out-of-band
1122 * @param mtd MTD device structure
1128 int onenand_read_oob(struct mtd_info *mtd, loff_t from, in onenand_read_oob() argument
1143 onenand_get_device(mtd, FL_READING); in onenand_read_oob()
1145 ret = onenand_read_ops_nolock(mtd, from, ops); in onenand_read_oob()
1147 ret = onenand_read_oob_nolock(mtd, from, ops); in onenand_read_oob()
1148 onenand_release_device(mtd); in onenand_read_oob()
1155 * @param mtd MTD device structure
1160 static int onenand_bbt_wait(struct mtd_info *mtd, int state) in onenand_bbt_wait() argument
1162 struct onenand_chip *this = mtd->priv; in onenand_bbt_wait()
1203 * onenand_bbt_read_oob - [MTD Interface] OneNAND read out-of-band for bbt scan
1204 * @param mtd MTD device structure
1210 int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, in onenand_bbt_read_oob() argument
1213 struct onenand_chip *this = mtd->priv; in onenand_bbt_read_oob()
1229 if (unlikely((from + len) > mtd->size)) { in onenand_bbt_read_oob()
1235 onenand_get_device(mtd, FL_READING); in onenand_bbt_read_oob()
1237 column = from & (mtd->oobsize - 1); in onenand_bbt_read_oob()
1241 thislen = mtd->oobsize - column; in onenand_bbt_read_oob()
1245 this->command(mtd, readcmd, from, mtd->oobsize); in onenand_bbt_read_oob()
1247 onenand_update_bufferram(mtd, from, 0); in onenand_bbt_read_oob()
1249 ret = this->bbt_wait(mtd, FL_READING); in onenand_bbt_read_oob()
1251 ret = onenand_recover_lsb(mtd, from, ret); in onenand_bbt_read_oob()
1256 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, buf, column, thislen); in onenand_bbt_read_oob()
1272 onenand_release_device(mtd); in onenand_bbt_read_oob()
1282 * @param mtd MTD device structure
1286 static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to) in onenand_verify_oob() argument
1288 struct onenand_chip *this = mtd->priv; in onenand_verify_oob()
1295 this->command(mtd, readcmd, to, mtd->oobsize); in onenand_verify_oob()
1296 onenand_update_bufferram(mtd, to, 0); in onenand_verify_oob()
1297 status = this->wait(mtd, FL_READING); in onenand_verify_oob()
1301 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); in onenand_verify_oob()
1302 for (i = 0; i < mtd->oobsize; i++) in onenand_verify_oob()
1311 * @param mtd MTD device structure
1316 static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr, size_t len) in onenand_verify() argument
1318 struct onenand_chip *this = mtd->priv; in onenand_verify()
1329 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize); in onenand_verify()
1331 onenand_update_bufferram(mtd, addr, 0); in onenand_verify()
1333 ret = this->wait(mtd, FL_READING); in onenand_verify()
1337 onenand_update_bufferram(mtd, addr, 1); in onenand_verify()
1340 dataram += onenand_bufferram_offset(mtd, ONENAND_DATARAM); in onenand_verify()
1361 * @param mtd MTD device structure
1367 static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf, in onenand_fill_auto_oob() argument
1370 struct onenand_chip *this = mtd->priv; in onenand_fill_auto_oob()
1404 * @param mtd MTD device structure
1410 static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to, in onenand_write_ops_nolock() argument
1413 struct onenand_chip *this = mtd->priv; in onenand_write_ops_nolock()
1439 oobsize = mtd->oobsize; in onenand_write_ops_nolock()
1441 oobcolumn = to & (mtd->oobsize - 1); in onenand_write_ops_nolock()
1443 column = to & (mtd->writesize - 1); in onenand_write_ops_nolock()
1449 thislen = min_t(int, mtd->writesize - column, len - written); in onenand_write_ops_nolock()
1452 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen); in onenand_write_ops_nolock()
1455 subpage = thislen < mtd->writesize; in onenand_write_ops_nolock()
1457 memset(this->page_buf, 0xff, mtd->writesize); in onenand_write_ops_nolock()
1462 this->write_bufferram(mtd, to, ONENAND_DATARAM, wbuf, 0, mtd->writesize); in onenand_write_ops_nolock()
1469 memset(oobbuf, 0xff, mtd->oobsize); in onenand_write_ops_nolock()
1471 onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen); in onenand_write_ops_nolock()
1481 this->write_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); in onenand_write_ops_nolock()
1483 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize); in onenand_write_ops_nolock()
1485 ret = this->wait(mtd, FL_WRITING); in onenand_write_ops_nolock()
1488 onenand_update_bufferram(mtd, to, !ret && !subpage); in onenand_write_ops_nolock()
1491 onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage); in onenand_write_ops_nolock()
1500 ret = onenand_verify(mtd, buf, to, thislen); in onenand_write_ops_nolock()
1523 * @param mtd MTD device structure
1532 static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, in onenand_write_oob_nolock() argument
1535 struct onenand_chip *this = mtd->priv; in onenand_write_oob_nolock()
1554 oobsize = mtd->oobsize; in onenand_write_oob_nolock()
1556 column = to & (mtd->oobsize - 1); in onenand_write_oob_nolock()
1571 if (unlikely(to >= mtd->size || in onenand_write_oob_nolock()
1572 column + len > ((mtd->size >> this->page_shift) - in onenand_write_oob_nolock()
1587 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize); in onenand_write_oob_nolock()
1591 memset(oobbuf, 0xff, mtd->oobsize); in onenand_write_oob_nolock()
1593 onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen); in onenand_write_oob_nolock()
1596 this->write_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); in onenand_write_oob_nolock()
1600 memset(this->page_buf, 0xff, mtd->writesize); in onenand_write_oob_nolock()
1601 this->write_bufferram(mtd, 0, ONENAND_DATARAM, in onenand_write_oob_nolock()
1602 this->page_buf, 0, mtd->writesize); in onenand_write_oob_nolock()
1605 this->command(mtd, oobcmd, to, mtd->oobsize); in onenand_write_oob_nolock()
1607 onenand_update_bufferram(mtd, to, 0); in onenand_write_oob_nolock()
1610 onenand_update_bufferram(mtd, to + this->writesize, 0); in onenand_write_oob_nolock()
1613 ret = this->wait(mtd, FL_WRITING); in onenand_write_oob_nolock()
1619 ret = onenand_verify_oob(mtd, oobbuf, to); in onenand_write_oob_nolock()
1629 to += mtd->writesize; in onenand_write_oob_nolock()
1640 * onenand_write - [MTD Interface] compability function for onenand_write_ecc
1641 * @param mtd MTD device structure
1649 int onenand_write(struct mtd_info *mtd, loff_t to, size_t len, in onenand_write() argument
1660 onenand_get_device(mtd, FL_WRITING); in onenand_write()
1661 ret = onenand_write_ops_nolock(mtd, to, &ops); in onenand_write()
1662 onenand_release_device(mtd); in onenand_write()
1669 * onenand_write_oob - [MTD Interface] OneNAND write out-of-band
1670 * @param mtd MTD device structure
1676 int onenand_write_oob(struct mtd_info *mtd, loff_t to, in onenand_write_oob() argument
1691 onenand_get_device(mtd, FL_WRITING); in onenand_write_oob()
1693 ret = onenand_write_ops_nolock(mtd, to, ops); in onenand_write_oob()
1695 ret = onenand_write_oob_nolock(mtd, to, ops); in onenand_write_oob()
1696 onenand_release_device(mtd); in onenand_write_oob()
1704 * @param mtd MTD device structure
1711 static int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allowbbt) in onenand_block_isbad_nolock() argument
1713 struct onenand_chip *this = mtd->priv; in onenand_block_isbad_nolock()
1717 return bbm->isbad_bbt(mtd, ofs, allowbbt); in onenand_block_isbad_nolock()
1722 * onenand_erase - [MTD Interface] erase block(s)
1723 * @param mtd MTD device structure
1728 int onenand_erase(struct mtd_info *mtd, struct erase_info *instr) in onenand_erase() argument
1730 struct onenand_chip *this = mtd->priv; in onenand_erase()
1743 i = flexonenand_region(mtd, addr); in onenand_erase()
1744 region = &mtd->eraseregions[i]; in onenand_erase()
1774 onenand_get_device(mtd, FL_ERASING); in onenand_erase()
1782 if (instr->priv == 0 && onenand_block_isbad_nolock(mtd, addr, 0)) { in onenand_erase()
1790 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size); in onenand_erase()
1792 onenand_invalidate_bufferram(mtd, addr, block_size); in onenand_erase()
1794 ret = this->wait(mtd, FL_ERASING); in onenand_erase()
1823 /* This has been checked at MTD in onenand_erase()
1841 onenand_release_device(mtd); in onenand_erase()
1847 * onenand_sync - [MTD Interface] sync
1848 * @param mtd MTD device structure
1852 void onenand_sync(struct mtd_info *mtd) in onenand_sync() argument
1857 onenand_get_device(mtd, FL_SYNCING); in onenand_sync()
1860 onenand_release_device(mtd); in onenand_sync()
1864 * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
1865 * @param mtd MTD device structure
1866 * @param ofs offset relative to mtd start
1870 int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs) in onenand_block_isbad() argument
1875 if (ofs > mtd->size) in onenand_block_isbad()
1878 onenand_get_device(mtd, FL_READING); in onenand_block_isbad()
1879 ret = onenand_block_isbad_nolock(mtd,ofs, 0); in onenand_block_isbad()
1880 onenand_release_device(mtd); in onenand_block_isbad()
1886 * @param mtd MTD device structure
1892 static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) in onenand_default_block_markbad() argument
1894 struct onenand_chip *this = mtd->priv; in onenand_default_block_markbad()
1911 ofs += mtd->oobsize + (bbm->badblockpos & ~0x01); in onenand_default_block_markbad()
1912 return onenand_write_oob_nolock(mtd, ofs, &ops); in onenand_default_block_markbad()
1916 * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
1917 * @param mtd MTD device structure
1918 * @param ofs offset relative to mtd start
1922 int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs) in onenand_block_markbad() argument
1924 struct onenand_chip *this = mtd->priv; in onenand_block_markbad()
1927 ret = onenand_block_isbad(mtd, ofs); in onenand_block_markbad()
1935 onenand_get_device(mtd, FL_WRITING); in onenand_block_markbad()
1936 ret = this->block_markbad(mtd, ofs); in onenand_block_markbad()
1937 onenand_release_device(mtd); in onenand_block_markbad()
1944 * @param mtd MTD device structure
1945 * @param ofs offset relative to mtd start
1951 static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int cmd) in onenand_do_lock_cmd() argument
1953 struct onenand_chip *this = mtd->priv; in onenand_do_lock_cmd()
1968 this->command(mtd, cmd, 0, 0); in onenand_do_lock_cmd()
1971 this->wait(mtd, FL_UNLOCKING); in onenand_do_lock_cmd()
1999 this->command(mtd, ONENAND_CMD_UNLOCK, 0, 0); in onenand_do_lock_cmd()
2002 this->wait(mtd, FL_UNLOCKING); in onenand_do_lock_cmd()
2021 * onenand_lock - [MTD Interface] Lock block(s)
2022 * @param mtd MTD device structure
2023 * @param ofs offset relative to mtd start
2028 static int onenand_lock(struct mtd_info *mtd, loff_t ofs, size_t len) in onenand_lock() argument
2032 onenand_get_device(mtd, FL_LOCKING); in onenand_lock()
2033 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK); in onenand_lock()
2034 onenand_release_device(mtd); in onenand_lock()
2039 * onenand_unlock - [MTD Interface] Unlock block(s)
2040 * @param mtd MTD device structure
2041 * @param ofs offset relative to mtd start
2046 static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len) in onenand_unlock() argument
2050 onenand_get_device(mtd, FL_LOCKING); in onenand_unlock()
2051 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK); in onenand_unlock()
2052 onenand_release_device(mtd); in onenand_unlock()
2092 * @param mtd MTD device structure
2096 static void onenand_unlock_all(struct mtd_info *mtd) in onenand_unlock_all() argument
2098 struct onenand_chip *this = mtd->priv; in onenand_unlock_all()
2100 size_t len = mtd->size; in onenand_unlock_all()
2106 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0); in onenand_unlock_all()
2109 this->wait(mtd, FL_LOCKING); in onenand_unlock_all()
2128 onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK); in onenand_unlock_all()
2134 * @param mtd MTD data structure
2140 static void onenand_check_features(struct mtd_info *mtd) in onenand_check_features() argument
2142 struct onenand_chip *this = mtd->priv; in onenand_check_features()
2268 static int flexonenand_get_boundary(struct mtd_info *mtd) in flexonenand_get_boundary() argument
2270 struct onenand_chip *this = mtd->priv; in flexonenand_get_boundary()
2279 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0); in flexonenand_get_boundary()
2280 this->wait(mtd, FL_SYNCING); in flexonenand_get_boundary()
2282 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0); in flexonenand_get_boundary()
2283 this->wait(mtd, FL_READING); in flexonenand_get_boundary()
2292 this->command(mtd, ONENAND_CMD_RESET, 0, 0); in flexonenand_get_boundary()
2293 this->wait(mtd, FL_RESETING); in flexonenand_get_boundary()
2306 * boundary[], diesize[], mtd->size, mtd->erasesize,
2307 * mtd->eraseregions
2308 * @param mtd - MTD device structure
2310 static void flexonenand_get_size(struct mtd_info *mtd) in flexonenand_get_size() argument
2312 struct onenand_chip *this = mtd->priv; in flexonenand_get_size()
2323 mtd->numeraseregions = this->dies << 1; in flexonenand_get_size()
2326 flexonenand_get_boundary(mtd); in flexonenand_get_size()
2333 mtd->eraseregions[i].offset = ofs; in flexonenand_get_size()
2334 mtd->eraseregions[i].erasesize = 1 << eraseshift; in flexonenand_get_size()
2335 mtd->eraseregions[i].numblocks = in flexonenand_get_size()
2337 ofs += mtd->eraseregions[i].numblocks << eraseshift; in flexonenand_get_size()
2340 mtd->numeraseregions -= 1; in flexonenand_get_size()
2341 mtd->eraseregions[i].numblocks += in flexonenand_get_size()
2347 mtd->eraseregions[i].offset = ofs; in flexonenand_get_size()
2348 mtd->eraseregions[i].erasesize = 1 << eraseshift; in flexonenand_get_size()
2349 mtd->eraseregions[i].numblocks = maxbdry ^ in flexonenand_get_size()
2351 ofs += mtd->eraseregions[i].numblocks << eraseshift; in flexonenand_get_size()
2354 mtd->numeraseregions -= 1; in flexonenand_get_size()
2358 mtd->erasesize = 1 << this->erase_shift; in flexonenand_get_size()
2359 if (mtd->numeraseregions == 1) in flexonenand_get_size()
2360 mtd->erasesize >>= 1; in flexonenand_get_size()
2362 printk(KERN_INFO "Device has %d eraseregions\n", mtd->numeraseregions); in flexonenand_get_size()
2363 for (i = 0; i < mtd->numeraseregions; i++) in flexonenand_get_size()
2365 " numblocks: %04u]\n", mtd->eraseregions[i].offset, in flexonenand_get_size()
2366 mtd->eraseregions[i].erasesize, in flexonenand_get_size()
2367 mtd->eraseregions[i].numblocks); in flexonenand_get_size()
2369 for (die = 0, mtd->size = 0; die < this->dies; die++) { in flexonenand_get_size()
2373 mtd->size += this->diesize[die]; in flexonenand_get_size()
2379 * @param mtd_info - mtd info structure
2391 static int flexonenand_check_blocks_erased(struct mtd_info *mtd, in flexonenand_check_blocks_erased() argument
2394 struct onenand_chip *this = mtd->priv; in flexonenand_check_blocks_erased()
2400 .ooblen = mtd->oobsize, in flexonenand_check_blocks_erased()
2410 if (onenand_block_isbad_nolock(mtd, addr, 0)) in flexonenand_check_blocks_erased()
2417 ret = onenand_read_oob_nolock(mtd, addr, &ops); in flexonenand_check_blocks_erased()
2421 for (i = 0; i < mtd->oobsize; i++) in flexonenand_check_blocks_erased()
2425 if (i != mtd->oobsize) { in flexonenand_check_blocks_erased()
2436 * @param mtd - mtd info structure
2438 int flexonenand_set_boundary(struct mtd_info *mtd, int die, in flexonenand_set_boundary() argument
2441 struct onenand_chip *this = mtd->priv; in flexonenand_set_boundary()
2465 ret = flexonenand_check_blocks_erased(mtd, min(old, new) in flexonenand_set_boundary()
2472 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0); in flexonenand_set_boundary()
2473 this->wait(mtd, FL_SYNCING); in flexonenand_set_boundary()
2476 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0); in flexonenand_set_boundary()
2477 ret = this->wait(mtd, FL_READING); in flexonenand_set_boundary()
2492 this->command(mtd, ONENAND_CMD_ERASE, addr, 0); in flexonenand_set_boundary()
2493 ret = this->wait(mtd, FL_ERASING); in flexonenand_set_boundary()
2501 this->command(mtd, ONENAND_CMD_PROG, addr, 0); in flexonenand_set_boundary()
2502 ret = this->wait(mtd, FL_WRITING); in flexonenand_set_boundary()
2509 this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0); in flexonenand_set_boundary()
2510 ret = this->wait(mtd, FL_WRITING); in flexonenand_set_boundary()
2513 this->wait(mtd, FL_RESETING); in flexonenand_set_boundary()
2516 flexonenand_get_size(mtd); in flexonenand_set_boundary()
2523 * @param mtd MTD device structure
2528 static int onenand_chip_probe(struct mtd_info *mtd) in onenand_chip_probe() argument
2530 struct onenand_chip *this = mtd->priv; in onenand_chip_probe()
2552 if (this->wait(mtd, FL_RESETING)) in onenand_chip_probe()
2575 * @param mtd MTD device structure
2580 int onenand_probe(struct mtd_info *mtd) in onenand_probe() argument
2582 struct onenand_chip *this = mtd->priv; in onenand_probe()
2587 ret = this->chip_probe(mtd); in onenand_probe()
2597 mtd->name = onenand_print_device_info(dev_id, ver_id); in onenand_probe()
2602 onenand_check_features(mtd); in onenand_probe()
2608 mtd->numeraseregions = this->dies << 1; in onenand_probe()
2609 mtd->eraseregions = malloc(sizeof(struct mtd_erase_region_info) in onenand_probe()
2611 if (!mtd->eraseregions) in onenand_probe()
2617 * mtd->size represents the actual device size. in onenand_probe()
2623 mtd->writesize = in onenand_probe()
2627 mtd->writesize <<= 1; in onenand_probe()
2629 mtd->oobsize = mtd->writesize >> 5; in onenand_probe()
2631 mtd->erasesize = mtd->writesize << 6; in onenand_probe()
2638 mtd->erasesize <<= 1; in onenand_probe()
2640 this->erase_shift = ffs(mtd->erasesize) - 1; in onenand_probe()
2641 this->page_shift = ffs(mtd->writesize) - 1; in onenand_probe()
2643 this->page_mask = (mtd->erasesize / mtd->writesize) - 1; in onenand_probe()
2648 this->writesize = mtd->writesize; in onenand_probe()
2653 flexonenand_get_size(mtd); in onenand_probe()
2655 mtd->size = this->chipsize; in onenand_probe()
2657 mtd->flags = MTD_CAP_NANDFLASH; in onenand_probe()
2658 mtd->_erase = onenand_erase; in onenand_probe()
2659 mtd->_read_oob = onenand_read_oob; in onenand_probe()
2660 mtd->_write_oob = onenand_write_oob; in onenand_probe()
2661 mtd->_sync = onenand_sync; in onenand_probe()
2662 mtd->_block_isbad = onenand_block_isbad; in onenand_probe()
2663 mtd->_block_markbad = onenand_block_markbad; in onenand_probe()
2664 mtd->writebufsize = mtd->writesize; in onenand_probe()
2671 * @param mtd MTD device structure
2676 * The flash ID is read and the mtd/chip structures are
2679 int onenand_scan(struct mtd_info *mtd, int maxchips) in onenand_scan() argument
2682 struct onenand_chip *this = mtd->priv; in onenand_scan()
2709 if (onenand_probe(mtd)) in onenand_scan()
2720 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL); in onenand_scan()
2728 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL); in onenand_scan()
2745 switch (mtd->oobsize) { in onenand_scan()
2748 mtd->subpage_sft = 0; in onenand_scan()
2753 mtd->subpage_sft = 2; in onenand_scan()
2758 mtd->subpage_sft = 1; in onenand_scan()
2763 mtd->oobsize); in onenand_scan()
2764 mtd->subpage_sft = 0; in onenand_scan()
2770 this->subpagesize = mtd->writesize >> mtd->subpage_sft; in onenand_scan()
2782 mtd->oobavail = this->ecclayout->oobavail; in onenand_scan()
2784 mtd->ecclayout = this->ecclayout; in onenand_scan()
2787 onenand_unlock_all(mtd); in onenand_scan()
2789 return this->scan_bbt(mtd); in onenand_scan()
2794 * @param mtd MTD device structure
2796 void onenand_release(struct mtd_info *mtd) in onenand_release() argument