Lines Matching defs:mtd

13  * 	  (see include/linux/mtd/cfi.h for selection)
34 #include <linux/mtd/xip.h>
35 #include <linux/mtd/map.h>
36 #include <linux/mtd/mtd.h>
37 #include <linux/mtd/cfi.h>
69 static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
70 static int cfi_intelext_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
71 static int cfi_intelext_is_locked(struct mtd_info *mtd, loff_t ofs,
95 static int cfi_intelext_point (struct mtd_info *mtd, loff_t from, size_t len,
97 static int cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len);
172 static void fixup_convert_atmel_pri(struct mtd_info *mtd)
174 struct map_info *map = mtd->priv;
212 static void fixup_at49bv640dx_lock(struct mtd_info *mtd)
214 struct map_info *map = mtd->priv;
219 mtd->flags |= MTD_POWERUP_LOCK;
224 static void fixup_intel_strataflash(struct mtd_info *mtd)
226 struct map_info *map = mtd->priv;
237 static void fixup_no_write_suspend(struct mtd_info *mtd)
239 struct map_info *map = mtd->priv;
250 static void fixup_st_m28w320ct(struct mtd_info *mtd)
252 struct map_info *map = mtd->priv;
259 static void fixup_st_m28w320cb(struct mtd_info *mtd)
261 struct map_info *map = mtd->priv;
279 static void fixup_LH28F640BF(struct mtd_info *mtd)
281 struct map_info *map = mtd->priv;
299 static void fixup_use_point(struct mtd_info *mtd)
301 struct map_info *map = mtd->priv;
302 if (!mtd->_point && map_is_linear(map)) {
303 mtd->_point = cfi_intelext_point;
304 mtd->_unpoint = cfi_intelext_unpoint;
308 static void fixup_use_write_buffers(struct mtd_info *mtd)
310 struct map_info *map = mtd->priv;
314 mtd->_write = cfi_intelext_write_buffers;
315 mtd->_writev = cfi_intelext_writev;
322 static void fixup_unlock_powerup_lock(struct mtd_info *mtd)
324 struct map_info *map = mtd->priv;
330 mtd->flags |= MTD_POWERUP_LOCK;
501 struct mtd_info *mtd;
504 mtd = kzalloc(sizeof(*mtd), GFP_KERNEL);
505 if (!mtd)
507 mtd->priv = map;
508 mtd->type = MTD_NORFLASH;
510 /* Fill in the default mtd operations */
511 mtd->_erase = cfi_intelext_erase_varsize;
512 mtd->_read = cfi_intelext_read;
513 mtd->_write = cfi_intelext_write_words;
514 mtd->_sync = cfi_intelext_sync;
515 mtd->_lock = cfi_intelext_lock;
516 mtd->_unlock = cfi_intelext_unlock;
517 mtd->_is_locked = cfi_intelext_is_locked;
518 mtd->_suspend = cfi_intelext_suspend;
519 mtd->_resume = cfi_intelext_resume;
520 mtd->flags = MTD_CAP_NORFLASH;
521 mtd->name = map->name;
522 mtd->writesize = 1;
523 mtd->writebufsize = cfi_interleave(cfi) << cfi->cfiq->MaxBufWriteSize;
525 mtd->reboot_notifier.notifier_call = cfi_intelext_reboot;
538 kfree(mtd);
545 cfi_fixup(mtd, cfi_fixup_table);
558 cfi_fixup(mtd, jedec_fixup_table);
561 cfi_fixup(mtd, fixup_table);
609 return cfi_intelext_setup(mtd);
617 static struct mtd_info *cfi_intelext_setup(struct mtd_info *mtd)
619 struct map_info *map = mtd->priv;
627 mtd->size = devsize * cfi->numchips;
629 mtd->numeraseregions = cfi->cfiq->NumEraseRegions * cfi->numchips;
630 mtd->eraseregions = kcalloc(mtd->numeraseregions,
633 if (!mtd->eraseregions)
641 if (mtd->erasesize < ersize) {
642 mtd->erasesize = ersize;
645 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
646 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
647 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
648 mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap = kmalloc(ernum / 8 + 1, GFP_KERNEL);
649 if (!mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap)
661 for (i=0; i<mtd->numeraseregions;i++){
663 i,(unsigned long long)mtd->eraseregions[i].offset,
664 mtd->eraseregions[i].erasesize,
665 mtd->eraseregions[i].numblocks);
669 mtd->_read_fact_prot_reg = cfi_intelext_read_fact_prot_reg;
670 mtd->_read_user_prot_reg = cfi_intelext_read_user_prot_reg;
671 mtd->_write_user_prot_reg = cfi_intelext_write_user_prot_reg;
672 mtd->_lock_user_prot_reg = cfi_intelext_lock_user_prot_reg;
673 mtd->_get_fact_prot_info = cfi_intelext_get_fact_prot_info;
674 mtd->_get_user_prot_info = cfi_intelext_get_user_prot_info;
679 if (cfi_intelext_partition_fixup(mtd, &cfi) != 0)
683 register_reboot_notifier(&mtd->reboot_notifier);
684 return mtd;
687 if (mtd->eraseregions)
690 kfree(mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap);
691 kfree(mtd->eraseregions);
692 kfree(mtd);
697 static int cfi_intelext_partition_fixup(struct mtd_info *mtd,
700 struct map_info *map = mtd->priv;
757 mtd->writesize = cfi->interleave << prinfo->ProgRegShift;
758 mtd->flags &= ~MTD_BIT_WRITEABLE;
760 map->name, mtd->writesize,
772 if ((1 << partshift) < mtd->erasesize) {
1400 static int cfi_intelext_point(struct mtd_info *mtd, loff_t from, size_t len,
1403 struct map_info *map = mtd->priv;
1453 static int cfi_intelext_unpoint(struct mtd_info *mtd, loff_t from, size_t len)
1455 struct map_info *map = mtd->priv;
1532 static int cfi_intelext_read (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf)
1534 struct map_info *map = mtd->priv;
1644 static int cfi_intelext_write_words (struct mtd_info *mtd, loff_t to , size_t len, size_t *retlen, const u_char *buf)
1646 struct map_info *map = mtd->priv;
1889 static int cfi_intelext_writev (struct mtd_info *mtd, const struct kvec *vecs,
1892 struct map_info *map = mtd->priv;
1941 static int cfi_intelext_write_buffers (struct mtd_info *mtd, loff_t to,
1949 return cfi_intelext_writev(mtd, &vec, 1, to, retlen);
2042 static int cfi_intelext_erase_varsize(struct mtd_info *mtd, struct erase_info *instr)
2044 return cfi_varsize_frob(mtd, do_erase_oneblock, instr->addr,
2048 static void cfi_intelext_sync (struct mtd_info *mtd)
2050 struct map_info *map = mtd->priv;
2181 static int cfi_intelext_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2188 cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2192 ret = cfi_varsize_frob(mtd, do_xxlock_oneblock,
2198 cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2205 static int cfi_intelext_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2212 cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2216 ret = cfi_varsize_frob(mtd, do_xxlock_oneblock,
2222 cfi_varsize_frob(mtd, do_printlockstatus_oneblock,
2229 static int cfi_intelext_is_locked(struct mtd_info *mtd, loff_t ofs,
2232 return cfi_varsize_frob(mtd, do_getlockstatus_oneblock,
2316 static int cfi_intelext_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
2320 struct map_info *map = mtd->priv;
2450 static int cfi_intelext_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
2454 return cfi_intelext_otp_walk(mtd, from, len, retlen,
2458 static int cfi_intelext_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
2462 return cfi_intelext_otp_walk(mtd, from, len, retlen,
2466 static int cfi_intelext_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
2470 return cfi_intelext_otp_walk(mtd, from, len, retlen,
2474 static int cfi_intelext_lock_user_prot_reg(struct mtd_info *mtd,
2478 return cfi_intelext_otp_walk(mtd, from, len, &retlen,
2482 static int cfi_intelext_get_fact_prot_info(struct mtd_info *mtd, size_t len,
2486 return cfi_intelext_otp_walk(mtd, 0, len, retlen, (u_char *)buf,
2490 static int cfi_intelext_get_user_prot_info(struct mtd_info *mtd, size_t len,
2493 return cfi_intelext_otp_walk(mtd, 0, len, retlen, (u_char *)buf,
2499 static void cfi_intelext_save_locks(struct mtd_info *mtd)
2506 for (i = 0; i < mtd->numeraseregions; i++) {
2507 region = &mtd->eraseregions[i];
2515 status = cfi_varsize_frob(mtd,
2525 static int cfi_intelext_suspend(struct mtd_info *mtd)
2527 struct map_info *map = mtd->priv;
2534 if ((mtd->flags & MTD_POWERUP_LOCK)
2536 cfi_intelext_save_locks(mtd);
2600 static void cfi_intelext_restore_locks(struct mtd_info *mtd)
2607 for (i = 0; i < mtd->numeraseregions; i++) {
2608 region = &mtd->eraseregions[i];
2615 cfi_intelext_unlock(mtd, adr, len);
2620 static void cfi_intelext_resume(struct mtd_info *mtd)
2622 struct map_info *map = mtd->priv;
2637 fixup_LH28F640BF(mtd);
2646 if ((mtd->flags & MTD_POWERUP_LOCK)
2648 cfi_intelext_restore_locks(mtd);
2651 static int cfi_intelext_reset(struct mtd_info *mtd)
2653 struct map_info *map = mtd->priv;
2679 struct mtd_info *mtd;
2681 mtd = container_of(nb, struct mtd_info, reboot_notifier);
2682 cfi_intelext_reset(mtd);
2686 static void cfi_intelext_destroy(struct mtd_info *mtd)
2688 struct map_info *map = mtd->priv;
2692 cfi_intelext_reset(mtd);
2693 unregister_reboot_notifier(&mtd->reboot_notifier);
2698 for (i = 0; i < mtd->numeraseregions; i++) {
2699 region = &mtd->eraseregions[i];
2702 kfree(mtd->eraseregions);