• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/mtd/47xxnand/

Lines Matching defs:mtd

25 #include <linux/mtd/compatmac.h>
26 #include <linux/mtd/mtd.h>
27 #include <linux/mtd/nand.h>
28 #include <linux/mtd/nand_ecc.h>
50 #include <linux/mtd/partitions.h>
53 extern struct mtd_partition * init_brcmnand_mtd_partitions(struct mtd_info *mtd, size_t size);
290 int brcmnand_cache_is_valid(struct mtd_info *mtd, struct nand_chip *chip, int state)
319 int brcmnand_spare_is_valid(struct mtd_info *mtd, struct nand_chip *chip, int state)
348 * @mtd: MTD device structure
352 static void brcmnand_release_device(struct mtd_info *mtd)
355 mutex_unlock(mtd->mutex);
361 * @param mtd MTD device structure
366 static int brcmnand_get_device(struct nand_chip *chip, struct mtd_info *mtd, int new_state)
368 mutex_lock(mtd->mutex);
375 * @mtd: MTD device structure
380 brcmnand_release_device_bcm4706(struct mtd_info *mtd)
382 mutex_unlock(mtd->mutex);
388 * @param mtd MTD device structure
394 brcmnand_get_device_bcm4706(struct nand_chip *chip, struct mtd_info *mtd, int new_state)
396 mutex_lock(mtd->mutex);
402 * @mtd: MTD device structure
410 static int brcmnand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
413 struct nand_chip *chip = mtd->priv;
417 ret = chip->block_bad(mtd, ofs, getchip);
419 ret = brcmnand_isbad_bbt(mtd, ofs, allowbbt);
427 static int brcmnand_handle_false_read_ecc_unc_errors(struct mtd_info *mtd,
486 static int brcmnand_posted_read_cache(struct mtd_info *mtd, struct nand_chip *chip,
504 valid = brcmnand_cache_is_valid(mtd, chip, FL_READING);
525 ret = brcmnand_handle_false_read_ecc_unc_errors(mtd, chip, buf, oob, offset);
543 * @mtd: mtd info structure
549 static int brcmnand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
561 ret = brcmnand_posted_read_cache(mtd, chip, &buf[data_read],
564 mtd->ecc_stats.corrected++;
628 * @mtd: MTD device structure
634 static int brcmnand_do_read_ops(struct mtd_info *mtd, loff_t from,
638 struct nand_chip *chip = mtd->priv;
645 stats = mtd->ecc_stats;
650 col = (int)(from & (mtd->writesize - 1));
656 bytes = min(mtd->writesize - col, readlen);
657 aligned = (bytes == mtd->writesize);
664 ret = chip->ecc.read_page(mtd, chip, bufpoi);
687 buf, ops, mtd->oobsize);
714 if (mtd->ecc_stats.failed - stats.failed)
717 return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
722 * @mtd: MTD device structure
731 __brcmnand_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
733 struct nand_chip *chip = mtd->priv;
736 if ((from + len) > mtd->size)
745 ret = brcmnand_do_read_ops(mtd, from, &chip->ops);
754 * @mtd: MTD device structure
763 brcmnand_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
765 struct nand_chip *chip = mtd->priv;
768 brcmnand_get_device(chip, mtd, FL_READING);
769 ret = __brcmnand_read(mtd, from, len, retlen, buf);
770 brcmnand_release_device(mtd);
775 static int brcmnand_posted_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
793 valid = brcmnand_spare_is_valid(mtd, chip, FL_READING);
816 * @mtd: mtd info structure
821 static int brcmnand_read_oob_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
833 ret = brcmnand_posted_read_oob(mtd, chip, &oob[oob_read], offset + data_read);
835 mtd->ecc_stats.corrected++;
852 * @mtd: MTD device structure
858 static int brcmnand_do_read_oob(struct mtd_info *mtd, loff_t from,
862 struct nand_chip *chip = mtd->priv;
874 len = mtd->oobsize;
883 if (unlikely(from >= mtd->size ||
884 ops->ooboffs + readlen > ((mtd->size >> chip->page_shift) -
895 ret = chip->ecc.read_oob(mtd, chip, page, 0);
917 * @mtd: MTD device structure
924 int __brcmnand_read_oob(struct mtd_info *mtd, loff_t from,
932 if (ops->datbuf && (from + ops->len) > mtd->size) {
943 ret = brcmnand_do_read_oob(mtd, from, ops);
945 ret = brcmnand_do_read_ops(mtd, from, ops);
960 * @mtd: MTD device structure
966 static int brcmnand_read_oob(struct mtd_info *mtd, loff_t from,
969 struct nand_chip *chip = mtd->priv;
972 brcmnand_get_device(chip, mtd, FL_READING);
973 ret = __brcmnand_read_oob(mtd, from, ops);
974 brcmnand_release_device(mtd);
979 static int brcmnand_ctrl_write_is_complete(struct mtd_info *mtd, struct nand_chip *chip,
1016 * @param mtd MTD data structure
1023 static int brcmnand_posted_write_cache(struct mtd_info *mtd, struct nand_chip *chip,
1049 * @mtd: mtd info structure
1053 static void brcmnand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
1082 ret = brcmnand_posted_write_cache(mtd, chip, &buf[data_written],
1091 W_REG(osh, &cc->nand_cmd_addr, offset + mtd->writesize - NFL_SECTOR_SIZE);
1093 if (brcmnand_ctrl_write_is_complete(mtd, chip, &need_bbt)) {
1106 ret = chip->ecc.read_oob(mtd, chip, chip->pageidx, 0);
1114 ret = chip->ecc.write_oob(mtd, chip, chip->pageidx);
1118 ret = chip->block_markbad(mtd, offset);
1133 * @mtd: MTD data structure
1136 * hold mtd->oobsize (16) bytes.
1140 static int brcmnand_posted_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
1175 if (brcmnand_ctrl_write_is_complete(mtd, chip, &need_bbt)) {
1180 ret = chip->block_markbad(mtd, offset);
1193 * @mtd: MTD device structure
1200 static int brcmnand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
1204 chip->ecc.write_page(mtd, chip, buf);
1262 * @mtd: MTD device structure
1268 static int brcmnand_do_write_ops(struct mtd_info *mtd, loff_t to,
1272 struct nand_chip *chip = mtd->priv;
1301 memset(chip->oob_poi, 0xff, mtd->oobsize);
1304 int bytes = mtd->writesize;
1311 ret = chip->write_page(mtd, chip, wbuf, page, cached,
1334 * @mtd: MTD device structure
1342 static int brcmnand_write(struct mtd_info *mtd, loff_t to, size_t len,
1345 struct nand_chip *chip = mtd->priv;
1349 if ((to + len) > mtd->size)
1354 brcmnand_get_device(chip, mtd, FL_WRITING);
1360 ret = brcmnand_do_write_ops(mtd, to, &chip->ops);
1364 brcmnand_release_device(mtd);
1371 * @mtd: MTD device structure
1375 static int brcmnand_write_oob_hwecc(struct mtd_info *mtd, struct nand_chip *chip, int page)
1384 ret = brcmnand_posted_write_oob(mtd, chip, oob + oob_written,
1396 * @mtd: MTD device structure
1402 static int brcmnand_do_write_oob(struct mtd_info *mtd, loff_t to,
1406 struct nand_chip *chip = mtd->priv;
1414 len = mtd->oobsize;
1430 if (unlikely(to >= mtd->size ||
1432 ((mtd->size >> chip->page_shift) -
1447 memset(chip->oob_poi, 0xff, mtd->oobsize);
1449 status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask);
1450 memset(chip->oob_poi, 0xff, mtd->oobsize);
1462 * @mtd: MTD device structure
1466 int __brcmnand_write_oob(struct mtd_info *mtd, loff_t to,
1474 if (ops->datbuf && (to + ops->len) > mtd->size) {
1485 ret = brcmnand_do_write_oob(mtd, to, ops);
1487 ret = brcmnand_do_write_ops(mtd, to, ops);
1501 * @mtd: MTD device structure
1505 static int brcmnand_write_oob(struct mtd_info *mtd, loff_t to,
1508 struct nand_chip *chip = mtd->priv;
1511 brcmnand_get_device(chip, mtd, FL_WRITING);
1512 ret = __brcmnand_write_oob(mtd, to, ops);
1513 brcmnand_release_device(mtd);
1518 static int brcmnand_erase_bbt(struct mtd_info *mtd, struct erase_info *instr, int allowbbt)
1520 struct nand_chip * chip = mtd->priv;
1548 if ((instr->len + instr->addr) > mtd->size) {
1580 if (brcmnand_block_checkbad(mtd, ((loff_t) page) <<
1600 ret = brcmnand_ctrl_write_is_complete(mtd, chip, &need_bbt);
1608 chip->block_markbad(mtd, addr);
1630 brcmnand_erase(struct mtd_info *mtd, struct erase_info *instr)
1632 struct nand_chip *chip = mtd->priv;
1636 brcmnand_get_device(chip, mtd, FL_ERASING);
1638 ret = brcmnand_erase_bbt(mtd, instr, allowbbt);
1639 brcmnand_release_device(mtd);
1646 * @mtd: MTD device structure
1650 static void brcmnand_sync(struct mtd_info *mtd)
1652 struct nand_chip *chip = mtd->priv;
1657 brcmnand_get_device(chip, mtd, FL_SYNCING);
1661 brcmnand_release_device(mtd);
1666 * @mtd: MTD device structure
1667 * @offs: offset relative to mtd start
1669 static int brcmnand_block_isbad(struct mtd_info *mtd, loff_t offs)
1671 struct nand_chip *chip = mtd->priv;
1674 if (offs > mtd->size)
1677 brcmnand_get_device(chip, mtd, FL_READING);
1678 ret = brcmnand_block_checkbad(mtd, offs, 1, 0);
1679 brcmnand_release_device(mtd);
1686 * @mtd: MTD device structure
1692 static int brcmnand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
1694 struct nand_chip *chip = mtd->priv;
1710 ret = chip->ecc.write_oob(mtd, chip, page);
1712 ret = chip->ecc.write_oob(mtd, chip, page);
1721 ret = brcmnand_update_bbt(mtd, ofs);
1722 mtd->ecc_stats.badblocks++;
1728 * @mtd: MTD device structure
1729 * @ofs: offset relative to mtd start
1731 static int brcmnand_block_markbad(struct mtd_info *mtd, loff_t ofs)
1733 struct nand_chip *chip = mtd->priv;
1736 brcmnand_get_device(chip, mtd, FL_READING);
1737 ret = brcmnand_block_checkbad(mtd, ofs, 1, 0);
1738 brcmnand_release_device(mtd);
1746 brcmnand_get_device(chip, mtd, FL_WRITING);
1747 ret = chip->block_markbad(mtd, ofs);
1748 brcmnand_release_device(mtd);
1756 * @mtd: MTD device structure
1758 static int brcmnand_suspend(struct mtd_info *mtd)
1760 struct nand_chip *chip = mtd->priv;
1762 return brcmnand_get_device(chip, mtd, FL_PM_SUSPENDED);
1767 * @mtd: MTD device structure
1769 static void brcmnand_resume(struct mtd_info *mtd)
1771 struct nand_chip *chip = mtd->priv;
1774 brcmnand_release_device(mtd);
1782 struct mtd_partition *init_brcmnand_mtd_partitions(struct mtd_info *mtd, size_t size)
1846 * @mtd: MTD device structure
1872 * @mtd: MTD device structure
1879 brcmnand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
1921 * @mtd: MTD device structure
1931 brcmnand_command_lp(struct mtd_info *mtd, unsigned int command, int column, int page_addr)
1933 register struct nand_chip *chip = mtd->priv;
1937 column += mtd->writesize;
1942 chip->cmd_ctrl(mtd, command & 0xff, NAND_NCE | NAND_CLE);
1955 chip->cmd_ctrl(mtd, column, ctrl);
1962 chip->cmd_ctrl(mtd, page_addr, ctrl);
1966 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE);
2001 chip->cmd_ctrl(mtd, NAND_CMD_STATUS, NAND_NCE | NAND_CLE);
2002 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE);
2004 while (!(chip->read_byte(mtd) & NAND_STATUS_READY));
2009 chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART, NAND_NCE | NAND_CLE);
2010 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE);
2014 chip->cmd_ctrl(mtd, NAND_CMD_READSTART, NAND_NCE | NAND_CLE);
2015 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE);
2034 nand_wait_ready(mtd);
2039 * @mtd: MTD device structure
2048 brcmnand_command(struct mtd_info *mtd, unsigned int command, int column, int page_addr)
2050 register struct nand_chip *chip = mtd->priv;
2054 if (mtd->writesize > 512) {
2055 brcmnand_command_lp(mtd, command, column, page_addr);
2065 if (column >= mtd->writesize) {
2067 column -= mtd->writesize;
2077 chip->cmd_ctrl(mtd, readcmd, ctrl);
2080 chip->cmd_ctrl(mtd, command, ctrl);
2095 chip->cmd_ctrl(mtd, column, ctrl);
2102 chip->cmd_ctrl(mtd, page_addr, ctrl);
2105 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE);
2126 chip->cmd_ctrl(mtd, NAND_CMD_STATUS, NAND_CTRL_CLE);
2128 chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE);
2130 while (!(chip->read_byte(mtd) & NAND_STATUS_READY));
2151 nand_wait_ready(mtd);
2156 * @mtd: MTD device structure
2161 brcmnand_read_byte(struct mtd_info *mtd)
2166 register struct nand_chip *chip = mtd->priv;
2181 * @mtd: MTD device structure
2186 brcmnand_write_byte(struct mtd_info *mtd, u_char ch)
2207 * @mtd: MTD device structure
2214 brcmnand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
2219 buf[count++] = brcmnand_read_byte(mtd);
2226 * @mtd: MTD device structure
2233 brcmnand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
2238 brcmnand_write_byte(mtd, buf[count++]);
2245 * @mtd: MTD device structure
2252 brcmnand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
2255 struct nand_chip *chip = mtd->priv;
2259 chbuf = chip->read_byte(mtd);
2270 * @mtd: MTD device structure
2275 brcmnand_devready(struct mtd_info *mtd)
2291 * @mtd: MTD device structure
2297 brcmnand_select_chip(struct mtd_info *mtd, int chip)
2304 * @mtd: MTD device structure
2309 brcmnand_init_nandchip(struct mtd_info *mtd, struct nand_chip *chip)
2328 chip->priv = mtd;
2342 mtd->name = "brcmnand";
2343 mtd->priv = chip;
2344 mtd->owner = THIS_MODULE;
2346 mtd->mutex = partitions_mutex_init();
2347 if (!mtd->mutex)
2360 struct mtd_info *mtd;
2403 mtd = &brcmnand_info.mtd;
2406 if ((ret = brcmnand_init_nandchip(mtd, chip)) != 0) {
2411 if ((ret = nand_scan(mtd, chip->numchips)) != 0) {
2427 mtd = &brcmnand_info.mtd;
2434 chip->priv = mtd;
2441 mtd->name = "brcmnand";
2442 mtd->priv = &brcmnand_info.chip;
2443 mtd->owner = THIS_MODULE;
2444 mtd->mutex = partitions_mutex_init();
2445 if (!mtd->mutex) {
2450 mtd->size = chip->chipsize;
2451 mtd->erasesize = info->blocksize;
2452 mtd->writesize = info->pagesize;
2454 mtd->oobsize = (info->pagesize >> 5);
2457 chip->page_shift = ffs(mtd->writesize) - 1;
2462 ffs(mtd->erasesize) - 1;
2466 chip->badblockpos = (mtd->writesize > 512) ?
2476 memset(BRCMNAND_OOBBUF(chip->buffers), 0xff, mtd->oobsize);
2485 switch (mtd->oobsize) {
2496 if (mtd->writesize == 2048)
2500 mtd->writesize);
2510 mtd->writesize);
2516 "oobsize %d\n", mtd->oobsize);
2554 mtd->oobavail = chip->ecc.layout->oobavail;
2562 chip->ecc.steps = mtd->writesize / chip->ecc.size;
2563 if (chip->ecc.steps * chip->ecc.size != mtd->writesize) {
2577 mtd->subpage_sft = 1;
2580 mtd->subpage_sft = 2;
2583 mtd->subpage_sft = 3;
2587 chip->subpagesize = mtd->writesize >> mtd->subpage_sft;
2607 mtd->type = MTD_NANDFLASH;
2608 mtd->flags = MTD_CAP_NANDFLASH;
2609 mtd->erase = brcmnand_erase;
2610 mtd->point = NULL;
2611 mtd->unpoint = NULL;
2612 mtd->read = brcmnand_read;
2613 mtd->write = brcmnand_write;
2614 mtd->read_oob = brcmnand_read_oob;
2615 mtd->write_oob = brcmnand_write_oob;
2616 mtd->sync = brcmnand_sync;
2617 mtd->lock = NULL;
2618 mtd->unlock = NULL;
2619 mtd->suspend = brcmnand_suspend;
2620 mtd->resume = brcmnand_resume;
2621 mtd->block_isbad = brcmnand_block_isbad;
2622 mtd->block_markbad = brcmnand_block_markbad;
2625 mtd->ecclayout = chip->ecc.layout;
2627 /* we're in mtd function now, use get/release device to protect ourselves */
2628 brcmnand_get_device(chip, mtd, FL_WRITING);
2629 ret = chip->scan_bbt(mtd);
2630 brcmnand_release_device(mtd);
2639 parts = init_brcmnand_mtd_partitions(mtd, mtd->size);
2645 ret = add_mtd_partitions(mtd, parts, i);
2668 del_mtd_partitions(&brcmnand_info.mtd);
2670 del_mtd_device(&brcmnand_info.mtd);