Lines Matching full:mtd
28 #include <linux/mtd/mtd.h>
29 #include <linux/mtd/rawnand.h>
30 #include <linux/mtd/partitions.h>
198 static inline u32 vf610_nfc_read(struct mtd_info *mtd, uint reg) in vf610_nfc_read() argument
200 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_read()
205 static inline void vf610_nfc_write(struct mtd_info *mtd, uint reg, u32 val) in vf610_nfc_write() argument
207 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_write()
212 static inline void vf610_nfc_set(struct mtd_info *mtd, uint reg, u32 bits) in vf610_nfc_set() argument
214 vf610_nfc_write(mtd, reg, vf610_nfc_read(mtd, reg) | bits); in vf610_nfc_set()
217 static inline void vf610_nfc_clear(struct mtd_info *mtd, uint reg, u32 bits) in vf610_nfc_clear() argument
219 vf610_nfc_write(mtd, reg, vf610_nfc_read(mtd, reg) & ~bits); in vf610_nfc_clear()
222 static inline void vf610_nfc_set_field(struct mtd_info *mtd, u32 reg, in vf610_nfc_set_field() argument
225 vf610_nfc_write(mtd, reg, in vf610_nfc_set_field()
226 (vf610_nfc_read(mtd, reg) & (~mask)) | val << shift); in vf610_nfc_set_field()
252 static void vf610_nfc_done(struct mtd_info *mtd) in vf610_nfc_done() argument
254 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_done()
264 vf610_nfc_set(mtd, NFC_FLASH_CMD2, START_BIT); in vf610_nfc_done()
268 while (!(vf610_nfc_read(mtd, NFC_IRQ_STATUS) & IDLE_IRQ_BIT)) { in vf610_nfc_done()
277 static u8 vf610_nfc_get_id(struct mtd_info *mtd, int col) in vf610_nfc_get_id() argument
282 flash_id = vf610_nfc_read(mtd, NFC_FLASH_STATUS1); in vf610_nfc_get_id()
285 flash_id = vf610_nfc_read(mtd, NFC_FLASH_STATUS2); in vf610_nfc_get_id()
292 static u8 vf610_nfc_get_status(struct mtd_info *mtd) in vf610_nfc_get_status() argument
294 return vf610_nfc_read(mtd, NFC_FLASH_STATUS2) & STATUS_BYTE1_MASK; in vf610_nfc_get_status()
326 static void vf610_nfc_addr_cycle(struct mtd_info *mtd, int column, int page) in vf610_nfc_addr_cycle() argument
329 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_addr_cycle()
332 vf610_nfc_set_field(mtd, NFC_COL_ADDR, COL_ADDR_MASK, in vf610_nfc_addr_cycle()
336 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK, in vf610_nfc_addr_cycle()
340 static inline void vf610_nfc_ecc_mode(struct mtd_info *mtd, int ecc_mode) in vf610_nfc_ecc_mode() argument
342 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG, in vf610_nfc_ecc_mode()
353 static void vf610_nfc_command(struct mtd_info *mtd, unsigned command, in vf610_nfc_command() argument
356 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_command()
365 vf610_nfc_addr_cycle(mtd, column, page); in vf610_nfc_command()
375 vf610_nfc_ecc_mode(mtd, ECC_HW_MODE); in vf610_nfc_command()
387 trfr_sz += mtd->oobsize; in vf610_nfc_command()
388 column = mtd->writesize; in vf610_nfc_command()
392 vf610_nfc_addr_cycle(mtd, column, page); in vf610_nfc_command()
393 vf610_nfc_ecc_mode(mtd, ECC_BYPASS); in vf610_nfc_command()
397 trfr_sz += mtd->writesize + mtd->oobsize; in vf610_nfc_command()
399 vf610_nfc_ecc_mode(mtd, ECC_HW_MODE); in vf610_nfc_command()
402 vf610_nfc_addr_cycle(mtd, column, page); in vf610_nfc_command()
411 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK, in vf610_nfc_command()
413 vf610_nfc_ecc_mode(mtd, ECC_BYPASS); in vf610_nfc_command()
420 vf610_nfc_addr_cycle(mtd, column, page); in vf610_nfc_command()
428 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK, in vf610_nfc_command()
441 vf610_nfc_done(mtd); in vf610_nfc_command()
447 static void vf610_nfc_read_buf(struct mtd_info *mtd, u_char *buf, int len) in vf610_nfc_read_buf() argument
449 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_read_buf()
462 static void vf610_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf, in vf610_nfc_write_buf() argument
465 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_write_buf()
469 l = min_t(uint, len, mtd->writesize + mtd->oobsize - c); in vf610_nfc_write_buf()
477 static uint8_t vf610_nfc_read_byte(struct mtd_info *mtd) in vf610_nfc_read_byte() argument
479 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_read_byte()
485 tmp = vf610_nfc_get_id(mtd, c); in vf610_nfc_read_byte()
488 tmp = vf610_nfc_get_status(mtd); in vf610_nfc_read_byte()
505 static u16 vf610_nfc_read_word(struct mtd_info *mtd) in vf610_nfc_read_word() argument
509 vf610_nfc_read_buf(mtd, (u_char *)&tmp, sizeof(tmp)); in vf610_nfc_read_word()
514 static int vf610_nfc_dev_ready(struct mtd_info *mtd) in vf610_nfc_dev_ready() argument
523 static void vf610_nfc_select_chip(struct mtd_info *mtd, int chip) in vf610_nfc_select_chip() argument
526 u32 tmp = vf610_nfc_read(mtd, NFC_ROW_ADDR); in vf610_nfc_select_chip()
534 vf610_nfc_write(mtd, NFC_ROW_ADDR, tmp); in vf610_nfc_select_chip()
553 static inline int vf610_nfc_correct_data(struct mtd_info *mtd, uint8_t *dat, in vf610_nfc_correct_data() argument
556 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_correct_data()
563 ecc_status = vf610_nfc_read(mtd, ecc_status_off) & 0xff; in vf610_nfc_correct_data()
570 vf610_nfc_command(mtd, NAND_CMD_READOOB, 0, page); in vf610_nfc_correct_data()
571 vf610_nfc_read_buf(mtd, oob, mtd->oobsize); in vf610_nfc_correct_data()
578 flips += count_written_bits(oob, mtd->oobsize, flips_threshold); in vf610_nfc_correct_data()
585 memset(oob, 0xff, mtd->oobsize); in vf610_nfc_correct_data()
589 static int vf610_nfc_read_page(struct mtd_info *mtd, struct nand_chip *chip, in vf610_nfc_read_page() argument
595 vf610_nfc_read_buf(mtd, buf, eccsize); in vf610_nfc_read_page()
597 vf610_nfc_read_buf(mtd, chip->oob_poi, mtd->oobsize); in vf610_nfc_read_page()
599 stat = vf610_nfc_correct_data(mtd, buf, chip->oob_poi, page); in vf610_nfc_read_page()
602 mtd->ecc_stats.failed++; in vf610_nfc_read_page()
605 mtd->ecc_stats.corrected += stat; in vf610_nfc_read_page()
613 static int vf610_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip, in vf610_nfc_write_page() argument
616 struct vf610_nfc *nfc = mtd_to_nfc(mtd); in vf610_nfc_write_page()
618 vf610_nfc_write_buf(mtd, buf, mtd->writesize); in vf610_nfc_write_page()
620 vf610_nfc_write_buf(mtd, chip->oob_poi, mtd->oobsize); in vf610_nfc_write_page()
623 nfc->write_sz = mtd->writesize + mtd->oobsize; in vf610_nfc_write_page()
636 struct mtd_info *mtd; in vf610_nfc_nand_init() local
659 mtd = nand_to_mtd(chip); in vf610_nfc_nand_init()
678 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT); in vf610_nfc_nand_init()
679 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_ADDR_AUTO_INCR_BIT); in vf610_nfc_nand_init()
680 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_BUFNO_AUTO_INCR_BIT); in vf610_nfc_nand_init()
681 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_BOOT_MODE_BIT); in vf610_nfc_nand_init()
682 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_DMA_REQ_BIT); in vf610_nfc_nand_init()
683 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_FAST_FLASH_BIT); in vf610_nfc_nand_init()
686 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG, CONFIG_PAGE_CNT_MASK, in vf610_nfc_nand_init()
690 if (nand_scan_ident(mtd, CONFIG_SYS_MAX_NAND_DEVICE, NULL)) { in vf610_nfc_nand_init()
696 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT); in vf610_nfc_nand_init()
704 if (mtd->writesize + mtd->oobsize > PAGE_2K + OOB_MAX - 8) { in vf610_nfc_nand_init()
711 if (mtd->writesize != PAGE_2K && mtd->oobsize < 64) { in vf610_nfc_nand_init()
717 if (chip->ecc.size != mtd->writesize) { in vf610_nfc_nand_init()
725 if (mtd->oobsize > 64) in vf610_nfc_nand_init()
726 mtd->oobsize = 64; in vf610_nfc_nand_init()
729 mtd->ecclayout = chip->ecc.layout; in vf610_nfc_nand_init()
745 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG, in vf610_nfc_nand_init()
751 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_ECC_SRAM_REQ_BIT); in vf610_nfc_nand_init()
755 err = nand_scan_tail(mtd); in vf610_nfc_nand_init()
759 err = nand_register(devnum, mtd); in vf610_nfc_nand_init()