Lines Matching full:mtd

6 #include <linux/mtd/cfi.h>
7 #include <linux/mtd/mtd.h>
8 #include <linux/mtd/partitions.h>
24 offsetof(struct snand_mtd_dev, mtd)); in mtd_to_priv()
27 int sfc_nand_erase_mtd(struct mtd_info *mtd, u32 addr) in sfc_nand_erase_mtd() argument
31 ret = sfc_nand_erase_block(0, addr >> mtd->writesize_shift); in sfc_nand_erase_mtd()
40 static int sfc_nand_write_mtd(struct mtd_info *mtd, loff_t to, in sfc_nand_write_mtd() argument
43 struct snand_mtd_dev *p_dev = mtd_to_priv(mtd); in sfc_nand_write_mtd()
49 if ((to + remaining) > mtd->size || to & mtd->writesize_mask || in sfc_nand_write_mtd()
50 remaining & mtd->writesize_mask || ops->ooblen) { in sfc_nand_write_mtd()
58 memcpy(p_dev->dma_buf, data, mtd->writesize); in sfc_nand_write_mtd()
59 memset(p_dev->dma_buf + mtd->writesize, 0xff, mtd->oobsize); in sfc_nand_write_mtd()
60 ret = sfc_nand_prog_page_raw(0, to >> mtd->writesize_shift, in sfc_nand_write_mtd()
69 data += mtd->writesize; in sfc_nand_write_mtd()
70 ops->retlen += mtd->writesize; in sfc_nand_write_mtd()
71 remaining -= mtd->writesize; in sfc_nand_write_mtd()
72 to += mtd->writesize; in sfc_nand_write_mtd()
78 static int sfc_nand_read_mtd(struct mtd_info *mtd, loff_t from, in sfc_nand_read_mtd() argument
89 if ((from + remaining) > mtd->size || ops->ooblen) { in sfc_nand_read_mtd()
98 page = from >> mtd->writesize_shift; in sfc_nand_read_mtd()
99 off = from & mtd->writesize_mask; in sfc_nand_read_mtd()
100 real_size = min_t(u32, remaining, mtd->writesize - off); in sfc_nand_read_mtd()
112 mtd->ecc_stats.failed++; in sfc_nand_read_mtd()
116 mtd->ecc_stats.corrected += 1; in sfc_nand_read_mtd()
133 int sfc_nand_isbad_mtd(struct mtd_info *mtd, loff_t ofs) in sfc_nand_isbad_mtd() argument
136 struct snand_mtd_dev *p_dev = mtd_to_priv(mtd); in sfc_nand_isbad_mtd()
139 if (ofs & mtd->writesize_mask) { in sfc_nand_isbad_mtd()
153 if ((int)sfc_nand_check_bad_block(0, ofs >> mtd->writesize_shift)) in sfc_nand_isbad_mtd()
168 ret = (int)sfc_nand_check_bad_block(0, ofs >> mtd->writesize_shift); in sfc_nand_isbad_mtd()
175 static int sfc_nand_markbad_mtd(struct mtd_info *mtd, loff_t ofs) in sfc_nand_markbad_mtd() argument
178 struct snand_mtd_dev *p_dev = mtd_to_priv(mtd); in sfc_nand_markbad_mtd()
182 if (ofs & mtd->erasesize_mask) { in sfc_nand_markbad_mtd()
188 if (sfc_nand_isbad_mtd(mtd, ofs)) in sfc_nand_markbad_mtd()
192 ret = sfc_nand_erase_block(0, ofs >> mtd->writesize_shift); in sfc_nand_markbad_mtd()
198 ret = sfc_nand_mark_bad_block(0, ofs >> mtd->writesize_shift); in sfc_nand_markbad_mtd()
214 if (sfc_nand_check_bad_block(0, ofs >> mtd->writesize_shift)) { in sfc_nand_markbad_mtd()
215 mtd->ecc_stats.badblocks++; in sfc_nand_markbad_mtd()
226 static int sfc_erase_mtd(struct mtd_info *mtd, struct erase_info *instr) in sfc_erase_mtd() argument
228 struct snand_mtd_dev *p_dev = mtd_to_priv(mtd); in sfc_erase_mtd()
229 struct snand_mtd_dev *nand = mtd_to_snanddev(mtd); in sfc_erase_mtd()
237 if ((addr + remaining) > mtd->size || addr & mtd->erasesize_mask) { in sfc_erase_mtd()
243 ret = snanddev_bbt_get_block_status(nand, addr >> mtd->erasesize_shift); in sfc_erase_mtd()
247 addr >> mtd->erasesize_shift); in sfc_erase_mtd()
248 addr += mtd->erasesize; in sfc_erase_mtd()
249 remaining -= mtd->erasesize; in sfc_erase_mtd()
253 ret = sfc_nand_erase_mtd(mtd, addr); in sfc_erase_mtd()
263 addr += mtd->erasesize; in sfc_erase_mtd()
264 remaining -= mtd->erasesize; in sfc_erase_mtd()
273 static int sfc_write_mtd(struct mtd_info *mtd, loff_t to, size_t len, in sfc_write_mtd() argument
277 struct snand_mtd_dev *p_dev = mtd_to_priv(mtd); in sfc_write_mtd()
284 ret = sfc_nand_write_mtd(mtd, to, &ops); in sfc_write_mtd()
291 static int sfc_read_mtd(struct mtd_info *mtd, loff_t from, size_t len, in sfc_read_mtd() argument
295 struct snand_mtd_dev *p_dev = mtd_to_priv(mtd); in sfc_read_mtd()
302 ret = sfc_nand_read_mtd(mtd, from, &ops); in sfc_read_mtd()
309 static int sfc_isbad_mtd(struct mtd_info *mtd, loff_t ofs) in sfc_isbad_mtd() argument
312 struct snand_mtd_dev *p_dev = mtd_to_priv(mtd); in sfc_isbad_mtd()
315 ret = sfc_nand_isbad_mtd(mtd, ofs); in sfc_isbad_mtd()
321 static int sfc_markbad_mtd(struct mtd_info *mtd, loff_t ofs) in sfc_markbad_mtd() argument
324 struct snand_mtd_dev *p_dev = mtd_to_priv(mtd); in sfc_markbad_mtd()
327 ret = sfc_nand_markbad_mtd(mtd, ofs); in sfc_markbad_mtd()
357 nand->mtd.name = "spi-nand0"; in sfc_nand_mtd_init()
358 nand->mtd.type = MTD_NANDFLASH; in sfc_nand_mtd_init()
359 nand->mtd.writesize = p_dev->page_size * SFC_NAND_SECTOR_SIZE; in sfc_nand_mtd_init()
360 nand->mtd.flags = MTD_CAP_NANDFLASH; in sfc_nand_mtd_init()
361 nand->mtd.size = capacity; in sfc_nand_mtd_init()
362 nand->mtd._erase = sfc_erase_mtd; in sfc_nand_mtd_init()
363 nand->mtd._read = sfc_read_mtd; in sfc_nand_mtd_init()
364 nand->mtd._write = sfc_write_mtd; in sfc_nand_mtd_init()
365 nand->mtd._block_isbad = sfc_isbad_mtd; in sfc_nand_mtd_init()
366 nand->mtd._block_markbad = sfc_markbad_mtd; in sfc_nand_mtd_init()
367 nand->mtd.oobsize = 16 * p_dev->page_size; in sfc_nand_mtd_init()
368 nand->mtd.bitflip_threshold = 2; in sfc_nand_mtd_init()
369 nand->mtd.erasesize = p_dev->block_size * SFC_NAND_SECTOR_SIZE; in sfc_nand_mtd_init()
370 nand->mtd.writebufsize = p_dev->page_size * SFC_NAND_SECTOR_SIZE; in sfc_nand_mtd_init()
371 nand->mtd.erasesize_shift = ffs(nand->mtd.erasesize) - 1; in sfc_nand_mtd_init()
372 nand->mtd.erasesize_mask = (1 << nand->mtd.erasesize_shift) - 1; in sfc_nand_mtd_init()
373 nand->mtd.writesize_shift = ffs(nand->mtd.writesize) - 1; in sfc_nand_mtd_init()
374 nand->mtd.writesize_mask = (1 << nand->mtd.writesize_shift) - 1; in sfc_nand_mtd_init()
375 nand->mtd.bitflip_threshold = 1; in sfc_nand_mtd_init()
376 nand->mtd.priv = nand; in sfc_nand_mtd_init()
407 ret = mtd_device_register(&nand->mtd, nand_parts, part_num); in sfc_nand_mtd_init()
409 pr_err("%s register mtd fail %d\n", __func__, ret); in sfc_nand_mtd_init()
411 pr_info("%s register mtd succuss\n", __func__); in sfc_nand_mtd_init()