Lines Matching full:mtd

27 #include <linux/mtd/mtd.h>
28 #include <linux/mtd/rawnand.h>
29 #include <linux/mtd/partitions.h>
197 static inline u32 vf610_nfc_read(struct mtd_info *mtd, uint reg) in vf610_nfc_read() argument
199 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_read()
204 static inline void vf610_nfc_write(struct mtd_info *mtd, uint reg, u32 val) in vf610_nfc_write() argument
206 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_write()
211 static inline void vf610_nfc_set(struct mtd_info *mtd, uint reg, u32 bits) in vf610_nfc_set() argument
213 vf610_nfc_write(mtd, reg, vf610_nfc_read(mtd, reg) | bits); in vf610_nfc_set()
216 static inline void vf610_nfc_clear(struct mtd_info *mtd, uint reg, u32 bits) in vf610_nfc_clear() argument
218 vf610_nfc_write(mtd, reg, vf610_nfc_read(mtd, reg) & ~bits); in vf610_nfc_clear()
221 static inline void vf610_nfc_set_field(struct mtd_info *mtd, u32 reg, in vf610_nfc_set_field() argument
224 vf610_nfc_write(mtd, reg, in vf610_nfc_set_field()
225 (vf610_nfc_read(mtd, reg) & (~mask)) | val << shift); in vf610_nfc_set_field()
251 static void vf610_nfc_done(struct mtd_info *mtd) in vf610_nfc_done() argument
253 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_done()
263 vf610_nfc_set(mtd, NFC_FLASH_CMD2, START_BIT); in vf610_nfc_done()
267 while (!(vf610_nfc_read(mtd, NFC_IRQ_STATUS) & IDLE_IRQ_BIT)) { in vf610_nfc_done()
276 static u8 vf610_nfc_get_id(struct mtd_info *mtd, int col) in vf610_nfc_get_id() argument
281 flash_id = vf610_nfc_read(mtd, NFC_FLASH_STATUS1); in vf610_nfc_get_id()
284 flash_id = vf610_nfc_read(mtd, NFC_FLASH_STATUS2); in vf610_nfc_get_id()
291 static u8 vf610_nfc_get_status(struct mtd_info *mtd) in vf610_nfc_get_status() argument
293 return vf610_nfc_read(mtd, NFC_FLASH_STATUS2) & STATUS_BYTE1_MASK; in vf610_nfc_get_status()
325 static void vf610_nfc_addr_cycle(struct mtd_info *mtd, int column, int page) in vf610_nfc_addr_cycle() argument
328 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_addr_cycle()
331 vf610_nfc_set_field(mtd, NFC_COL_ADDR, COL_ADDR_MASK, in vf610_nfc_addr_cycle()
335 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK, in vf610_nfc_addr_cycle()
339 static inline void vf610_nfc_ecc_mode(struct mtd_info *mtd, int ecc_mode) in vf610_nfc_ecc_mode() argument
341 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG, in vf610_nfc_ecc_mode()
352 static void vf610_nfc_command(struct mtd_info *mtd, unsigned command, in vf610_nfc_command() argument
355 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_command()
364 vf610_nfc_addr_cycle(mtd, column, page); in vf610_nfc_command()
374 vf610_nfc_ecc_mode(mtd, ECC_HW_MODE); in vf610_nfc_command()
386 trfr_sz += mtd->oobsize; in vf610_nfc_command()
387 column = mtd->writesize; in vf610_nfc_command()
391 vf610_nfc_addr_cycle(mtd, column, page); in vf610_nfc_command()
392 vf610_nfc_ecc_mode(mtd, ECC_BYPASS); in vf610_nfc_command()
396 trfr_sz += mtd->writesize + mtd->oobsize; in vf610_nfc_command()
398 vf610_nfc_ecc_mode(mtd, ECC_HW_MODE); in vf610_nfc_command()
401 vf610_nfc_addr_cycle(mtd, column, page); in vf610_nfc_command()
410 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK, in vf610_nfc_command()
412 vf610_nfc_ecc_mode(mtd, ECC_BYPASS); in vf610_nfc_command()
419 vf610_nfc_addr_cycle(mtd, column, page); in vf610_nfc_command()
427 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK, in vf610_nfc_command()
440 vf610_nfc_done(mtd); in vf610_nfc_command()
446 static void vf610_nfc_read_buf(struct mtd_info *mtd, u_char *buf, int len) in vf610_nfc_read_buf() argument
448 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_read_buf()
461 static void vf610_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf, in vf610_nfc_write_buf() argument
464 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_write_buf()
468 l = min_t(uint, len, mtd->writesize + mtd->oobsize - c); in vf610_nfc_write_buf()
476 static uint8_t vf610_nfc_read_byte(struct mtd_info *mtd) in vf610_nfc_read_byte() argument
478 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_read_byte()
484 tmp = vf610_nfc_get_id(mtd, c); in vf610_nfc_read_byte()
487 tmp = vf610_nfc_get_status(mtd); in vf610_nfc_read_byte()
504 static u16 vf610_nfc_read_word(struct mtd_info *mtd) in vf610_nfc_read_word() argument
508 vf610_nfc_read_buf(mtd, (u_char *)&tmp, sizeof(tmp)); in vf610_nfc_read_word()
513 static int vf610_nfc_dev_ready(struct mtd_info *mtd) in vf610_nfc_dev_ready() argument
522 static void vf610_nfc_select_chip(struct mtd_info *mtd, int chip) in vf610_nfc_select_chip() argument
525 u32 tmp = vf610_nfc_read(mtd, NFC_ROW_ADDR); in vf610_nfc_select_chip()
533 vf610_nfc_write(mtd, NFC_ROW_ADDR, tmp); in vf610_nfc_select_chip()
552 static inline int vf610_nfc_correct_data(struct mtd_info *mtd, uint8_t *dat, in vf610_nfc_correct_data() argument
555 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_correct_data()
562 ecc_status = vf610_nfc_read(mtd, ecc_status_off) & 0xff; in vf610_nfc_correct_data()
569 vf610_nfc_command(mtd, NAND_CMD_READOOB, 0, page); in vf610_nfc_correct_data()
570 vf610_nfc_read_buf(mtd, oob, mtd->oobsize); in vf610_nfc_correct_data()
577 flips += count_written_bits(oob, mtd->oobsize, flips_threshold); in vf610_nfc_correct_data()
584 memset(oob, 0xff, mtd->oobsize); in vf610_nfc_correct_data()
588 static int vf610_nfc_read_page(struct mtd_info *mtd, struct nand_chip *chip, in vf610_nfc_read_page() argument
594 vf610_nfc_read_buf(mtd, buf, eccsize); in vf610_nfc_read_page()
596 vf610_nfc_read_buf(mtd, chip->oob_poi, mtd->oobsize); in vf610_nfc_read_page()
598 stat = vf610_nfc_correct_data(mtd, buf, chip->oob_poi, page); in vf610_nfc_read_page()
601 mtd->ecc_stats.failed++; in vf610_nfc_read_page()
604 mtd->ecc_stats.corrected += stat; in vf610_nfc_read_page()
612 static int vf610_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip, in vf610_nfc_write_page() argument
615 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_write_page()
617 vf610_nfc_write_buf(mtd, buf, mtd->writesize); in vf610_nfc_write_page()
619 vf610_nfc_write_buf(mtd, chip->oob_poi, mtd->oobsize); in vf610_nfc_write_page()
622 nfc->write_sz = mtd->writesize + mtd->oobsize; in vf610_nfc_write_page()
635 struct mtd_info *mtd; in vf610_nfc_nand_init() local
658 mtd = nand_to_mtd(chip); in vf610_nfc_nand_init()
677 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT); in vf610_nfc_nand_init()
678 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_ADDR_AUTO_INCR_BIT); in vf610_nfc_nand_init()
679 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_BUFNO_AUTO_INCR_BIT); in vf610_nfc_nand_init()
680 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_BOOT_MODE_BIT); in vf610_nfc_nand_init()
681 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_DMA_REQ_BIT); in vf610_nfc_nand_init()
682 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_FAST_FLASH_BIT); in vf610_nfc_nand_init()
685 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG, CONFIG_PAGE_CNT_MASK, in vf610_nfc_nand_init()
689 if (nand_scan_ident(mtd, CONFIG_SYS_MAX_NAND_DEVICE, NULL)) { in vf610_nfc_nand_init()
695 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT); in vf610_nfc_nand_init()
703 if (mtd->writesize + mtd->oobsize > PAGE_2K + OOB_MAX - 8) { in vf610_nfc_nand_init()
710 if (mtd->writesize != PAGE_2K && mtd->oobsize < 64) { in vf610_nfc_nand_init()
716 if (chip->ecc.size != mtd->writesize) { in vf610_nfc_nand_init()
724 if (mtd->oobsize > 64) in vf610_nfc_nand_init()
725 mtd->oobsize = 64; in vf610_nfc_nand_init()
728 mtd->ecclayout = chip->ecc.layout; in vf610_nfc_nand_init()
744 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG, in vf610_nfc_nand_init()
750 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_ECC_SRAM_REQ_BIT); in vf610_nfc_nand_init()
754 err = nand_scan_tail(mtd); in vf610_nfc_nand_init()
758 err = nand_register(devnum, mtd); in vf610_nfc_nand_init()