• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asus-wl-520gu-7.0.1.45/src/linux/linux/drivers/mtd/nand/

Lines Matching refs:mtd

2  *  drivers/mtd/nand.c
21 #include <linux/mtd/mtd.h>
22 #include <linux/mtd/nand.h>
23 #include <linux/mtd/nand_ids.h>
28 #include <linux/mtd/nand_ecc.h>
35 ((struct nand_chip *) mtd->priv)->CTRL_ADDR)
37 nand_command(mtd, NAND_CMD_RESET, -1, -1); \
44 static int nand_read (struct mtd_info *mtd, loff_t from, size_t len,
46 static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
48 static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len,
50 static int nand_write (struct mtd_info *mtd, loff_t to, size_t len,
52 static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
55 static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len,
57 static int nand_writev (struct mtd_info *mtd, const struct iovec *vecs,
59 static int nand_erase (struct mtd_info *mtd, struct erase_info *instr);
60 static void nand_sync (struct mtd_info *mtd);
65 static void nand_command (struct mtd_info *mtd, unsigned command,
68 register struct nand_chip *this = mtd->priv;
80 if (mtd->oobblock == 256 && column >= 256) {
86 else if (mtd->oobblock == 512 && column >= 256) {
115 if (mtd->size & 0x0c000000) {
131 static int nand_read (struct mtd_info *mtd, loff_t from, size_t len,
135 struct nand_chip *this = mtd->priv;
137 return nand_read_ecc (mtd, from, len, retlen, buf, this->ecc_code_buf);
139 return nand_read_ecc (mtd, from, len, retlen, buf, NULL);
146 static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
151 struct nand_chip *this = mtd->priv;
163 if ((from + len) > mtd->size) {
200 col = from & (mtd->oobblock - 1);
203 state = (col < mtd->eccsize) ? 0 : 1;
206 col = (col >= mtd->eccsize) ? (col - mtd->eccsize) : col;
220 nand_command (mtd, NAND_CMD_READ0, 0x00, page);
222 nand_command (mtd, NAND_CMD_READ1, 0x00, page);
225 for (j=0 ; j < mtd->eccsize ; j++)
230 nand_command (mtd, NAND_CMD_READOOB, 0x00, page);
233 nand_command (mtd, NAND_CMD_READ0, 0x00, page);
236 nand_command (mtd, NAND_CMD_READOOB, 0x03, page);
239 nand_command (mtd, NAND_CMD_READ0, 0x00, page);
271 if ((*retlen + (mtd->eccsize - col)) >= len) {
278 for (j=col ; j < mtd->eccsize ; j++)
283 nand_command (mtd, NAND_CMD_READ0, col, page);
285 nand_command (mtd, NAND_CMD_READ1, col, page);
288 if ((*retlen + (mtd->eccsize - col)) >= len) {
295 for (j=col ; j < mtd->eccsize ; j++)
312 if ((mtd->oobblock == 256) || state)
316 if (mtd->oobblock == 512)
339 static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len,
344 struct nand_chip *this = mtd->priv;
361 if ((col + len) > mtd->oobsize) {
398 nand_command (mtd, NAND_CMD_READOOB, col, page);
424 static int nand_write (struct mtd_info *mtd, loff_t to, size_t len,
428 struct nand_chip *this = mtd->priv;
430 return nand_write_ecc (mtd, to, len, retlen, buf, this->ecc_code_buf);
432 return nand_write_ecc (mtd, to, len, retlen, buf, NULL);
439 static int nand_write_ecc (struct mtd_info *mtd, loff_t to, size_t len,
444 struct nand_chip *this = mtd->priv;
447 int ecc_bytes = (mtd->oobblock == 512) ? 6 : 3;
455 if ((to + len) > mtd->size) {
485 col = to & (mtd->oobblock - 1);
494 nand_command (mtd, NAND_CMD_STATUS, -1, -1);
509 if ((col + len) >= mtd->oobblock)
510 for(i=col, cnt=0 ; i < mtd->oobblock ; i++, cnt++)
522 if ((col < mtd->eccsize) &&
523 ((col + (len - *retlen)) >= mtd->eccsize)) {
524 nand_command (mtd, NAND_CMD_READ0, col, page);
529 this->data_buf[(mtd->oobblock + i)] =
534 if ((mtd->oobblock == 512) &&
535 ((col + (len - *retlen)) >= mtd->oobblock)) {
538 this->data_buf[(mtd->oobblock + i)] =
543 for (i=ecc_bytes ; i < mtd->oobsize ; i++)
544 this->data_buf[(mtd->oobblock + i)] = 0xff;
547 for (i=mtd->oobblock ; i < (mtd->oobblock + mtd->oobsize) ; i++)
556 if ((col + (len - *retlen)) < mtd->oobblock) {
557 for(i=(col + cnt) ; i < mtd->oobblock ; i++)
562 nand_command (mtd, NAND_CMD_SEQIN, 0x00, page);
565 for (i=0 ; i < (mtd->oobblock + mtd->oobsize) ; i++)
569 nand_command (mtd, NAND_CMD_PAGEPROG, -1, -1);
582 nand_command (mtd, NAND_CMD_STATUS, -1, -1);
617 if (col < mtd->eccsize)
618 nand_command (mtd, NAND_CMD_READ0, col, page);
620 nand_command (mtd, NAND_CMD_READ1, col - 256, page);
644 nand_command (mtd, NAND_CMD_READOOB, 0x00, page);
697 static int nand_write_oob (struct mtd_info *mtd, loff_t to, size_t len,
701 struct nand_chip *this = mtd->priv;
718 if ((column + len) > mtd->oobsize) {
748 nand_command (mtd, NAND_CMD_STATUS, -1, -1);
761 nand_command (mtd, NAND_CMD_SEQIN, column + 512, page);
766 nand_command (mtd, NAND_CMD_PAGEPROG, -1, -1);
779 nand_command (mtd, NAND_CMD_STATUS, -1, -1);
800 nand_command (mtd, NAND_CMD_READOOB, column, page);
835 static int nand_writev (struct mtd_info *mtd, const struct iovec *vecs,
839 struct nand_chip *this = mtd->priv;
842 int ecc_bytes = (mtd->oobblock == 512) ? 6 : 3;
855 if ((to + total_len) > mtd->size) {
885 col = to & (mtd->oobblock - 1);
894 nand_command (mtd, NAND_CMD_STATUS, -1, -1);
918 while ((cnt < mtd->oobblock) && count) {
929 for (i=cnt ; i < mtd->oobblock ; i++)
938 if (col >= mtd->eccsize) {
939 nand_command (mtd, NAND_CMD_READ0, col, page);
945 this->data_buf[(mtd->oobblock + i)] =
950 if ((mtd->oobblock == 512) && (cnt == mtd->oobblock)) {
954 this->data_buf[(mtd->oobblock + i)] =
959 for (i=ecc_bytes ; i < mtd->oobsize ; i++)
960 this->data_buf[(mtd->oobblock + i)] = 0xff;
963 for (i=mtd->oobblock ; i < (mtd->oobblock + mtd->oobsize) ; i++)
967 nand_command (mtd, NAND_CMD_SEQIN, 0x00, page);
970 for (i=0 ; i < (mtd->oobblock + mtd->oobsize) ; i++)
974 nand_command (mtd, NAND_CMD_PAGEPROG, -1, -1);
987 nand_command (mtd, NAND_CMD_STATUS, -1, -1);
1022 if (col < mtd->eccsize)
1023 nand_command (mtd, NAND_CMD_READ0, col, page);
1025 nand_command (mtd, NAND_CMD_READ1, col - 256, page);
1049 nand_command (mtd, NAND_CMD_READOOB, 0x00, page);
1095 static int nand_erase (struct mtd_info *mtd, struct erase_info *instr)
1098 struct nand_chip *this = mtd->priv;
1106 if (instr->addr & (mtd->erasesize - 1)) {
1113 if (instr->len & (mtd->erasesize - 1)) {
1120 if ((instr->len + instr->addr) > mtd->size) {
1149 pages_per_block = mtd->erasesize / mtd->oobblock;
1155 nand_command (mtd, NAND_CMD_STATUS, -1, -1);
1169 nand_command(mtd, NAND_CMD_ERASE1, -1, page);
1170 nand_command(mtd, NAND_CMD_ERASE2, -1, -1);
1183 nand_command (mtd, NAND_CMD_STATUS, -1, -1);
1201 len -= mtd->erasesize;
1244 static void nand_sync (struct mtd_info *mtd)
1246 struct nand_chip *this = mtd->priv;
1289 int nand_scan (struct mtd_info *mtd)
1292 struct nand_chip *this = mtd->priv;
1298 nand_command (mtd, NAND_CMD_READID, 0x00, -1);
1308 if (!mtd->size) {
1309 mtd->name = nand_flash_ids[i].name;
1310 mtd->erasesize = nand_flash_ids[i].erasesize;
1311 mtd->size = (1 << nand_flash_ids[i].chipshift);
1312 mtd->eccsize = 256;
1314 mtd->oobblock = 256;
1315 mtd->oobsize = 8;
1319 mtd->oobblock = 512;
1320 mtd->oobsize = 16;
1326 nand_maf_id, nand_dev_id, mtd->name);
1339 if (!mtd->size) {
1345 mtd->type = MTD_NANDFLASH;
1346 mtd->flags = MTD_CAP_NANDFLASH | MTD_ECC;
1347 mtd->module = THIS_MODULE;
1348 mtd->ecctype = MTD_ECC_SW;
1349 mtd->erase = nand_erase;
1350 mtd->point = NULL;
1351 mtd->unpoint = NULL;
1352 mtd->read = nand_read;
1353 mtd->write = nand_write;
1354 mtd->read_ecc = nand_read_ecc;
1355 mtd->write_ecc = nand_write_ecc;
1356 mtd->read_oob = nand_read_oob;
1357 mtd->write_oob = nand_write_oob;
1358 mtd->readv = NULL;
1359 mtd->writev = nand_writev;
1360 mtd->sync = nand_sync;
1361 mtd->lock = NULL;
1362 mtd->unlock = NULL;
1363 mtd->suspend = NULL;
1364 mtd->resume = NULL;