Lines Matching refs:mtd

22 #include <linux/mtd/mtd.h>
23 #include <linux/mtd/partitions.h>
24 #include <linux/mtd/map.h>
31 * Data structure to hold the pointer to the mtd device as well
35 struct mtd_info *mtd;
42 return fixed_size_llseek(file, offset, orig, mfi->mtd->size);
50 struct mtd_info *mtd;
59 mtd = get_mtd_device(NULL, devnum);
61 if (IS_ERR(mtd))
62 return PTR_ERR(mtd);
64 if (mtd->type == MTD_ABSENT) {
70 if ((file->f_mode & FMODE_WRITE) && !(mtd->flags & MTD_WRITEABLE)) {
80 mfi->mtd = mtd;
85 put_mtd_device(mtd);
94 struct mtd_info *mtd = mfi->mtd;
100 mtd_sync(mtd);
102 put_mtd_device(mtd);
131 struct mtd_info *mtd = mfi->mtd;
141 if (*ppos + count > mtd->size) {
142 if (*ppos < mtd->size)
143 count = mtd->size - *ppos;
151 kbuf = mtd_kmalloc_up_to(mtd, &size);
160 ret = mtd_read_fact_prot_reg(mtd, *ppos, len,
164 ret = mtd_read_user_prot_reg(mtd, *ppos, len,
176 ret = mtd_read_oob(mtd, *ppos, &ops);
181 ret = mtd_read(mtd, *ppos, len, &retlen, kbuf);
221 struct mtd_info *mtd = mfi->mtd;
231 if (*ppos >= mtd->size)
234 if (*ppos + count > mtd->size)
235 count = mtd->size - *ppos;
240 kbuf = mtd_kmalloc_up_to(mtd, &size);
257 ret = mtd_write_user_prot_reg(mtd, *ppos, len,
271 ret = mtd_write_oob(mtd, *ppos, &ops);
277 ret = mtd_write(mtd, *ppos, len, &retlen, kbuf);
312 struct mtd_info *mtd = mfi->mtd;
317 if (mtd_read_fact_prot_reg(mtd, -1, 0, &retlen, NULL) ==
324 if (mtd_read_user_prot_reg(mtd, -1, 0, &retlen, NULL) ==
340 static int mtdchar_writeoob(struct file *file, struct mtd_info *mtd,
344 struct mtd_info *master = mtd_get_master(mtd);
357 ops.ooboffs = start & (mtd->writesize - 1);
362 if (ops.ooboffs && ops.ooblen > (mtd->oobsize - ops.ooboffs))
369 start &= ~((uint64_t)mtd->writesize - 1);
370 ret = mtd_write_oob(mtd, start, &ops);
382 static int mtdchar_readoob(struct file *file, struct mtd_info *mtd,
394 ops.ooboffs = start & (mtd->writesize - 1);
399 if (ops.ooboffs && ops.ooblen > (mtd->oobsize - ops.ooboffs))
406 start &= ~((uint64_t)mtd->writesize - 1);
407 ret = mtd_read_oob(mtd, start, &ops);
443 static int shrink_ecclayout(struct mtd_info *mtd,
449 if (!mtd || !to)
458 ret = mtd_ooblayout_ecc(mtd, section++, &oobregion);
475 ret = mtd_ooblayout_free(mtd, i, &oobregion);
491 static int get_oobinfo(struct mtd_info *mtd, struct nand_oobinfo *to)
496 if (!mtd || !to)
505 ret = mtd_ooblayout_ecc(mtd, section++, &oobregion);
524 ret = mtd_ooblayout_free(mtd, i, &oobregion);
541 static int mtdchar_blkpg_ioctl(struct mtd_info *mtd,
555 /* Only master mtd device must be used to add partitions */
556 if (mtd_is_partition(mtd))
562 return mtd_add_partition(mtd, p.devname, p.start, p.length);
569 return mtd_del_partition(mtd, p.pno);
576 static void adjust_oob_length(struct mtd_info *mtd, uint64_t start,
585 start_page = mtd_div_by_ws(start, mtd);
586 end_page = mtd_div_by_ws(start + ops->len - 1, mtd);
587 oob_per_page = mtd_oobavail(mtd, ops);
594 mtdchar_write_ioctl(struct mtd_info *mtd, struct mtd_write_req __user *argp)
596 struct mtd_info *master = mtd_get_master(mtd);
621 if (req.start + req.len > mtd->size)
624 datbuf_len = min_t(size_t, req.len, mtd->erasesize);
631 oobbuf_len = min_t(size_t, req.ooblen, mtd->erasesize);
655 if (ops.len == mtd->erasesize)
656 ops.len -= mtd_mod_by_ws(req.start + ops.len, mtd);
665 adjust_oob_length(mtd, req.start, &ops);
673 ret = mtd_write_oob(mtd, req.start, &ops);
692 mtdchar_read_ioctl(struct mtd_info *mtd, struct mtd_read_req __user *argp)
694 struct mtd_info *master = mtd_get_master(mtd);
727 if (req.start + req.len > mtd->size) {
732 datbuf_len = min_t(size_t, req.len, mtd->erasesize);
741 oobbuf_len = min_t(size_t, req.ooblen, mtd->erasesize);
768 if (ops.len == mtd->erasesize)
769 ops.len -= mtd_mod_by_ws(req.start + ops.len, mtd);
771 ret = mtd_read_oob(mtd, (loff_t)req.start, &ops);
825 struct mtd_info *mtd = mfi->mtd;
826 struct mtd_info *master = mtd_get_master(mtd);
879 if (copy_to_user(argp, &(mtd->numeraseregions), sizeof(int)))
892 if (ur_idx >= mtd->numeraseregions)
895 kr = &(mtd->eraseregions[ur_idx]);
907 info.type = mtd->type;
908 info.flags = mtd->flags;
909 info.size = mtd->size;
910 info.erasesize = mtd->erasesize;
911 info.writesize = mtd->writesize;
912 info.oobsize = mtd->oobsize;
950 ret = mtd_erase(mtd, erase);
965 ret = mtdchar_writeoob(file, mtd, buf.start, buf.length,
979 ret = mtdchar_readoob(file, mtd, buf.start, buf.length,
992 ret = mtdchar_writeoob(file, mtd, buf.start, buf.length,
1006 ret = mtdchar_readoob(file, mtd, buf.start, buf.length,
1014 ret = mtdchar_write_ioctl(mtd,
1021 ret = mtdchar_read_ioctl(mtd,
1033 ret = mtd_lock(mtd, einfo.start, einfo.length);
1044 ret = mtd_unlock(mtd, einfo.start, einfo.length);
1055 ret = mtd_is_locked(mtd, einfo.start, einfo.length);
1067 ret = get_oobinfo(mtd, &oi);
1082 return mtd_block_isbad(mtd, offs);
1091 return mtd_block_markbad(mtd, offs);
1117 ret = mtd_get_fact_prot_info(mtd, 4096, &retlen, buf);
1120 ret = mtd_get_user_prot_info(mtd, 4096, &retlen, buf);
1149 ret = mtd_lock_user_prot_reg(mtd, oinfo.start, oinfo.length);
1151 ret = mtd_erase_user_prot_reg(mtd, oinfo.start, oinfo.length);
1167 shrink_ecclayout(mtd, usrlay);
1177 if (copy_to_user(argp, &mtd->ecc_stats,
1194 if (!mtd_has_oob(mtd))
1216 ret = mtdchar_blkpg_ioctl(mtd, &a);
1234 struct mtd_info *mtd = mfi->mtd;
1235 struct mtd_info *master = mtd_get_master(mtd);
1260 struct mtd_info *mtd = mfi->mtd;
1261 struct mtd_info *master = mtd_get_master(mtd);
1281 ret = mtdchar_writeoob(file, mtd, buf.start,
1296 ret = mtdchar_readoob(file, mtd, buf.start,
1320 ret = mtdchar_blkpg_ioctl(mtd, &a);
1348 struct mtd_info *mtd = mfi->mtd;
1355 if (len > mtd->size || pgoff >= (mtd->size >> PAGE_SHIFT))
1359 if (offset > mtd->size - len)
1362 ret = mtd_get_unmapped_area(mtd, len, offset, flags);
1370 return mtd_mmap_capabilities(mfi->mtd);
1381 struct mtd_info *mtd = mfi->mtd;
1382 struct map_info *map = mtd->priv;
1385 and that mtd->priv is a valid struct map_info. It should be
1388 if (0 /*mtd->type == MTD_RAM || mtd->type == MTD_ROM*/) {
1424 "mtd", &mtd_fops);
1436 __unregister_chrdev(MTD_CHAR_MAJOR, 0, 1 << MINORBITS, "mtd");