xref: /openbmc/u-boot/drivers/mtd/nand/raw/arasan_nfc.c (revision 5c8fd32b)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Arasan NAND Flash Controller Driver
4  *
5  * Copyright (C) 2014 - 2015 Xilinx, Inc.
6  */
7 
8 #include <common.h>
9 #include <malloc.h>
10 #include <asm/io.h>
11 #include <linux/errno.h>
12 #include <linux/mtd/mtd.h>
13 #include <linux/mtd/rawnand.h>
14 #include <linux/mtd/partitions.h>
15 #include <linux/mtd/nand_ecc.h>
16 #include <asm/arch/hardware.h>
17 #include <asm/arch/sys_proto.h>
18 #include <nand.h>
19 
20 struct arasan_nand_info {
21 	void __iomem *nand_base;
22 	u32 page;
23 	bool on_die_ecc_enabled;
24 };
25 
26 struct nand_regs {
27 	u32 pkt_reg;
28 	u32 memadr_reg1;
29 	u32 memadr_reg2;
30 	u32 cmd_reg;
31 	u32 pgm_reg;
32 	u32 intsts_enr;
33 	u32 intsig_enr;
34 	u32 intsts_reg;
35 	u32 rdy_busy;
36 	u32 cms_sysadr_reg;
37 	u32 flash_sts_reg;
38 	u32 tmg_reg;
39 	u32 buf_dataport;
40 	u32 ecc_reg;
41 	u32 ecc_errcnt_reg;
42 	u32 ecc_sprcmd_reg;
43 	u32 errcnt_1bitreg;
44 	u32 errcnt_2bitreg;
45 	u32 errcnt_3bitreg;
46 	u32 errcnt_4bitreg;
47 	u32 dma_sysadr0_reg;
48 	u32 dma_bufbdry_reg;
49 	u32 cpu_rls_reg;
50 	u32 errcnt_5bitreg;
51 	u32 errcnt_6bitreg;
52 	u32 errcnt_7bitreg;
53 	u32 errcnt_8bitreg;
54 	u32 data_if_reg;
55 };
56 
57 #define arasan_nand_base ((struct nand_regs __iomem *)ARASAN_NAND_BASEADDR)
58 
59 struct arasan_nand_command_format {
60 	u8 cmd1;
61 	u8 cmd2;
62 	u8 addr_cycles;
63 	u32 pgm;
64 };
65 
66 #define ONDIE_ECC_FEATURE_ADDR			0x90
67 #define ENABLE_ONDIE_ECC			0x08
68 
69 #define ARASAN_PROG_RD_MASK			0x00000001
70 #define ARASAN_PROG_BLK_ERS_MASK		0x00000004
71 #define ARASAN_PROG_RD_ID_MASK			0x00000040
72 #define ARASAN_PROG_RD_STS_MASK			0x00000008
73 #define ARASAN_PROG_PG_PROG_MASK		0x00000010
74 #define ARASAN_PROG_RD_PARAM_PG_MASK		0x00000080
75 #define ARASAN_PROG_RST_MASK			0x00000100
76 #define ARASAN_PROG_GET_FTRS_MASK		0x00000200
77 #define ARASAN_PROG_SET_FTRS_MASK		0x00000400
78 #define ARASAN_PROG_CHNG_ROWADR_END_MASK	0x00400000
79 
80 #define ARASAN_NAND_CMD_ECC_ON_MASK		0x80000000
81 #define ARASAN_NAND_CMD_CMD12_MASK		0xFFFF
82 #define ARASAN_NAND_CMD_PG_SIZE_MASK		0x3800000
83 #define ARASAN_NAND_CMD_PG_SIZE_SHIFT		23
84 #define ARASAN_NAND_CMD_CMD2_SHIFT		8
85 #define ARASAN_NAND_CMD_ADDR_CYCL_MASK		0x70000000
86 #define ARASAN_NAND_CMD_ADDR_CYCL_SHIFT		28
87 
88 #define ARASAN_NAND_MEM_ADDR1_PAGE_MASK		0xFFFF0000
89 #define ARASAN_NAND_MEM_ADDR1_COL_MASK		0xFFFF
90 #define ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT	16
91 #define ARASAN_NAND_MEM_ADDR2_PAGE_MASK		0xFF
92 #define ARASAN_NAND_MEM_ADDR2_CS_MASK		0xC0000000
93 #define ARASAN_NAND_MEM_ADDR2_BCH_MASK		0xE000000
94 #define ARASAN_NAND_MEM_ADDR2_BCH_SHIFT		25
95 
96 #define ARASAN_NAND_INT_STS_ERR_EN_MASK		0x10
97 #define ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK	0x08
98 #define ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK	0x02
99 #define ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK	0x01
100 #define ARASAN_NAND_INT_STS_XFR_CMPLT_MASK	0x04
101 
102 #define ARASAN_NAND_PKT_REG_PKT_CNT_MASK	0xFFF000
103 #define ARASAN_NAND_PKT_REG_PKT_SIZE_MASK	0x7FF
104 #define ARASAN_NAND_PKT_REG_PKT_CNT_SHFT	12
105 
106 #define ARASAN_NAND_ROW_ADDR_CYCL_MASK		0x0F
107 #define ARASAN_NAND_COL_ADDR_CYCL_MASK		0xF0
108 #define ARASAN_NAND_COL_ADDR_CYCL_SHIFT		4
109 
110 #define ARASAN_NAND_ECC_SIZE_SHIFT		16
111 #define ARASAN_NAND_ECC_BCH_SHIFT		27
112 
113 #define ARASAN_NAND_PKTSIZE_1K			1024
114 #define ARASAN_NAND_PKTSIZE_512			512
115 
116 #define ARASAN_NAND_POLL_TIMEOUT		1000000
117 #define ARASAN_NAND_INVALID_ADDR_CYCL		0xFF
118 
119 #define ERR_ADDR_CYCLE				-1
120 #define READ_BUFF_SIZE				0x4000
121 
122 static struct arasan_nand_command_format *curr_cmd;
123 
124 enum addr_cycles {
125 	NAND_ADDR_CYCL_NONE,
126 	NAND_ADDR_CYCL_ONE,
127 	NAND_ADDR_CYCL_ROW,
128 	NAND_ADDR_CYCL_COL,
129 	NAND_ADDR_CYCL_BOTH,
130 };
131 
132 static struct arasan_nand_command_format arasan_nand_commands[] = {
133 	{NAND_CMD_READ0, NAND_CMD_READSTART, NAND_ADDR_CYCL_BOTH,
134 	 ARASAN_PROG_RD_MASK},
135 	{NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, NAND_ADDR_CYCL_COL,
136 	 ARASAN_PROG_RD_MASK},
137 	{NAND_CMD_READID, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
138 	 ARASAN_PROG_RD_ID_MASK},
139 	{NAND_CMD_STATUS, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE,
140 	 ARASAN_PROG_RD_STS_MASK},
141 	{NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, NAND_ADDR_CYCL_BOTH,
142 	 ARASAN_PROG_PG_PROG_MASK},
143 	{NAND_CMD_RNDIN, NAND_CMD_NONE, NAND_ADDR_CYCL_COL,
144 	 ARASAN_PROG_CHNG_ROWADR_END_MASK},
145 	{NAND_CMD_ERASE1, NAND_CMD_ERASE2, NAND_ADDR_CYCL_ROW,
146 	 ARASAN_PROG_BLK_ERS_MASK},
147 	{NAND_CMD_RESET, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE,
148 	 ARASAN_PROG_RST_MASK},
149 	{NAND_CMD_PARAM, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
150 	 ARASAN_PROG_RD_PARAM_PG_MASK},
151 	{NAND_CMD_GET_FEATURES, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
152 	 ARASAN_PROG_GET_FTRS_MASK},
153 	{NAND_CMD_SET_FEATURES, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
154 	 ARASAN_PROG_SET_FTRS_MASK},
155 	{NAND_CMD_NONE, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE, 0},
156 };
157 
158 struct arasan_ecc_matrix {
159 	u32 pagesize;
160 	u32 ecc_codeword_size;
161 	u8 eccbits;
162 	u8 bch;
163 	u8 bchval;
164 	u16 eccaddr;
165 	u16 eccsize;
166 };
167 
168 static const struct arasan_ecc_matrix ecc_matrix[] = {
169 	{512, 512, 1, 0, 0, 0x20D, 0x3},
170 	{512, 512, 4, 1, 3, 0x209, 0x7},
171 	{512, 512, 8, 1, 2, 0x203, 0xD},
172 	/*
173 	 * 2K byte page
174 	 */
175 	{2048, 512, 1, 0, 0, 0x834, 0xC},
176 	{2048, 512, 4, 1, 3, 0x826, 0x1A},
177 	{2048, 512, 8, 1, 2, 0x80c, 0x34},
178 	{2048, 512, 12, 1, 1, 0x822, 0x4E},
179 	{2048, 512, 16, 1, 0, 0x808, 0x68},
180 	{2048, 1024, 24, 1, 4, 0x81c, 0x54},
181 	/*
182 	 * 4K byte page
183 	 */
184 	{4096, 512, 1, 0, 0, 0x1068, 0x18},
185 	{4096, 512, 4, 1, 3, 0x104c, 0x34},
186 	{4096, 512, 8, 1, 2, 0x1018, 0x68},
187 	{4096, 512, 12, 1, 1, 0x1044, 0x9C},
188 	{4096, 512, 16, 1, 0, 0x1010, 0xD0},
189 	{4096, 1024, 24, 1, 4, 0x1038, 0xA8},
190 	/*
191 	 * 8K byte page
192 	 */
193 	{8192, 512, 1, 0, 0, 0x20d0, 0x30},
194 	{8192, 512, 4, 1, 3, 0x2098, 0x68},
195 	{8192, 512, 8, 1, 2, 0x2030, 0xD0},
196 	{8192, 512, 12, 1, 1, 0x2088, 0x138},
197 	{8192, 512, 16, 1, 0, 0x2020, 0x1A0},
198 	{8192, 1024, 24, 1, 4, 0x2070, 0x150},
199 	/*
200 	 * 16K byte page
201 	 */
202 	{16384, 512, 1, 0, 0, 0x4460, 0x60},
203 	{16384, 512, 4, 1, 3, 0x43f0, 0xD0},
204 	{16384, 512, 8, 1, 2, 0x4320, 0x1A0},
205 	{16384, 512, 12, 1, 1, 0x4250, 0x270},
206 	{16384, 512, 16, 1, 0, 0x4180, 0x340},
207 	{16384, 1024, 24, 1, 4, 0x4220, 0x2A0}
208 };
209 
210 static struct nand_ecclayout ondie_nand_oob_64 = {
211 	.eccbytes = 32,
212 
213 	.eccpos = {
214 		8, 9, 10, 11, 12, 13, 14, 15,
215 		24, 25, 26, 27, 28, 29, 30, 31,
216 		40, 41, 42, 43, 44, 45, 46, 47,
217 		56, 57, 58, 59, 60, 61, 62, 63
218 	},
219 
220 	.oobfree = {
221 		{ .offset = 4, .length = 4 },
222 		{ .offset = 20, .length = 4 },
223 		{ .offset = 36, .length = 4 },
224 		{ .offset = 52, .length = 4 }
225 	}
226 };
227 
228 /*
229  * bbt decriptors for chips with on-die ECC and
230  * chips with 64-byte OOB
231  */
232 static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
233 static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
234 
235 static struct nand_bbt_descr bbt_main_descr = {
236 	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
237 		NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
238 	.offs = 4,
239 	.len = 4,
240 	.veroffs = 20,
241 	.maxblocks = 4,
242 	.pattern = bbt_pattern
243 };
244 
245 static struct nand_bbt_descr bbt_mirror_descr = {
246 	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
247 		NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
248 	.offs = 4,
249 	.len = 4,
250 	.veroffs = 20,
251 	.maxblocks = 4,
252 	.pattern = mirror_pattern
253 };
254 
255 static u8 buf_data[READ_BUFF_SIZE];
256 static u32 buf_index;
257 
258 static struct nand_ecclayout nand_oob;
259 
260 static struct nand_chip nand_chip[CONFIG_SYS_MAX_NAND_DEVICE];
261 
262 static void arasan_nand_select_chip(struct mtd_info *mtd, int chip)
263 {
264 }
265 
266 static void arasan_nand_enable_ecc(void)
267 {
268 	u32 reg_val;
269 
270 	reg_val = readl(&arasan_nand_base->cmd_reg);
271 	reg_val |= ARASAN_NAND_CMD_ECC_ON_MASK;
272 
273 	writel(reg_val, &arasan_nand_base->cmd_reg);
274 }
275 
276 static u8 arasan_nand_get_addrcycle(struct mtd_info *mtd)
277 {
278 	u8 addrcycles;
279 	struct nand_chip *chip = mtd_to_nand(mtd);
280 
281 	switch (curr_cmd->addr_cycles) {
282 	case NAND_ADDR_CYCL_NONE:
283 		addrcycles = 0;
284 		break;
285 	case NAND_ADDR_CYCL_ONE:
286 		addrcycles = 1;
287 		break;
288 	case NAND_ADDR_CYCL_ROW:
289 		addrcycles = chip->onfi_params.addr_cycles &
290 			     ARASAN_NAND_ROW_ADDR_CYCL_MASK;
291 		break;
292 	case NAND_ADDR_CYCL_COL:
293 		addrcycles = (chip->onfi_params.addr_cycles &
294 			      ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
295 			      ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
296 		break;
297 	case NAND_ADDR_CYCL_BOTH:
298 		addrcycles = chip->onfi_params.addr_cycles &
299 			     ARASAN_NAND_ROW_ADDR_CYCL_MASK;
300 		addrcycles += (chip->onfi_params.addr_cycles &
301 			       ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
302 			       ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
303 		break;
304 	default:
305 		addrcycles = ARASAN_NAND_INVALID_ADDR_CYCL;
306 		break;
307 	}
308 	return addrcycles;
309 }
310 
311 static int arasan_nand_read_page(struct mtd_info *mtd, u8 *buf, u32 size)
312 {
313 	struct nand_chip *chip = mtd_to_nand(mtd);
314 	struct arasan_nand_info *nand = nand_get_controller_data(chip);
315 	u32 reg_val, i, pktsize, pktnum;
316 	u32 *bufptr = (u32 *)buf;
317 	u32 timeout;
318 	u32  rdcount = 0;
319 	u8 addr_cycles;
320 
321 	if (chip->ecc_step_ds >= ARASAN_NAND_PKTSIZE_1K)
322 		pktsize = ARASAN_NAND_PKTSIZE_1K;
323 	else
324 		pktsize = ARASAN_NAND_PKTSIZE_512;
325 
326 	if (size % pktsize)
327 		pktnum = size/pktsize + 1;
328 	else
329 		pktnum = size/pktsize;
330 
331 	reg_val = readl(&arasan_nand_base->intsts_enr);
332 	reg_val |= ARASAN_NAND_INT_STS_ERR_EN_MASK |
333 		   ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK;
334 	writel(reg_val, &arasan_nand_base->intsts_enr);
335 
336 	reg_val = readl(&arasan_nand_base->pkt_reg);
337 	reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
338 		     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
339 	reg_val |= (pktnum << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) |
340 		    pktsize;
341 	writel(reg_val, &arasan_nand_base->pkt_reg);
342 
343 	if (!nand->on_die_ecc_enabled) {
344 		arasan_nand_enable_ecc();
345 		addr_cycles = arasan_nand_get_addrcycle(mtd);
346 		if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
347 			return ERR_ADDR_CYCLE;
348 
349 		writel((NAND_CMD_RNDOUTSTART << ARASAN_NAND_CMD_CMD2_SHIFT) |
350 		       NAND_CMD_RNDOUT | (addr_cycles <<
351 		       ARASAN_NAND_CMD_ADDR_CYCL_SHIFT),
352 		       &arasan_nand_base->ecc_sprcmd_reg);
353 	}
354 	writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg);
355 
356 	while (rdcount < pktnum) {
357 		timeout = ARASAN_NAND_POLL_TIMEOUT;
358 		while (!(readl(&arasan_nand_base->intsts_reg) &
359 			ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK) && timeout) {
360 			udelay(1);
361 			timeout--;
362 		}
363 		if (!timeout) {
364 			puts("arasan_read_page: timedout:Buff RDY\n");
365 			return -ETIMEDOUT;
366 		}
367 
368 		rdcount++;
369 
370 		if (pktnum == rdcount) {
371 			reg_val = readl(&arasan_nand_base->intsts_enr);
372 			reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
373 			writel(reg_val, &arasan_nand_base->intsts_enr);
374 		} else {
375 			reg_val = readl(&arasan_nand_base->intsts_enr);
376 			writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
377 			       &arasan_nand_base->intsts_enr);
378 		}
379 		reg_val = readl(&arasan_nand_base->intsts_reg);
380 		writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
381 		       &arasan_nand_base->intsts_reg);
382 
383 		for (i = 0; i < pktsize/4; i++)
384 			bufptr[i] = readl(&arasan_nand_base->buf_dataport);
385 
386 
387 		bufptr += pktsize/4;
388 
389 		if (rdcount >= pktnum)
390 			break;
391 
392 		writel(ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
393 		       &arasan_nand_base->intsts_enr);
394 	}
395 
396 	timeout = ARASAN_NAND_POLL_TIMEOUT;
397 
398 	while (!(readl(&arasan_nand_base->intsts_reg) &
399 		ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
400 		udelay(1);
401 		timeout--;
402 	}
403 	if (!timeout) {
404 		puts("arasan rd_page timedout:Xfer CMPLT\n");
405 		return -ETIMEDOUT;
406 	}
407 
408 	reg_val = readl(&arasan_nand_base->intsts_enr);
409 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
410 	       &arasan_nand_base->intsts_enr);
411 	reg_val = readl(&arasan_nand_base->intsts_reg);
412 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
413 	       &arasan_nand_base->intsts_reg);
414 
415 	if (!nand->on_die_ecc_enabled) {
416 		if (readl(&arasan_nand_base->intsts_reg) &
417 		    ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK) {
418 			printf("arasan rd_page:sbiterror\n");
419 			return -1;
420 		}
421 
422 		if (readl(&arasan_nand_base->intsts_reg) &
423 		    ARASAN_NAND_INT_STS_ERR_EN_MASK) {
424 			mtd->ecc_stats.failed++;
425 			printf("arasan rd_page:multibiterror\n");
426 			return -1;
427 		}
428 	}
429 
430 	return 0;
431 }
432 
433 static int arasan_nand_read_page_hwecc(struct mtd_info *mtd,
434 		struct nand_chip *chip, u8 *buf, int oob_required, int page)
435 {
436 	int status;
437 
438 	status = arasan_nand_read_page(mtd, buf, (mtd->writesize));
439 
440 	if (oob_required)
441 		chip->ecc.read_oob(mtd, chip, page);
442 
443 	return status;
444 }
445 
446 static void arasan_nand_fill_tx(const u8 *buf, int len)
447 {
448 	u32 __iomem *nand = &arasan_nand_base->buf_dataport;
449 
450 	if (((unsigned long)buf & 0x3) != 0) {
451 		if (((unsigned long)buf & 0x1) != 0) {
452 			if (len) {
453 				writeb(*buf, nand);
454 				buf += 1;
455 				len--;
456 			}
457 		}
458 
459 		if (((unsigned long)buf & 0x3) != 0) {
460 			if (len >= 2) {
461 				writew(*(u16 *)buf, nand);
462 				buf += 2;
463 				len -= 2;
464 			}
465 		}
466 	}
467 
468 	while (len >= 4) {
469 		writel(*(u32 *)buf, nand);
470 		buf += 4;
471 		len -= 4;
472 	}
473 
474 	if (len) {
475 		if (len >= 2) {
476 			writew(*(u16 *)buf, nand);
477 			buf += 2;
478 			len -= 2;
479 		}
480 
481 		if (len)
482 			writeb(*buf, nand);
483 	}
484 }
485 
486 static int arasan_nand_write_page_hwecc(struct mtd_info *mtd,
487 		struct nand_chip *chip, const u8 *buf, int oob_required,
488 		int page)
489 {
490 	u32 reg_val, i, pktsize, pktnum;
491 	const u32 *bufptr = (const u32 *)buf;
492 	u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
493 	u32 size = mtd->writesize;
494 	u32 rdcount = 0;
495 	u8 column_addr_cycles;
496 	struct arasan_nand_info *nand = nand_get_controller_data(chip);
497 
498 	if (chip->ecc_step_ds >= ARASAN_NAND_PKTSIZE_1K)
499 		pktsize = ARASAN_NAND_PKTSIZE_1K;
500 	else
501 		pktsize = ARASAN_NAND_PKTSIZE_512;
502 
503 	if (size % pktsize)
504 		pktnum = size/pktsize + 1;
505 	else
506 		pktnum = size/pktsize;
507 
508 	reg_val = readl(&arasan_nand_base->pkt_reg);
509 	reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
510 		     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
511 	reg_val |= (pktnum << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | pktsize;
512 	writel(reg_val, &arasan_nand_base->pkt_reg);
513 
514 	if (!nand->on_die_ecc_enabled) {
515 		arasan_nand_enable_ecc();
516 		column_addr_cycles = (chip->onfi_params.addr_cycles &
517 				      ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
518 				      ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
519 		writel((NAND_CMD_RNDIN | (column_addr_cycles << 28)),
520 		       &arasan_nand_base->ecc_sprcmd_reg);
521 	}
522 	writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg);
523 
524 	while (rdcount < pktnum) {
525 		timeout = ARASAN_NAND_POLL_TIMEOUT;
526 		while (!(readl(&arasan_nand_base->intsts_reg) &
527 			ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK) && timeout) {
528 			udelay(1);
529 			timeout--;
530 		}
531 
532 		if (!timeout) {
533 			puts("arasan_write_page: timedout:Buff RDY\n");
534 			return -ETIMEDOUT;
535 		}
536 
537 		rdcount++;
538 
539 		if (pktnum == rdcount) {
540 			reg_val = readl(&arasan_nand_base->intsts_enr);
541 			reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
542 			writel(reg_val, &arasan_nand_base->intsts_enr);
543 		} else {
544 			reg_val = readl(&arasan_nand_base->intsts_enr);
545 			writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
546 			       &arasan_nand_base->intsts_enr);
547 		}
548 
549 		reg_val = readl(&arasan_nand_base->intsts_reg);
550 		writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
551 		       &arasan_nand_base->intsts_reg);
552 
553 		for (i = 0; i < pktsize/4; i++)
554 			writel(bufptr[i], &arasan_nand_base->buf_dataport);
555 
556 		bufptr += pktsize/4;
557 
558 		if (rdcount >= pktnum)
559 			break;
560 
561 		writel(ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
562 		       &arasan_nand_base->intsts_enr);
563 	}
564 
565 	timeout = ARASAN_NAND_POLL_TIMEOUT;
566 
567 	while (!(readl(&arasan_nand_base->intsts_reg) &
568 		ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
569 		udelay(1);
570 		timeout--;
571 	}
572 	if (!timeout) {
573 		puts("arasan write_page timedout:Xfer CMPLT\n");
574 		return -ETIMEDOUT;
575 	}
576 
577 	reg_val = readl(&arasan_nand_base->intsts_enr);
578 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
579 	       &arasan_nand_base->intsts_enr);
580 	reg_val = readl(&arasan_nand_base->intsts_reg);
581 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
582 	       &arasan_nand_base->intsts_reg);
583 
584 	if (oob_required)
585 		chip->ecc.write_oob(mtd, chip, nand->page);
586 
587 	return 0;
588 }
589 
590 static int arasan_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
591 				int page)
592 {
593 	chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
594 	chip->read_buf(mtd, chip->oob_poi, (mtd->oobsize));
595 
596 	return 0;
597 }
598 
599 static int arasan_nand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
600 				 int page)
601 {
602 	int status = 0;
603 	const u8 *buf = chip->oob_poi;
604 
605 	chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
606 	chip->write_buf(mtd, buf, mtd->oobsize);
607 
608 	return status;
609 }
610 
611 static int arasan_nand_reset(struct arasan_nand_command_format *curr_cmd)
612 {
613 	u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
614 	u32 cmd_reg = 0;
615 
616 	writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
617 	       &arasan_nand_base->intsts_enr);
618 	cmd_reg = readl(&arasan_nand_base->cmd_reg);
619 	cmd_reg &= ~ARASAN_NAND_CMD_CMD12_MASK;
620 
621 	cmd_reg |= curr_cmd->cmd1 |
622 		  (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
623 	writel(cmd_reg, &arasan_nand_base->cmd_reg);
624 	writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg);
625 
626 	while (!(readl(&arasan_nand_base->intsts_reg) &
627 		ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
628 		udelay(1);
629 		timeout--;
630 	}
631 	if (!timeout) {
632 		printf("ERROR:%s timedout\n", __func__);
633 		return -ETIMEDOUT;
634 	}
635 
636 	writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
637 	       &arasan_nand_base->intsts_enr);
638 
639 	writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
640 	       &arasan_nand_base->intsts_reg);
641 
642 	return 0;
643 }
644 
645 static u8 arasan_nand_page(struct mtd_info *mtd)
646 {
647 	u8 page_val = 0;
648 
649 	switch (mtd->writesize) {
650 	case 512:
651 		page_val = 0;
652 		break;
653 	case 2048:
654 		page_val = 1;
655 		break;
656 	case 4096:
657 		page_val = 2;
658 		break;
659 	case 8192:
660 		page_val = 3;
661 		break;
662 	case 16384:
663 		page_val = 4;
664 		break;
665 	case 1024:
666 		page_val = 5;
667 		break;
668 	default:
669 		printf("%s:Pagesize>16K\n", __func__);
670 		break;
671 	}
672 
673 	return page_val;
674 }
675 
676 static int arasan_nand_send_wrcmd(struct arasan_nand_command_format *curr_cmd,
677 			int column, int page_addr, struct mtd_info *mtd)
678 {
679 	u32 reg_val, page;
680 	u8 page_val, addr_cycles;
681 
682 	writel(ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
683 	       &arasan_nand_base->intsts_enr);
684 	reg_val = readl(&arasan_nand_base->cmd_reg);
685 	reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
686 	reg_val |= curr_cmd->cmd1 |
687 		   (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
688 	if (curr_cmd->cmd1 == NAND_CMD_SEQIN) {
689 		reg_val &= ~ARASAN_NAND_CMD_PG_SIZE_MASK;
690 		page_val = arasan_nand_page(mtd);
691 		reg_val |= (page_val << ARASAN_NAND_CMD_PG_SIZE_SHIFT);
692 	}
693 
694 	reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
695 	addr_cycles = arasan_nand_get_addrcycle(mtd);
696 
697 	if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
698 		return ERR_ADDR_CYCLE;
699 
700 	reg_val |= (addr_cycles <<
701 		   ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
702 	writel(reg_val, &arasan_nand_base->cmd_reg);
703 
704 	if (page_addr == -1)
705 		page_addr = 0;
706 
707 	page = (page_addr << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
708 		ARASAN_NAND_MEM_ADDR1_PAGE_MASK;
709 	column &= ARASAN_NAND_MEM_ADDR1_COL_MASK;
710 	writel(page|column, &arasan_nand_base->memadr_reg1);
711 
712 	reg_val = readl(&arasan_nand_base->memadr_reg2);
713 	reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
714 	reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
715 	writel(reg_val, &arasan_nand_base->memadr_reg2);
716 	reg_val = readl(&arasan_nand_base->memadr_reg2);
717 	reg_val &= ~ARASAN_NAND_MEM_ADDR2_CS_MASK;
718 	writel(reg_val, &arasan_nand_base->memadr_reg2);
719 
720 	return 0;
721 }
722 
723 static void arasan_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
724 {
725 	u32 reg_val;
726 	u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
727 
728 	reg_val = readl(&arasan_nand_base->pkt_reg);
729 	reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
730 		     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
731 
732 	reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | len;
733 	writel(reg_val, &arasan_nand_base->pkt_reg);
734 	writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg);
735 
736 	while (!(readl(&arasan_nand_base->intsts_reg) &
737 		ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK) && timeout) {
738 		udelay(1);
739 		timeout--;
740 	}
741 
742 	if (!timeout)
743 		puts("ERROR:arasan_nand_write_buf timedout:Buff RDY\n");
744 
745 	reg_val = readl(&arasan_nand_base->intsts_enr);
746 	reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
747 	writel(reg_val, &arasan_nand_base->intsts_enr);
748 	writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
749 	       &arasan_nand_base->intsts_enr);
750 	reg_val = readl(&arasan_nand_base->intsts_reg);
751 	writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
752 	       &arasan_nand_base->intsts_reg);
753 
754 	arasan_nand_fill_tx(buf, len);
755 
756 	timeout = ARASAN_NAND_POLL_TIMEOUT;
757 	while (!(readl(&arasan_nand_base->intsts_reg) &
758 		ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
759 		udelay(1);
760 		timeout--;
761 	}
762 	if (!timeout)
763 		puts("ERROR:arasan_nand_write_buf timedout:Xfer CMPLT\n");
764 
765 	writel(readl(&arasan_nand_base->intsts_enr) |
766 	       ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
767 	       &arasan_nand_base->intsts_enr);
768 	writel(readl(&arasan_nand_base->intsts_reg) |
769 	       ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
770 	       &arasan_nand_base->intsts_reg);
771 }
772 
773 static int arasan_nand_erase(struct arasan_nand_command_format *curr_cmd,
774 			      int column, int page_addr, struct mtd_info *mtd)
775 {
776 	u32 reg_val, page;
777 	u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
778 	u8 row_addr_cycles;
779 
780 	writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
781 	       &arasan_nand_base->intsts_enr);
782 	reg_val = readl(&arasan_nand_base->cmd_reg);
783 	reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
784 	reg_val |= curr_cmd->cmd1 |
785 		   (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
786 	row_addr_cycles = arasan_nand_get_addrcycle(mtd);
787 
788 	if (row_addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
789 		return ERR_ADDR_CYCLE;
790 
791 	reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
792 	reg_val |= (row_addr_cycles <<
793 		    ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
794 
795 	writel(reg_val, &arasan_nand_base->cmd_reg);
796 
797 	page = (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
798 		ARASAN_NAND_MEM_ADDR1_COL_MASK;
799 	column = page_addr & ARASAN_NAND_MEM_ADDR1_COL_MASK;
800 	writel(column | (page << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT),
801 	       &arasan_nand_base->memadr_reg1);
802 
803 	reg_val = readl(&arasan_nand_base->memadr_reg2);
804 	reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
805 	reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
806 	writel(reg_val, &arasan_nand_base->memadr_reg2);
807 	reg_val = readl(&arasan_nand_base->memadr_reg2);
808 	reg_val &= ~ARASAN_NAND_MEM_ADDR2_CS_MASK;
809 	writel(reg_val, &arasan_nand_base->memadr_reg2);
810 	writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg);
811 
812 	while (!(readl(&arasan_nand_base->intsts_reg) &
813 		ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
814 		udelay(1);
815 		timeout--;
816 	}
817 	if (!timeout) {
818 		printf("ERROR:%s timedout:Xfer CMPLT\n", __func__);
819 		return -ETIMEDOUT;
820 	}
821 
822 	reg_val = readl(&arasan_nand_base->intsts_enr);
823 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
824 	       &arasan_nand_base->intsts_enr);
825 	reg_val = readl(&arasan_nand_base->intsts_reg);
826 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
827 	       &arasan_nand_base->intsts_reg);
828 
829 	return 0;
830 }
831 
832 static int arasan_nand_read_status(struct arasan_nand_command_format *curr_cmd,
833 				int column, int page_addr, struct mtd_info *mtd)
834 {
835 	u32 reg_val;
836 	u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
837 	u8 addr_cycles;
838 
839 	writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
840 	       &arasan_nand_base->intsts_enr);
841 	reg_val = readl(&arasan_nand_base->cmd_reg);
842 	reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
843 	reg_val |= curr_cmd->cmd1 |
844 		   (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
845 	addr_cycles = arasan_nand_get_addrcycle(mtd);
846 
847 	if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
848 		return ERR_ADDR_CYCLE;
849 
850 	reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
851 	reg_val |= (addr_cycles <<
852 		    ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
853 
854 	writel(reg_val, &arasan_nand_base->cmd_reg);
855 
856 	reg_val = readl(&arasan_nand_base->pkt_reg);
857 	reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
858 		     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
859 	reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | 1;
860 	writel(reg_val, &arasan_nand_base->pkt_reg);
861 
862 	reg_val = readl(&arasan_nand_base->memadr_reg2);
863 	reg_val &= ~ARASAN_NAND_MEM_ADDR2_CS_MASK;
864 	writel(reg_val, &arasan_nand_base->memadr_reg2);
865 
866 	writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg);
867 	while (!(readl(&arasan_nand_base->intsts_reg) &
868 		ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
869 		udelay(1);
870 		timeout--;
871 	}
872 
873 	if (!timeout) {
874 		printf("ERROR:%s: timedout:Xfer CMPLT\n", __func__);
875 		return -ETIMEDOUT;
876 	}
877 
878 	reg_val = readl(&arasan_nand_base->intsts_enr);
879 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
880 	       &arasan_nand_base->intsts_enr);
881 	reg_val = readl(&arasan_nand_base->intsts_reg);
882 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
883 	       &arasan_nand_base->intsts_reg);
884 
885 	return 0;
886 }
887 
888 static int arasan_nand_send_rdcmd(struct arasan_nand_command_format *curr_cmd,
889 			       int column, int page_addr, struct mtd_info *mtd)
890 {
891 	u32 reg_val, addr_cycles, page;
892 	u8 page_val;
893 
894 	reg_val = readl(&arasan_nand_base->intsts_enr);
895 	writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
896 	       &arasan_nand_base->intsts_enr);
897 
898 	reg_val = readl(&arasan_nand_base->cmd_reg);
899 	reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
900 	reg_val |= curr_cmd->cmd1 |
901 		   (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
902 
903 	if (curr_cmd->cmd1 == NAND_CMD_RNDOUT ||
904 	    curr_cmd->cmd1 == NAND_CMD_READ0) {
905 		reg_val &= ~ARASAN_NAND_CMD_PG_SIZE_MASK;
906 		page_val = arasan_nand_page(mtd);
907 		reg_val |= (page_val << ARASAN_NAND_CMD_PG_SIZE_SHIFT);
908 	}
909 
910 	reg_val &= ~ARASAN_NAND_CMD_ECC_ON_MASK;
911 
912 	reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
913 
914 	addr_cycles = arasan_nand_get_addrcycle(mtd);
915 
916 	if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
917 		return ERR_ADDR_CYCLE;
918 
919 	reg_val |= (addr_cycles << 28);
920 	writel(reg_val, &arasan_nand_base->cmd_reg);
921 
922 	if (page_addr == -1)
923 		page_addr = 0;
924 
925 	page = (page_addr << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
926 		ARASAN_NAND_MEM_ADDR1_PAGE_MASK;
927 	column &= ARASAN_NAND_MEM_ADDR1_COL_MASK;
928 	writel(page | column, &arasan_nand_base->memadr_reg1);
929 
930 	reg_val = readl(&arasan_nand_base->memadr_reg2);
931 	reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
932 	reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
933 	writel(reg_val, &arasan_nand_base->memadr_reg2);
934 
935 	reg_val = readl(&arasan_nand_base->memadr_reg2);
936 	reg_val &= ~ARASAN_NAND_MEM_ADDR2_CS_MASK;
937 	writel(reg_val, &arasan_nand_base->memadr_reg2);
938 	buf_index = 0;
939 
940 	return 0;
941 }
942 
943 static void arasan_nand_read_buf(struct mtd_info *mtd, u8 *buf, int size)
944 {
945 	u32 reg_val, i;
946 	u32 *bufptr = (u32 *)buf;
947 	u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
948 
949 	reg_val = readl(&arasan_nand_base->pkt_reg);
950 	reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
951 		     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
952 	reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | size;
953 	writel(reg_val, &arasan_nand_base->pkt_reg);
954 
955 	writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg);
956 
957 	while (!(readl(&arasan_nand_base->intsts_reg) &
958 		ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK) && timeout) {
959 		udelay(1);
960 		timeout--;
961 	}
962 
963 	if (!timeout)
964 		puts("ERROR:arasan_nand_read_buf timedout:Buff RDY\n");
965 
966 	reg_val = readl(&arasan_nand_base->intsts_enr);
967 	reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
968 	writel(reg_val, &arasan_nand_base->intsts_enr);
969 
970 	writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
971 	       &arasan_nand_base->intsts_enr);
972 	reg_val = readl(&arasan_nand_base->intsts_reg);
973 	writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
974 	       &arasan_nand_base->intsts_reg);
975 
976 	buf_index = 0;
977 	for (i = 0; i < size / 4; i++)
978 		bufptr[i] = readl(&arasan_nand_base->buf_dataport);
979 
980 	if (size & 0x03)
981 		bufptr[i] = readl(&arasan_nand_base->buf_dataport);
982 
983 	timeout = ARASAN_NAND_POLL_TIMEOUT;
984 
985 	while (!(readl(&arasan_nand_base->intsts_reg) &
986 		ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
987 		udelay(1);
988 		timeout--;
989 	}
990 
991 	if (!timeout)
992 		puts("ERROR:arasan_nand_read_buf timedout:Xfer CMPLT\n");
993 
994 	reg_val = readl(&arasan_nand_base->intsts_enr);
995 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
996 	       &arasan_nand_base->intsts_enr);
997 	reg_val = readl(&arasan_nand_base->intsts_reg);
998 	writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
999 	       &arasan_nand_base->intsts_reg);
1000 }
1001 
1002 static u8 arasan_nand_read_byte(struct mtd_info *mtd)
1003 {
1004 	struct nand_chip *chip = mtd_to_nand(mtd);
1005 	u32 size;
1006 	u8 val;
1007 	struct nand_onfi_params *p;
1008 
1009 	if (buf_index == 0) {
1010 		p = &chip->onfi_params;
1011 		if (curr_cmd->cmd1 == NAND_CMD_READID)
1012 			size = 4;
1013 		else if (curr_cmd->cmd1 == NAND_CMD_PARAM)
1014 			size = sizeof(struct nand_onfi_params);
1015 		else if (curr_cmd->cmd1 == NAND_CMD_RNDOUT)
1016 			size = le16_to_cpu(p->ext_param_page_length) * 16;
1017 		else if (curr_cmd->cmd1 == NAND_CMD_GET_FEATURES)
1018 			size = 4;
1019 		else if (curr_cmd->cmd1 == NAND_CMD_STATUS)
1020 			return readb(&arasan_nand_base->flash_sts_reg);
1021 		else
1022 			size = 8;
1023 		chip->read_buf(mtd, &buf_data[0], size);
1024 	}
1025 
1026 	val = *(&buf_data[0] + buf_index);
1027 	buf_index++;
1028 
1029 	return val;
1030 }
1031 
1032 static void arasan_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
1033 				     int column, int page_addr)
1034 {
1035 	u32 i, ret = 0;
1036 	struct nand_chip *chip = mtd_to_nand(mtd);
1037 	struct arasan_nand_info *nand = nand_get_controller_data(chip);
1038 
1039 	curr_cmd = NULL;
1040 	writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
1041 	       &arasan_nand_base->intsts_enr);
1042 
1043 	if ((command == NAND_CMD_READOOB) &&
1044 	    (mtd->writesize > 512)) {
1045 		column += mtd->writesize;
1046 		command = NAND_CMD_READ0;
1047 	}
1048 
1049 	/* Get the command format */
1050 	for (i = 0; (arasan_nand_commands[i].cmd1 != NAND_CMD_NONE ||
1051 		     arasan_nand_commands[i].cmd2 != NAND_CMD_NONE); i++) {
1052 		if (command == arasan_nand_commands[i].cmd1) {
1053 			curr_cmd = &arasan_nand_commands[i];
1054 			break;
1055 		}
1056 	}
1057 
1058 	if (curr_cmd == NULL) {
1059 		printf("Unsupported Command; 0x%x\n", command);
1060 		return;
1061 	}
1062 
1063 	if (curr_cmd->cmd1 == NAND_CMD_RESET)
1064 		ret = arasan_nand_reset(curr_cmd);
1065 
1066 	if ((curr_cmd->cmd1 == NAND_CMD_READID) ||
1067 	    (curr_cmd->cmd1 == NAND_CMD_PARAM) ||
1068 	    (curr_cmd->cmd1 == NAND_CMD_RNDOUT) ||
1069 	    (curr_cmd->cmd1 == NAND_CMD_GET_FEATURES) ||
1070 	    (curr_cmd->cmd1 == NAND_CMD_READ0))
1071 		ret = arasan_nand_send_rdcmd(curr_cmd, column, page_addr, mtd);
1072 
1073 	if ((curr_cmd->cmd1 == NAND_CMD_SET_FEATURES) ||
1074 	    (curr_cmd->cmd1 == NAND_CMD_SEQIN)) {
1075 		nand->page = page_addr;
1076 		ret = arasan_nand_send_wrcmd(curr_cmd, column, page_addr, mtd);
1077 	}
1078 
1079 	if (curr_cmd->cmd1 == NAND_CMD_ERASE1)
1080 		ret = arasan_nand_erase(curr_cmd, column, page_addr, mtd);
1081 
1082 	if (curr_cmd->cmd1 == NAND_CMD_STATUS)
1083 		ret = arasan_nand_read_status(curr_cmd, column, page_addr, mtd);
1084 
1085 	if (ret != 0)
1086 		printf("ERROR:%s:command:0x%x\n", __func__, curr_cmd->cmd1);
1087 }
1088 
1089 static void arasan_check_ondie(struct mtd_info *mtd)
1090 {
1091 	struct nand_chip *nand_chip = mtd_to_nand(mtd);
1092 	struct arasan_nand_info *nand = nand_get_controller_data(nand_chip);
1093 	u8 maf_id, dev_id;
1094 	u8 get_feature[4];
1095 	u8 set_feature[4] = {ENABLE_ONDIE_ECC, 0x00, 0x00, 0x00};
1096 	u32 i;
1097 
1098 	/* Send the command for reading device ID */
1099 	nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1100 	nand_chip->cmdfunc(mtd, NAND_CMD_READID, 0, -1);
1101 
1102 	/* Read manufacturer and device IDs */
1103 	maf_id = nand_chip->read_byte(mtd);
1104 	dev_id = nand_chip->read_byte(mtd);
1105 
1106 	if ((maf_id == NAND_MFR_MICRON) &&
1107 	    ((dev_id == 0xf1) || (dev_id == 0xa1) || (dev_id == 0xb1) ||
1108 	     (dev_id == 0xaa) || (dev_id == 0xba) || (dev_id == 0xda) ||
1109 	     (dev_id == 0xca) || (dev_id == 0xac) || (dev_id == 0xbc) ||
1110 	     (dev_id == 0xdc) || (dev_id == 0xcc) || (dev_id == 0xa3) ||
1111 	     (dev_id == 0xb3) || (dev_id == 0xd3) || (dev_id == 0xc3))) {
1112 		nand_chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES,
1113 				   ONDIE_ECC_FEATURE_ADDR, -1);
1114 
1115 		nand_chip->write_buf(mtd, &set_feature[0], 4);
1116 		nand_chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES,
1117 				   ONDIE_ECC_FEATURE_ADDR, -1);
1118 
1119 		for (i = 0; i < 4; i++)
1120 			get_feature[i] = nand_chip->read_byte(mtd);
1121 
1122 		if (get_feature[0] & ENABLE_ONDIE_ECC)
1123 			nand->on_die_ecc_enabled = true;
1124 		else
1125 			printf("%s: Unable to enable OnDie ECC\n", __func__);
1126 
1127 		/* Use the BBT pattern descriptors */
1128 		nand_chip->bbt_td = &bbt_main_descr;
1129 		nand_chip->bbt_md = &bbt_mirror_descr;
1130 	}
1131 }
1132 
1133 static int arasan_nand_ecc_init(struct mtd_info *mtd)
1134 {
1135 	int found = -1;
1136 	u32 regval, eccpos_start, i, eccaddr;
1137 	struct nand_chip *nand_chip = mtd_to_nand(mtd);
1138 
1139 	for (i = 0; i < ARRAY_SIZE(ecc_matrix); i++) {
1140 		if ((ecc_matrix[i].pagesize == mtd->writesize) &&
1141 		    (ecc_matrix[i].ecc_codeword_size >=
1142 		     nand_chip->ecc_step_ds)) {
1143 			if (ecc_matrix[i].eccbits >=
1144 			    nand_chip->ecc_strength_ds) {
1145 				found = i;
1146 				break;
1147 			}
1148 			found = i;
1149 		}
1150 	}
1151 
1152 	if (found < 0)
1153 		return 1;
1154 
1155 	eccaddr = mtd->writesize + mtd->oobsize -
1156 		  ecc_matrix[found].eccsize;
1157 
1158 	regval = eccaddr |
1159 		 (ecc_matrix[found].eccsize << ARASAN_NAND_ECC_SIZE_SHIFT) |
1160 		 (ecc_matrix[found].bch << ARASAN_NAND_ECC_BCH_SHIFT);
1161 	writel(regval, &arasan_nand_base->ecc_reg);
1162 
1163 	if (ecc_matrix[found].bch) {
1164 		regval = readl(&arasan_nand_base->memadr_reg2);
1165 		regval &= ~ARASAN_NAND_MEM_ADDR2_BCH_MASK;
1166 		regval |= (ecc_matrix[found].bchval <<
1167 			   ARASAN_NAND_MEM_ADDR2_BCH_SHIFT);
1168 		writel(regval, &arasan_nand_base->memadr_reg2);
1169 	}
1170 
1171 	nand_oob.eccbytes = ecc_matrix[found].eccsize;
1172 	eccpos_start = mtd->oobsize - nand_oob.eccbytes;
1173 
1174 	for (i = 0; i < nand_oob.eccbytes; i++)
1175 		nand_oob.eccpos[i] = eccpos_start + i;
1176 
1177 	nand_oob.oobfree[0].offset = 2;
1178 	nand_oob.oobfree[0].length = eccpos_start - 2;
1179 
1180 	nand_chip->ecc.size = ecc_matrix[found].ecc_codeword_size;
1181 	nand_chip->ecc.strength = ecc_matrix[found].eccbits;
1182 	nand_chip->ecc.bytes = ecc_matrix[found].eccsize;
1183 	nand_chip->ecc.layout = &nand_oob;
1184 
1185 	return 0;
1186 }
1187 
1188 static int arasan_nand_init(struct nand_chip *nand_chip, int devnum)
1189 {
1190 	struct arasan_nand_info *nand;
1191 	struct mtd_info *mtd;
1192 	int err = -1;
1193 
1194 	nand = calloc(1, sizeof(struct arasan_nand_info));
1195 	if (!nand) {
1196 		printf("%s: failed to allocate\n", __func__);
1197 		return err;
1198 	}
1199 
1200 	nand->nand_base = arasan_nand_base;
1201 	mtd = nand_to_mtd(nand_chip);
1202 	nand_set_controller_data(nand_chip, nand);
1203 
1204 	/* Set the driver entry points for MTD */
1205 	nand_chip->cmdfunc = arasan_nand_cmd_function;
1206 	nand_chip->select_chip = arasan_nand_select_chip;
1207 	nand_chip->read_byte = arasan_nand_read_byte;
1208 
1209 	/* Buffer read/write routines */
1210 	nand_chip->read_buf = arasan_nand_read_buf;
1211 	nand_chip->write_buf = arasan_nand_write_buf;
1212 	nand_chip->bbt_options = NAND_BBT_USE_FLASH;
1213 
1214 	writel(0x0, &arasan_nand_base->cmd_reg);
1215 	writel(0x0, &arasan_nand_base->pgm_reg);
1216 
1217 	/* first scan to find the device and get the page size */
1218 	if (nand_scan_ident(mtd, 1, NULL)) {
1219 		printf("%s: nand_scan_ident failed\n", __func__);
1220 		goto fail;
1221 	}
1222 
1223 	nand_chip->ecc.mode = NAND_ECC_HW;
1224 	nand_chip->ecc.hwctl = NULL;
1225 	nand_chip->ecc.read_page = arasan_nand_read_page_hwecc;
1226 	nand_chip->ecc.write_page = arasan_nand_write_page_hwecc;
1227 	nand_chip->ecc.read_oob = arasan_nand_read_oob;
1228 	nand_chip->ecc.write_oob = arasan_nand_write_oob;
1229 
1230 	arasan_check_ondie(mtd);
1231 
1232 	/*
1233 	 * If on die supported, then give priority to on-die ecc and use
1234 	 * it instead of controller ecc.
1235 	 */
1236 	if (nand->on_die_ecc_enabled) {
1237 		nand_chip->ecc.strength = 1;
1238 		nand_chip->ecc.size = mtd->writesize;
1239 		nand_chip->ecc.bytes = 0;
1240 		nand_chip->ecc.layout = &ondie_nand_oob_64;
1241 	} else {
1242 		if (arasan_nand_ecc_init(mtd)) {
1243 			printf("%s: nand_ecc_init failed\n", __func__);
1244 			goto fail;
1245 		}
1246 	}
1247 
1248 	if (nand_scan_tail(mtd)) {
1249 		printf("%s: nand_scan_tail failed\n", __func__);
1250 		goto fail;
1251 	}
1252 
1253 	if (nand_register(devnum, mtd)) {
1254 		printf("Nand Register Fail\n");
1255 		goto fail;
1256 	}
1257 
1258 	return 0;
1259 fail:
1260 	free(nand);
1261 	return err;
1262 }
1263 
1264 void board_nand_init(void)
1265 {
1266 	struct nand_chip *nand = &nand_chip[0];
1267 
1268 	if (arasan_nand_init(nand, 0))
1269 		puts("NAND init failed\n");
1270 }
1271