Lines Matching full:mtd

2  * drivers/mtd/nand/raw/nand_util.c
9 * @references: borrowed heavily from Linux mtd-utils code:
15 * Artem Bityutskiy <dedekind1@gmail.com> from mtd-utils
30 #include <linux/mtd/mtd.h>
45 * @param mtd nand mtd instance to erase
49 * This code is ported from flash_eraseall.c from Linux mtd utils by
52 int nand_erase_opts(struct mtd_info *mtd, in nand_erase_opts() argument
60 const char *mtd_device = mtd->name; in nand_erase_opts()
62 struct nand_chip *chip = mtd_to_nand(mtd); in nand_erase_opts()
64 if ((opts->offset & (mtd->erasesize - 1)) != 0) { in nand_erase_opts()
72 erase.mtd = mtd; in nand_erase_opts()
73 erase.len = mtd->erasesize; in nand_erase_opts()
75 erase_length = lldiv(opts->length + mtd->erasesize - 1, in nand_erase_opts()
76 mtd->erasesize); in nand_erase_opts()
101 erase.addr += mtd->erasesize) { in nand_erase_opts()
110 int ret = mtd_block_isbad(mtd, erase.addr); in nand_erase_opts()
124 printf("\n%s: MTD get bad block failed: %d\n", in nand_erase_opts()
133 result = mtd_erase(mtd, &erase); in nand_erase_opts()
135 printf("\n%s: MTD Erase failure: %d\n", in nand_erase_opts()
149 result = mtd_write_oob(mtd, erase.addr, &ops); in nand_erase_opts()
151 printf("\n%s: MTD writeoob failure: %d\n", in nand_erase_opts()
199 * @param mtd nand mtd instance
207 * - Lock all pages of the chip using nand_lock(mtd, 0) (or the lockpre pin)
209 * - If desired: Bring the chip to the lock-tight state using nand_lock(mtd, 1)
216 int nand_lock(struct mtd_info *mtd, int tight) in nand_lock() argument
220 struct nand_chip *chip = mtd_to_nand(mtd); in nand_lock()
223 chip->select_chip(mtd, 0); in nand_lock()
226 chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, 0); in nand_lock()
227 if (chip->read_byte(mtd) & NAND_LOCK_STATUS_TIGHT) { in nand_lock()
233 chip->cmdfunc(mtd, in nand_lock()
238 status = chip->waitfunc(mtd, chip); in nand_lock()
247 chip->select_chip(mtd, -1); in nand_lock()
255 * @param mtd nand mtd instance
265 int nand_get_lock_status(struct mtd_info *mtd, loff_t offset) in nand_get_lock_status() argument
270 struct nand_chip *chip = mtd_to_nand(mtd); in nand_get_lock_status()
274 chip->select_chip(mtd, chipnr); in nand_get_lock_status()
277 if ((offset & (mtd->writesize - 1)) != 0) { in nand_get_lock_status()
287 chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, page & chip->pagemask); in nand_get_lock_status()
289 ret = chip->read_byte(mtd) & (NAND_LOCK_STATUS_TIGHT in nand_get_lock_status()
294 chip->select_chip(mtd, -1); in nand_get_lock_status()
302 * @param mtd nand mtd instance
305 * page size mtd->writesize)
310 int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length, in nand_unlock() argument
317 struct nand_chip *chip = mtd_to_nand(mtd); in nand_unlock()
324 chip->select_chip(mtd, chipnr); in nand_unlock()
327 chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1); in nand_unlock()
328 if (!(chip->read_byte(mtd) & NAND_STATUS_WP)) { in nand_unlock()
336 chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, page & chip->pagemask); in nand_unlock()
337 if (chip->read_byte(mtd) & NAND_LOCK_STATUS_TIGHT) { in nand_unlock()
343 if ((start & (mtd->erasesize - 1)) != 0) { in nand_unlock()
350 if (length == 0 || (length & (mtd->erasesize - 1)) != 0) { in nand_unlock()
352 "size %08x!\n", mtd->erasesize); in nand_unlock()
361 length -= mtd->erasesize; in nand_unlock()
364 chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask); in nand_unlock()
377 chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1, page & chip->pagemask); in nand_unlock()
380 status = chip->waitfunc(mtd, chip); in nand_unlock()
390 chip->select_chip(mtd, -1); in nand_unlock()
401 * @param mtd nand mtd instance
409 static int check_skip_len(struct mtd_info *mtd, loff_t offset, size_t length, in check_skip_len() argument
419 if (offset >= mtd->size) in check_skip_len()
422 block_start = offset & ~(loff_t)(mtd->erasesize - 1); in check_skip_len()
423 block_off = offset & (mtd->erasesize - 1); in check_skip_len()
424 block_len = mtd->erasesize - block_off; in check_skip_len()
426 if (!nand_block_isbad(mtd, block_start)) in check_skip_len()
443 static size_t drop_ffs(const struct mtd_info *mtd, const u_char *buf, in drop_ffs() argument
455 l = (l + mtd->writesize - 1) / mtd->writesize; in drop_ffs()
456 l *= mtd->writesize; in drop_ffs()
473 * @param mtd nand mtd instance
474 * @param ops MTD operations, including data to verify
478 int nand_verify_page_oob(struct mtd_info *mtd, struct mtd_oob_ops *ops, in nand_verify_page_oob() argument
483 size_t verlen = mtd->writesize + mtd->oobsize; in nand_verify_page_oob()
492 vops.oobbuf = vops.datbuf + mtd->writesize; in nand_verify_page_oob()
494 rval = mtd_read_oob(mtd, ofs, &vops); in nand_verify_page_oob()
513 * @param mtd nand mtd instance
519 int nand_verify(struct mtd_info *mtd, loff_t ofs, size_t len, u_char *buf) in nand_verify() argument
523 size_t verlen = mtd->writesize; in nand_verify()
532 verlen = min(mtd->writesize, (uint32_t)(ofs + len - verofs)); in nand_verify()
533 rval = nand_read(mtd, verofs, &verlen, verbuf); in nand_verify()
561 * @param mtd nand mtd instance
572 int nand_write_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length, in nand_write_skip_bad() argument
584 blocksize = mtd->erasesize; in nand_write_skip_bad()
597 if ((offset & (mtd->writesize - 1)) != 0) { in nand_write_skip_bad()
603 need_skip = check_skip_len(mtd, offset, *length, &used_for_write); in nand_write_skip_bad()
621 rval = nand_write(mtd, offset, length, buffer); in nand_write_skip_bad()
624 rval = nand_verify(mtd, offset, *length, buffer); in nand_write_skip_bad()
636 size_t block_offset = offset & (mtd->erasesize - 1); in nand_write_skip_bad()
641 if (nand_block_isbad(mtd, offset & ~(mtd->erasesize - 1))) { in nand_write_skip_bad()
643 offset & ~(mtd->erasesize - 1)); in nand_write_skip_bad()
644 offset += mtd->erasesize - block_offset; in nand_write_skip_bad()
656 truncated_write_size = drop_ffs(mtd, p_buffer, in nand_write_skip_bad()
660 rval = nand_write(mtd, offset, &truncated_write_size, in nand_write_skip_bad()
664 rval = nand_verify(mtd, offset, in nand_write_skip_bad()
696 * @param mtd nand mtd instance
706 int nand_read_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length, in nand_read_skip_bad() argument
715 need_skip = check_skip_len(mtd, offset, *length, &used_for_read); in nand_read_skip_bad()
733 rval = nand_read(mtd, offset, length, buffer); in nand_read_skip_bad()
744 size_t block_offset = offset & (mtd->erasesize - 1); in nand_read_skip_bad()
749 if (nand_block_isbad(mtd, offset & ~(mtd->erasesize - 1))) { in nand_read_skip_bad()
751 offset & ~(mtd->erasesize - 1)); in nand_read_skip_bad()
752 offset += mtd->erasesize - block_offset; in nand_read_skip_bad()
756 if (left_to_read < (mtd->erasesize - block_offset)) in nand_read_skip_bad()
759 read_length = mtd->erasesize - block_offset; in nand_read_skip_bad()
761 rval = nand_read(mtd, offset, &read_length, p_buffer); in nand_read_skip_bad()
807 * @param mtd nand mtd instance
811 int nand_torture(struct mtd_info *mtd, loff_t offset) in nand_torture() argument
815 .mtd = mtd, in nand_torture()
817 .len = mtd->erasesize, in nand_torture()
823 if ((offset & (mtd->erasesize - 1)) != 0) { in nand_torture()
828 if (offset + mtd->erasesize > mtd->size) { in nand_torture()
835 buf = malloc_cache_aligned(mtd->erasesize); in nand_torture()
842 err = mtd_erase(mtd, &instr); in nand_torture()
845 mtd->name, instr.addr, err); in nand_torture()
850 err = mtd_read(mtd, offset, mtd->erasesize, &retlen, buf); in nand_torture()
851 if ((err && err != -EUCLEAN) || retlen != mtd->erasesize) { in nand_torture()
853 mtd->name, instr.addr, err); in nand_torture()
857 err = check_pattern(buf, 0xff, mtd->erasesize); in nand_torture()
866 memset(buf, patterns[i], mtd->erasesize); in nand_torture()
867 err = mtd_write(mtd, offset, mtd->erasesize, &retlen, buf); in nand_torture()
868 if (err || retlen != mtd->erasesize) { in nand_torture()
870 mtd->name, instr.addr, err); in nand_torture()
874 err = mtd_read(mtd, offset, mtd->erasesize, &retlen, buf); in nand_torture()
875 if ((err && err != -EUCLEAN) || retlen != mtd->erasesize) { in nand_torture()
877 mtd->name, instr.addr, err); in nand_torture()
881 err = check_pattern(buf, patterns[i], mtd->erasesize); in nand_torture()