Lines Matching defs:mtd

12  * 	  (see include/linux/mtd/cfi.h for selection)
33 #include <linux/mtd/xip.h>
34 #include <linux/mtd/map.h>
35 #include <linux/mtd/mtd.h>
36 #include <linux/mtd/cfi.h>
68 static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
69 static int cfi_intelext_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
70 static int cfi_intelext_is_locked(struct mtd_info *mtd, loff_t ofs,
93 static int cfi_intelext_point (struct mtd_info *mtd, loff_t from, size_t len,
95 static int cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len);
170 static void fixup_convert_atmel_pri(struct mtd_info *mtd)
172 struct map_info *map = mtd->priv;
210 static void fixup_at49bv640dx_lock(struct mtd_info *mtd)
212 struct map_info *map = mtd->priv;
217 mtd->flags |= MTD_POWERUP_LOCK;
222 static void fixup_intel_strataflash(struct mtd_info *mtd)
224 struct map_info *map = mtd->priv;
235 static void fixup_no_write_suspend(struct mtd_info *mtd)
237 struct map_info *map = mtd->priv;
248 static void fixup_st_m28w320ct(struct mtd_info *mtd)
250 struct map_info *map = mtd->priv;
257 static void fixup_st_m28w320cb(struct mtd_info *mtd)
259 struct map_info *map = mtd->priv;
277 static void fixup_LH28F640BF(struct mtd_info *mtd)
279 struct map_info *map = mtd->priv;
297 static void fixup_use_point(struct mtd_info *mtd)
299 struct map_info *map = mtd->priv;
300 if (!mtd->_point && map_is_linear(map)) {
301 mtd->_point = cfi_intelext_point;
302 mtd->_unpoint = cfi_intelext_unpoint;
306 static void fixup_use_write_buffers(struct mtd_info *mtd)
308 struct map_info *map = mtd->priv;
312 mtd->_write = cfi_intelext_write_buffers;
313 mtd->_writev = cfi_intelext_writev;
320 static void fixup_unlock_powerup_lock(struct mtd_info *mtd)
322 struct map_info *map = mtd->priv;
328 mtd->flags |= MTD_POWERUP_LOCK;
499 struct mtd_info *mtd;
502 mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
503 if (!mtd)
505 mtd->priv = map;
506 mtd->type = MTD_NORFLASH;
508 /* Fill in the default mtd operations */
509 mtd->_erase = cfi_intelext_erase_varsize;
510 mtd->_read = cfi_intelext_read;
511 mtd->_write = cfi_intelext_write_words;
512 mtd->_sync = cfi_intelext_sync;
513 mtd->_lock = cfi_intelext_lock;
514 mtd->_unlock = cfi_intelext_unlock;
515 mtd->_is_locked = cfi_intelext_is_locked;
516 mtd->_suspend = cfi_intelext_suspend;
517 mtd->_resume = cfi_intelext_resume;
518 mtd->flags = MTD_CAP_NORFLASH;
519 mtd->name = map->name;
520 mtd->writesize = 1;
521 mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
523 mtd->reboot_notifier.notifier_call = cfi_intelext_reboot;
536 kfree(mtd);
543 cfi_fixup(mtd, cfi_fixup_table);
556 cfi_fixup(mtd, jedec_fixup_table);
559 cfi_fixup(mtd, fixup_table);
607 return cfi_intelext_setup(mtd);
615 static struct mtd_info *cfi_intelext_setup(struct mtd_info *mtd)
617 struct map_info *map = mtd->priv;
625 mtd->size = devsize * cfi->numchips;
627 mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
628 mtd->eraseregions = kcalloc(mtd->numeraseregions,
631 if (!mtd->eraseregions)
639 if (mtd->erasesize < ersize) {
640 mtd->erasesize = ersize;
643 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
644 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
645 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
646 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap = kmalloc(ernum / 8 + 1, GFP_KERNEL);
647 if (!mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap)
659 for (i=0; i<mtd->numeraseregions;i++){
661 i,(unsigned long long)mtd->eraseregions[i].offset,
662 mtd->eraseregions[i].erasesize,
663 mtd->eraseregions[i].numblocks);
667 mtd->_read_fact_prot_reg = cfi_intelext_read_fact_prot_reg;
668 mtd->_read_user_prot_reg = cfi_intelext_read_user_prot_reg;
669 mtd->_write_user_prot_reg = cfi_intelext_write_user_prot_reg;
670 mtd->_lock_user_prot_reg = cfi_intelext_lock_user_prot_reg;
671 mtd->_get_fact_prot_info = cfi_intelext_get_fact_prot_info;
672 mtd->_get_user_prot_info = cfi_intelext_get_user_prot_info;
677 if (cfi_intelext_partition_fixup(mtd, &cfi) != 0)
681 register_reboot_notifier(&mtd->reboot_notifier);
682 return mtd;
685 if (mtd->eraseregions)
688 kfree(mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap);
689 kfree(mtd->eraseregions);
690 kfree(mtd);
695 static int cfi_intelext_partition_fixup(struct mtd_info *mtd,
698 struct map_info *map = mtd->priv;
755 mtd->writesize = cfi->interleave << prinfo->ProgRegShift;
756 mtd->flags &= ~MTD_BIT_WRITEABLE;
758 map->name, mtd->writesize,
770 if ((1 << partshift) < mtd->erasesize) {
1398 static int cfi_intelext_point(struct mtd_info *mtd, loff_t from, size_t len,
1401 struct map_info *map = mtd->priv;
1451 static int cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
1453 struct map_info *map = mtd->priv;
1530 static int cfi_intelext_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
1532 struct map_info *map = mtd->priv;
1642 static int cfi_intelext_write_words (struct mtd_info *mtd, loff_t to , size_t len, size_t *retlen, const u_char *buf)
1644 struct map_info *map = mtd->priv;
1887 static int cfi_intelext_writev (struct mtd_info *mtd, const struct kvec *vecs,
1890 struct map_info *map = mtd->priv;
1939 static int cfi_intelext_write_buffers (struct mtd_info *mtd, loff_t to,
1947 return cfi_intelext_writev(mtd, &vec, 1, to, retlen);
2040 static int cfi_intelext_erase_varsize(struct mtd_info *mtd, struct erase_info *instr)
2042 return cfi_varsize_frob(mtd, do_erase_oneblock, instr->addr,
2046 static void cfi_intelext_sync (struct mtd_info *mtd)
2048 struct map_info *map = mtd->priv;
2179 static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2186 cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2190 ret = cfi_varsize_frob(mtd, do_xxlock_oneblock,
2196 cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2203 static int cfi_intelext_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2210 cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2214 ret = cfi_varsize_frob(mtd, do_xxlock_oneblock,
2220 cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2227 static int cfi_intelext_is_locked(struct mtd_info *mtd, loff_t ofs,
2230 return cfi_varsize_frob(mtd, do_getlockstatus_oneblock,
2314 static int cfi_intelext_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
2318 struct map_info *map = mtd->priv;
2448 static int cfi_intelext_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
2452 return cfi_intelext_otp_walk(mtd, from, len, retlen,
2456 static int cfi_intelext_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
2460 return cfi_intelext_otp_walk(mtd, from, len, retlen,
2464 static int cfi_intelext_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
2468 return cfi_intelext_otp_walk(mtd, from, len, retlen,
2472 static int cfi_intelext_lock_user_prot_reg(struct mtd_info *mtd,
2476 return cfi_intelext_otp_walk(mtd, from, len, &retlen,
2480 static int cfi_intelext_get_fact_prot_info(struct mtd_info *mtd, size_t len,
2484 return cfi_intelext_otp_walk(mtd, 0, len, retlen, (u_char *)buf,
2488 static int cfi_intelext_get_user_prot_info(struct mtd_info *mtd, size_t len,
2491 return cfi_intelext_otp_walk(mtd, 0, len, retlen, (u_char *)buf,
2497 static void cfi_intelext_save_locks(struct mtd_info *mtd)
2504 for (i = 0; i < mtd->numeraseregions; i++) {
2505 region = &mtd->eraseregions[i];
2513 status = cfi_varsize_frob(mtd,
2523 static int cfi_intelext_suspend(struct mtd_info *mtd)
2525 struct map_info *map = mtd->priv;
2532 if ((mtd->flags & MTD_POWERUP_LOCK)
2534 cfi_intelext_save_locks(mtd);
2597 static void cfi_intelext_restore_locks(struct mtd_info *mtd)
2604 for (i = 0; i < mtd->numeraseregions; i++) {
2605 region = &mtd->eraseregions[i];
2612 cfi_intelext_unlock(mtd, adr, len);
2617 static void cfi_intelext_resume(struct mtd_info *mtd)
2619 struct map_info *map = mtd->priv;
2634 fixup_LH28F640BF(mtd);
2643 if ((mtd->flags & MTD_POWERUP_LOCK)
2645 cfi_intelext_restore_locks(mtd);
2648 static int cfi_intelext_reset(struct mtd_info *mtd)
2650 struct map_info *map = mtd->priv;
2676 struct mtd_info *mtd;
2678 mtd = container_of(nb, struct mtd_info, reboot_notifier);
2679 cfi_intelext_reset(mtd);
2683 static void cfi_intelext_destroy(struct mtd_info *mtd)
2685 struct map_info *map = mtd->priv;
2689 cfi_intelext_reset(mtd);
2690 unregister_reboot_notifier(&mtd->reboot_notifier);
2695 for (i = 0; i < mtd->numeraseregions; i++) {
2696 region = &mtd->eraseregions[i];
2699 kfree(mtd->eraseregions);