1 // SPDX-License-Identifier: GPL-2.0+
3 * Arasan NAND Flash Controller Driver
5 * Copyright (C) 2014 - 2015 Xilinx, Inc.
11 #include <linux/delay.h>
12 #include <linux/errno.h>
13 #include <linux/mtd/mtd.h>
14 #include <linux/mtd/rawnand.h>
15 #include <linux/mtd/partitions.h>
16 #include <linux/mtd/nand_ecc.h>
17 #include <asm/arch/hardware.h>
18 #include <asm/arch/sys_proto.h>
24 bool on_die_ecc_enabled;
28 struct nand_regs *reg;
29 struct nand_config config;
32 struct arasan_nand_info {
34 struct nand_drv nand_ctrl;
35 struct nand_chip nand_chip;
69 struct arasan_nand_command_format {
76 #define ONDIE_ECC_FEATURE_ADDR 0x90
77 #define ENABLE_ONDIE_ECC 0x08
79 #define ARASAN_PROG_RD_MASK 0x00000001
80 #define ARASAN_PROG_BLK_ERS_MASK 0x00000004
81 #define ARASAN_PROG_RD_ID_MASK 0x00000040
82 #define ARASAN_PROG_RD_STS_MASK 0x00000008
83 #define ARASAN_PROG_PG_PROG_MASK 0x00000010
84 #define ARASAN_PROG_RD_PARAM_PG_MASK 0x00000080
85 #define ARASAN_PROG_RST_MASK 0x00000100
86 #define ARASAN_PROG_GET_FTRS_MASK 0x00000200
87 #define ARASAN_PROG_SET_FTRS_MASK 0x00000400
88 #define ARASAN_PROG_CHNG_ROWADR_END_MASK 0x00400000
90 #define ARASAN_NAND_CMD_ECC_ON_MASK 0x80000000
91 #define ARASAN_NAND_CMD_CMD12_MASK 0xFFFF
92 #define ARASAN_NAND_CMD_PG_SIZE_MASK 0x3800000
93 #define ARASAN_NAND_CMD_PG_SIZE_SHIFT 23
94 #define ARASAN_NAND_CMD_CMD2_SHIFT 8
95 #define ARASAN_NAND_CMD_ADDR_CYCL_MASK 0x70000000
96 #define ARASAN_NAND_CMD_ADDR_CYCL_SHIFT 28
98 #define ARASAN_NAND_MEM_ADDR1_PAGE_MASK 0xFFFF0000
99 #define ARASAN_NAND_MEM_ADDR1_COL_MASK 0xFFFF
100 #define ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT 16
101 #define ARASAN_NAND_MEM_ADDR2_PAGE_MASK 0xFF
102 #define ARASAN_NAND_MEM_ADDR2_CS_MASK 0xC0000000
103 #define ARASAN_NAND_MEM_ADDR2_CS0_MASK (0x3 << 30)
104 #define ARASAN_NAND_MEM_ADDR2_CS1_MASK (0x1 << 30)
105 #define ARASAN_NAND_MEM_ADDR2_BCH_MASK 0xE000000
106 #define ARASAN_NAND_MEM_ADDR2_BCH_SHIFT 25
108 #define ARASAN_NAND_INT_STS_ERR_EN_MASK 0x10
109 #define ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK 0x08
110 #define ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK 0x02
111 #define ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK 0x01
112 #define ARASAN_NAND_INT_STS_XFR_CMPLT_MASK 0x04
114 #define ARASAN_NAND_PKT_REG_PKT_CNT_MASK 0xFFF000
115 #define ARASAN_NAND_PKT_REG_PKT_SIZE_MASK 0x7FF
116 #define ARASAN_NAND_PKT_REG_PKT_CNT_SHFT 12
118 #define ARASAN_NAND_ROW_ADDR_CYCL_MASK 0x0F
119 #define ARASAN_NAND_COL_ADDR_CYCL_MASK 0xF0
120 #define ARASAN_NAND_COL_ADDR_CYCL_SHIFT 4
122 #define ARASAN_NAND_ECC_SIZE_SHIFT 16
123 #define ARASAN_NAND_ECC_BCH_SHIFT 27
125 #define ARASAN_NAND_PKTSIZE_1K 1024
126 #define ARASAN_NAND_PKTSIZE_512 512
128 #define ARASAN_NAND_POLL_TIMEOUT 1000000
129 #define ARASAN_NAND_INVALID_ADDR_CYCL 0xFF
131 #define ERR_ADDR_CYCLE -1
132 #define READ_BUFF_SIZE 0x4000
134 static struct arasan_nand_command_format *curr_cmd;
144 static struct arasan_nand_command_format arasan_nand_commands[] = {
145 {NAND_CMD_READ0, NAND_CMD_READSTART, NAND_ADDR_CYCL_BOTH,
146 ARASAN_PROG_RD_MASK},
147 {NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, NAND_ADDR_CYCL_COL,
148 ARASAN_PROG_RD_MASK},
149 {NAND_CMD_READID, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
150 ARASAN_PROG_RD_ID_MASK},
151 {NAND_CMD_STATUS, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE,
152 ARASAN_PROG_RD_STS_MASK},
153 {NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, NAND_ADDR_CYCL_BOTH,
154 ARASAN_PROG_PG_PROG_MASK},
155 {NAND_CMD_RNDIN, NAND_CMD_NONE, NAND_ADDR_CYCL_COL,
156 ARASAN_PROG_CHNG_ROWADR_END_MASK},
157 {NAND_CMD_ERASE1, NAND_CMD_ERASE2, NAND_ADDR_CYCL_ROW,
158 ARASAN_PROG_BLK_ERS_MASK},
159 {NAND_CMD_RESET, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE,
160 ARASAN_PROG_RST_MASK},
161 {NAND_CMD_PARAM, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
162 ARASAN_PROG_RD_PARAM_PG_MASK},
163 {NAND_CMD_GET_FEATURES, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
164 ARASAN_PROG_GET_FTRS_MASK},
165 {NAND_CMD_SET_FEATURES, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
166 ARASAN_PROG_SET_FTRS_MASK},
167 {NAND_CMD_NONE, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE, 0},
170 struct arasan_ecc_matrix {
172 u32 ecc_codeword_size;
180 static const struct arasan_ecc_matrix ecc_matrix[] = {
181 {512, 512, 1, 0, 0, 0x20D, 0x3},
182 {512, 512, 4, 1, 3, 0x209, 0x7},
183 {512, 512, 8, 1, 2, 0x203, 0xD},
187 {2048, 512, 1, 0, 0, 0x834, 0xC},
188 {2048, 512, 4, 1, 3, 0x826, 0x1A},
189 {2048, 512, 8, 1, 2, 0x80c, 0x34},
190 {2048, 512, 12, 1, 1, 0x822, 0x4E},
191 {2048, 512, 16, 1, 0, 0x808, 0x68},
192 {2048, 1024, 24, 1, 4, 0x81c, 0x54},
196 {4096, 512, 1, 0, 0, 0x1068, 0x18},
197 {4096, 512, 4, 1, 3, 0x104c, 0x34},
198 {4096, 512, 8, 1, 2, 0x1018, 0x68},
199 {4096, 512, 12, 1, 1, 0x1044, 0x9C},
200 {4096, 512, 16, 1, 0, 0x1010, 0xD0},
201 {4096, 1024, 24, 1, 4, 0x1038, 0xA8},
205 {8192, 512, 1, 0, 0, 0x20d0, 0x30},
206 {8192, 512, 4, 1, 3, 0x2098, 0x68},
207 {8192, 512, 8, 1, 2, 0x2030, 0xD0},
208 {8192, 512, 12, 1, 1, 0x2088, 0x138},
209 {8192, 512, 16, 1, 0, 0x2020, 0x1A0},
210 {8192, 1024, 24, 1, 4, 0x2070, 0x150},
214 {16384, 512, 1, 0, 0, 0x4460, 0x60},
215 {16384, 512, 4, 1, 3, 0x43f0, 0xD0},
216 {16384, 512, 8, 1, 2, 0x4320, 0x1A0},
217 {16384, 512, 12, 1, 1, 0x4250, 0x270},
218 {16384, 512, 16, 1, 0, 0x4180, 0x340},
219 {16384, 1024, 24, 1, 4, 0x4220, 0x2A0}
222 static struct nand_ecclayout ondie_nand_oob_64 = {
226 8, 9, 10, 11, 12, 13, 14, 15,
227 24, 25, 26, 27, 28, 29, 30, 31,
228 40, 41, 42, 43, 44, 45, 46, 47,
229 56, 57, 58, 59, 60, 61, 62, 63
233 { .offset = 4, .length = 4 },
234 { .offset = 20, .length = 4 },
235 { .offset = 36, .length = 4 },
236 { .offset = 52, .length = 4 }
241 * bbt decriptors for chips with on-die ECC and
242 * chips with 64-byte OOB
244 static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
245 static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
247 static struct nand_bbt_descr bbt_main_descr = {
248 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
249 NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
254 .pattern = bbt_pattern
257 static struct nand_bbt_descr bbt_mirror_descr = {
258 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
259 NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
264 .pattern = mirror_pattern
267 static u8 buf_data[READ_BUFF_SIZE];
268 static u32 buf_index;
270 static struct nand_ecclayout nand_oob;
272 static void arasan_nand_select_chip(struct mtd_info *mtd, int chip)
274 struct nand_chip *nand_chip = mtd_to_nand(mtd);
275 struct nand_drv *info = nand_get_controller_data(nand_chip);
278 reg_val = readl(&info->reg->memadr_reg2);
280 reg_val &= ~ARASAN_NAND_MEM_ADDR2_CS0_MASK;
281 writel(reg_val, &info->reg->memadr_reg2);
282 } else if (chip == 1) {
283 reg_val |= ARASAN_NAND_MEM_ADDR2_CS1_MASK;
284 writel(reg_val, &info->reg->memadr_reg2);
288 static void arasan_nand_enable_ecc(struct mtd_info *mtd)
290 struct nand_chip *chip = mtd_to_nand(mtd);
291 struct nand_drv *info = nand_get_controller_data(chip);
294 reg_val = readl(&info->reg->cmd_reg);
295 reg_val |= ARASAN_NAND_CMD_ECC_ON_MASK;
297 writel(reg_val, &info->reg->cmd_reg);
300 static u8 arasan_nand_get_addrcycle(struct mtd_info *mtd)
303 struct nand_chip *chip = mtd_to_nand(mtd);
305 switch (curr_cmd->addr_cycles) {
306 case NAND_ADDR_CYCL_NONE:
309 case NAND_ADDR_CYCL_ONE:
312 case NAND_ADDR_CYCL_ROW:
313 addrcycles = chip->onfi_params.addr_cycles &
314 ARASAN_NAND_ROW_ADDR_CYCL_MASK;
316 case NAND_ADDR_CYCL_COL:
317 addrcycles = (chip->onfi_params.addr_cycles &
318 ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
319 ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
321 case NAND_ADDR_CYCL_BOTH:
322 addrcycles = chip->onfi_params.addr_cycles &
323 ARASAN_NAND_ROW_ADDR_CYCL_MASK;
324 addrcycles += (chip->onfi_params.addr_cycles &
325 ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
326 ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
329 addrcycles = ARASAN_NAND_INVALID_ADDR_CYCL;
335 static int arasan_nand_read_page(struct mtd_info *mtd, u8 *buf, u32 size)
337 struct nand_chip *chip = mtd_to_nand(mtd);
338 struct nand_drv *info = nand_get_controller_data(chip);
339 struct nand_config *nand = &info->config;
340 u32 reg_val, i, pktsize, pktnum;
341 u32 *bufptr = (u32 *)buf;
346 if (chip->ecc_step_ds >= ARASAN_NAND_PKTSIZE_1K)
347 pktsize = ARASAN_NAND_PKTSIZE_1K;
349 pktsize = ARASAN_NAND_PKTSIZE_512;
352 pktnum = size/pktsize + 1;
354 pktnum = size/pktsize;
356 reg_val = readl(&info->reg->intsts_enr);
357 reg_val |= ARASAN_NAND_INT_STS_ERR_EN_MASK |
358 ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK;
359 writel(reg_val, &info->reg->intsts_enr);
361 reg_val = readl(&info->reg->pkt_reg);
362 reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
363 ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
364 reg_val |= (pktnum << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) |
366 writel(reg_val, &info->reg->pkt_reg);
368 if (!nand->on_die_ecc_enabled) {
369 arasan_nand_enable_ecc(mtd);
370 addr_cycles = arasan_nand_get_addrcycle(mtd);
371 if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
372 return ERR_ADDR_CYCLE;
374 writel((NAND_CMD_RNDOUTSTART << ARASAN_NAND_CMD_CMD2_SHIFT) |
375 NAND_CMD_RNDOUT | (addr_cycles <<
376 ARASAN_NAND_CMD_ADDR_CYCL_SHIFT),
377 &info->reg->ecc_sprcmd_reg);
379 writel(curr_cmd->pgm, &info->reg->pgm_reg);
381 while (rdcount < pktnum) {
382 timeout = ARASAN_NAND_POLL_TIMEOUT;
383 while (!(readl(&info->reg->intsts_reg) &
384 ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK) && timeout) {
389 puts("arasan_read_page: timedout:Buff RDY\n");
395 if (pktnum == rdcount) {
396 reg_val = readl(&info->reg->intsts_enr);
397 reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
398 writel(reg_val, &info->reg->intsts_enr);
400 reg_val = readl(&info->reg->intsts_enr);
401 writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
402 &info->reg->intsts_enr);
404 reg_val = readl(&info->reg->intsts_reg);
405 writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
406 &info->reg->intsts_reg);
408 for (i = 0; i < pktsize/4; i++)
409 bufptr[i] = readl(&info->reg->buf_dataport);
414 if (rdcount >= pktnum)
417 writel(ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
418 &info->reg->intsts_enr);
421 timeout = ARASAN_NAND_POLL_TIMEOUT;
423 while (!(readl(&info->reg->intsts_reg) &
424 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
429 puts("arasan rd_page timedout:Xfer CMPLT\n");
433 reg_val = readl(&info->reg->intsts_enr);
434 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
435 &info->reg->intsts_enr);
436 reg_val = readl(&info->reg->intsts_reg);
437 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
438 &info->reg->intsts_reg);
440 if (!nand->on_die_ecc_enabled) {
441 if (readl(&info->reg->intsts_reg) &
442 ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK) {
443 printf("arasan rd_page:sbiterror\n");
447 if (readl(&info->reg->intsts_reg) &
448 ARASAN_NAND_INT_STS_ERR_EN_MASK) {
449 mtd->ecc_stats.failed++;
450 printf("arasan rd_page:multibiterror\n");
458 static int arasan_nand_read_page_hwecc(struct mtd_info *mtd,
459 struct nand_chip *chip, u8 *buf, int oob_required, int page)
463 status = arasan_nand_read_page(mtd, buf, (mtd->writesize));
466 chip->ecc.read_oob(mtd, chip, page);
471 static void arasan_nand_fill_tx(struct mtd_info *mtd, const u8 *buf, int len)
473 struct nand_chip *chip = mtd_to_nand(mtd);
474 struct nand_drv *info = nand_get_controller_data(chip);
475 u32 __iomem *nand = &info->reg->buf_dataport;
477 if (((unsigned long)buf & 0x3) != 0) {
478 if (((unsigned long)buf & 0x1) != 0) {
486 if (((unsigned long)buf & 0x3) != 0) {
488 writew(*(u16 *)buf, nand);
496 writel(*(u32 *)buf, nand);
503 writew(*(u16 *)buf, nand);
513 static int arasan_nand_write_page_hwecc(struct mtd_info *mtd,
514 struct nand_chip *chip, const u8 *buf, int oob_required,
517 struct nand_drv *info = nand_get_controller_data(chip);
518 struct nand_config *nand = &info->config;
519 u32 reg_val, i, pktsize, pktnum;
520 const u32 *bufptr = (const u32 *)buf;
521 u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
522 u32 size = mtd->writesize;
524 u8 column_addr_cycles;
526 if (chip->ecc_step_ds >= ARASAN_NAND_PKTSIZE_1K)
527 pktsize = ARASAN_NAND_PKTSIZE_1K;
529 pktsize = ARASAN_NAND_PKTSIZE_512;
532 pktnum = size/pktsize + 1;
534 pktnum = size/pktsize;
536 reg_val = readl(&info->reg->pkt_reg);
537 reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
538 ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
539 reg_val |= (pktnum << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | pktsize;
540 writel(reg_val, &info->reg->pkt_reg);
542 if (!nand->on_die_ecc_enabled) {
543 arasan_nand_enable_ecc(mtd);
544 column_addr_cycles = (chip->onfi_params.addr_cycles &
545 ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
546 ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
547 writel((NAND_CMD_RNDIN | (column_addr_cycles << 28)),
548 &info->reg->ecc_sprcmd_reg);
550 writel(curr_cmd->pgm, &info->reg->pgm_reg);
552 while (rdcount < pktnum) {
553 timeout = ARASAN_NAND_POLL_TIMEOUT;
554 while (!(readl(&info->reg->intsts_reg) &
555 ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK) && timeout) {
561 puts("arasan_write_page: timedout:Buff RDY\n");
567 if (pktnum == rdcount) {
568 reg_val = readl(&info->reg->intsts_enr);
569 reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
570 writel(reg_val, &info->reg->intsts_enr);
572 reg_val = readl(&info->reg->intsts_enr);
573 writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
574 &info->reg->intsts_enr);
577 reg_val = readl(&info->reg->intsts_reg);
578 writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
579 &info->reg->intsts_reg);
581 for (i = 0; i < pktsize/4; i++)
582 writel(bufptr[i], &info->reg->buf_dataport);
586 if (rdcount >= pktnum)
589 writel(ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
590 &info->reg->intsts_enr);
593 timeout = ARASAN_NAND_POLL_TIMEOUT;
595 while (!(readl(&info->reg->intsts_reg) &
596 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
601 puts("arasan write_page timedout:Xfer CMPLT\n");
605 reg_val = readl(&info->reg->intsts_enr);
606 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
607 &info->reg->intsts_enr);
608 reg_val = readl(&info->reg->intsts_reg);
609 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
610 &info->reg->intsts_reg);
613 chip->ecc.write_oob(mtd, chip, nand->page);
618 static int arasan_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
621 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
622 chip->read_buf(mtd, chip->oob_poi, (mtd->oobsize));
627 static int arasan_nand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
631 const u8 *buf = chip->oob_poi;
633 chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
634 chip->write_buf(mtd, buf, mtd->oobsize);
639 static int arasan_nand_reset(struct mtd_info *mtd,
640 struct arasan_nand_command_format *curr_cmd)
642 struct nand_chip *chip = mtd_to_nand(mtd);
643 struct nand_drv *info = nand_get_controller_data(chip);
644 u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
647 writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
648 &info->reg->intsts_enr);
649 cmd_reg = readl(&info->reg->cmd_reg);
650 cmd_reg &= ~ARASAN_NAND_CMD_CMD12_MASK;
652 cmd_reg |= curr_cmd->cmd1 |
653 (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
654 writel(cmd_reg, &info->reg->cmd_reg);
655 writel(curr_cmd->pgm, &info->reg->pgm_reg);
657 while (!(readl(&info->reg->intsts_reg) &
658 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
663 printf("ERROR:%s timedout\n", __func__);
667 writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
668 &info->reg->intsts_enr);
670 writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
671 &info->reg->intsts_reg);
676 static u8 arasan_nand_page(struct mtd_info *mtd)
680 switch (mtd->writesize) {
700 printf("%s:Pagesize>16K\n", __func__);
707 static int arasan_nand_send_wrcmd(struct arasan_nand_command_format *curr_cmd,
708 int column, int page_addr, struct mtd_info *mtd)
710 struct nand_chip *chip = mtd_to_nand(mtd);
711 struct nand_drv *info = nand_get_controller_data(chip);
713 u8 page_val, addr_cycles;
715 writel(ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
716 &info->reg->intsts_enr);
717 reg_val = readl(&info->reg->cmd_reg);
718 reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
719 reg_val |= curr_cmd->cmd1 |
720 (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
721 if (curr_cmd->cmd1 == NAND_CMD_SEQIN) {
722 reg_val &= ~ARASAN_NAND_CMD_PG_SIZE_MASK;
723 page_val = arasan_nand_page(mtd);
724 reg_val |= (page_val << ARASAN_NAND_CMD_PG_SIZE_SHIFT);
727 reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
728 addr_cycles = arasan_nand_get_addrcycle(mtd);
730 if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
731 return ERR_ADDR_CYCLE;
733 reg_val |= (addr_cycles <<
734 ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
735 writel(reg_val, &info->reg->cmd_reg);
740 page = (page_addr << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
741 ARASAN_NAND_MEM_ADDR1_PAGE_MASK;
742 column &= ARASAN_NAND_MEM_ADDR1_COL_MASK;
743 writel(page | column, &info->reg->memadr_reg1);
745 reg_val = readl(&info->reg->memadr_reg2);
746 reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
747 reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
748 writel(reg_val, &info->reg->memadr_reg2);
753 static void arasan_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
755 struct nand_chip *chip = mtd_to_nand(mtd);
756 struct nand_drv *info = nand_get_controller_data(chip);
758 u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
760 reg_val = readl(&info->reg->pkt_reg);
761 reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
762 ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
764 reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | len;
765 writel(reg_val, &info->reg->pkt_reg);
766 writel(curr_cmd->pgm, &info->reg->pgm_reg);
768 while (!(readl(&info->reg->intsts_reg) &
769 ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK) && timeout) {
775 puts("ERROR:arasan_nand_write_buf timedout:Buff RDY\n");
777 reg_val = readl(&info->reg->intsts_enr);
778 reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
779 writel(reg_val, &info->reg->intsts_enr);
780 writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
781 &info->reg->intsts_enr);
782 reg_val = readl(&info->reg->intsts_reg);
783 writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
784 &info->reg->intsts_reg);
786 arasan_nand_fill_tx(mtd, buf, len);
788 timeout = ARASAN_NAND_POLL_TIMEOUT;
789 while (!(readl(&info->reg->intsts_reg) &
790 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
795 puts("ERROR:arasan_nand_write_buf timedout:Xfer CMPLT\n");
797 writel(readl(&info->reg->intsts_enr) |
798 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
799 &info->reg->intsts_enr);
800 writel(readl(&info->reg->intsts_reg) |
801 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
802 &info->reg->intsts_reg);
805 static int arasan_nand_erase(struct arasan_nand_command_format *curr_cmd,
806 int column, int page_addr, struct mtd_info *mtd)
808 struct nand_chip *chip = mtd_to_nand(mtd);
809 struct nand_drv *info = nand_get_controller_data(chip);
811 u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
814 writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
815 &info->reg->intsts_enr);
816 reg_val = readl(&info->reg->cmd_reg);
817 reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
818 reg_val |= curr_cmd->cmd1 |
819 (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
820 row_addr_cycles = arasan_nand_get_addrcycle(mtd);
822 if (row_addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
823 return ERR_ADDR_CYCLE;
825 reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
826 reg_val |= (row_addr_cycles <<
827 ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
829 writel(reg_val, &info->reg->cmd_reg);
831 page = (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
832 ARASAN_NAND_MEM_ADDR1_COL_MASK;
833 column = page_addr & ARASAN_NAND_MEM_ADDR1_COL_MASK;
834 writel(column | (page << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT),
835 &info->reg->memadr_reg1);
837 reg_val = readl(&info->reg->memadr_reg2);
838 reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
839 reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
840 writel(reg_val, &info->reg->memadr_reg2);
841 writel(curr_cmd->pgm, &info->reg->pgm_reg);
843 while (!(readl(&info->reg->intsts_reg) &
844 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
849 printf("ERROR:%s timedout:Xfer CMPLT\n", __func__);
853 reg_val = readl(&info->reg->intsts_enr);
854 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
855 &info->reg->intsts_enr);
856 reg_val = readl(&info->reg->intsts_reg);
857 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
858 &info->reg->intsts_reg);
863 static int arasan_nand_read_status(struct arasan_nand_command_format *curr_cmd,
864 int column, int page_addr, struct mtd_info *mtd)
866 struct nand_chip *chip = mtd_to_nand(mtd);
867 struct nand_drv *info = nand_get_controller_data(chip);
869 u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
872 writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
873 &info->reg->intsts_enr);
874 reg_val = readl(&info->reg->cmd_reg);
875 reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
876 reg_val |= curr_cmd->cmd1 |
877 (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
878 addr_cycles = arasan_nand_get_addrcycle(mtd);
880 if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
881 return ERR_ADDR_CYCLE;
883 reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
884 reg_val |= (addr_cycles <<
885 ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
887 writel(reg_val, &info->reg->cmd_reg);
889 reg_val = readl(&info->reg->pkt_reg);
890 reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
891 ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
892 reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | 1;
893 writel(reg_val, &info->reg->pkt_reg);
895 writel(curr_cmd->pgm, &info->reg->pgm_reg);
896 while (!(readl(&info->reg->intsts_reg) &
897 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
903 printf("ERROR:%s: timedout:Xfer CMPLT\n", __func__);
907 reg_val = readl(&info->reg->intsts_enr);
908 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
909 &info->reg->intsts_enr);
910 reg_val = readl(&info->reg->intsts_reg);
911 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
912 &info->reg->intsts_reg);
917 static int arasan_nand_send_rdcmd(struct arasan_nand_command_format *curr_cmd,
918 int column, int page_addr, struct mtd_info *mtd)
920 struct nand_chip *chip = mtd_to_nand(mtd);
921 struct nand_drv *info = nand_get_controller_data(chip);
922 u32 reg_val, addr_cycles, page;
925 reg_val = readl(&info->reg->intsts_enr);
926 writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
927 &info->reg->intsts_enr);
929 reg_val = readl(&info->reg->cmd_reg);
930 reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
931 reg_val |= curr_cmd->cmd1 |
932 (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
934 if (curr_cmd->cmd1 == NAND_CMD_RNDOUT ||
935 curr_cmd->cmd1 == NAND_CMD_READ0) {
936 reg_val &= ~ARASAN_NAND_CMD_PG_SIZE_MASK;
937 page_val = arasan_nand_page(mtd);
938 reg_val |= (page_val << ARASAN_NAND_CMD_PG_SIZE_SHIFT);
941 reg_val &= ~ARASAN_NAND_CMD_ECC_ON_MASK;
943 reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
945 addr_cycles = arasan_nand_get_addrcycle(mtd);
947 if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
948 return ERR_ADDR_CYCLE;
950 reg_val |= (addr_cycles << 28);
951 writel(reg_val, &info->reg->cmd_reg);
956 page = (page_addr << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
957 ARASAN_NAND_MEM_ADDR1_PAGE_MASK;
958 column &= ARASAN_NAND_MEM_ADDR1_COL_MASK;
959 writel(page | column, &info->reg->memadr_reg1);
961 reg_val = readl(&info->reg->memadr_reg2);
962 reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
963 reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
964 writel(reg_val, &info->reg->memadr_reg2);
971 static void arasan_nand_read_buf(struct mtd_info *mtd, u8 *buf, int size)
973 struct nand_chip *chip = mtd_to_nand(mtd);
974 struct nand_drv *info = nand_get_controller_data(chip);
976 u32 *bufptr = (u32 *)buf;
977 u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
979 reg_val = readl(&info->reg->pkt_reg);
980 reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
981 ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
982 reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | size;
983 writel(reg_val, &info->reg->pkt_reg);
985 writel(curr_cmd->pgm, &info->reg->pgm_reg);
987 while (!(readl(&info->reg->intsts_reg) &
988 ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK) && timeout) {
994 puts("ERROR:arasan_nand_read_buf timedout:Buff RDY\n");
996 reg_val = readl(&info->reg->intsts_enr);
997 reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
998 writel(reg_val, &info->reg->intsts_enr);
1000 writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
1001 &info->reg->intsts_enr);
1002 reg_val = readl(&info->reg->intsts_reg);
1003 writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
1004 &info->reg->intsts_reg);
1007 for (i = 0; i < size / 4; i++)
1008 bufptr[i] = readl(&info->reg->buf_dataport);
1011 bufptr[i] = readl(&info->reg->buf_dataport);
1013 timeout = ARASAN_NAND_POLL_TIMEOUT;
1015 while (!(readl(&info->reg->intsts_reg) &
1016 ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
1022 puts("ERROR:arasan_nand_read_buf timedout:Xfer CMPLT\n");
1024 reg_val = readl(&info->reg->intsts_enr);
1025 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
1026 &info->reg->intsts_enr);
1027 reg_val = readl(&info->reg->intsts_reg);
1028 writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
1029 &info->reg->intsts_reg);
1032 static u8 arasan_nand_read_byte(struct mtd_info *mtd)
1034 struct nand_chip *chip = mtd_to_nand(mtd);
1035 struct nand_drv *info = nand_get_controller_data(chip);
1038 struct nand_onfi_params *p;
1040 if (buf_index == 0) {
1041 p = &chip->onfi_params;
1042 if (curr_cmd->cmd1 == NAND_CMD_READID)
1044 else if (curr_cmd->cmd1 == NAND_CMD_PARAM)
1045 size = sizeof(struct nand_onfi_params);
1046 else if (curr_cmd->cmd1 == NAND_CMD_RNDOUT)
1047 size = le16_to_cpu(p->ext_param_page_length) * 16;
1048 else if (curr_cmd->cmd1 == NAND_CMD_GET_FEATURES)
1050 else if (curr_cmd->cmd1 == NAND_CMD_STATUS)
1051 return readb(&info->reg->flash_sts_reg);
1054 chip->read_buf(mtd, &buf_data[0], size);
1057 val = *(&buf_data[0] + buf_index);
1063 static void arasan_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
1064 int column, int page_addr)
1066 struct nand_chip *chip = mtd_to_nand(mtd);
1067 struct nand_drv *info = nand_get_controller_data(chip);
1068 struct nand_config *nand = &info->config;
1072 writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
1073 &info->reg->intsts_enr);
1075 if ((command == NAND_CMD_READOOB) &&
1076 (mtd->writesize > 512)) {
1077 column += mtd->writesize;
1078 command = NAND_CMD_READ0;
1081 /* Get the command format */
1082 for (i = 0; (arasan_nand_commands[i].cmd1 != NAND_CMD_NONE ||
1083 arasan_nand_commands[i].cmd2 != NAND_CMD_NONE); i++) {
1084 if (command == arasan_nand_commands[i].cmd1) {
1085 curr_cmd = &arasan_nand_commands[i];
1090 if (curr_cmd == NULL) {
1091 printf("Unsupported Command; 0x%x\n", command);
1095 if (curr_cmd->cmd1 == NAND_CMD_RESET)
1096 ret = arasan_nand_reset(mtd, curr_cmd);
1098 if ((curr_cmd->cmd1 == NAND_CMD_READID) ||
1099 (curr_cmd->cmd1 == NAND_CMD_PARAM) ||
1100 (curr_cmd->cmd1 == NAND_CMD_RNDOUT) ||
1101 (curr_cmd->cmd1 == NAND_CMD_GET_FEATURES) ||
1102 (curr_cmd->cmd1 == NAND_CMD_READ0))
1103 ret = arasan_nand_send_rdcmd(curr_cmd, column, page_addr, mtd);
1105 if ((curr_cmd->cmd1 == NAND_CMD_SET_FEATURES) ||
1106 (curr_cmd->cmd1 == NAND_CMD_SEQIN)) {
1107 nand->page = page_addr;
1108 ret = arasan_nand_send_wrcmd(curr_cmd, column, page_addr, mtd);
1111 if (curr_cmd->cmd1 == NAND_CMD_ERASE1)
1112 ret = arasan_nand_erase(curr_cmd, column, page_addr, mtd);
1114 if (curr_cmd->cmd1 == NAND_CMD_STATUS)
1115 ret = arasan_nand_read_status(curr_cmd, column, page_addr, mtd);
1118 printf("ERROR:%s:command:0x%x\n", __func__, curr_cmd->cmd1);
1121 static void arasan_check_ondie(struct mtd_info *mtd)
1123 struct nand_chip *nand_chip = mtd_to_nand(mtd);
1124 struct nand_drv *info = nand_get_controller_data(nand_chip);
1125 struct nand_config *nand = &info->config;
1128 u8 set_feature[4] = {ENABLE_ONDIE_ECC, 0x00, 0x00, 0x00};
1131 nand_chip->select_chip(mtd, 0);
1133 /* Send the command for reading device ID */
1134 nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1135 nand_chip->cmdfunc(mtd, NAND_CMD_READID, 0, -1);
1137 /* Read manufacturer and device IDs */
1138 maf_id = nand_chip->read_byte(mtd);
1139 dev_id = nand_chip->read_byte(mtd);
1141 if ((maf_id == NAND_MFR_MICRON) &&
1142 ((dev_id == 0xf1) || (dev_id == 0xa1) || (dev_id == 0xb1) ||
1143 (dev_id == 0xaa) || (dev_id == 0xba) || (dev_id == 0xda) ||
1144 (dev_id == 0xca) || (dev_id == 0xac) || (dev_id == 0xbc) ||
1145 (dev_id == 0xdc) || (dev_id == 0xcc) || (dev_id == 0xa3) ||
1146 (dev_id == 0xb3) || (dev_id == 0xd3) || (dev_id == 0xc3))) {
1147 nand_chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES,
1148 ONDIE_ECC_FEATURE_ADDR, -1);
1150 nand_chip->write_buf(mtd, &set_feature[0], 4);
1151 nand_chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES,
1152 ONDIE_ECC_FEATURE_ADDR, -1);
1154 for (i = 0; i < 4; i++)
1155 get_feature[i] = nand_chip->read_byte(mtd);
1157 if (get_feature[0] & ENABLE_ONDIE_ECC) {
1158 nand->on_die_ecc_enabled = true;
1159 printf("On-DIE ECC Enabled\n");
1161 printf("%s: Unable to enable OnDie ECC\n", __func__);
1164 /* Use the BBT pattern descriptors */
1165 nand_chip->bbt_td = &bbt_main_descr;
1166 nand_chip->bbt_md = &bbt_mirror_descr;
1170 static int arasan_nand_ecc_init(struct mtd_info *mtd)
1172 struct nand_chip *nand_chip = mtd_to_nand(mtd);
1173 struct nand_drv *info = nand_get_controller_data(nand_chip);
1175 u32 regval, eccpos_start, i, eccaddr;
1177 for (i = 0; i < ARRAY_SIZE(ecc_matrix); i++) {
1178 if ((ecc_matrix[i].pagesize == mtd->writesize) &&
1179 (ecc_matrix[i].ecc_codeword_size >=
1180 nand_chip->ecc_step_ds)) {
1181 if (ecc_matrix[i].eccbits >=
1182 nand_chip->ecc_strength_ds) {
1193 eccaddr = mtd->writesize + mtd->oobsize -
1194 ecc_matrix[found].eccsize;
1197 (ecc_matrix[found].eccsize << ARASAN_NAND_ECC_SIZE_SHIFT) |
1198 (ecc_matrix[found].bch << ARASAN_NAND_ECC_BCH_SHIFT);
1199 writel(regval, &info->reg->ecc_reg);
1201 if (ecc_matrix[found].bch) {
1202 regval = readl(&info->reg->memadr_reg2);
1203 regval &= ~ARASAN_NAND_MEM_ADDR2_BCH_MASK;
1204 regval |= (ecc_matrix[found].bchval <<
1205 ARASAN_NAND_MEM_ADDR2_BCH_SHIFT);
1206 writel(regval, &info->reg->memadr_reg2);
1209 nand_oob.eccbytes = ecc_matrix[found].eccsize;
1210 eccpos_start = mtd->oobsize - nand_oob.eccbytes;
1212 for (i = 0; i < nand_oob.eccbytes; i++)
1213 nand_oob.eccpos[i] = eccpos_start + i;
1215 nand_oob.oobfree[0].offset = 2;
1216 nand_oob.oobfree[0].length = eccpos_start - 2;
1218 nand_chip->ecc.size = ecc_matrix[found].ecc_codeword_size;
1219 nand_chip->ecc.strength = ecc_matrix[found].eccbits;
1220 nand_chip->ecc.bytes = ecc_matrix[found].eccsize;
1221 nand_chip->ecc.layout = &nand_oob;
1226 static int arasan_probe(struct udevice *dev)
1228 struct arasan_nand_info *arasan = dev_get_priv(dev);
1229 struct nand_chip *nand_chip = &arasan->nand_chip;
1230 struct nand_drv *info = &arasan->nand_ctrl;
1231 struct nand_config *nand = &info->config;
1232 struct mtd_info *mtd;
1235 info->reg = (struct nand_regs *)dev_read_addr(dev);
1236 mtd = nand_to_mtd(nand_chip);
1237 nand_set_controller_data(nand_chip, &arasan->nand_ctrl);
1239 #ifdef CONFIG_SYS_NAND_NO_SUBPAGE_WRITE
1240 nand_chip->options |= NAND_NO_SUBPAGE_WRITE;
1243 /* Set the driver entry points for MTD */
1244 nand_chip->cmdfunc = arasan_nand_cmd_function;
1245 nand_chip->select_chip = arasan_nand_select_chip;
1246 nand_chip->read_byte = arasan_nand_read_byte;
1248 /* Buffer read/write routines */
1249 nand_chip->read_buf = arasan_nand_read_buf;
1250 nand_chip->write_buf = arasan_nand_write_buf;
1251 nand_chip->bbt_options = NAND_BBT_USE_FLASH;
1253 writel(0x0, &info->reg->cmd_reg);
1254 writel(0x0, &info->reg->pgm_reg);
1256 /* first scan to find the device and get the page size */
1257 if (nand_scan_ident(mtd, CONFIG_SYS_NAND_MAX_CHIPS, NULL)) {
1258 printf("%s: nand_scan_ident failed\n", __func__);
1262 nand_chip->ecc.mode = NAND_ECC_HW;
1263 nand_chip->ecc.hwctl = NULL;
1264 nand_chip->ecc.read_page = arasan_nand_read_page_hwecc;
1265 nand_chip->ecc.write_page = arasan_nand_write_page_hwecc;
1266 nand_chip->ecc.read_oob = arasan_nand_read_oob;
1267 nand_chip->ecc.write_oob = arasan_nand_write_oob;
1269 arasan_check_ondie(mtd);
1272 * If on die supported, then give priority to on-die ecc and use
1273 * it instead of controller ecc.
1275 if (nand->on_die_ecc_enabled) {
1276 nand_chip->ecc.strength = 1;
1277 nand_chip->ecc.size = mtd->writesize;
1278 nand_chip->ecc.bytes = 0;
1279 nand_chip->ecc.layout = &ondie_nand_oob_64;
1281 if (arasan_nand_ecc_init(mtd)) {
1282 printf("%s: nand_ecc_init failed\n", __func__);
1287 if (nand_scan_tail(mtd)) {
1288 printf("%s: nand_scan_tail failed\n", __func__);
1292 if (nand_register(0, mtd)) {
1293 printf("Nand Register Fail\n");
1303 static const struct udevice_id arasan_nand_dt_ids[] = {
1304 {.compatible = "arasan,nfc-v3p10",},
1308 U_BOOT_DRIVER(arasan_nand) = {
1309 .name = "arasan_nand",
1311 .of_match = arasan_nand_dt_ids,
1312 .probe = arasan_probe,
1313 .priv_auto = sizeof(struct arasan_nand_info),
1316 void board_nand_init(void)
1318 struct udevice *dev;
1321 ret = uclass_get_device_by_driver(UCLASS_MTD,
1322 DM_DRIVER_GET(arasan_nand), &dev);
1323 if (ret && ret != -ENODEV)
1324 pr_err("Failed to initialize %s. (error %d)\n", dev->name, ret);