1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2009-2015 Freescale Semiconductor, Inc. and others
5 * Description: MPC5125, VF610, MCF54418 and Kinetis K70 Nand driver.
6 * Ported to U-Boot by Stefan Agner
7 * Based on RFC driver posted on Kernel Mailing list by Bill Pringlemeir
8 * Jason ported to M54418TWR and MVFA5.
14 * Based on original driver mpc5121_nfc.c.
17 * - Untested on MPC5125 and M54418.
18 * - DMA and pipelining not used.
20 * - HW ECC: Only 2K page with 64+ OOB.
21 * - HW ECC: Only 24 and 32-bit error correction implemented.
26 #include <dm/device_compat.h>
28 #include <linux/mtd/mtd.h>
29 #include <linux/mtd/rawnand.h>
30 #include <linux/mtd/partitions.h>
35 #if CONFIG_NAND_VF610_NFC_DT
38 #include <linux/ioport.h>
41 /* Register Offsets */
42 #define NFC_FLASH_CMD1 0x3F00
43 #define NFC_FLASH_CMD2 0x3F04
44 #define NFC_COL_ADDR 0x3F08
45 #define NFC_ROW_ADDR 0x3F0c
46 #define NFC_ROW_ADDR_INC 0x3F14
47 #define NFC_FLASH_STATUS1 0x3F18
48 #define NFC_FLASH_STATUS2 0x3F1c
49 #define NFC_CACHE_SWAP 0x3F28
50 #define NFC_SECTOR_SIZE 0x3F2c
51 #define NFC_FLASH_CONFIG 0x3F30
52 #define NFC_IRQ_STATUS 0x3F38
54 /* Addresses for NFC MAIN RAM BUFFER areas */
55 #define NFC_MAIN_AREA(n) ((n) * 0x1000)
57 #define PAGE_2K 0x0800
59 #define OOB_MAX 0x0100
62 * NFC_CMD2[CODE] values. See section:
63 * - 31.4.7 Flash Command Code Description, Vybrid manual
64 * - 23.8.6 Flash Command Sequencer, MPC5125 manual
66 * Briefly these are bitmasks of controller cycles.
68 #define READ_PAGE_CMD_CODE 0x7EE0
69 #define READ_ONFI_PARAM_CMD_CODE 0x4860
70 #define PROGRAM_PAGE_CMD_CODE 0x7FC0
71 #define ERASE_CMD_CODE 0x4EC0
72 #define READ_ID_CMD_CODE 0x4804
73 #define RESET_CMD_CODE 0x4040
74 #define STATUS_READ_CMD_CODE 0x4068
76 /* NFC ECC mode define */
81 /*** Register Mask and bit definitions */
83 /* NFC_FLASH_CMD1 Field */
84 #define CMD_BYTE2_MASK 0xFF000000
85 #define CMD_BYTE2_SHIFT 24
87 /* NFC_FLASH_CM2 Field */
88 #define CMD_BYTE1_MASK 0xFF000000
89 #define CMD_BYTE1_SHIFT 24
90 #define CMD_CODE_MASK 0x00FFFF00
91 #define CMD_CODE_SHIFT 8
92 #define BUFNO_MASK 0x00000006
94 #define START_BIT (1<<0)
96 /* NFC_COL_ADDR Field */
97 #define COL_ADDR_MASK 0x0000FFFF
98 #define COL_ADDR_SHIFT 0
100 /* NFC_ROW_ADDR Field */
101 #define ROW_ADDR_MASK 0x00FFFFFF
102 #define ROW_ADDR_SHIFT 0
103 #define ROW_ADDR_CHIP_SEL_RB_MASK 0xF0000000
104 #define ROW_ADDR_CHIP_SEL_RB_SHIFT 28
105 #define ROW_ADDR_CHIP_SEL_MASK 0x0F000000
106 #define ROW_ADDR_CHIP_SEL_SHIFT 24
108 /* NFC_FLASH_STATUS2 Field */
109 #define STATUS_BYTE1_MASK 0x000000FF
111 /* NFC_FLASH_CONFIG Field */
112 #define CONFIG_ECC_SRAM_ADDR_MASK 0x7FC00000
113 #define CONFIG_ECC_SRAM_ADDR_SHIFT 22
114 #define CONFIG_ECC_SRAM_REQ_BIT (1<<21)
115 #define CONFIG_DMA_REQ_BIT (1<<20)
116 #define CONFIG_ECC_MODE_MASK 0x000E0000
117 #define CONFIG_ECC_MODE_SHIFT 17
118 #define CONFIG_FAST_FLASH_BIT (1<<16)
119 #define CONFIG_16BIT (1<<7)
120 #define CONFIG_BOOT_MODE_BIT (1<<6)
121 #define CONFIG_ADDR_AUTO_INCR_BIT (1<<5)
122 #define CONFIG_BUFNO_AUTO_INCR_BIT (1<<4)
123 #define CONFIG_PAGE_CNT_MASK 0xF
124 #define CONFIG_PAGE_CNT_SHIFT 0
126 /* NFC_IRQ_STATUS Field */
127 #define IDLE_IRQ_BIT (1<<29)
128 #define IDLE_EN_BIT (1<<20)
129 #define CMD_DONE_CLEAR_BIT (1<<18)
130 #define IDLE_CLEAR_BIT (1<<17)
132 #define NFC_TIMEOUT (1000)
135 * ECC status - seems to consume 8 bytes (double word). The documented
136 * status byte is located in the lowest byte of the second word (which is
137 * the 4th or 7th byte depending on endianness).
138 * Calculate an offset to store the ECC status at the end of the buffer.
140 #define ECC_SRAM_ADDR (PAGE_2K + OOB_MAX - 8)
142 #define ECC_STATUS 0x4
143 #define ECC_STATUS_MASK 0x80
144 #define ECC_STATUS_ERR_COUNT 0x3F
146 enum vf610_nfc_alt_buf {
154 struct nand_chip chip;
155 /* NULL without CONFIG_NAND_VF610_NFC_DT */
160 /* Status and ID are in alternate locations. */
161 enum vf610_nfc_alt_buf alt_buf;
164 #define mtd_to_nfc(_mtd) nand_get_controller_data(mtd_to_nand(_mtd))
166 #if defined(CONFIG_SYS_NAND_VF610_NFC_45_ECC_BYTES)
167 #define ECC_HW_MODE ECC_45_BYTE
169 static struct nand_ecclayout vf610_nfc_ecc = {
171 .eccpos = {19, 20, 21, 22, 23,
172 24, 25, 26, 27, 28, 29, 30, 31,
173 32, 33, 34, 35, 36, 37, 38, 39,
174 40, 41, 42, 43, 44, 45, 46, 47,
175 48, 49, 50, 51, 52, 53, 54, 55,
176 56, 57, 58, 59, 60, 61, 62, 63},
181 #elif defined(CONFIG_SYS_NAND_VF610_NFC_60_ECC_BYTES)
182 #define ECC_HW_MODE ECC_60_BYTE
184 static struct nand_ecclayout vf610_nfc_ecc = {
186 .eccpos = { 4, 5, 6, 7, 8, 9, 10, 11,
187 12, 13, 14, 15, 16, 17, 18, 19,
188 20, 21, 22, 23, 24, 25, 26, 27,
189 28, 29, 30, 31, 32, 33, 34, 35,
190 36, 37, 38, 39, 40, 41, 42, 43,
191 44, 45, 46, 47, 48, 49, 50, 51,
192 52, 53, 54, 55, 56, 57, 58, 59,
200 static inline u32 vf610_nfc_read(struct mtd_info *mtd, uint reg)
202 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
204 return readl(nfc->regs + reg);
207 static inline void vf610_nfc_write(struct mtd_info *mtd, uint reg, u32 val)
209 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
211 writel(val, nfc->regs + reg);
214 static inline void vf610_nfc_set(struct mtd_info *mtd, uint reg, u32 bits)
216 vf610_nfc_write(mtd, reg, vf610_nfc_read(mtd, reg) | bits);
219 static inline void vf610_nfc_clear(struct mtd_info *mtd, uint reg, u32 bits)
221 vf610_nfc_write(mtd, reg, vf610_nfc_read(mtd, reg) & ~bits);
224 static inline void vf610_nfc_set_field(struct mtd_info *mtd, u32 reg,
225 u32 mask, u32 shift, u32 val)
227 vf610_nfc_write(mtd, reg,
228 (vf610_nfc_read(mtd, reg) & (~mask)) | val << shift);
231 static inline void vf610_nfc_memcpy(void *dst, const void *src, size_t n)
234 * Use this accessor for the internal SRAM buffers. On the ARM
235 * Freescale Vybrid SoC it's known that the driver can treat
236 * the SRAM buffer as if it's memory. Other platform might need
237 * to treat the buffers differently.
239 * For the time being, use memcpy
244 /* Clear flags for upcoming command */
245 static inline void vf610_nfc_clear_status(void __iomem *regbase)
247 void __iomem *reg = regbase + NFC_IRQ_STATUS;
248 u32 tmp = __raw_readl(reg);
249 tmp |= CMD_DONE_CLEAR_BIT | IDLE_CLEAR_BIT;
250 __raw_writel(tmp, reg);
253 /* Wait for complete operation */
254 static void vf610_nfc_done(struct mtd_info *mtd)
256 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
260 * Barrier is needed after this write. This write need
261 * to be done before reading the next register the first
263 * vf610_nfc_set implicates such a barrier by using writel
264 * to write to the register.
266 vf610_nfc_set(mtd, NFC_FLASH_CMD2, START_BIT);
268 start = get_timer(0);
270 while (!(vf610_nfc_read(mtd, NFC_IRQ_STATUS) & IDLE_IRQ_BIT)) {
271 if (get_timer(start) > NFC_TIMEOUT) {
272 printf("Timeout while waiting for IDLE.\n");
276 vf610_nfc_clear_status(nfc->regs);
279 static u8 vf610_nfc_get_id(struct mtd_info *mtd, int col)
284 flash_id = vf610_nfc_read(mtd, NFC_FLASH_STATUS1);
285 flash_id >>= (3 - col) * 8;
287 flash_id = vf610_nfc_read(mtd, NFC_FLASH_STATUS2);
291 return flash_id & 0xff;
294 static u8 vf610_nfc_get_status(struct mtd_info *mtd)
296 return vf610_nfc_read(mtd, NFC_FLASH_STATUS2) & STATUS_BYTE1_MASK;
300 static void vf610_nfc_send_command(void __iomem *regbase, u32 cmd_byte1,
303 void __iomem *reg = regbase + NFC_FLASH_CMD2;
305 vf610_nfc_clear_status(regbase);
307 tmp = __raw_readl(reg);
308 tmp &= ~(CMD_BYTE1_MASK | CMD_CODE_MASK | BUFNO_MASK);
309 tmp |= cmd_byte1 << CMD_BYTE1_SHIFT;
310 tmp |= cmd_code << CMD_CODE_SHIFT;
311 __raw_writel(tmp, reg);
315 static void vf610_nfc_send_commands(void __iomem *regbase, u32 cmd_byte1,
316 u32 cmd_byte2, u32 cmd_code)
318 void __iomem *reg = regbase + NFC_FLASH_CMD1;
320 vf610_nfc_send_command(regbase, cmd_byte1, cmd_code);
322 tmp = __raw_readl(reg);
323 tmp &= ~CMD_BYTE2_MASK;
324 tmp |= cmd_byte2 << CMD_BYTE2_SHIFT;
325 __raw_writel(tmp, reg);
328 static void vf610_nfc_addr_cycle(struct mtd_info *mtd, int column, int page)
331 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
332 if (nfc->chip.options & NAND_BUSWIDTH_16)
334 vf610_nfc_set_field(mtd, NFC_COL_ADDR, COL_ADDR_MASK,
335 COL_ADDR_SHIFT, column);
338 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK,
339 ROW_ADDR_SHIFT, page);
342 static inline void vf610_nfc_ecc_mode(struct mtd_info *mtd, int ecc_mode)
344 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG,
345 CONFIG_ECC_MODE_MASK,
346 CONFIG_ECC_MODE_SHIFT, ecc_mode);
349 static inline void vf610_nfc_transfer_size(void __iomem *regbase, int size)
351 __raw_writel(size, regbase + NFC_SECTOR_SIZE);
354 /* Send command to NAND chip */
355 static void vf610_nfc_command(struct mtd_info *mtd, unsigned command,
356 int column, int page)
358 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
359 int trfr_sz = nfc->chip.options & NAND_BUSWIDTH_16 ? 1 : 0;
361 nfc->buf_offset = max(column, 0);
362 nfc->alt_buf = ALT_BUF_DATA;
366 /* Use valid column/page from preread... */
367 vf610_nfc_addr_cycle(mtd, column, page);
371 * SEQIN => data => PAGEPROG sequence is done by the controller
372 * hence we do not need to issue the command here...
375 case NAND_CMD_PAGEPROG:
376 trfr_sz += nfc->write_sz;
377 vf610_nfc_ecc_mode(mtd, ECC_HW_MODE);
378 vf610_nfc_transfer_size(nfc->regs, trfr_sz);
379 vf610_nfc_send_commands(nfc->regs, NAND_CMD_SEQIN,
380 command, PROGRAM_PAGE_CMD_CODE);
384 vf610_nfc_transfer_size(nfc->regs, 0);
385 vf610_nfc_send_command(nfc->regs, command, RESET_CMD_CODE);
388 case NAND_CMD_READOOB:
389 trfr_sz += mtd->oobsize;
390 column = mtd->writesize;
391 vf610_nfc_transfer_size(nfc->regs, trfr_sz);
392 vf610_nfc_send_commands(nfc->regs, NAND_CMD_READ0,
393 NAND_CMD_READSTART, READ_PAGE_CMD_CODE);
394 vf610_nfc_addr_cycle(mtd, column, page);
395 vf610_nfc_ecc_mode(mtd, ECC_BYPASS);
399 trfr_sz += mtd->writesize + mtd->oobsize;
400 vf610_nfc_transfer_size(nfc->regs, trfr_sz);
401 vf610_nfc_ecc_mode(mtd, ECC_HW_MODE);
402 vf610_nfc_send_commands(nfc->regs, NAND_CMD_READ0,
403 NAND_CMD_READSTART, READ_PAGE_CMD_CODE);
404 vf610_nfc_addr_cycle(mtd, column, page);
408 nfc->alt_buf = ALT_BUF_ONFI;
409 trfr_sz = 3 * sizeof(struct nand_onfi_params);
410 vf610_nfc_transfer_size(nfc->regs, trfr_sz);
411 vf610_nfc_send_command(nfc->regs, NAND_CMD_PARAM,
412 READ_ONFI_PARAM_CMD_CODE);
413 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK,
414 ROW_ADDR_SHIFT, column);
415 vf610_nfc_ecc_mode(mtd, ECC_BYPASS);
418 case NAND_CMD_ERASE1:
419 vf610_nfc_transfer_size(nfc->regs, 0);
420 vf610_nfc_send_commands(nfc->regs, command,
421 NAND_CMD_ERASE2, ERASE_CMD_CODE);
422 vf610_nfc_addr_cycle(mtd, column, page);
425 case NAND_CMD_READID:
426 nfc->alt_buf = ALT_BUF_ID;
428 vf610_nfc_transfer_size(nfc->regs, 0);
429 vf610_nfc_send_command(nfc->regs, command, READ_ID_CMD_CODE);
430 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK,
431 ROW_ADDR_SHIFT, column);
434 case NAND_CMD_STATUS:
435 nfc->alt_buf = ALT_BUF_STAT;
436 vf610_nfc_transfer_size(nfc->regs, 0);
437 vf610_nfc_send_command(nfc->regs, command, STATUS_READ_CMD_CODE);
448 /* Read data from NFC buffers */
449 static void vf610_nfc_read_buf(struct mtd_info *mtd, u_char *buf, int len)
451 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
452 uint c = nfc->buf_offset;
454 /* Alternate buffers are only supported through read_byte */
458 vf610_nfc_memcpy(buf, nfc->regs + NFC_MAIN_AREA(0) + c, len);
460 nfc->buf_offset += len;
463 /* Write data to NFC buffers */
464 static void vf610_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
467 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
468 uint c = nfc->buf_offset;
471 l = min_t(uint, len, mtd->writesize + mtd->oobsize - c);
472 vf610_nfc_memcpy(nfc->regs + NFC_MAIN_AREA(0) + c, buf, l);
475 nfc->buf_offset += l;
478 /* Read byte from NFC buffers */
479 static uint8_t vf610_nfc_read_byte(struct mtd_info *mtd)
481 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
483 uint c = nfc->buf_offset;
485 switch (nfc->alt_buf) {
487 tmp = vf610_nfc_get_id(mtd, c);
490 tmp = vf610_nfc_get_status(mtd);
492 #ifdef __LITTLE_ENDIAN
494 /* Reverse byte since the controller uses big endianness */
495 c = nfc->buf_offset ^ 0x3;
499 tmp = *((u8 *)(nfc->regs + NFC_MAIN_AREA(0) + c));
506 /* Read word from NFC buffers */
507 static u16 vf610_nfc_read_word(struct mtd_info *mtd)
511 vf610_nfc_read_buf(mtd, (u_char *)&tmp, sizeof(tmp));
515 /* If not provided, upper layers apply a fixed delay. */
516 static int vf610_nfc_dev_ready(struct mtd_info *mtd)
518 /* NFC handles R/B internally; always ready. */
523 * This function supports Vybrid only (MPC5125 would have full RB and four CS)
525 static void vf610_nfc_select_chip(struct mtd_info *mtd, int chip)
528 u32 tmp = vf610_nfc_read(mtd, NFC_ROW_ADDR);
529 tmp &= ~(ROW_ADDR_CHIP_SEL_RB_MASK | ROW_ADDR_CHIP_SEL_MASK);
532 tmp |= 1 << ROW_ADDR_CHIP_SEL_RB_SHIFT;
533 tmp |= (1 << chip) << ROW_ADDR_CHIP_SEL_SHIFT;
536 vf610_nfc_write(mtd, NFC_ROW_ADDR, tmp);
540 /* Count the number of 0's in buff upto max_bits */
541 static inline int count_written_bits(uint8_t *buff, int size, int max_bits)
543 uint32_t *buff32 = (uint32_t *)buff;
544 int k, written_bits = 0;
546 for (k = 0; k < (size / 4); k++) {
547 written_bits += hweight32(~buff32[k]);
548 if (written_bits > max_bits)
555 static inline int vf610_nfc_correct_data(struct mtd_info *mtd, uint8_t *dat,
556 uint8_t *oob, int page)
558 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
559 u32 ecc_status_off = NFC_MAIN_AREA(0) + ECC_SRAM_ADDR + ECC_STATUS;
563 int flips_threshold = nfc->chip.ecc.strength / 2;
565 ecc_status = vf610_nfc_read(mtd, ecc_status_off) & 0xff;
566 ecc_count = ecc_status & ECC_STATUS_ERR_COUNT;
568 if (!(ecc_status & ECC_STATUS_MASK))
571 /* Read OOB without ECC unit enabled */
572 vf610_nfc_command(mtd, NAND_CMD_READOOB, 0, page);
573 vf610_nfc_read_buf(mtd, oob, mtd->oobsize);
576 * On an erased page, bit count (including OOB) should be zero or
577 * at least less then half of the ECC strength.
579 flips = count_written_bits(dat, nfc->chip.ecc.size, flips_threshold);
580 flips += count_written_bits(oob, mtd->oobsize, flips_threshold);
582 if (unlikely(flips > flips_threshold))
586 memset(dat, 0xff, nfc->chip.ecc.size);
587 memset(oob, 0xff, mtd->oobsize);
591 static int vf610_nfc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
592 uint8_t *buf, int oob_required, int page)
594 int eccsize = chip->ecc.size;
597 vf610_nfc_read_buf(mtd, buf, eccsize);
599 vf610_nfc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
601 stat = vf610_nfc_correct_data(mtd, buf, chip->oob_poi, page);
604 mtd->ecc_stats.failed++;
607 mtd->ecc_stats.corrected += stat;
613 * ECC will be calculated automatically
615 static int vf610_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
616 const uint8_t *buf, int oob_required, int page)
618 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
620 vf610_nfc_write_buf(mtd, buf, mtd->writesize);
622 vf610_nfc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
624 /* Always write whole page including OOB due to HW ECC */
625 nfc->write_sz = mtd->writesize + mtd->oobsize;
630 struct vf610_nfc_config {
636 static int vf610_nfc_nand_init(struct vf610_nfc *nfc, int devnum)
638 struct nand_chip *chip = &nfc->chip;
639 struct mtd_info *mtd = nand_to_mtd(chip);
641 struct vf610_nfc_config cfg = {
643 #ifdef CONFIG_SYS_NAND_BUSWIDTH_16BIT
651 nand_set_controller_data(chip, nfc);
654 chip->options |= NAND_BUSWIDTH_16;
656 chip->dev_ready = vf610_nfc_dev_ready;
657 chip->cmdfunc = vf610_nfc_command;
658 chip->read_byte = vf610_nfc_read_byte;
659 chip->read_word = vf610_nfc_read_word;
660 chip->read_buf = vf610_nfc_read_buf;
661 chip->write_buf = vf610_nfc_write_buf;
662 chip->select_chip = vf610_nfc_select_chip;
664 chip->options |= NAND_NO_SUBPAGE_WRITE;
666 chip->ecc.size = PAGE_2K;
668 /* Set configuration register. */
669 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT);
670 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_ADDR_AUTO_INCR_BIT);
671 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_BUFNO_AUTO_INCR_BIT);
672 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_BOOT_MODE_BIT);
673 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_DMA_REQ_BIT);
674 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_FAST_FLASH_BIT);
676 /* Disable virtual pages, only one elementary transfer unit */
677 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG, CONFIG_PAGE_CNT_MASK,
678 CONFIG_PAGE_CNT_SHIFT, 1);
680 /* first scan to find the device and get the page size */
681 if (nand_scan_ident(mtd, CONFIG_SYS_MAX_NAND_DEVICE, NULL)) {
687 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT);
689 /* Bad block options. */
691 chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB |
694 /* Single buffer only, max 256 OOB minus ECC status */
695 if (mtd->writesize + mtd->oobsize > PAGE_2K + OOB_MAX - 8) {
696 dev_err(nfc->dev, "Unsupported flash page size\n");
701 if (cfg.hardware_ecc) {
702 if (mtd->writesize != PAGE_2K && mtd->oobsize < 64) {
703 dev_err(nfc->dev, "Unsupported flash with hwecc\n");
708 if (chip->ecc.size != mtd->writesize) {
709 dev_err(nfc->dev, "ecc size: %d\n", chip->ecc.size);
710 dev_err(nfc->dev, "Step size needs to be page size\n");
715 /* Current HW ECC layouts only use 64 bytes of OOB */
716 if (mtd->oobsize > 64)
719 /* propagate ecc.layout to mtd_info */
720 mtd->ecclayout = chip->ecc.layout;
721 chip->ecc.read_page = vf610_nfc_read_page;
722 chip->ecc.write_page = vf610_nfc_write_page;
723 chip->ecc.mode = NAND_ECC_HW;
725 chip->ecc.size = PAGE_2K;
726 chip->ecc.layout = &vf610_nfc_ecc;
727 #if defined(CONFIG_SYS_NAND_VF610_NFC_45_ECC_BYTES)
728 chip->ecc.strength = 24;
729 chip->ecc.bytes = 45;
730 #elif defined(CONFIG_SYS_NAND_VF610_NFC_60_ECC_BYTES)
731 chip->ecc.strength = 32;
732 chip->ecc.bytes = 60;
735 /* Set ECC_STATUS offset */
736 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG,
737 CONFIG_ECC_SRAM_ADDR_MASK,
738 CONFIG_ECC_SRAM_ADDR_SHIFT,
741 /* Enable ECC status in SRAM */
742 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_ECC_SRAM_REQ_BIT);
745 /* second phase scan */
746 err = nand_scan_tail(mtd);
750 err = nand_register(devnum, mtd);
760 #if CONFIG_NAND_VF610_NFC_DT
761 static const struct udevice_id vf610_nfc_dt_ids[] = {
763 .compatible = "fsl,vf610-nfc",
768 static int vf610_nfc_dt_probe(struct udevice *dev)
771 struct vf610_nfc *nfc = dev_get_priv(dev);
774 ret = dev_read_resource(dev, 0, &res);
778 nfc->regs = devm_ioremap(dev, res.start, resource_size(&res));
780 return vf610_nfc_nand_init(nfc, 0);
783 U_BOOT_DRIVER(vf610_nfc_dt) = {
784 .name = "vf610-nfc-dt",
786 .of_match = vf610_nfc_dt_ids,
787 .priv_auto_alloc_size = sizeof(struct vf610_nfc),
788 .probe = vf610_nfc_dt_probe,
791 void board_nand_init(void)
796 ret = uclass_get_device_by_driver(UCLASS_MTD,
797 DM_GET_DRIVER(vf610_nfc_dt),
799 if (ret && ret != -ENODEV)
800 pr_err("Failed to initialize NAND controller. (error %d)\n",
804 void board_nand_init(void)
807 struct vf610_nfc *nfc;
809 nfc = calloc(1, sizeof(*nfc));
811 printf("%s: Out of memory\n", __func__);
815 nfc->regs = (void __iomem *)CONFIG_SYS_NAND_BASE;
816 err = vf610_nfc_nand_init(nfc, 0);
818 printf("VF610 NAND init failed (err %d)\n", err);
820 #endif /* CONFIG_NAND_VF610_NFC_DT */