Lines Matching defs:mtd
34 #include <linux/mtd/mtd.h>
35 #include <linux/mtd/partitions.h>
45 struct mtd_info *mtd = dev_get_drvdata(dev);
47 return mtd ? mtd_suspend(mtd) : 0;
52 struct mtd_info *mtd = dev_get_drvdata(dev);
54 if (mtd)
55 mtd_resume(mtd);
66 .name = "mtd",
93 struct mtd_info *mtd = dev_get_drvdata(dev);
94 dev_t index = MTD_DEVT(mtd->index);
96 idr_remove(&mtd_idr, mtd->index);
97 of_node_put(mtd_get_of_node(mtd));
99 if (mtd_is_partition(mtd))
100 release_mtd_partition(mtd);
108 struct mtd_info *mtd = container_of(kref, struct mtd_info, refcnt);
109 bool is_partition = mtd_is_partition(mtd);
111 debugfs_remove_recursive(mtd->dbg.dfs_dir);
114 nvmem_unregister(mtd->nvmem);
116 device_unregister(&mtd->dev);
119 * Clear dev so mtd can be safely re-registered later if desired.
124 memset(&mtd->dev, 0, sizeof(mtd->dev));
138 struct mtd_info *mtd = dev_get_drvdata(dev);
141 switch (mtd->type) {
177 struct mtd_info *mtd = dev_get_drvdata(dev);
179 return sysfs_emit(buf, "0x%lx\n", (unsigned long)mtd->flags);
186 struct mtd_info *mtd = dev_get_drvdata(dev);
188 return sysfs_emit(buf, "%llu\n", (unsigned long long)mtd->size);
195 struct mtd_info *mtd = dev_get_drvdata(dev);
197 return sysfs_emit(buf, "%lu\n", (unsigned long)mtd->erasesize);
204 struct mtd_info *mtd = dev_get_drvdata(dev);
206 return sysfs_emit(buf, "%lu\n", (unsigned long)mtd->writesize);
213 struct mtd_info *mtd = dev_get_drvdata(dev);
214 unsigned int subpagesize = mtd->writesize >> mtd->subpage_sft;
223 struct mtd_info *mtd = dev_get_drvdata(dev);
225 return sysfs_emit(buf, "%lu\n", (unsigned long)mtd->oobsize);
232 struct mtd_info *mtd = dev_get_drvdata(dev);
234 return sysfs_emit(buf, "%u\n", mtd->oobavail);
241 struct mtd_info *mtd = dev_get_drvdata(dev);
243 return sysfs_emit(buf, "%u\n", mtd->numeraseregions);
250 struct mtd_info *mtd = dev_get_drvdata(dev);
252 return sysfs_emit(buf, "%s\n", mtd->name);
259 struct mtd_info *mtd = dev_get_drvdata(dev);
261 return sysfs_emit(buf, "%u\n", mtd->ecc_strength);
269 struct mtd_info *mtd = dev_get_drvdata(dev);
271 return sysfs_emit(buf, "%u\n", mtd->bitflip_threshold);
278 struct mtd_info *mtd = dev_get_drvdata(dev);
286 mtd->bitflip_threshold = bitflip_threshold;
294 struct mtd_info *mtd = dev_get_drvdata(dev);
296 return sysfs_emit(buf, "%u\n", mtd->ecc_step_size);
304 struct mtd_info *mtd = dev_get_drvdata(dev);
305 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats;
314 struct mtd_info *mtd = dev_get_drvdata(dev);
315 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats;
324 struct mtd_info *mtd = dev_get_drvdata(dev);
325 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats;
334 struct mtd_info *mtd = dev_get_drvdata(dev);
335 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats;
361 ATTRIBUTE_GROUPS(mtd);
364 .name = "mtd",
386 static void mtd_debugfs_populate(struct mtd_info *mtd)
388 struct device *dev = &mtd->dev;
393 mtd->dbg.dfs_dir = debugfs_create_dir(dev_name(dev), dfs_dir_mtd);
397 unsigned mtd_mmap_capabilities(struct mtd_info *mtd)
399 switch (mtd->type) {
416 struct mtd_info *mtd;
418 mtd = container_of(n, struct mtd_info, reboot_notifier);
419 mtd->_reboot(mtd);
426 * @mtd: pointer to new MTD device info structure
444 * for (i = 0; i < mtd_pairing_groups(mtd); i++) {
446 * mtd_pairing_info_to_wunit(mtd, &info);
450 int mtd_wunit_to_pairing_info(struct mtd_info *mtd, int wunit,
453 struct mtd_info *master = mtd_get_master(mtd);
471 * @mtd: pointer to new MTD device info structure
486 * npairs = mtd_wunit_per_eb(mtd) / mtd_pairing_groups(mtd);
488 * wunit = mtd_pairing_info_to_wunit(mtd, &info);
489 * mtd_write(mtd, mtd_wunit_to_offset(mtd, blkoffs, wunit),
490 * mtd->writesize, &retlen, buf + (i * mtd->writesize));
493 int mtd_pairing_info_to_wunit(struct mtd_info *mtd,
496 struct mtd_info *master = mtd_get_master(mtd);
505 return mtd->pairing->get_wunit(master, info);
513 * @mtd: pointer to new MTD device info structure
521 int mtd_pairing_groups(struct mtd_info *mtd)
523 struct mtd_info *master = mtd_get_master(mtd);
535 struct mtd_info *mtd = priv;
539 err = mtd_read(mtd, offset, bytes, &retlen, val);
546 static int mtd_nvmem_add(struct mtd_info *mtd)
548 struct device_node *node = mtd_get_of_node(mtd);
552 config.dev = &mtd->dev;
553 config.name = dev_name(&mtd->dev);
556 config.size = mtd->size;
563 config.priv = mtd;
565 mtd->nvmem = nvmem_register(&config);
566 if (IS_ERR(mtd->nvmem)) {
568 if (PTR_ERR(mtd->nvmem) == -EOPNOTSUPP)
569 mtd->nvmem = NULL;
571 return dev_err_probe(&mtd->dev, PTR_ERR(mtd->nvmem),
578 static void mtd_check_of_node(struct mtd_info *mtd)
585 if (mtd_get_of_node(mtd))
588 if (!mtd_is_partition(mtd))
591 parent_dn = of_node_get(mtd_get_of_node(mtd->parent));
595 if (mtd_is_partition(mtd->parent))
603 mtd_name_len = strlen(mtd->name);
621 !strncmp(mtd->name, pname + offset, plen)) {
622 mtd_set_of_node(mtd, mtd_dn);
634 * @mtd: pointer to new MTD device info structure
641 int add_mtd_device(struct mtd_info *mtd)
643 struct device_node *np = mtd_get_of_node(mtd);
644 struct mtd_info *master = mtd_get_master(mtd);
653 if (WARN_ONCE(mtd->dev.type, "MTD already registered\n"))
656 BUG_ON(mtd->writesize == 0);
662 if (WARN_ON((mtd->_write && mtd->_write_oob) ||
663 (mtd->_read && mtd->_read_oob)))
666 if (WARN_ON((!mtd->erasesize || !master->_erase) &&
667 !(mtd->flags & MTD_NO_ERASE)))
678 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION &&
679 (!mtd_is_partition(mtd) || master->type != MTD_MLCNANDFLASH ||
687 ofidx = of_alias_get_id(np, "mtd");
689 i = idr_alloc(&mtd_idr, mtd, ofidx, ofidx + 1, GFP_KERNEL);
691 i = idr_alloc(&mtd_idr, mtd, 0, 0, GFP_KERNEL);
697 mtd->index = i;
698 kref_init(&mtd->refcnt);
701 if (mtd->bitflip_threshold == 0)
702 mtd->bitflip_threshold = mtd->ecc_strength;
704 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) {
707 mtd->erasesize /= ngroups;
708 mtd->size = (u64)mtd_div_by_eb(mtd->size, master) *
709 mtd->erasesize;
712 if (is_power_of_2(mtd->erasesize))
713 mtd->erasesize_shift = ffs(mtd->erasesize) - 1;
715 mtd->erasesize_shift = 0;
717 if (is_power_of_2(mtd->writesize))
718 mtd->writesize_shift = ffs(mtd->writesize) - 1;
720 mtd->writesize_shift = 0;
722 mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1;
723 mtd->writesize_mask = (1 << mtd->writesize_shift) - 1;
726 if ((mtd->flags & MTD_WRITEABLE) && (mtd->flags & MTD_POWERUP_LOCK)) {
727 error = mtd_unlock(mtd, 0, mtd->size);
731 mtd->name);
739 mtd->dev.type = &mtd_devtype;
740 mtd->dev.class = &mtd_class;
741 mtd->dev.devt = MTD_DEVT(i);
742 dev_set_name(&mtd->dev, "mtd%d", i);
743 dev_set_drvdata(&mtd->dev, mtd);
744 mtd_check_of_node(mtd);
745 of_node_get(mtd_get_of_node(mtd));
746 error = device_register(&mtd->dev);
748 put_device(&mtd->dev);
753 error = mtd_nvmem_add(mtd);
757 mtd_debugfs_populate(mtd);
759 device_create(&mtd_class, mtd->dev.parent, MTD_DEVT(i) + 1, NULL,
760 "mtd%dro", i);
762 pr_debug("mtd: Giving out device %d to %s\n", i, mtd->name);
766 not->add(mtd);
770 if (of_property_read_bool(mtd_get_of_node(mtd), "linux,rootfs")) {
772 pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name);
773 ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
775 pr_warn("mtd: can't set mtd%d (%s) as root device - mtd must be builtin\n",
776 mtd->index, mtd->name);
788 device_unregister(&mtd->dev);
790 of_node_put(mtd_get_of_node(mtd));
799 * @mtd: pointer to MTD device info structure
807 int del_mtd_device(struct mtd_info *mtd)
814 if (idr_find(&mtd_idr, mtd->index) != mtd) {
822 not->remove(mtd);
824 kref_put(&mtd->refcnt, mtd_device_release);
836 static void mtd_set_dev_defaults(struct mtd_info *mtd)
838 if (mtd->dev.parent) {
839 if (!mtd->owner && mtd->dev.parent->driver)
840 mtd->owner = mtd->dev.parent->driver->owner;
841 if (!mtd->name)
842 mtd->name = dev_name(mtd->dev.parent);
844 pr_debug("mtd device won't show a device symlink in sysfs\n");
847 INIT_LIST_HEAD(&mtd->partitions);
848 mutex_init(&mtd->master.partitions_lock);
849 mutex_init(&mtd->master.chrdev_lock);
852 static ssize_t mtd_otp_size(struct mtd_info *mtd, bool is_user)
865 ret = mtd_get_user_prot_info(mtd, PAGE_SIZE, &retlen, info);
867 ret = mtd_get_fact_prot_info(mtd, PAGE_SIZE, &retlen, info);
884 static struct nvmem_device *mtd_otp_nvmem_register(struct mtd_info *mtd,
894 np = of_get_compatible_child(mtd->dev.of_node, compatible);
897 config.dev = mtd->dev.parent;
907 config.priv = mtd;
922 struct mtd_info *mtd = priv;
926 ret = mtd_read_user_prot_reg(mtd, offset, bytes, &retlen, val);
936 struct mtd_info *mtd = priv;
940 ret = mtd_read_fact_prot_reg(mtd, offset, bytes, &retlen, val);
947 static int mtd_otp_nvmem_add(struct mtd_info *mtd)
949 struct device *dev = mtd->dev.parent;
954 if (mtd->_get_user_prot_info && mtd->_read_user_prot_reg) {
955 size = mtd_otp_size(mtd, true);
960 nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size,
966 mtd->otp_user_nvmem = nvmem;
970 if (mtd->_get_fact_prot_info && mtd->_read_fact_prot_reg) {
971 size = mtd_otp_size(mtd, false);
990 err = mtd_nvmem_fact_otp_reg_read(mtd, 0, otp, size);
998 nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size,
1004 mtd->otp_factory_nvmem = nvmem;
1011 nvmem_unregister(mtd->otp_user_nvmem);
1018 * @mtd: the MTD device to register
1033 * * Then It tries to probe partitions on MTD device @mtd using parsers
1039 * @mtd and exits.
1043 int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
1050 mtd_set_dev_defaults(mtd);
1052 ret = mtd_otp_nvmem_add(mtd);
1057 ret = add_mtd_device(mtd);
1063 ret = parse_mtd_partitions(mtd, types, parser_data);
1070 ret = add_mtd_partitions(mtd, parts, nr_parts);
1071 else if (!device_is_registered(&mtd->dev))
1072 ret = add_mtd_device(mtd);
1087 WARN_ONCE(mtd->_reboot && mtd->reboot_notifier.notifier_call,
1089 if (mtd->_reboot && !mtd->reboot_notifier.notifier_call) {
1090 mtd->reboot_notifier.notifier_call = mtd_reboot_notifier;
1091 register_reboot_notifier(&mtd->reboot_notifier);
1096 nvmem_unregister(mtd->otp_user_nvmem);
1097 nvmem_unregister(mtd->otp_factory_nvmem);
1100 if (ret && device_is_registered(&mtd->dev))
1101 del_mtd_device(mtd);
1146 struct mtd_info *mtd;
1154 mtd_for_each_device(mtd)
1155 new->add(mtd);
1172 struct mtd_info *mtd;
1178 mtd_for_each_device(mtd)
1179 old->remove(mtd);
1189 * @mtd: last known address of the required MTD device
1198 struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num)
1207 if (other == mtd) {
1208 ret = mtd;
1214 if (mtd && mtd != ret)
1233 int __get_mtd_device(struct mtd_info *mtd)
1235 struct mtd_info *master = mtd_get_master(mtd);
1239 err = master->_get_device(mtd);
1250 while (mtd) {
1251 if (mtd != master)
1252 kref_get(&mtd->refcnt);
1253 mtd = mtd->parent;
1270 struct mtd_info *mtd = NULL;
1279 mtd = tmp;
1280 err = __get_mtd_device(mtd);
1287 return err ? ERR_PTR(err) : mtd;
1302 struct mtd_info *mtd = NULL, *other;
1308 mtd = other;
1313 if (!mtd)
1316 err = __get_mtd_device(mtd);
1321 return mtd;
1329 void put_mtd_device(struct mtd_info *mtd)
1332 __put_mtd_device(mtd);
1338 void __put_mtd_device(struct mtd_info *mtd)
1340 struct mtd_info *master = mtd_get_master(mtd);
1342 while (mtd) {
1343 /* kref_put() can relese mtd, so keep a reference mtd->parent */
1344 struct mtd_info *parent = mtd->parent;
1346 if (mtd != master)
1347 kref_put(&mtd->refcnt, mtd_device_release);
1348 mtd = parent;
1367 int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
1369 struct mtd_info *master = mtd_get_master(mtd);
1370 u64 mst_ofs = mtd_get_master_ofs(mtd, 0);
1377 if (!mtd->erasesize || !master->_erase)
1380 if (instr->addr >= mtd->size || instr->len > mtd->size - instr->addr)
1382 if (!(mtd->flags & MTD_WRITEABLE))
1390 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) {
1391 adjinstr.addr = (loff_t)mtd_div_by_eb(instr->addr, mtd) *
1393 adjinstr.len = ((u64)mtd_div_by_eb(instr->addr + instr->len, mtd) *
1404 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) {
1407 instr->fail_addr *= mtd->erasesize;
1418 int mtd_point(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,
1421 struct mtd_info *master = mtd_get_master(mtd);
1429 if (from < 0 || from >= mtd->size || len > mtd->size - from)
1434 from = mtd_get_master_ofs(mtd, from);
1440 int mtd_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
1442 struct mtd_info *master = mtd_get_master(mtd);
1446 if (from < 0 || from >= mtd->size || len > mtd->size - from)
1450 return master->_unpoint(master, mtd_get_master_ofs(mtd, from), len);
1459 unsigned long mtd_get_unmapped_area(struct mtd_info *mtd, unsigned long len,
1466 ret = mtd_point(mtd, offset, len, &retlen, &virt, NULL);
1470 mtd_unpoint(mtd, offset, retlen);
1477 static void mtd_update_ecc_stats(struct mtd_info *mtd, struct mtd_info *master,
1482 if (master == mtd)
1489 while (mtd->parent) {
1490 mtd->ecc_stats.failed += diff.failed;
1491 mtd->ecc_stats.corrected += diff.corrected;
1492 mtd = mtd->parent;
1496 int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen,
1505 ret = mtd_read_oob(mtd, from, &ops);
1512 int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
1521 ret = mtd_write_oob(mtd, to, &ops);
1535 int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
1538 struct mtd_info *master = mtd_get_master(mtd);
1543 if (to < 0 || to >= mtd->size || len > mtd->size - to)
1545 if (!(mtd->flags & MTD_WRITEABLE))
1552 return master->_panic_write(master, mtd_get_master_ofs(mtd, to), len,
1557 static int mtd_check_oob_ops(struct mtd_info *mtd, loff_t offs,
1571 if (offs < 0 || offs + ops->len > mtd->size)
1577 if (ops->ooboffs >= mtd_oobavail(mtd, ops))
1580 maxooblen = ((size_t)(mtd_div_by_ws(mtd->size, mtd) -
1581 mtd_div_by_ws(offs, mtd)) *
1582 mtd_oobavail(mtd, ops)) - ops->ooboffs;
1590 static int mtd_read_oob_std(struct mtd_info *mtd, loff_t from,
1593 struct mtd_info *master = mtd_get_master(mtd);
1596 from = mtd_get_master_ofs(mtd, from);
1606 static int mtd_write_oob_std(struct mtd_info *mtd, loff_t to,
1609 struct mtd_info *master = mtd_get_master(mtd);
1612 to = mtd_get_master_ofs(mtd, to);
1622 static int mtd_io_emulated_slc(struct mtd_info *mtd, loff_t start, bool read,
1625 struct mtd_info *master = mtd_get_master(mtd);
1635 ebofs = mtd_mod_by_eb(start, mtd);
1636 base = (loff_t)mtd_div_by_eb(start, mtd) * master->erasesize;
1638 info.pair = mtd_div_by_ws(ebofs, mtd);
1639 pageofs = mtd_mod_by_ws(ebofs, mtd);
1640 oobavail = mtd_oobavail(mtd, ops);
1651 pos = mtd_wunit_to_offset(mtd, base, wunit);
1654 if (adjops.len > mtd->writesize - pageofs)
1655 adjops.len = mtd->writesize - pageofs;
1662 ret = mtd_read_oob_std(mtd, pos + pageofs, &adjops);
1666 ret = mtd_write_oob_std(mtd, pos + pageofs, &adjops);
1685 int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops)
1687 struct mtd_info *master = mtd_get_master(mtd);
1693 ret_code = mtd_check_oob_ops(mtd, from, ops);
1699 /* Check the validity of a potential fallback on mtd->_read */
1706 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION)
1707 ret_code = mtd_io_emulated_slc(mtd, from, true, ops);
1709 ret_code = mtd_read_oob_std(mtd, from, ops);
1711 mtd_update_ecc_stats(mtd, master, &old_stats);
1714 * In cases where ops->datbuf != NULL, mtd->_read_oob() has semantics
1715 * similar to mtd->_read(), returning a non-negative integer
1716 * representing max bitflips. In other cases, mtd->_read_oob() may
1721 if (mtd->ecc_strength == 0)
1725 return ret_code >= mtd->bitflip_threshold ? -EUCLEAN : 0;
1729 int mtd_write_oob(struct mtd_info *mtd, loff_t to,
1732 struct mtd_info *master = mtd_get_master(mtd);
1737 if (!(mtd->flags & MTD_WRITEABLE))
1740 ret = mtd_check_oob_ops(mtd, to, ops);
1746 /* Check the validity of a potential fallback on mtd->_write */
1750 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION)
1751 return mtd_io_emulated_slc(mtd, to, false, ops);
1753 return mtd_write_oob_std(mtd, to, ops);
1759 * @mtd: MTD device structure
1769 * mtd_ooblayout_ecc(mtd, section++, oobecc) until it returns -ERANGE.
1773 int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,
1776 struct mtd_info *master = mtd_get_master(mtd);
1793 * @mtd: MTD device structure
1803 * mtd_ooblayout_free(mtd, section++, oobfree) until it returns -ERANGE.
1807 int mtd_ooblayout_free(struct mtd_info *mtd, int section,
1810 struct mtd_info *master = mtd_get_master(mtd);
1826 * @mtd: mtd info structure
1837 * mtd_ooblayout_find_region(mtd, 3, §ion, &oobregion, mtd_ooblayout_ecc);
1841 static int mtd_ooblayout_find_region(struct mtd_info *mtd, int byte,
1852 ret = iter(mtd, section, oobregion);
1877 * @mtd: mtd info structure
1887 int mtd_ooblayout_find_eccregion(struct mtd_info *mtd, int eccbyte,
1891 return mtd_ooblayout_find_region(mtd, eccbyte, section, oobregion,
1898 * @mtd: mtd info structure
1910 static int mtd_ooblayout_get_bytes(struct mtd_info *mtd, u8 *buf,
1919 ret = mtd_ooblayout_find_region(mtd, start, §ion,
1933 ret = iter(mtd, ++section, &oobregion);
1941 * @mtd: mtd info structure
1953 static int mtd_ooblayout_set_bytes(struct mtd_info *mtd, const u8 *buf,
1962 ret = mtd_ooblayout_find_region(mtd, start, §ion,
1976 ret = iter(mtd, ++section, &oobregion);
1984 * @mtd: mtd info structure
1991 static int mtd_ooblayout_count_bytes(struct mtd_info *mtd,
2000 ret = iter(mtd, section++, &oobregion);
2015 * @mtd: mtd info structure
2025 int mtd_ooblayout_get_eccbytes(struct mtd_info *mtd, u8 *eccbuf,
2028 return mtd_ooblayout_get_bytes(mtd, eccbuf, oobbuf, start, nbytes,
2035 * @mtd: mtd info structure
2045 int mtd_ooblayout_set_eccbytes(struct mtd_info *mtd, const u8 *eccbuf,
2048 return mtd_ooblayout_set_bytes(mtd, eccbuf, oobbuf, start, nbytes,
2055 * @mtd: mtd info structure
2065 int mtd_ooblayout_get_databytes(struct mtd_info *mtd, u8 *databuf,
2068 return mtd_ooblayout_get_bytes(mtd, databuf, oobbuf, start, nbytes,
2075 * @mtd: mtd info structure
2085 int mtd_ooblayout_set_databytes(struct mtd_info *mtd, const u8 *databuf,
2088 return mtd_ooblayout_set_bytes(mtd, databuf, oobbuf, start, nbytes,
2095 * @mtd: mtd info structure
2101 int mtd_ooblayout_count_freebytes(struct mtd_info *mtd)
2103 return mtd_ooblayout_count_bytes(mtd, mtd_ooblayout_free);
2109 * @mtd: mtd info structure
2115 int mtd_ooblayout_count_eccbytes(struct mtd_info *mtd)
2117 return mtd_ooblayout_count_bytes(mtd, mtd_ooblayout_ecc);
2126 int mtd_get_fact_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen,
2129 struct mtd_info *master = mtd_get_master(mtd);
2139 int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
2142 struct mtd_info *master = mtd_get_master(mtd);
2153 int mtd_get_user_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen,
2156 struct mtd_info *master = mtd_get_master(mtd);
2166 int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
2169 struct mtd_info *master = mtd_get_master(mtd);
2180 int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, size_t len,
2183 struct mtd_info *master = mtd_get_master(mtd);
2203 int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len)
2205 struct mtd_info *master = mtd_get_master(mtd);
2215 int mtd_erase_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len)
2217 struct mtd_info *master = mtd_get_master(mtd);
2228 int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2230 struct mtd_info *master = mtd_get_master(mtd);
2234 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs)
2239 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) {
2240 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize;
2241 len = (u64)mtd_div_by_eb(len, mtd) * master->erasesize;
2244 return master->_lock(master, mtd_get_master_ofs(mtd, ofs), len);
2248 int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2250 struct mtd_info *master = mtd_get_master(mtd);
2254 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs)
2259 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) {
2260 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize;
2261 len = (u64)mtd_div_by_eb(len, mtd) * master->erasesize;
2264 return master->_unlock(master, mtd_get_master_ofs(mtd, ofs), len);
2268 int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2270 struct mtd_info *master = mtd_get_master(mtd);
2274 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs)
2279 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) {
2280 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize;
2281 len = (u64)mtd_div_by_eb(len, mtd) * master->erasesize;
2284 return master->_is_locked(master, mtd_get_master_ofs(mtd, ofs), len);
2288 int mtd_block_isreserved(struct mtd_info *mtd, loff_t ofs)
2290 struct mtd_info *master = mtd_get_master(mtd);
2292 if (ofs < 0 || ofs >= mtd->size)
2297 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION)
2298 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize;
2300 return master->_block_isreserved(master, mtd_get_master_ofs(mtd, ofs));
2304 int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs)
2306 struct mtd_info *master = mtd_get_master(mtd);
2308 if (ofs < 0 || ofs >= mtd->size)
2313 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION)
2314 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize;
2316 return master->_block_isbad(master, mtd_get_master_ofs(mtd, ofs));
2320 int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs)
2322 struct mtd_info *master = mtd_get_master(mtd);
2327 if (ofs < 0 || ofs >= mtd->size)
2329 if (!(mtd->flags & MTD_WRITEABLE))
2332 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION)
2333 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize;
2335 ret = master->_block_markbad(master, mtd_get_master_ofs(mtd, ofs));
2339 while (mtd->parent) {
2340 mtd->ecc_stats.badblocks++;
2341 mtd = mtd->parent;
2350 * @mtd: mtd device description object pointer
2359 static int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
2369 ret = mtd_write(mtd, to, vecs[i].iov_len, &thislen,
2382 * @mtd: mtd device description object pointer
2391 int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
2394 struct mtd_info *master = mtd_get_master(mtd);
2397 if (!(mtd->flags & MTD_WRITEABLE))
2401 return default_mtd_writev(mtd, vecs, count, to, retlen);
2404 mtd_get_master_ofs(mtd, to), retlen);
2410 * @mtd: mtd device description object pointer
2423 * the MTD device's min. I/O unit, i.e. the "mtd->writesize" value.
2432 void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size)
2435 size_t min_alloc = max_t(size_t, mtd->writesize, PAGE_SIZE);
2446 *size = ALIGN(*size, mtd->writesize);
2460 /* Support for /proc/mtd */
2464 struct mtd_info *mtd;
2468 mtd_for_each_device(mtd) {
2469 seq_printf(m, "mtd%d: %8.8llx %8.8x \"%s\"\n",
2470 mtd->index, (unsigned long long)mtd->size,
2471 mtd->erasesize, mtd->name);
2513 mtd_bdi = mtd_bdi_init("mtd");
2519 proc_mtd = proc_create_single("mtd", 0, NULL, mtd_proc_show);
2525 dfs_dir_mtd = debugfs_create_dir("mtd", NULL);
2533 remove_proc_entry("mtd", NULL);
2539 pr_err("Error registering mtd class or bdi: %d\n", ret);
2548 remove_proc_entry("mtd", NULL);