Lines Matching refs:mtd

45 	struct mtd_info *mtd = dev_get_drvdata(dev);  in mtd_cls_suspend()  local
47 return mtd ? mtd_suspend(mtd) : 0; in mtd_cls_suspend()
52 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_cls_resume() local
54 if (mtd) in mtd_cls_resume()
55 mtd_resume(mtd); in mtd_cls_resume()
93 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_release() local
94 dev_t index = MTD_DEVT(mtd->index); in mtd_release()
96 idr_remove(&mtd_idr, mtd->index); in mtd_release()
97 of_node_put(mtd_get_of_node(mtd)); in mtd_release()
99 if (mtd_is_partition(mtd)) in mtd_release()
100 release_mtd_partition(mtd); in mtd_release()
108 struct mtd_info *mtd = container_of(kref, struct mtd_info, refcnt); in mtd_device_release() local
109 bool is_partition = mtd_is_partition(mtd); in mtd_device_release()
111 debugfs_remove_recursive(mtd->dbg.dfs_dir); in mtd_device_release()
114 nvmem_unregister(mtd->nvmem); in mtd_device_release()
116 device_unregister(&mtd->dev); in mtd_device_release()
124 memset(&mtd->dev, 0, sizeof(mtd->dev)); in mtd_device_release()
138 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_type_show() local
141 switch (mtd->type) { in mtd_type_show()
177 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_flags_show() local
179 return sysfs_emit(buf, "0x%lx\n", (unsigned long)mtd->flags); in mtd_flags_show()
186 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_size_show() local
188 return sysfs_emit(buf, "%llu\n", (unsigned long long)mtd->size); in mtd_size_show()
195 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_erasesize_show() local
197 return sysfs_emit(buf, "%lu\n", (unsigned long)mtd->erasesize); in mtd_erasesize_show()
204 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_writesize_show() local
206 return sysfs_emit(buf, "%lu\n", (unsigned long)mtd->writesize); in mtd_writesize_show()
213 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_subpagesize_show() local
214 unsigned int subpagesize = mtd->writesize >> mtd->subpage_sft; in mtd_subpagesize_show()
223 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_oobsize_show() local
225 return sysfs_emit(buf, "%lu\n", (unsigned long)mtd->oobsize); in mtd_oobsize_show()
232 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_oobavail_show() local
234 return sysfs_emit(buf, "%u\n", mtd->oobavail); in mtd_oobavail_show()
241 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_numeraseregions_show() local
243 return sysfs_emit(buf, "%u\n", mtd->numeraseregions); in mtd_numeraseregions_show()
250 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_name_show() local
252 return sysfs_emit(buf, "%s\n", mtd->name); in mtd_name_show()
259 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_ecc_strength_show() local
261 return sysfs_emit(buf, "%u\n", mtd->ecc_strength); in mtd_ecc_strength_show()
269 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_bitflip_threshold_show() local
271 return sysfs_emit(buf, "%u\n", mtd->bitflip_threshold); in mtd_bitflip_threshold_show()
278 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_bitflip_threshold_store() local
286 mtd->bitflip_threshold = bitflip_threshold; in mtd_bitflip_threshold_store()
294 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_ecc_step_size_show() local
296 return sysfs_emit(buf, "%u\n", mtd->ecc_step_size); in mtd_ecc_step_size_show()
304 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_corrected_bits_show() local
305 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats; in mtd_corrected_bits_show()
314 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_ecc_failures_show() local
315 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats; in mtd_ecc_failures_show()
324 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_bad_blocks_show() local
325 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats; in mtd_bad_blocks_show()
334 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_bbt_blocks_show() local
335 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats; in mtd_bbt_blocks_show()
361 ATTRIBUTE_GROUPS(mtd);
386 static void mtd_debugfs_populate(struct mtd_info *mtd) in mtd_debugfs_populate() argument
388 struct device *dev = &mtd->dev; in mtd_debugfs_populate()
393 mtd->dbg.dfs_dir = debugfs_create_dir(dev_name(dev), dfs_dir_mtd); in mtd_debugfs_populate()
397 unsigned mtd_mmap_capabilities(struct mtd_info *mtd) in mtd_mmap_capabilities() argument
399 switch (mtd->type) { in mtd_mmap_capabilities()
416 struct mtd_info *mtd; in mtd_reboot_notifier() local
418 mtd = container_of(n, struct mtd_info, reboot_notifier); in mtd_reboot_notifier()
419 mtd->_reboot(mtd); in mtd_reboot_notifier()
450 int mtd_wunit_to_pairing_info(struct mtd_info *mtd, int wunit, in mtd_wunit_to_pairing_info() argument
453 struct mtd_info *master = mtd_get_master(mtd); in mtd_wunit_to_pairing_info()
493 int mtd_pairing_info_to_wunit(struct mtd_info *mtd, in mtd_pairing_info_to_wunit() argument
496 struct mtd_info *master = mtd_get_master(mtd); in mtd_pairing_info_to_wunit()
505 return mtd->pairing->get_wunit(master, info); in mtd_pairing_info_to_wunit()
521 int mtd_pairing_groups(struct mtd_info *mtd) in mtd_pairing_groups() argument
523 struct mtd_info *master = mtd_get_master(mtd); in mtd_pairing_groups()
535 struct mtd_info *mtd = priv; in mtd_nvmem_reg_read() local
539 err = mtd_read(mtd, offset, bytes, &retlen, val); in mtd_nvmem_reg_read()
546 static int mtd_nvmem_add(struct mtd_info *mtd) in mtd_nvmem_add() argument
548 struct device_node *node = mtd_get_of_node(mtd); in mtd_nvmem_add()
552 config.dev = &mtd->dev; in mtd_nvmem_add()
553 config.name = dev_name(&mtd->dev); in mtd_nvmem_add()
557 config.size = mtd->size; in mtd_nvmem_add()
564 config.priv = mtd; in mtd_nvmem_add()
566 mtd->nvmem = nvmem_register(&config); in mtd_nvmem_add()
567 if (IS_ERR(mtd->nvmem)) { in mtd_nvmem_add()
569 if (PTR_ERR(mtd->nvmem) == -EOPNOTSUPP) in mtd_nvmem_add()
570 mtd->nvmem = NULL; in mtd_nvmem_add()
572 return dev_err_probe(&mtd->dev, PTR_ERR(mtd->nvmem), in mtd_nvmem_add()
579 static void mtd_check_of_node(struct mtd_info *mtd) in mtd_check_of_node() argument
586 if (mtd_get_of_node(mtd)) in mtd_check_of_node()
589 if (!mtd_is_partition(mtd)) in mtd_check_of_node()
592 parent_dn = of_node_get(mtd_get_of_node(mtd->parent)); in mtd_check_of_node()
596 if (mtd_is_partition(mtd->parent)) in mtd_check_of_node()
604 mtd_name_len = strlen(mtd->name); in mtd_check_of_node()
622 !strncmp(mtd->name, pname + offset, plen)) { in mtd_check_of_node()
623 mtd_set_of_node(mtd, mtd_dn); in mtd_check_of_node()
642 int add_mtd_device(struct mtd_info *mtd) in add_mtd_device() argument
644 struct device_node *np = mtd_get_of_node(mtd); in add_mtd_device()
645 struct mtd_info *master = mtd_get_master(mtd); in add_mtd_device()
654 if (WARN_ONCE(mtd->dev.type, "MTD already registered\n")) in add_mtd_device()
657 BUG_ON(mtd->writesize == 0); in add_mtd_device()
663 if (WARN_ON((mtd->_write && mtd->_write_oob) || in add_mtd_device()
664 (mtd->_read && mtd->_read_oob))) in add_mtd_device()
667 if (WARN_ON((!mtd->erasesize || !master->_erase) && in add_mtd_device()
668 !(mtd->flags & MTD_NO_ERASE))) in add_mtd_device()
679 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION && in add_mtd_device()
680 (!mtd_is_partition(mtd) || master->type != MTD_MLCNANDFLASH || in add_mtd_device()
690 i = idr_alloc(&mtd_idr, mtd, ofidx, ofidx + 1, GFP_KERNEL); in add_mtd_device()
692 i = idr_alloc(&mtd_idr, mtd, 0, 0, GFP_KERNEL); in add_mtd_device()
698 mtd->index = i; in add_mtd_device()
699 kref_init(&mtd->refcnt); in add_mtd_device()
702 if (mtd->bitflip_threshold == 0) in add_mtd_device()
703 mtd->bitflip_threshold = mtd->ecc_strength; in add_mtd_device()
705 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) { in add_mtd_device()
708 mtd->erasesize /= ngroups; in add_mtd_device()
709 mtd->size = (u64)mtd_div_by_eb(mtd->size, master) * in add_mtd_device()
710 mtd->erasesize; in add_mtd_device()
713 if (is_power_of_2(mtd->erasesize)) in add_mtd_device()
714 mtd->erasesize_shift = ffs(mtd->erasesize) - 1; in add_mtd_device()
716 mtd->erasesize_shift = 0; in add_mtd_device()
718 if (is_power_of_2(mtd->writesize)) in add_mtd_device()
719 mtd->writesize_shift = ffs(mtd->writesize) - 1; in add_mtd_device()
721 mtd->writesize_shift = 0; in add_mtd_device()
723 mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1; in add_mtd_device()
724 mtd->writesize_mask = (1 << mtd->writesize_shift) - 1; in add_mtd_device()
727 if ((mtd->flags & MTD_WRITEABLE) && (mtd->flags & MTD_POWERUP_LOCK)) { in add_mtd_device()
728 error = mtd_unlock(mtd, 0, mtd->size); in add_mtd_device()
732 mtd->name); in add_mtd_device()
740 mtd->dev.type = &mtd_devtype; in add_mtd_device()
741 mtd->dev.class = &mtd_class; in add_mtd_device()
742 mtd->dev.devt = MTD_DEVT(i); in add_mtd_device()
743 dev_set_name(&mtd->dev, "mtd%d", i); in add_mtd_device()
744 dev_set_drvdata(&mtd->dev, mtd); in add_mtd_device()
745 mtd_check_of_node(mtd); in add_mtd_device()
746 of_node_get(mtd_get_of_node(mtd)); in add_mtd_device()
747 error = device_register(&mtd->dev); in add_mtd_device()
749 put_device(&mtd->dev); in add_mtd_device()
754 error = mtd_nvmem_add(mtd); in add_mtd_device()
758 mtd_debugfs_populate(mtd); in add_mtd_device()
760 device_create(&mtd_class, mtd->dev.parent, MTD_DEVT(i) + 1, NULL, in add_mtd_device()
763 pr_debug("mtd: Giving out device %d to %s\n", i, mtd->name); in add_mtd_device()
767 not->add(mtd); in add_mtd_device()
771 if (of_property_read_bool(mtd_get_of_node(mtd), "linux,rootfs")) { in add_mtd_device()
773 pr_info("mtd: setting mtd%d (%s) as root device\n", mtd->index, mtd->name); in add_mtd_device()
774 ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, mtd->index); in add_mtd_device()
777 mtd->index, mtd->name); in add_mtd_device()
789 device_unregister(&mtd->dev); in add_mtd_device()
791 of_node_put(mtd_get_of_node(mtd)); in add_mtd_device()
808 int del_mtd_device(struct mtd_info *mtd) in del_mtd_device() argument
815 if (idr_find(&mtd_idr, mtd->index) != mtd) { in del_mtd_device()
823 not->remove(mtd); in del_mtd_device()
825 kref_put(&mtd->refcnt, mtd_device_release); in del_mtd_device()
837 static void mtd_set_dev_defaults(struct mtd_info *mtd) in mtd_set_dev_defaults() argument
839 if (mtd->dev.parent) { in mtd_set_dev_defaults()
840 if (!mtd->owner && mtd->dev.parent->driver) in mtd_set_dev_defaults()
841 mtd->owner = mtd->dev.parent->driver->owner; in mtd_set_dev_defaults()
842 if (!mtd->name) in mtd_set_dev_defaults()
843 mtd->name = dev_name(mtd->dev.parent); in mtd_set_dev_defaults()
848 INIT_LIST_HEAD(&mtd->partitions); in mtd_set_dev_defaults()
849 mutex_init(&mtd->master.partitions_lock); in mtd_set_dev_defaults()
850 mutex_init(&mtd->master.chrdev_lock); in mtd_set_dev_defaults()
853 static ssize_t mtd_otp_size(struct mtd_info *mtd, bool is_user) in mtd_otp_size() argument
866 ret = mtd_get_user_prot_info(mtd, PAGE_SIZE, &retlen, info); in mtd_otp_size()
868 ret = mtd_get_fact_prot_info(mtd, PAGE_SIZE, &retlen, info); in mtd_otp_size()
885 static struct nvmem_device *mtd_otp_nvmem_register(struct mtd_info *mtd, in mtd_otp_nvmem_register() argument
895 np = of_get_compatible_child(mtd->dev.of_node, compatible); in mtd_otp_nvmem_register()
898 config.dev = mtd->dev.parent; in mtd_otp_nvmem_register()
902 config.add_legacy_fixed_of_cells = !mtd_type_is_nand(mtd); in mtd_otp_nvmem_register()
909 config.priv = mtd; in mtd_otp_nvmem_register()
924 struct mtd_info *mtd = priv; in mtd_nvmem_user_otp_reg_read() local
928 ret = mtd_read_user_prot_reg(mtd, offset, bytes, &retlen, val); in mtd_nvmem_user_otp_reg_read()
938 struct mtd_info *mtd = priv; in mtd_nvmem_fact_otp_reg_read() local
942 ret = mtd_read_fact_prot_reg(mtd, offset, bytes, &retlen, val); in mtd_nvmem_fact_otp_reg_read()
949 static int mtd_otp_nvmem_add(struct mtd_info *mtd) in mtd_otp_nvmem_add() argument
951 struct device *dev = mtd->dev.parent; in mtd_otp_nvmem_add()
956 if (mtd->_get_user_prot_info && mtd->_read_user_prot_reg) { in mtd_otp_nvmem_add()
957 size = mtd_otp_size(mtd, true); in mtd_otp_nvmem_add()
964 nvmem = mtd_otp_nvmem_register(mtd, "user-otp", size, in mtd_otp_nvmem_add()
970 mtd->otp_user_nvmem = nvmem; in mtd_otp_nvmem_add()
974 if (mtd->_get_fact_prot_info && mtd->_read_fact_prot_reg) { in mtd_otp_nvmem_add()
975 size = mtd_otp_size(mtd, false); in mtd_otp_nvmem_add()
994 err = mtd_nvmem_fact_otp_reg_read(mtd, 0, otp, size); in mtd_otp_nvmem_add()
1002 nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size, in mtd_otp_nvmem_add()
1008 mtd->otp_factory_nvmem = nvmem; in mtd_otp_nvmem_add()
1015 nvmem_unregister(mtd->otp_user_nvmem); in mtd_otp_nvmem_add()
1047 int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, in mtd_device_parse_register() argument
1054 mtd_set_dev_defaults(mtd); in mtd_device_parse_register()
1056 ret = mtd_otp_nvmem_add(mtd); in mtd_device_parse_register()
1061 ret = add_mtd_device(mtd); in mtd_device_parse_register()
1067 ret = parse_mtd_partitions(mtd, types, parser_data); in mtd_device_parse_register()
1074 ret = add_mtd_partitions(mtd, parts, nr_parts); in mtd_device_parse_register()
1075 else if (!device_is_registered(&mtd->dev)) in mtd_device_parse_register()
1076 ret = add_mtd_device(mtd); in mtd_device_parse_register()
1091 WARN_ONCE(mtd->_reboot && mtd->reboot_notifier.notifier_call, in mtd_device_parse_register()
1093 if (mtd->_reboot && !mtd->reboot_notifier.notifier_call) { in mtd_device_parse_register()
1094 mtd->reboot_notifier.notifier_call = mtd_reboot_notifier; in mtd_device_parse_register()
1095 register_reboot_notifier(&mtd->reboot_notifier); in mtd_device_parse_register()
1100 nvmem_unregister(mtd->otp_user_nvmem); in mtd_device_parse_register()
1101 nvmem_unregister(mtd->otp_factory_nvmem); in mtd_device_parse_register()
1104 if (ret && device_is_registered(&mtd->dev)) in mtd_device_parse_register()
1105 del_mtd_device(mtd); in mtd_device_parse_register()
1150 struct mtd_info *mtd; in register_mtd_user() local
1158 mtd_for_each_device(mtd) in register_mtd_user()
1159 new->add(mtd); in register_mtd_user()
1176 struct mtd_info *mtd; in unregister_mtd_user() local
1182 mtd_for_each_device(mtd) in unregister_mtd_user()
1183 old->remove(mtd); in unregister_mtd_user()
1202 struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) in get_mtd_device() argument
1211 if (other == mtd) { in get_mtd_device()
1212 ret = mtd; in get_mtd_device()
1218 if (mtd && mtd != ret) in get_mtd_device()
1237 int __get_mtd_device(struct mtd_info *mtd) in __get_mtd_device() argument
1239 struct mtd_info *master = mtd_get_master(mtd); in __get_mtd_device()
1243 err = master->_get_device(mtd); in __get_mtd_device()
1254 while (mtd) { in __get_mtd_device()
1255 if (mtd != master) in __get_mtd_device()
1256 kref_get(&mtd->refcnt); in __get_mtd_device()
1257 mtd = mtd->parent; in __get_mtd_device()
1274 struct mtd_info *mtd = NULL; in of_get_mtd_device_by_node() local
1283 mtd = tmp; in of_get_mtd_device_by_node()
1284 err = __get_mtd_device(mtd); in of_get_mtd_device_by_node()
1291 return err ? ERR_PTR(err) : mtd; in of_get_mtd_device_by_node()
1306 struct mtd_info *mtd = NULL, *other; in get_mtd_device_nm() local
1312 mtd = other; in get_mtd_device_nm()
1317 if (!mtd) in get_mtd_device_nm()
1320 err = __get_mtd_device(mtd); in get_mtd_device_nm()
1325 return mtd; in get_mtd_device_nm()
1333 void put_mtd_device(struct mtd_info *mtd) in put_mtd_device() argument
1336 __put_mtd_device(mtd); in put_mtd_device()
1342 void __put_mtd_device(struct mtd_info *mtd) in __put_mtd_device() argument
1344 struct mtd_info *master = mtd_get_master(mtd); in __put_mtd_device()
1346 while (mtd) { in __put_mtd_device()
1348 struct mtd_info *parent = mtd->parent; in __put_mtd_device()
1350 if (mtd != master) in __put_mtd_device()
1351 kref_put(&mtd->refcnt, mtd_device_release); in __put_mtd_device()
1352 mtd = parent; in __put_mtd_device()
1371 int mtd_erase(struct mtd_info *mtd, struct erase_info *instr) in mtd_erase() argument
1373 struct mtd_info *master = mtd_get_master(mtd); in mtd_erase()
1374 u64 mst_ofs = mtd_get_master_ofs(mtd, 0); in mtd_erase()
1381 if (!mtd->erasesize || !master->_erase) in mtd_erase()
1384 if (instr->addr >= mtd->size || instr->len > mtd->size - instr->addr) in mtd_erase()
1386 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_erase()
1394 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) { in mtd_erase()
1395 adjinstr.addr = (loff_t)mtd_div_by_eb(instr->addr, mtd) * in mtd_erase()
1397 adjinstr.len = ((u64)mtd_div_by_eb(instr->addr + instr->len, mtd) * in mtd_erase()
1408 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) { in mtd_erase()
1411 instr->fail_addr *= mtd->erasesize; in mtd_erase()
1422 int mtd_point(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, in mtd_point() argument
1425 struct mtd_info *master = mtd_get_master(mtd); in mtd_point()
1433 if (from < 0 || from >= mtd->size || len > mtd->size - from) in mtd_point()
1438 from = mtd_get_master_ofs(mtd, from); in mtd_point()
1444 int mtd_unpoint(struct mtd_info *mtd, loff_t from, size_t len) in mtd_unpoint() argument
1446 struct mtd_info *master = mtd_get_master(mtd); in mtd_unpoint()
1450 if (from < 0 || from >= mtd->size || len > mtd->size - from) in mtd_unpoint()
1454 return master->_unpoint(master, mtd_get_master_ofs(mtd, from), len); in mtd_unpoint()
1463 unsigned long mtd_get_unmapped_area(struct mtd_info *mtd, unsigned long len, in mtd_get_unmapped_area() argument
1470 ret = mtd_point(mtd, offset, len, &retlen, &virt, NULL); in mtd_get_unmapped_area()
1474 mtd_unpoint(mtd, offset, retlen); in mtd_get_unmapped_area()
1481 static void mtd_update_ecc_stats(struct mtd_info *mtd, struct mtd_info *master, in mtd_update_ecc_stats() argument
1486 if (master == mtd) in mtd_update_ecc_stats()
1493 while (mtd->parent) { in mtd_update_ecc_stats()
1494 mtd->ecc_stats.failed += diff.failed; in mtd_update_ecc_stats()
1495 mtd->ecc_stats.corrected += diff.corrected; in mtd_update_ecc_stats()
1496 mtd = mtd->parent; in mtd_update_ecc_stats()
1500 int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, in mtd_read() argument
1509 ret = mtd_read_oob(mtd, from, &ops); in mtd_read()
1516 int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, in mtd_write() argument
1525 ret = mtd_write_oob(mtd, to, &ops); in mtd_write()
1539 int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, in mtd_panic_write() argument
1542 struct mtd_info *master = mtd_get_master(mtd); in mtd_panic_write()
1547 if (to < 0 || to >= mtd->size || len > mtd->size - to) in mtd_panic_write()
1549 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_panic_write()
1556 return master->_panic_write(master, mtd_get_master_ofs(mtd, to), len, in mtd_panic_write()
1561 static int mtd_check_oob_ops(struct mtd_info *mtd, loff_t offs, in mtd_check_oob_ops() argument
1575 if (offs < 0 || offs + ops->len > mtd->size) in mtd_check_oob_ops()
1581 if (ops->ooboffs >= mtd_oobavail(mtd, ops)) in mtd_check_oob_ops()
1584 maxooblen = ((size_t)(mtd_div_by_ws(mtd->size, mtd) - in mtd_check_oob_ops()
1585 mtd_div_by_ws(offs, mtd)) * in mtd_check_oob_ops()
1586 mtd_oobavail(mtd, ops)) - ops->ooboffs; in mtd_check_oob_ops()
1594 static int mtd_read_oob_std(struct mtd_info *mtd, loff_t from, in mtd_read_oob_std() argument
1597 struct mtd_info *master = mtd_get_master(mtd); in mtd_read_oob_std()
1600 from = mtd_get_master_ofs(mtd, from); in mtd_read_oob_std()
1610 static int mtd_write_oob_std(struct mtd_info *mtd, loff_t to, in mtd_write_oob_std() argument
1613 struct mtd_info *master = mtd_get_master(mtd); in mtd_write_oob_std()
1616 to = mtd_get_master_ofs(mtd, to); in mtd_write_oob_std()
1626 static int mtd_io_emulated_slc(struct mtd_info *mtd, loff_t start, bool read, in mtd_io_emulated_slc() argument
1629 struct mtd_info *master = mtd_get_master(mtd); in mtd_io_emulated_slc()
1639 ebofs = mtd_mod_by_eb(start, mtd); in mtd_io_emulated_slc()
1640 base = (loff_t)mtd_div_by_eb(start, mtd) * master->erasesize; in mtd_io_emulated_slc()
1642 info.pair = mtd_div_by_ws(ebofs, mtd); in mtd_io_emulated_slc()
1643 pageofs = mtd_mod_by_ws(ebofs, mtd); in mtd_io_emulated_slc()
1644 oobavail = mtd_oobavail(mtd, ops); in mtd_io_emulated_slc()
1655 pos = mtd_wunit_to_offset(mtd, base, wunit); in mtd_io_emulated_slc()
1658 if (adjops.len > mtd->writesize - pageofs) in mtd_io_emulated_slc()
1659 adjops.len = mtd->writesize - pageofs; in mtd_io_emulated_slc()
1666 ret = mtd_read_oob_std(mtd, pos + pageofs, &adjops); in mtd_io_emulated_slc()
1670 ret = mtd_write_oob_std(mtd, pos + pageofs, &adjops); in mtd_io_emulated_slc()
1689 int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops) in mtd_read_oob() argument
1691 struct mtd_info *master = mtd_get_master(mtd); in mtd_read_oob()
1697 ret_code = mtd_check_oob_ops(mtd, from, ops); in mtd_read_oob()
1710 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) in mtd_read_oob()
1711 ret_code = mtd_io_emulated_slc(mtd, from, true, ops); in mtd_read_oob()
1713 ret_code = mtd_read_oob_std(mtd, from, ops); in mtd_read_oob()
1715 mtd_update_ecc_stats(mtd, master, &old_stats); in mtd_read_oob()
1725 if (mtd->ecc_strength == 0) in mtd_read_oob()
1729 return ret_code >= mtd->bitflip_threshold ? -EUCLEAN : 0; in mtd_read_oob()
1733 int mtd_write_oob(struct mtd_info *mtd, loff_t to, in mtd_write_oob() argument
1736 struct mtd_info *master = mtd_get_master(mtd); in mtd_write_oob()
1741 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_write_oob()
1744 ret = mtd_check_oob_ops(mtd, to, ops); in mtd_write_oob()
1754 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) in mtd_write_oob()
1755 return mtd_io_emulated_slc(mtd, to, false, ops); in mtd_write_oob()
1757 return mtd_write_oob_std(mtd, to, ops); in mtd_write_oob()
1777 int mtd_ooblayout_ecc(struct mtd_info *mtd, int section, in mtd_ooblayout_ecc() argument
1780 struct mtd_info *master = mtd_get_master(mtd); in mtd_ooblayout_ecc()
1811 int mtd_ooblayout_free(struct mtd_info *mtd, int section, in mtd_ooblayout_free() argument
1814 struct mtd_info *master = mtd_get_master(mtd); in mtd_ooblayout_free()
1845 static int mtd_ooblayout_find_region(struct mtd_info *mtd, int byte, in mtd_ooblayout_find_region() argument
1856 ret = iter(mtd, section, oobregion); in mtd_ooblayout_find_region()
1891 int mtd_ooblayout_find_eccregion(struct mtd_info *mtd, int eccbyte, in mtd_ooblayout_find_eccregion() argument
1895 return mtd_ooblayout_find_region(mtd, eccbyte, section, oobregion, in mtd_ooblayout_find_eccregion()
1914 static int mtd_ooblayout_get_bytes(struct mtd_info *mtd, u8 *buf, in mtd_ooblayout_get_bytes() argument
1923 ret = mtd_ooblayout_find_region(mtd, start, &section, in mtd_ooblayout_get_bytes()
1937 ret = iter(mtd, ++section, &oobregion); in mtd_ooblayout_get_bytes()
1957 static int mtd_ooblayout_set_bytes(struct mtd_info *mtd, const u8 *buf, in mtd_ooblayout_set_bytes() argument
1966 ret = mtd_ooblayout_find_region(mtd, start, &section, in mtd_ooblayout_set_bytes()
1980 ret = iter(mtd, ++section, &oobregion); in mtd_ooblayout_set_bytes()
1995 static int mtd_ooblayout_count_bytes(struct mtd_info *mtd, in mtd_ooblayout_count_bytes() argument
2004 ret = iter(mtd, section++, &oobregion); in mtd_ooblayout_count_bytes()
2029 int mtd_ooblayout_get_eccbytes(struct mtd_info *mtd, u8 *eccbuf, in mtd_ooblayout_get_eccbytes() argument
2032 return mtd_ooblayout_get_bytes(mtd, eccbuf, oobbuf, start, nbytes, in mtd_ooblayout_get_eccbytes()
2049 int mtd_ooblayout_set_eccbytes(struct mtd_info *mtd, const u8 *eccbuf, in mtd_ooblayout_set_eccbytes() argument
2052 return mtd_ooblayout_set_bytes(mtd, eccbuf, oobbuf, start, nbytes, in mtd_ooblayout_set_eccbytes()
2069 int mtd_ooblayout_get_databytes(struct mtd_info *mtd, u8 *databuf, in mtd_ooblayout_get_databytes() argument
2072 return mtd_ooblayout_get_bytes(mtd, databuf, oobbuf, start, nbytes, in mtd_ooblayout_get_databytes()
2089 int mtd_ooblayout_set_databytes(struct mtd_info *mtd, const u8 *databuf, in mtd_ooblayout_set_databytes() argument
2092 return mtd_ooblayout_set_bytes(mtd, databuf, oobbuf, start, nbytes, in mtd_ooblayout_set_databytes()
2105 int mtd_ooblayout_count_freebytes(struct mtd_info *mtd) in mtd_ooblayout_count_freebytes() argument
2107 return mtd_ooblayout_count_bytes(mtd, mtd_ooblayout_free); in mtd_ooblayout_count_freebytes()
2119 int mtd_ooblayout_count_eccbytes(struct mtd_info *mtd) in mtd_ooblayout_count_eccbytes() argument
2121 return mtd_ooblayout_count_bytes(mtd, mtd_ooblayout_ecc); in mtd_ooblayout_count_eccbytes()
2130 int mtd_get_fact_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen, in mtd_get_fact_prot_info() argument
2133 struct mtd_info *master = mtd_get_master(mtd); in mtd_get_fact_prot_info()
2143 int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, size_t len, in mtd_read_fact_prot_reg() argument
2146 struct mtd_info *master = mtd_get_master(mtd); in mtd_read_fact_prot_reg()
2157 int mtd_get_user_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen, in mtd_get_user_prot_info() argument
2160 struct mtd_info *master = mtd_get_master(mtd); in mtd_get_user_prot_info()
2170 int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len, in mtd_read_user_prot_reg() argument
2173 struct mtd_info *master = mtd_get_master(mtd); in mtd_read_user_prot_reg()
2184 int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, size_t len, in mtd_write_user_prot_reg() argument
2187 struct mtd_info *master = mtd_get_master(mtd); in mtd_write_user_prot_reg()
2207 int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len) in mtd_lock_user_prot_reg() argument
2209 struct mtd_info *master = mtd_get_master(mtd); in mtd_lock_user_prot_reg()
2219 int mtd_erase_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len) in mtd_erase_user_prot_reg() argument
2221 struct mtd_info *master = mtd_get_master(mtd); in mtd_erase_user_prot_reg()
2232 int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in mtd_lock() argument
2234 struct mtd_info *master = mtd_get_master(mtd); in mtd_lock()
2238 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs) in mtd_lock()
2243 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) { in mtd_lock()
2244 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize; in mtd_lock()
2245 len = (u64)mtd_div_by_eb(len, mtd) * master->erasesize; in mtd_lock()
2248 return master->_lock(master, mtd_get_master_ofs(mtd, ofs), len); in mtd_lock()
2252 int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in mtd_unlock() argument
2254 struct mtd_info *master = mtd_get_master(mtd); in mtd_unlock()
2258 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs) in mtd_unlock()
2263 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) { in mtd_unlock()
2264 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize; in mtd_unlock()
2265 len = (u64)mtd_div_by_eb(len, mtd) * master->erasesize; in mtd_unlock()
2268 return master->_unlock(master, mtd_get_master_ofs(mtd, ofs), len); in mtd_unlock()
2272 int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len) in mtd_is_locked() argument
2274 struct mtd_info *master = mtd_get_master(mtd); in mtd_is_locked()
2278 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs) in mtd_is_locked()
2283 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) { in mtd_is_locked()
2284 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize; in mtd_is_locked()
2285 len = (u64)mtd_div_by_eb(len, mtd) * master->erasesize; in mtd_is_locked()
2288 return master->_is_locked(master, mtd_get_master_ofs(mtd, ofs), len); in mtd_is_locked()
2292 int mtd_block_isreserved(struct mtd_info *mtd, loff_t ofs) in mtd_block_isreserved() argument
2294 struct mtd_info *master = mtd_get_master(mtd); in mtd_block_isreserved()
2296 if (ofs < 0 || ofs >= mtd->size) in mtd_block_isreserved()
2301 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) in mtd_block_isreserved()
2302 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize; in mtd_block_isreserved()
2304 return master->_block_isreserved(master, mtd_get_master_ofs(mtd, ofs)); in mtd_block_isreserved()
2308 int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) in mtd_block_isbad() argument
2310 struct mtd_info *master = mtd_get_master(mtd); in mtd_block_isbad()
2312 if (ofs < 0 || ofs >= mtd->size) in mtd_block_isbad()
2317 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) in mtd_block_isbad()
2318 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize; in mtd_block_isbad()
2320 return master->_block_isbad(master, mtd_get_master_ofs(mtd, ofs)); in mtd_block_isbad()
2324 int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs) in mtd_block_markbad() argument
2326 struct mtd_info *master = mtd_get_master(mtd); in mtd_block_markbad()
2331 if (ofs < 0 || ofs >= mtd->size) in mtd_block_markbad()
2333 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_block_markbad()
2336 if (mtd->flags & MTD_SLC_ON_MLC_EMULATION) in mtd_block_markbad()
2337 ofs = (loff_t)mtd_div_by_eb(ofs, mtd) * master->erasesize; in mtd_block_markbad()
2339 ret = master->_block_markbad(master, mtd_get_master_ofs(mtd, ofs)); in mtd_block_markbad()
2343 while (mtd->parent) { in mtd_block_markbad()
2344 mtd->ecc_stats.badblocks++; in mtd_block_markbad()
2345 mtd = mtd->parent; in mtd_block_markbad()
2363 static int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, in default_mtd_writev() argument
2373 ret = mtd_write(mtd, to, vecs[i].iov_len, &thislen, in default_mtd_writev()
2395 int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, in mtd_writev() argument
2398 struct mtd_info *master = mtd_get_master(mtd); in mtd_writev()
2401 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_writev()
2405 return default_mtd_writev(mtd, vecs, count, to, retlen); in mtd_writev()
2408 mtd_get_master_ofs(mtd, to), retlen); in mtd_writev()
2436 void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size) in mtd_kmalloc_up_to() argument
2439 size_t min_alloc = max_t(size_t, mtd->writesize, PAGE_SIZE); in mtd_kmalloc_up_to()
2450 *size = ALIGN(*size, mtd->writesize); in mtd_kmalloc_up_to()
2468 struct mtd_info *mtd; in mtd_proc_show() local
2472 mtd_for_each_device(mtd) { in mtd_proc_show()
2474 mtd->index, (unsigned long long)mtd->size, in mtd_proc_show()
2475 mtd->erasesize, mtd->name); in mtd_proc_show()