Home | History | Annotate | Download | only in nand
      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