Lines Matching refs:mtd

55 	struct mtd_info *mtd = dev_get_drvdata(dev);  in mtd_cls_suspend()  local
57 return mtd ? mtd_suspend(mtd) : 0; in mtd_cls_suspend()
62 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_cls_resume() local
64 if (mtd) in mtd_cls_resume()
65 mtd_resume(mtd); in mtd_cls_resume()
104 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_release() local
105 dev_t index = MTD_DEVT(mtd->index); in mtd_release()
114 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_type_show() local
117 switch (mtd->type) { in mtd_type_show()
153 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_flags_show() local
155 return snprintf(buf, PAGE_SIZE, "0x%lx\n", (unsigned long)mtd->flags); in mtd_flags_show()
163 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_size_show() local
166 (unsigned long long)mtd->size); in mtd_size_show()
174 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_erasesize_show() local
176 return snprintf(buf, PAGE_SIZE, "%lu\n", (unsigned long)mtd->erasesize); in mtd_erasesize_show()
184 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_writesize_show() local
186 return snprintf(buf, PAGE_SIZE, "%lu\n", (unsigned long)mtd->writesize); in mtd_writesize_show()
194 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_subpagesize_show() local
195 unsigned int subpagesize = mtd->writesize >> mtd->subpage_sft; in mtd_subpagesize_show()
205 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_oobsize_show() local
207 return snprintf(buf, PAGE_SIZE, "%lu\n", (unsigned long)mtd->oobsize); in mtd_oobsize_show()
215 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_numeraseregions_show() local
217 return snprintf(buf, PAGE_SIZE, "%u\n", mtd->numeraseregions); in mtd_numeraseregions_show()
226 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_name_show() local
228 return snprintf(buf, PAGE_SIZE, "%s\n", mtd->name); in mtd_name_show()
236 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_ecc_strength_show() local
238 return snprintf(buf, PAGE_SIZE, "%u\n", mtd->ecc_strength); in mtd_ecc_strength_show()
246 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_bitflip_threshold_show() local
248 return snprintf(buf, PAGE_SIZE, "%u\n", mtd->bitflip_threshold); in mtd_bitflip_threshold_show()
255 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_bitflip_threshold_store() local
263 mtd->bitflip_threshold = bitflip_threshold; in mtd_bitflip_threshold_store()
273 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_ecc_step_size_show() local
275 return snprintf(buf, PAGE_SIZE, "%u\n", mtd->ecc_step_size); in mtd_ecc_step_size_show()
283 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_ecc_stats_corrected_show() local
284 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats; in mtd_ecc_stats_corrected_show()
294 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_ecc_stats_errors_show() local
295 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats; in mtd_ecc_stats_errors_show()
304 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_badblocks_show() local
305 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats; in mtd_badblocks_show()
314 struct mtd_info *mtd = dev_get_drvdata(dev); in mtd_bbtblocks_show() local
315 struct mtd_ecc_stats *ecc_stats = &mtd->ecc_stats; in mtd_bbtblocks_show()
340 ATTRIBUTE_GROUPS(mtd);
349 unsigned mtd_mmap_capabilities(struct mtd_info *mtd) in mtd_mmap_capabilities() argument
351 switch (mtd->type) { in mtd_mmap_capabilities()
368 struct mtd_info *mtd; in mtd_reboot_notifier() local
370 mtd = container_of(n, struct mtd_info, reboot_notifier); in mtd_reboot_notifier()
371 mtd->_reboot(mtd); in mtd_reboot_notifier()
385 int add_mtd_device(struct mtd_info *mtd) in add_mtd_device() argument
395 if (WARN_ONCE(mtd->backing_dev_info, "MTD already registered\n")) in add_mtd_device()
398 mtd->backing_dev_info = &mtd_bdi; in add_mtd_device()
400 BUG_ON(mtd->writesize == 0); in add_mtd_device()
403 i = idr_alloc(&mtd_idr, mtd, 0, 0, GFP_KERNEL); in add_mtd_device()
409 mtd->index = i; in add_mtd_device()
410 mtd->usecount = 0; in add_mtd_device()
413 if (mtd->bitflip_threshold == 0) in add_mtd_device()
414 mtd->bitflip_threshold = mtd->ecc_strength; in add_mtd_device()
416 if (is_power_of_2(mtd->erasesize)) in add_mtd_device()
417 mtd->erasesize_shift = ffs(mtd->erasesize) - 1; in add_mtd_device()
419 mtd->erasesize_shift = 0; in add_mtd_device()
421 if (is_power_of_2(mtd->writesize)) in add_mtd_device()
422 mtd->writesize_shift = ffs(mtd->writesize) - 1; in add_mtd_device()
424 mtd->writesize_shift = 0; in add_mtd_device()
426 mtd->erasesize_mask = (1 << mtd->erasesize_shift) - 1; in add_mtd_device()
427 mtd->writesize_mask = (1 << mtd->writesize_shift) - 1; in add_mtd_device()
430 if ((mtd->flags & MTD_WRITEABLE) && (mtd->flags & MTD_POWERUP_LOCK)) { in add_mtd_device()
431 error = mtd_unlock(mtd, 0, mtd->size); in add_mtd_device()
435 mtd->name); in add_mtd_device()
443 mtd->dev.type = &mtd_devtype; in add_mtd_device()
444 mtd->dev.class = &mtd_class; in add_mtd_device()
445 mtd->dev.devt = MTD_DEVT(i); in add_mtd_device()
446 dev_set_name(&mtd->dev, "mtd%d", i); in add_mtd_device()
447 dev_set_drvdata(&mtd->dev, mtd); in add_mtd_device()
448 error = device_register(&mtd->dev); in add_mtd_device()
452 device_create(&mtd_class, mtd->dev.parent, MTD_DEVT(i) + 1, NULL, in add_mtd_device()
455 pr_debug("mtd: Giving out device %d to %s\n", i, mtd->name); in add_mtd_device()
459 not->add(mtd); in add_mtd_device()
486 int del_mtd_device(struct mtd_info *mtd) in del_mtd_device() argument
493 if (idr_find(&mtd_idr, mtd->index) != mtd) { in del_mtd_device()
501 not->remove(mtd); in del_mtd_device()
503 if (mtd->usecount) { in del_mtd_device()
505 mtd->index, mtd->name, mtd->usecount); in del_mtd_device()
508 device_unregister(&mtd->dev); in del_mtd_device()
510 idr_remove(&mtd_idr, mtd->index); in del_mtd_device()
521 static int mtd_add_device_partitions(struct mtd_info *mtd, in mtd_add_device_partitions() argument
528 ret = add_mtd_device(mtd); in mtd_add_device_partitions()
534 ret = add_mtd_partitions(mtd, real_parts, nbparts); in mtd_add_device_partitions()
536 del_mtd_device(mtd); in mtd_add_device_partitions()
547 static void mtd_set_dev_defaults(struct mtd_info *mtd) in mtd_set_dev_defaults() argument
549 if (mtd->dev.parent) { in mtd_set_dev_defaults()
550 if (!mtd->owner && mtd->dev.parent->driver) in mtd_set_dev_defaults()
551 mtd->owner = mtd->dev.parent->driver->owner; in mtd_set_dev_defaults()
552 if (!mtd->name) in mtd_set_dev_defaults()
553 mtd->name = dev_name(mtd->dev.parent); in mtd_set_dev_defaults()
588 int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types, in mtd_device_parse_register() argument
596 mtd_set_dev_defaults(mtd); in mtd_device_parse_register()
598 ret = parse_mtd_partitions(mtd, types, &real_parts, parser_data); in mtd_device_parse_register()
615 ret = mtd_add_device_partitions(mtd, real_parts, ret); in mtd_device_parse_register()
627 WARN_ONCE(mtd->_reboot && mtd->reboot_notifier.notifier_call, in mtd_device_parse_register()
629 if (mtd->_reboot && !mtd->reboot_notifier.notifier_call) { in mtd_device_parse_register()
630 mtd->reboot_notifier.notifier_call = mtd_reboot_notifier; in mtd_device_parse_register()
631 register_reboot_notifier(&mtd->reboot_notifier); in mtd_device_parse_register()
674 struct mtd_info *mtd; in register_mtd_user() local
682 mtd_for_each_device(mtd) in register_mtd_user()
683 new->add(mtd); in register_mtd_user()
700 struct mtd_info *mtd; in unregister_mtd_user() local
706 mtd_for_each_device(mtd) in unregister_mtd_user()
707 old->remove(mtd); in unregister_mtd_user()
726 struct mtd_info *get_mtd_device(struct mtd_info *mtd, int num) in get_mtd_device() argument
735 if (other == mtd) { in get_mtd_device()
736 ret = mtd; in get_mtd_device()
742 if (mtd && mtd != ret) in get_mtd_device()
761 int __get_mtd_device(struct mtd_info *mtd) in __get_mtd_device() argument
765 if (!try_module_get(mtd->owner)) in __get_mtd_device()
768 if (mtd->_get_device) { in __get_mtd_device()
769 err = mtd->_get_device(mtd); in __get_mtd_device()
772 module_put(mtd->owner); in __get_mtd_device()
776 mtd->usecount++; in __get_mtd_device()
792 struct mtd_info *mtd = NULL, *other; in get_mtd_device_nm() local
798 mtd = other; in get_mtd_device_nm()
803 if (!mtd) in get_mtd_device_nm()
806 err = __get_mtd_device(mtd); in get_mtd_device_nm()
811 return mtd; in get_mtd_device_nm()
819 void put_mtd_device(struct mtd_info *mtd) in put_mtd_device() argument
822 __put_mtd_device(mtd); in put_mtd_device()
828 void __put_mtd_device(struct mtd_info *mtd) in __put_mtd_device() argument
830 --mtd->usecount; in __put_mtd_device()
831 BUG_ON(mtd->usecount < 0); in __put_mtd_device()
833 if (mtd->_put_device) in __put_mtd_device()
834 mtd->_put_device(mtd); in __put_mtd_device()
836 module_put(mtd->owner); in __put_mtd_device()
847 int mtd_erase(struct mtd_info *mtd, struct erase_info *instr) in mtd_erase() argument
849 if (instr->addr >= mtd->size || instr->len > mtd->size - instr->addr) in mtd_erase()
851 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_erase()
859 return mtd->_erase(mtd, instr); in mtd_erase()
866 int mtd_point(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, in mtd_point() argument
873 if (!mtd->_point) in mtd_point()
875 if (from < 0 || from >= mtd->size || len > mtd->size - from) in mtd_point()
879 return mtd->_point(mtd, from, len, retlen, virt, phys); in mtd_point()
884 int mtd_unpoint(struct mtd_info *mtd, loff_t from, size_t len) in mtd_unpoint() argument
886 if (!mtd->_point) in mtd_unpoint()
888 if (from < 0 || from >= mtd->size || len > mtd->size - from) in mtd_unpoint()
892 return mtd->_unpoint(mtd, from, len); in mtd_unpoint()
901 unsigned long mtd_get_unmapped_area(struct mtd_info *mtd, unsigned long len, in mtd_get_unmapped_area() argument
904 if (!mtd->_get_unmapped_area) in mtd_get_unmapped_area()
906 if (offset >= mtd->size || len > mtd->size - offset) in mtd_get_unmapped_area()
908 return mtd->_get_unmapped_area(mtd, len, offset, flags); in mtd_get_unmapped_area()
912 int mtd_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, in mtd_read() argument
917 if (from < 0 || from >= mtd->size || len > mtd->size - from) in mtd_read()
927 ret_code = mtd->_read(mtd, from, len, retlen, buf); in mtd_read()
930 if (mtd->ecc_strength == 0) in mtd_read()
932 return ret_code >= mtd->bitflip_threshold ? -EUCLEAN : 0; in mtd_read()
936 int mtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, in mtd_write() argument
940 if (to < 0 || to >= mtd->size || len > mtd->size - to) in mtd_write()
942 if (!mtd->_write || !(mtd->flags & MTD_WRITEABLE)) in mtd_write()
946 return mtd->_write(mtd, to, len, retlen, buf); in mtd_write()
957 int mtd_panic_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, in mtd_panic_write() argument
961 if (!mtd->_panic_write) in mtd_panic_write()
963 if (to < 0 || to >= mtd->size || len > mtd->size - to) in mtd_panic_write()
965 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_panic_write()
969 return mtd->_panic_write(mtd, to, len, retlen, buf); in mtd_panic_write()
973 int mtd_read_oob(struct mtd_info *mtd, loff_t from, struct mtd_oob_ops *ops) in mtd_read_oob() argument
977 if (!mtd->_read_oob) in mtd_read_oob()
985 ret_code = mtd->_read_oob(mtd, from, ops); in mtd_read_oob()
988 if (mtd->ecc_strength == 0) in mtd_read_oob()
990 return ret_code >= mtd->bitflip_threshold ? -EUCLEAN : 0; in mtd_read_oob()
999 int mtd_get_fact_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen, in mtd_get_fact_prot_info() argument
1002 if (!mtd->_get_fact_prot_info) in mtd_get_fact_prot_info()
1006 return mtd->_get_fact_prot_info(mtd, len, retlen, buf); in mtd_get_fact_prot_info()
1010 int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, size_t len, in mtd_read_fact_prot_reg() argument
1014 if (!mtd->_read_fact_prot_reg) in mtd_read_fact_prot_reg()
1018 return mtd->_read_fact_prot_reg(mtd, from, len, retlen, buf); in mtd_read_fact_prot_reg()
1022 int mtd_get_user_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen, in mtd_get_user_prot_info() argument
1025 if (!mtd->_get_user_prot_info) in mtd_get_user_prot_info()
1029 return mtd->_get_user_prot_info(mtd, len, retlen, buf); in mtd_get_user_prot_info()
1033 int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len, in mtd_read_user_prot_reg() argument
1037 if (!mtd->_read_user_prot_reg) in mtd_read_user_prot_reg()
1041 return mtd->_read_user_prot_reg(mtd, from, len, retlen, buf); in mtd_read_user_prot_reg()
1045 int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, size_t len, in mtd_write_user_prot_reg() argument
1051 if (!mtd->_write_user_prot_reg) in mtd_write_user_prot_reg()
1055 ret = mtd->_write_user_prot_reg(mtd, to, len, retlen, buf); in mtd_write_user_prot_reg()
1067 int mtd_lock_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len) in mtd_lock_user_prot_reg() argument
1069 if (!mtd->_lock_user_prot_reg) in mtd_lock_user_prot_reg()
1073 return mtd->_lock_user_prot_reg(mtd, from, len); in mtd_lock_user_prot_reg()
1078 int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in mtd_lock() argument
1080 if (!mtd->_lock) in mtd_lock()
1082 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs) in mtd_lock()
1086 return mtd->_lock(mtd, ofs, len); in mtd_lock()
1090 int mtd_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) in mtd_unlock() argument
1092 if (!mtd->_unlock) in mtd_unlock()
1094 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs) in mtd_unlock()
1098 return mtd->_unlock(mtd, ofs, len); in mtd_unlock()
1102 int mtd_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len) in mtd_is_locked() argument
1104 if (!mtd->_is_locked) in mtd_is_locked()
1106 if (ofs < 0 || ofs >= mtd->size || len > mtd->size - ofs) in mtd_is_locked()
1110 return mtd->_is_locked(mtd, ofs, len); in mtd_is_locked()
1114 int mtd_block_isreserved(struct mtd_info *mtd, loff_t ofs) in mtd_block_isreserved() argument
1116 if (ofs < 0 || ofs >= mtd->size) in mtd_block_isreserved()
1118 if (!mtd->_block_isreserved) in mtd_block_isreserved()
1120 return mtd->_block_isreserved(mtd, ofs); in mtd_block_isreserved()
1124 int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) in mtd_block_isbad() argument
1126 if (ofs < 0 || ofs >= mtd->size) in mtd_block_isbad()
1128 if (!mtd->_block_isbad) in mtd_block_isbad()
1130 return mtd->_block_isbad(mtd, ofs); in mtd_block_isbad()
1134 int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs) in mtd_block_markbad() argument
1136 if (!mtd->_block_markbad) in mtd_block_markbad()
1138 if (ofs < 0 || ofs >= mtd->size) in mtd_block_markbad()
1140 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_block_markbad()
1142 return mtd->_block_markbad(mtd, ofs); in mtd_block_markbad()
1157 static int default_mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, in default_mtd_writev() argument
1167 ret = mtd_write(mtd, to, vecs[i].iov_len, &thislen, in default_mtd_writev()
1189 int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs, in mtd_writev() argument
1193 if (!(mtd->flags & MTD_WRITEABLE)) in mtd_writev()
1195 if (!mtd->_writev) in mtd_writev()
1196 return default_mtd_writev(mtd, vecs, count, to, retlen); in mtd_writev()
1197 return mtd->_writev(mtd, vecs, count, to, retlen); in mtd_writev()
1225 void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size) in mtd_kmalloc_up_to() argument
1228 size_t min_alloc = max_t(size_t, mtd->writesize, PAGE_SIZE); in mtd_kmalloc_up_to()
1239 *size = ALIGN(*size, mtd->writesize); in mtd_kmalloc_up_to()
1257 struct mtd_info *mtd; in mtd_proc_show() local
1261 mtd_for_each_device(mtd) { in mtd_proc_show()
1263 mtd->index, (unsigned long long)mtd->size, in mtd_proc_show()
1264 mtd->erasesize, mtd->name); in mtd_proc_show()