Home | History | Annotate | Download | only in nand
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev (at) gmail.com>
      4  * Copyright (C) 2015 Roy Spliet <r.spliet (at) ultimaker.com>
      5  *
      6  * Derived from:
      7  *	https://github.com/yuq/sunxi-nfc-mtd
      8  *	Copyright (C) 2013 Qiang Yu <yuq825 (at) gmail.com>
      9  *
     10  *	https://github.com/hno/Allwinner-Info
     11  *	Copyright (C) 2013 Henrik Nordstrm <Henrik Nordstrm>
     12  *
     13  *	Copyright (C) 2013 Dmitriy B. <rzk333 (at) gmail.com>
     14  *	Copyright (C) 2013 Sergey Lapin <slapin (at) ossfans.org>
     15  *
     16  * This program is free software; you can redistribute it and/or modify
     17  * it under the terms of the GNU General Public License as published by
     18  * the Free Software Foundation; either version 2 of the License, or
     19  * (at your option) any later version.
     20  *
     21  * This program is distributed in the hope that it will be useful,
     22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     24  * GNU General Public License for more details.
     25  */
     26 
     27 #include <common.h>
     28 #include <fdtdec.h>
     29 #include <memalign.h>
     30 #include <nand.h>
     31 
     32 #include <linux/kernel.h>
     33 #include <linux/mtd/mtd.h>
     34 #include <linux/mtd/rawnand.h>
     35 #include <linux/mtd/partitions.h>
     36 #include <linux/io.h>
     37 
     38 #include <asm/gpio.h>
     39 #include <asm/arch/clock.h>
     40 
     41 DECLARE_GLOBAL_DATA_PTR;
     42 
     43 #define NFC_REG_CTL		0x0000
     44 #define NFC_REG_ST		0x0004
     45 #define NFC_REG_INT		0x0008
     46 #define NFC_REG_TIMING_CTL	0x000C
     47 #define NFC_REG_TIMING_CFG	0x0010
     48 #define NFC_REG_ADDR_LOW	0x0014
     49 #define NFC_REG_ADDR_HIGH	0x0018
     50 #define NFC_REG_SECTOR_NUM	0x001C
     51 #define NFC_REG_CNT		0x0020
     52 #define NFC_REG_CMD		0x0024
     53 #define NFC_REG_RCMD_SET	0x0028
     54 #define NFC_REG_WCMD_SET	0x002C
     55 #define NFC_REG_IO_DATA		0x0030
     56 #define NFC_REG_ECC_CTL		0x0034
     57 #define NFC_REG_ECC_ST		0x0038
     58 #define NFC_REG_DEBUG		0x003C
     59 #define NFC_REG_ECC_ERR_CNT(x)	((0x0040 + (x)) & ~0x3)
     60 #define NFC_REG_USER_DATA(x)	(0x0050 + ((x) * 4))
     61 #define NFC_REG_SPARE_AREA	0x00A0
     62 #define NFC_REG_PAT_ID		0x00A4
     63 #define NFC_RAM0_BASE		0x0400
     64 #define NFC_RAM1_BASE		0x0800
     65 
     66 /* define bit use in NFC_CTL */
     67 #define NFC_EN			BIT(0)
     68 #define NFC_RESET		BIT(1)
     69 #define NFC_BUS_WIDTH_MSK	BIT(2)
     70 #define NFC_BUS_WIDTH_8		(0 << 2)
     71 #define NFC_BUS_WIDTH_16	(1 << 2)
     72 #define NFC_RB_SEL_MSK		BIT(3)
     73 #define NFC_RB_SEL(x)		((x) << 3)
     74 #define NFC_CE_SEL_MSK		(0x7 << 24)
     75 #define NFC_CE_SEL(x)		((x) << 24)
     76 #define NFC_CE_CTL		BIT(6)
     77 #define NFC_PAGE_SHIFT_MSK	(0xf << 8)
     78 #define NFC_PAGE_SHIFT(x)	(((x) < 10 ? 0 : (x) - 10) << 8)
     79 #define NFC_SAM			BIT(12)
     80 #define NFC_RAM_METHOD		BIT(14)
     81 #define NFC_DEBUG_CTL		BIT(31)
     82 
     83 /* define bit use in NFC_ST */
     84 #define NFC_RB_B2R		BIT(0)
     85 #define NFC_CMD_INT_FLAG	BIT(1)
     86 #define NFC_DMA_INT_FLAG	BIT(2)
     87 #define NFC_CMD_FIFO_STATUS	BIT(3)
     88 #define NFC_STA			BIT(4)
     89 #define NFC_NATCH_INT_FLAG	BIT(5)
     90 #define NFC_RB_STATE(x)		BIT(x + 8)
     91 
     92 /* define bit use in NFC_INT */
     93 #define NFC_B2R_INT_ENABLE	BIT(0)
     94 #define NFC_CMD_INT_ENABLE	BIT(1)
     95 #define NFC_DMA_INT_ENABLE	BIT(2)
     96 #define NFC_INT_MASK		(NFC_B2R_INT_ENABLE | \
     97 				 NFC_CMD_INT_ENABLE | \
     98 				 NFC_DMA_INT_ENABLE)
     99 
    100 /* define bit use in NFC_TIMING_CTL */
    101 #define NFC_TIMING_CTL_EDO	BIT(8)
    102 
    103 /* define NFC_TIMING_CFG register layout */
    104 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD)		\
    105 	(((tWB) & 0x3) | (((tADL) & 0x3) << 2) |		\
    106 	(((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) |		\
    107 	(((tCAD) & 0x7) << 8))
    108 
    109 /* define bit use in NFC_CMD */
    110 #define NFC_CMD_LOW_BYTE_MSK	0xff
    111 #define NFC_CMD_HIGH_BYTE_MSK	(0xff << 8)
    112 #define NFC_CMD(x)		(x)
    113 #define NFC_ADR_NUM_MSK		(0x7 << 16)
    114 #define NFC_ADR_NUM(x)		(((x) - 1) << 16)
    115 #define NFC_SEND_ADR		BIT(19)
    116 #define NFC_ACCESS_DIR		BIT(20)
    117 #define NFC_DATA_TRANS		BIT(21)
    118 #define NFC_SEND_CMD1		BIT(22)
    119 #define NFC_WAIT_FLAG		BIT(23)
    120 #define NFC_SEND_CMD2		BIT(24)
    121 #define NFC_SEQ			BIT(25)
    122 #define NFC_DATA_SWAP_METHOD	BIT(26)
    123 #define NFC_ROW_AUTO_INC	BIT(27)
    124 #define NFC_SEND_CMD3		BIT(28)
    125 #define NFC_SEND_CMD4		BIT(29)
    126 #define NFC_CMD_TYPE_MSK	(0x3 << 30)
    127 #define NFC_NORMAL_OP		(0 << 30)
    128 #define NFC_ECC_OP		(1 << 30)
    129 #define NFC_PAGE_OP		(2 << 30)
    130 
    131 /* define bit use in NFC_RCMD_SET */
    132 #define NFC_READ_CMD_MSK	0xff
    133 #define NFC_RND_READ_CMD0_MSK	(0xff << 8)
    134 #define NFC_RND_READ_CMD1_MSK	(0xff << 16)
    135 
    136 /* define bit use in NFC_WCMD_SET */
    137 #define NFC_PROGRAM_CMD_MSK	0xff
    138 #define NFC_RND_WRITE_CMD_MSK	(0xff << 8)
    139 #define NFC_READ_CMD0_MSK	(0xff << 16)
    140 #define NFC_READ_CMD1_MSK	(0xff << 24)
    141 
    142 /* define bit use in NFC_ECC_CTL */
    143 #define NFC_ECC_EN		BIT(0)
    144 #define NFC_ECC_PIPELINE	BIT(3)
    145 #define NFC_ECC_EXCEPTION	BIT(4)
    146 #define NFC_ECC_BLOCK_SIZE_MSK	BIT(5)
    147 #define NFC_ECC_BLOCK_512	(1 << 5)
    148 #define NFC_RANDOM_EN		BIT(9)
    149 #define NFC_RANDOM_DIRECTION	BIT(10)
    150 #define NFC_ECC_MODE_MSK	(0xf << 12)
    151 #define NFC_ECC_MODE(x)		((x) << 12)
    152 #define NFC_RANDOM_SEED_MSK	(0x7fff << 16)
    153 #define NFC_RANDOM_SEED(x)	((x) << 16)
    154 
    155 /* define bit use in NFC_ECC_ST */
    156 #define NFC_ECC_ERR(x)		BIT(x)
    157 #define NFC_ECC_PAT_FOUND(x)	BIT(x + 16)
    158 #define NFC_ECC_ERR_CNT(b, x)	(((x) >> ((b) * 8)) & 0xff)
    159 
    160 #define NFC_DEFAULT_TIMEOUT_MS	1000
    161 
    162 #define NFC_SRAM_SIZE		1024
    163 
    164 #define NFC_MAX_CS		7
    165 
    166 /*
    167  * Ready/Busy detection type: describes the Ready/Busy detection modes
    168  *
    169  * @RB_NONE:	no external detection available, rely on STATUS command
    170  *		and software timeouts
    171  * @RB_NATIVE:	use sunxi NAND controller Ready/Busy support. The Ready/Busy
    172  *		pin of the NAND flash chip must be connected to one of the
    173  *		native NAND R/B pins (those which can be muxed to the NAND
    174  *		Controller)
    175  * @RB_GPIO:	use a simple GPIO to handle Ready/Busy status. The Ready/Busy
    176  *		pin of the NAND flash chip must be connected to a GPIO capable
    177  *		pin.
    178  */
    179 enum sunxi_nand_rb_type {
    180 	RB_NONE,
    181 	RB_NATIVE,
    182 	RB_GPIO,
    183 };
    184 
    185 /*
    186  * Ready/Busy structure: stores information related to Ready/Busy detection
    187  *
    188  * @type:	the Ready/Busy detection mode
    189  * @info:	information related to the R/B detection mode. Either a gpio
    190  *		id or a native R/B id (those supported by the NAND controller).
    191  */
    192 struct sunxi_nand_rb {
    193 	enum sunxi_nand_rb_type type;
    194 	union {
    195 		struct gpio_desc gpio;
    196 		int nativeid;
    197 	} info;
    198 };
    199 
    200 /*
    201  * Chip Select structure: stores information related to NAND Chip Select
    202  *
    203  * @cs:		the NAND CS id used to communicate with a NAND Chip
    204  * @rb:		the Ready/Busy description
    205  */
    206 struct sunxi_nand_chip_sel {
    207 	u8 cs;
    208 	struct sunxi_nand_rb rb;
    209 };
    210 
    211 /*
    212  * sunxi HW ECC infos: stores information related to HW ECC support
    213  *
    214  * @mode:	the sunxi ECC mode field deduced from ECC requirements
    215  * @layout:	the OOB layout depending on the ECC requirements and the
    216  *		selected ECC mode
    217  */
    218 struct sunxi_nand_hw_ecc {
    219 	int mode;
    220 	struct nand_ecclayout layout;
    221 };
    222 
    223 /*
    224  * NAND chip structure: stores NAND chip device related information
    225  *
    226  * @node:		used to store NAND chips into a list
    227  * @nand:		base NAND chip structure
    228  * @mtd:		base MTD structure
    229  * @clk_rate:		clk_rate required for this NAND chip
    230  * @timing_cfg		TIMING_CFG register value for this NAND chip
    231  * @selected:		current active CS
    232  * @nsels:		number of CS lines required by the NAND chip
    233  * @sels:		array of CS lines descriptions
    234  */
    235 struct sunxi_nand_chip {
    236 	struct list_head node;
    237 	struct nand_chip nand;
    238 	unsigned long clk_rate;
    239 	u32 timing_cfg;
    240 	u32 timing_ctl;
    241 	int selected;
    242 	int addr_cycles;
    243 	u32 addr[2];
    244 	int cmd_cycles;
    245 	u8 cmd[2];
    246 	int nsels;
    247 	struct sunxi_nand_chip_sel sels[0];
    248 };
    249 
    250 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
    251 {
    252 	return container_of(nand, struct sunxi_nand_chip, nand);
    253 }
    254 
    255 /*
    256  * NAND Controller structure: stores sunxi NAND controller information
    257  *
    258  * @controller:		base controller structure
    259  * @dev:		parent device (used to print error messages)
    260  * @regs:		NAND controller registers
    261  * @ahb_clk:		NAND Controller AHB clock
    262  * @mod_clk:		NAND Controller mod clock
    263  * @assigned_cs:	bitmask describing already assigned CS lines
    264  * @clk_rate:		NAND controller current clock rate
    265  * @chips:		a list containing all the NAND chips attached to
    266  *			this NAND controller
    267  * @complete:		a completion object used to wait for NAND
    268  *			controller events
    269  */
    270 struct sunxi_nfc {
    271 	struct nand_hw_control controller;
    272 	struct device *dev;
    273 	void __iomem *regs;
    274 	struct clk *ahb_clk;
    275 	struct clk *mod_clk;
    276 	unsigned long assigned_cs;
    277 	unsigned long clk_rate;
    278 	struct list_head chips;
    279 };
    280 
    281 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_hw_control *ctrl)
    282 {
    283 	return container_of(ctrl, struct sunxi_nfc, controller);
    284 }
    285 
    286 static void sunxi_nfc_set_clk_rate(unsigned long hz)
    287 {
    288 	struct sunxi_ccm_reg *const ccm =
    289 	(struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
    290 	int div_m, div_n;
    291 
    292 	div_m = (clock_get_pll6() + hz - 1) / hz;
    293 	for (div_n = 0; div_n < 3 && div_m > 16; div_n++) {
    294 		if (div_m % 2)
    295 			div_m++;
    296 		div_m >>= 1;
    297 	}
    298 	if (div_m > 16)
    299 		div_m = 16;
    300 
    301 	/* config mod clock */
    302 	writel(CCM_NAND_CTRL_ENABLE | CCM_NAND_CTRL_PLL6 |
    303 	       CCM_NAND_CTRL_N(div_n) | CCM_NAND_CTRL_M(div_m),
    304 	       &ccm->nand0_clk_cfg);
    305 
    306 	/* gate on nand clock */
    307 	setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_NAND0));
    308 #ifdef CONFIG_MACH_SUN9I
    309 	setbits_le32(&ccm->ahb_gate1, (1 << AHB_GATE_OFFSET_DMA));
    310 #else
    311 	setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_DMA));
    312 #endif
    313 }
    314 
    315 static int sunxi_nfc_wait_int(struct sunxi_nfc *nfc, u32 flags,
    316 			      unsigned int timeout_ms)
    317 {
    318 	unsigned int timeout_ticks;
    319 	u32 time_start, status;
    320 	int ret = -ETIMEDOUT;
    321 
    322 	if (!timeout_ms)
    323 		timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
    324 
    325 	timeout_ticks = (timeout_ms * CONFIG_SYS_HZ) / 1000;
    326 
    327 	time_start = get_timer(0);
    328 
    329 	do {
    330 		status = readl(nfc->regs + NFC_REG_ST);
    331 		if ((status & flags) == flags) {
    332 			ret = 0;
    333 			break;
    334 		}
    335 
    336 		udelay(1);
    337 	} while (get_timer(time_start) < timeout_ticks);
    338 
    339 	writel(status & flags, nfc->regs + NFC_REG_ST);
    340 
    341 	return ret;
    342 }
    343 
    344 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
    345 {
    346 	unsigned long timeout = (CONFIG_SYS_HZ *
    347 				 NFC_DEFAULT_TIMEOUT_MS) / 1000;
    348 	u32 time_start;
    349 
    350 	time_start = get_timer(0);
    351 	do {
    352 		if (!(readl(nfc->regs + NFC_REG_ST) & NFC_CMD_FIFO_STATUS))
    353 			return 0;
    354 	} while (get_timer(time_start) < timeout);
    355 
    356 	dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
    357 	return -ETIMEDOUT;
    358 }
    359 
    360 static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
    361 {
    362 	unsigned long timeout = (CONFIG_SYS_HZ *
    363 				 NFC_DEFAULT_TIMEOUT_MS) / 1000;
    364 	u32 time_start;
    365 
    366 	writel(0, nfc->regs + NFC_REG_ECC_CTL);
    367 	writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
    368 
    369 	time_start = get_timer(0);
    370 	do {
    371 		if (!(readl(nfc->regs + NFC_REG_CTL) & NFC_RESET))
    372 			return 0;
    373 	} while (get_timer(time_start) < timeout);
    374 
    375 	dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
    376 	return -ETIMEDOUT;
    377 }
    378 
    379 static int sunxi_nfc_dev_ready(struct mtd_info *mtd)
    380 {
    381 	struct nand_chip *nand = mtd_to_nand(mtd);
    382 	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    383 	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
    384 	struct sunxi_nand_rb *rb;
    385 	unsigned long timeo = (sunxi_nand->nand.state == FL_ERASING ? 400 : 20);
    386 	int ret;
    387 
    388 	if (sunxi_nand->selected < 0)
    389 		return 0;
    390 
    391 	rb = &sunxi_nand->sels[sunxi_nand->selected].rb;
    392 
    393 	switch (rb->type) {
    394 	case RB_NATIVE:
    395 		ret = !!(readl(nfc->regs + NFC_REG_ST) &
    396 			 NFC_RB_STATE(rb->info.nativeid));
    397 		if (ret)
    398 			break;
    399 
    400 		sunxi_nfc_wait_int(nfc, NFC_RB_B2R, timeo);
    401 		ret = !!(readl(nfc->regs + NFC_REG_ST) &
    402 			 NFC_RB_STATE(rb->info.nativeid));
    403 		break;
    404 	case RB_GPIO:
    405 		ret = dm_gpio_get_value(&rb->info.gpio);
    406 		break;
    407 	case RB_NONE:
    408 	default:
    409 		ret = 0;
    410 		dev_err(nfc->dev, "cannot check R/B NAND status!\n");
    411 		break;
    412 	}
    413 
    414 	return ret;
    415 }
    416 
    417 static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
    418 {
    419 	struct nand_chip *nand = mtd_to_nand(mtd);
    420 	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    421 	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
    422 	struct sunxi_nand_chip_sel *sel;
    423 	u32 ctl;
    424 
    425 	if (chip > 0 && chip >= sunxi_nand->nsels)
    426 		return;
    427 
    428 	if (chip == sunxi_nand->selected)
    429 		return;
    430 
    431 	ctl = readl(nfc->regs + NFC_REG_CTL) &
    432 	      ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
    433 
    434 	if (chip >= 0) {
    435 		sel = &sunxi_nand->sels[chip];
    436 
    437 		ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
    438 		       NFC_PAGE_SHIFT(nand->page_shift - 10);
    439 		if (sel->rb.type == RB_NONE) {
    440 			nand->dev_ready = NULL;
    441 		} else {
    442 			nand->dev_ready = sunxi_nfc_dev_ready;
    443 			if (sel->rb.type == RB_NATIVE)
    444 				ctl |= NFC_RB_SEL(sel->rb.info.nativeid);
    445 		}
    446 
    447 		writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
    448 
    449 		if (nfc->clk_rate != sunxi_nand->clk_rate) {
    450 			sunxi_nfc_set_clk_rate(sunxi_nand->clk_rate);
    451 			nfc->clk_rate = sunxi_nand->clk_rate;
    452 		}
    453 	}
    454 
    455 	writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
    456 	writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
    457 	writel(ctl, nfc->regs + NFC_REG_CTL);
    458 
    459 	sunxi_nand->selected = chip;
    460 }
    461 
    462 static void sunxi_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
    463 {
    464 	struct nand_chip *nand = mtd_to_nand(mtd);
    465 	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    466 	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
    467 	int ret;
    468 	int cnt;
    469 	int offs = 0;
    470 	u32 tmp;
    471 
    472 	while (len > offs) {
    473 		cnt = min(len - offs, NFC_SRAM_SIZE);
    474 
    475 		ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    476 		if (ret)
    477 			break;
    478 
    479 		writel(cnt, nfc->regs + NFC_REG_CNT);
    480 		tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
    481 		writel(tmp, nfc->regs + NFC_REG_CMD);
    482 
    483 		ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
    484 		if (ret)
    485 			break;
    486 
    487 		if (buf)
    488 			memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
    489 				      cnt);
    490 		offs += cnt;
    491 	}
    492 }
    493 
    494 static void sunxi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
    495 				int len)
    496 {
    497 	struct nand_chip *nand = mtd_to_nand(mtd);
    498 	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    499 	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
    500 	int ret;
    501 	int cnt;
    502 	int offs = 0;
    503 	u32 tmp;
    504 
    505 	while (len > offs) {
    506 		cnt = min(len - offs, NFC_SRAM_SIZE);
    507 
    508 		ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    509 		if (ret)
    510 			break;
    511 
    512 		writel(cnt, nfc->regs + NFC_REG_CNT);
    513 		memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
    514 		tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
    515 		      NFC_ACCESS_DIR;
    516 		writel(tmp, nfc->regs + NFC_REG_CMD);
    517 
    518 		ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
    519 		if (ret)
    520 			break;
    521 
    522 		offs += cnt;
    523 	}
    524 }
    525 
    526 static uint8_t sunxi_nfc_read_byte(struct mtd_info *mtd)
    527 {
    528 	uint8_t ret;
    529 
    530 	sunxi_nfc_read_buf(mtd, &ret, 1);
    531 
    532 	return ret;
    533 }
    534 
    535 static void sunxi_nfc_cmd_ctrl(struct mtd_info *mtd, int dat,
    536 			       unsigned int ctrl)
    537 {
    538 	struct nand_chip *nand = mtd_to_nand(mtd);
    539 	struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
    540 	struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
    541 	int ret;
    542 	u32 tmp;
    543 
    544 	ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    545 	if (ret)
    546 		return;
    547 
    548 	if (ctrl & NAND_CTRL_CHANGE) {
    549 		tmp = readl(nfc->regs + NFC_REG_CTL);
    550 		if (ctrl & NAND_NCE)
    551 			tmp |= NFC_CE_CTL;
    552 		else
    553 			tmp &= ~NFC_CE_CTL;
    554 		writel(tmp, nfc->regs + NFC_REG_CTL);
    555 	}
    556 
    557 	if (dat == NAND_CMD_NONE && (ctrl & NAND_NCE) &&
    558 	    !(ctrl & (NAND_CLE | NAND_ALE))) {
    559 		u32 cmd = 0;
    560 
    561 		if (!sunxi_nand->addr_cycles && !sunxi_nand->cmd_cycles)
    562 			return;
    563 
    564 		if (sunxi_nand->cmd_cycles--)
    565 			cmd |= NFC_SEND_CMD1 | sunxi_nand->cmd[0];
    566 
    567 		if (sunxi_nand->cmd_cycles--) {
    568 			cmd |= NFC_SEND_CMD2;
    569 			writel(sunxi_nand->cmd[1],
    570 			       nfc->regs + NFC_REG_RCMD_SET);
    571 		}
    572 
    573 		sunxi_nand->cmd_cycles = 0;
    574 
    575 		if (sunxi_nand->addr_cycles) {
    576 			cmd |= NFC_SEND_ADR |
    577 			       NFC_ADR_NUM(sunxi_nand->addr_cycles);
    578 			writel(sunxi_nand->addr[0],
    579 			       nfc->regs + NFC_REG_ADDR_LOW);
    580 		}
    581 
    582 		if (sunxi_nand->addr_cycles > 4)
    583 			writel(sunxi_nand->addr[1],
    584 			       nfc->regs + NFC_REG_ADDR_HIGH);
    585 
    586 		writel(cmd, nfc->regs + NFC_REG_CMD);
    587 		sunxi_nand->addr[0] = 0;
    588 		sunxi_nand->addr[1] = 0;
    589 		sunxi_nand->addr_cycles = 0;
    590 		sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
    591 	}
    592 
    593 	if (ctrl & NAND_CLE) {
    594 		sunxi_nand->cmd[sunxi_nand->cmd_cycles++] = dat;
    595 	} else if (ctrl & NAND_ALE) {
    596 		sunxi_nand->addr[sunxi_nand->addr_cycles / 4] |=
    597 				dat << ((sunxi_nand->addr_cycles % 4) * 8);
    598 		sunxi_nand->addr_cycles++;
    599 	}
    600 }
    601 
    602 /* These seed values have been extracted from Allwinner's BSP */
    603 static const u16 sunxi_nfc_randomizer_page_seeds[] = {
    604 	0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
    605 	0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
    606 	0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
    607 	0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
    608 	0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
    609 	0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
    610 	0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
    611 	0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
    612 	0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
    613 	0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
    614 	0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
    615 	0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
    616 	0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
    617 	0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
    618 	0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
    619 	0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
    620 };
    621 
    622 /*
    623  * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
    624  * have been generated using
    625  * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
    626  * the randomizer engine does internally before de/scrambling OOB data.
    627  *
    628  * Those tables are statically defined to avoid calculating randomizer state
    629  * at runtime.
    630  */
    631 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
    632 	0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
    633 	0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
    634 	0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
    635 	0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
    636 	0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
    637 	0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
    638 	0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
    639 	0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
    640 	0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
    641 	0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
    642 	0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
    643 	0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
    644 	0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
    645 	0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
    646 	0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
    647 	0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
    648 };
    649 
    650 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
    651 	0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
    652 	0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
    653 	0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
    654 	0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
    655 	0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
    656 	0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
    657 	0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
    658 	0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
    659 	0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
    660 	0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
    661 	0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
    662 	0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
    663 	0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
    664 	0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
    665 	0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
    666 	0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
    667 };
    668 
    669 static u16 sunxi_nfc_randomizer_step(u16 state, int count)
    670 {
    671 	state &= 0x7fff;
    672 
    673 	/*
    674 	 * This loop is just a simple implementation of a Fibonacci LFSR using
    675 	 * the x16 + x15 + 1 polynomial.
    676 	 */
    677 	while (count--)
    678 		state = ((state >> 1) |
    679 			 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
    680 
    681 	return state;
    682 }
    683 
    684 static u16 sunxi_nfc_randomizer_state(struct mtd_info *mtd, int page, bool ecc)
    685 {
    686 	const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
    687 	int mod = mtd->erasesize / mtd->writesize;
    688 
    689 	if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
    690 		mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
    691 
    692 	if (ecc) {
    693 		if (mtd->ecc_step_size == 512)
    694 			seeds = sunxi_nfc_randomizer_ecc512_seeds;
    695 		else
    696 			seeds = sunxi_nfc_randomizer_ecc1024_seeds;
    697 	}
    698 
    699 	return seeds[page % mod];
    700 }
    701 
    702 static void sunxi_nfc_randomizer_config(struct mtd_info *mtd,
    703 					int page, bool ecc)
    704 {
    705 	struct nand_chip *nand = mtd_to_nand(mtd);
    706 	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    707 	u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
    708 	u16 state;
    709 
    710 	if (!(nand->options & NAND_NEED_SCRAMBLING))
    711 		return;
    712 
    713 	ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
    714 	state = sunxi_nfc_randomizer_state(mtd, page, ecc);
    715 	ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
    716 	writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
    717 }
    718 
    719 static void sunxi_nfc_randomizer_enable(struct mtd_info *mtd)
    720 {
    721 	struct nand_chip *nand = mtd_to_nand(mtd);
    722 	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    723 
    724 	if (!(nand->options & NAND_NEED_SCRAMBLING))
    725 		return;
    726 
    727 	writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
    728 	       nfc->regs + NFC_REG_ECC_CTL);
    729 }
    730 
    731 static void sunxi_nfc_randomizer_disable(struct mtd_info *mtd)
    732 {
    733 	struct nand_chip *nand = mtd_to_nand(mtd);
    734 	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    735 
    736 	if (!(nand->options & NAND_NEED_SCRAMBLING))
    737 		return;
    738 
    739 	writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
    740 	       nfc->regs + NFC_REG_ECC_CTL);
    741 }
    742 
    743 static void sunxi_nfc_randomize_bbm(struct mtd_info *mtd, int page, u8 *bbm)
    744 {
    745 	u16 state = sunxi_nfc_randomizer_state(mtd, page, true);
    746 
    747 	bbm[0] ^= state;
    748 	bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
    749 }
    750 
    751 static void sunxi_nfc_randomizer_write_buf(struct mtd_info *mtd,
    752 					   const uint8_t *buf, int len,
    753 					   bool ecc, int page)
    754 {
    755 	sunxi_nfc_randomizer_config(mtd, page, ecc);
    756 	sunxi_nfc_randomizer_enable(mtd);
    757 	sunxi_nfc_write_buf(mtd, buf, len);
    758 	sunxi_nfc_randomizer_disable(mtd);
    759 }
    760 
    761 static void sunxi_nfc_randomizer_read_buf(struct mtd_info *mtd, uint8_t *buf,
    762 					  int len, bool ecc, int page)
    763 {
    764 	sunxi_nfc_randomizer_config(mtd, page, ecc);
    765 	sunxi_nfc_randomizer_enable(mtd);
    766 	sunxi_nfc_read_buf(mtd, buf, len);
    767 	sunxi_nfc_randomizer_disable(mtd);
    768 }
    769 
    770 static void sunxi_nfc_hw_ecc_enable(struct mtd_info *mtd)
    771 {
    772 	struct nand_chip *nand = mtd_to_nand(mtd);
    773 	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    774 	struct sunxi_nand_hw_ecc *data = nand->ecc.priv;
    775 	u32 ecc_ctl;
    776 
    777 	ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
    778 	ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
    779 		     NFC_ECC_BLOCK_SIZE_MSK);
    780 	ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(data->mode) | NFC_ECC_EXCEPTION;
    781 
    782 	if (nand->ecc.size == 512)
    783 		ecc_ctl |= NFC_ECC_BLOCK_512;
    784 
    785 	writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
    786 }
    787 
    788 static void sunxi_nfc_hw_ecc_disable(struct mtd_info *mtd)
    789 {
    790 	struct nand_chip *nand = mtd_to_nand(mtd);
    791 	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    792 
    793 	writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
    794 	       nfc->regs + NFC_REG_ECC_CTL);
    795 }
    796 
    797 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
    798 {
    799 	buf[0] = user_data;
    800 	buf[1] = user_data >> 8;
    801 	buf[2] = user_data >> 16;
    802 	buf[3] = user_data >> 24;
    803 }
    804 
    805 static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
    806 				       u8 *data, int data_off,
    807 				       u8 *oob, int oob_off,
    808 				       int *cur_off,
    809 				       unsigned int *max_bitflips,
    810 				       bool bbm, int page)
    811 {
    812 	struct nand_chip *nand = mtd_to_nand(mtd);
    813 	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    814 	struct nand_ecc_ctrl *ecc = &nand->ecc;
    815 	int raw_mode = 0;
    816 	u32 status;
    817 	int ret;
    818 
    819 	if (*cur_off != data_off)
    820 		nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
    821 
    822 	sunxi_nfc_randomizer_read_buf(mtd, NULL, ecc->size, false, page);
    823 
    824 	if (data_off + ecc->size != oob_off)
    825 		nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
    826 
    827 	ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    828 	if (ret)
    829 		return ret;
    830 
    831 	sunxi_nfc_randomizer_enable(mtd);
    832 	writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
    833 	       nfc->regs + NFC_REG_CMD);
    834 
    835 	ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
    836 	sunxi_nfc_randomizer_disable(mtd);
    837 	if (ret)
    838 		return ret;
    839 
    840 	*cur_off = oob_off + ecc->bytes + 4;
    841 
    842 	status = readl(nfc->regs + NFC_REG_ECC_ST);
    843 	if (status & NFC_ECC_PAT_FOUND(0)) {
    844 		u8 pattern = 0xff;
    845 
    846 		if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1)))
    847 			pattern = 0x0;
    848 
    849 		memset(data, pattern, ecc->size);
    850 		memset(oob, pattern, ecc->bytes + 4);
    851 
    852 		return 1;
    853 	}
    854 
    855 	ret = NFC_ECC_ERR_CNT(0, readl(nfc->regs + NFC_REG_ECC_ERR_CNT(0)));
    856 
    857 	memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
    858 
    859 	nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
    860 	sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4, true, page);
    861 
    862 	if (status & NFC_ECC_ERR(0)) {
    863 		/*
    864 		 * Re-read the data with the randomizer disabled to identify
    865 		 * bitflips in erased pages.
    866 		 */
    867 		if (nand->options & NAND_NEED_SCRAMBLING) {
    868 			nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
    869 			nand->read_buf(mtd, data, ecc->size);
    870 			nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
    871 			nand->read_buf(mtd, oob, ecc->bytes + 4);
    872 		}
    873 
    874 		ret = nand_check_erased_ecc_chunk(data,	ecc->size,
    875 						  oob, ecc->bytes + 4,
    876 						  NULL, 0, ecc->strength);
    877 		if (ret >= 0)
    878 			raw_mode = 1;
    879 	} else {
    880 		/*
    881 		 * The engine protects 4 bytes of OOB data per chunk.
    882 		 * Retrieve the corrected OOB bytes.
    883 		 */
    884 		sunxi_nfc_user_data_to_buf(readl(nfc->regs +
    885 						 NFC_REG_USER_DATA(0)),
    886 					   oob);
    887 
    888 		/* De-randomize the Bad Block Marker. */
    889 		if (bbm && nand->options & NAND_NEED_SCRAMBLING)
    890 			sunxi_nfc_randomize_bbm(mtd, page, oob);
    891 	}
    892 
    893 	if (ret < 0) {
    894 		mtd->ecc_stats.failed++;
    895 	} else {
    896 		mtd->ecc_stats.corrected += ret;
    897 		*max_bitflips = max_t(unsigned int, *max_bitflips, ret);
    898 	}
    899 
    900 	return raw_mode;
    901 }
    902 
    903 static void sunxi_nfc_hw_ecc_read_extra_oob(struct mtd_info *mtd,
    904 					    u8 *oob, int *cur_off,
    905 					    bool randomize, int page)
    906 {
    907 	struct nand_chip *nand = mtd_to_nand(mtd);
    908 	struct nand_ecc_ctrl *ecc = &nand->ecc;
    909 	int offset = ((ecc->bytes + 4) * ecc->steps);
    910 	int len = mtd->oobsize - offset;
    911 
    912 	if (len <= 0)
    913 		return;
    914 
    915 	if (*cur_off != offset)
    916 		nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
    917 			      offset + mtd->writesize, -1);
    918 
    919 	if (!randomize)
    920 		sunxi_nfc_read_buf(mtd, oob + offset, len);
    921 	else
    922 		sunxi_nfc_randomizer_read_buf(mtd, oob + offset, len,
    923 					      false, page);
    924 
    925 	*cur_off = mtd->oobsize + mtd->writesize;
    926 }
    927 
    928 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
    929 {
    930 	return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
    931 }
    932 
    933 static int sunxi_nfc_hw_ecc_write_chunk(struct mtd_info *mtd,
    934 					const u8 *data, int data_off,
    935 					const u8 *oob, int oob_off,
    936 					int *cur_off, bool bbm,
    937 					int page)
    938 {
    939 	struct nand_chip *nand = mtd_to_nand(mtd);
    940 	struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
    941 	struct nand_ecc_ctrl *ecc = &nand->ecc;
    942 	int ret;
    943 
    944 	if (data_off != *cur_off)
    945 		nand->cmdfunc(mtd, NAND_CMD_RNDIN, data_off, -1);
    946 
    947 	sunxi_nfc_randomizer_write_buf(mtd, data, ecc->size, false, page);
    948 
    949 	/* Fill OOB data in */
    950 	if ((nand->options & NAND_NEED_SCRAMBLING) && bbm) {
    951 		u8 user_data[4];
    952 
    953 		memcpy(user_data, oob, 4);
    954 		sunxi_nfc_randomize_bbm(mtd, page, user_data);
    955 		writel(sunxi_nfc_buf_to_user_data(user_data),
    956 		       nfc->regs + NFC_REG_USER_DATA(0));
    957 	} else {
    958 		writel(sunxi_nfc_buf_to_user_data(oob),
    959 		       nfc->regs + NFC_REG_USER_DATA(0));
    960 	}
    961 
    962 	if (data_off + ecc->size != oob_off)
    963 		nand->cmdfunc(mtd, NAND_CMD_RNDIN, oob_off, -1);
    964 
    965 	ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
    966 	if (ret)
    967 		return ret;
    968 
    969 	sunxi_nfc_randomizer_enable(mtd);
    970 	writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
    971 	       NFC_ACCESS_DIR | NFC_ECC_OP,
    972 	       nfc->regs + NFC_REG_CMD);
    973 
    974 	ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
    975 	sunxi_nfc_randomizer_disable(mtd);
    976 	if (ret)
    977 		return ret;
    978 
    979 	*cur_off = oob_off + ecc->bytes + 4;
    980 
    981 	return 0;
    982 }
    983 
    984 static void sunxi_nfc_hw_ecc_write_extra_oob(struct mtd_info *mtd,
    985 					     u8 *oob, int *cur_off,
    986 					     int page)
    987 {
    988 	struct nand_chip *nand = mtd_to_nand(mtd);
    989 	struct nand_ecc_ctrl *ecc = &nand->ecc;
    990 	int offset = ((ecc->bytes + 4) * ecc->steps);
    991 	int len = mtd->oobsize - offset;
    992 
    993 	if (len <= 0)
    994 		return;
    995 
    996 	if (*cur_off != offset)
    997 		nand->cmdfunc(mtd, NAND_CMD_RNDIN,
    998 			      offset + mtd->writesize, -1);
    999 
   1000 	sunxi_nfc_randomizer_write_buf(mtd, oob + offset, len, false, page);
   1001 
   1002 	*cur_off = mtd->oobsize + mtd->writesize;
   1003 }
   1004 
   1005 static int sunxi_nfc_hw_ecc_read_page(struct mtd_info *mtd,
   1006 				      struct nand_chip *chip, uint8_t *buf,
   1007 				      int oob_required, int page)
   1008 {
   1009 	struct nand_ecc_ctrl *ecc = &chip->ecc;
   1010 	unsigned int max_bitflips = 0;
   1011 	int ret, i, cur_off = 0;
   1012 	bool raw_mode = false;
   1013 
   1014 	sunxi_nfc_hw_ecc_enable(mtd);
   1015 
   1016 	for (i = 0; i < ecc->steps; i++) {
   1017 		int data_off = i * ecc->size;
   1018 		int oob_off = i * (ecc->bytes + 4);
   1019 		u8 *data = buf + data_off;
   1020 		u8 *oob = chip->oob_poi + oob_off;
   1021 
   1022 		ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
   1023 						  oob_off + mtd->writesize,
   1024 						  &cur_off, &max_bitflips,
   1025 						  !i, page);
   1026 		if (ret < 0)
   1027 			return ret;
   1028 		else if (ret)
   1029 			raw_mode = true;
   1030 	}
   1031 
   1032 	if (oob_required)
   1033 		sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
   1034 						!raw_mode, page);
   1035 
   1036 	sunxi_nfc_hw_ecc_disable(mtd);
   1037 
   1038 	return max_bitflips;
   1039 }
   1040 
   1041 static int sunxi_nfc_hw_ecc_read_subpage(struct mtd_info *mtd,
   1042 					 struct nand_chip *chip,
   1043 					 uint32_t data_offs, uint32_t readlen,
   1044 					 uint8_t *bufpoi, int page)
   1045 {
   1046 	struct nand_ecc_ctrl *ecc = &chip->ecc;
   1047 	int ret, i, cur_off = 0;
   1048 	unsigned int max_bitflips = 0;
   1049 
   1050 	sunxi_nfc_hw_ecc_enable(mtd);
   1051 
   1052 	chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
   1053 	for (i = data_offs / ecc->size;
   1054 	     i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
   1055 		int data_off = i * ecc->size;
   1056 		int oob_off = i * (ecc->bytes + 4);
   1057 		u8 *data = bufpoi + data_off;
   1058 		u8 *oob = chip->oob_poi + oob_off;
   1059 
   1060 		ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off,
   1061 			oob, oob_off + mtd->writesize,
   1062 			&cur_off, &max_bitflips, !i, page);
   1063 		if (ret < 0)
   1064 			return ret;
   1065 	}
   1066 
   1067 	sunxi_nfc_hw_ecc_disable(mtd);
   1068 
   1069 	return max_bitflips;
   1070 }
   1071 
   1072 static int sunxi_nfc_hw_ecc_write_page(struct mtd_info *mtd,
   1073 				       struct nand_chip *chip,
   1074 				       const uint8_t *buf, int oob_required,
   1075 				       int page)
   1076 {
   1077 	struct nand_ecc_ctrl *ecc = &chip->ecc;
   1078 	int ret, i, cur_off = 0;
   1079 
   1080 	sunxi_nfc_hw_ecc_enable(mtd);
   1081 
   1082 	for (i = 0; i < ecc->steps; i++) {
   1083 		int data_off = i * ecc->size;
   1084 		int oob_off = i * (ecc->bytes + 4);
   1085 		const u8 *data = buf + data_off;
   1086 		const u8 *oob = chip->oob_poi + oob_off;
   1087 
   1088 		ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
   1089 						   oob_off + mtd->writesize,
   1090 						   &cur_off, !i, page);
   1091 		if (ret)
   1092 			return ret;
   1093 	}
   1094 
   1095 	if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
   1096 		sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
   1097 						 &cur_off, page);
   1098 
   1099 	sunxi_nfc_hw_ecc_disable(mtd);
   1100 
   1101 	return 0;
   1102 }
   1103 
   1104 static int sunxi_nfc_hw_ecc_write_subpage(struct mtd_info *mtd,
   1105 					  struct nand_chip *chip,
   1106 					  u32 data_offs, u32 data_len,
   1107 					  const u8 *buf, int oob_required,
   1108 					  int page)
   1109 {
   1110 	struct nand_ecc_ctrl *ecc = &chip->ecc;
   1111 	int ret, i, cur_off = 0;
   1112 
   1113 	sunxi_nfc_hw_ecc_enable(mtd);
   1114 
   1115 	for (i = data_offs / ecc->size;
   1116 	     i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
   1117 		int data_off = i * ecc->size;
   1118 		int oob_off = i * (ecc->bytes + 4);
   1119 		const u8 *data = buf + data_off;
   1120 		const u8 *oob = chip->oob_poi + oob_off;
   1121 
   1122 		ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
   1123 						   oob_off + mtd->writesize,
   1124 						   &cur_off, !i, page);
   1125 		if (ret)
   1126 			return ret;
   1127 	}
   1128 
   1129 	sunxi_nfc_hw_ecc_disable(mtd);
   1130 
   1131 	return 0;
   1132 }
   1133 
   1134 static int sunxi_nfc_hw_syndrome_ecc_read_page(struct mtd_info *mtd,
   1135 					       struct nand_chip *chip,
   1136 					       uint8_t *buf, int oob_required,
   1137 					       int page)
   1138 {
   1139 	struct nand_ecc_ctrl *ecc = &chip->ecc;
   1140 	unsigned int max_bitflips = 0;
   1141 	int ret, i, cur_off = 0;
   1142 	bool raw_mode = false;
   1143 
   1144 	sunxi_nfc_hw_ecc_enable(mtd);
   1145 
   1146 	for (i = 0; i < ecc->steps; i++) {
   1147 		int data_off = i * (ecc->size + ecc->bytes + 4);
   1148 		int oob_off = data_off + ecc->size;
   1149 		u8 *data = buf + (i * ecc->size);
   1150 		u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
   1151 
   1152 		ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
   1153 						  oob_off, &cur_off,
   1154 						  &max_bitflips, !i, page);
   1155 		if (ret < 0)
   1156 			return ret;
   1157 		else if (ret)
   1158 			raw_mode = true;
   1159 	}
   1160 
   1161 	if (oob_required)
   1162 		sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
   1163 						!raw_mode, page);
   1164 
   1165 	sunxi_nfc_hw_ecc_disable(mtd);
   1166 
   1167 	return max_bitflips;
   1168 }
   1169 
   1170 static int sunxi_nfc_hw_syndrome_ecc_write_page(struct mtd_info *mtd,
   1171 						struct nand_chip *chip,
   1172 						const uint8_t *buf,
   1173 						int oob_required, int page)
   1174 {
   1175 	struct nand_ecc_ctrl *ecc = &chip->ecc;
   1176 	int ret, i, cur_off = 0;
   1177 
   1178 	sunxi_nfc_hw_ecc_enable(mtd);
   1179 
   1180 	for (i = 0; i < ecc->steps; i++) {
   1181 		int data_off = i * (ecc->size + ecc->bytes + 4);
   1182 		int oob_off = data_off + ecc->size;
   1183 		const u8 *data = buf + (i * ecc->size);
   1184 		const u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
   1185 
   1186 		ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off,
   1187 						   oob, oob_off, &cur_off,
   1188 						   false, page);
   1189 		if (ret)
   1190 			return ret;
   1191 	}
   1192 
   1193 	if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
   1194 		sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
   1195 						 &cur_off, page);
   1196 
   1197 	sunxi_nfc_hw_ecc_disable(mtd);
   1198 
   1199 	return 0;
   1200 }
   1201 
   1202 static const s32 tWB_lut[] = {6, 12, 16, 20};
   1203 static const s32 tRHW_lut[] = {4, 8, 12, 20};
   1204 
   1205 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
   1206 		u32 clk_period)
   1207 {
   1208 	u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
   1209 	int i;
   1210 
   1211 	for (i = 0; i < lut_size; i++) {
   1212 		if (clk_cycles <= lut[i])
   1213 			return i;
   1214 	}
   1215 
   1216 	/* Doesn't fit */
   1217 	return -EINVAL;
   1218 }
   1219 
   1220 #define sunxi_nand_lookup_timing(l, p, c) \
   1221 			_sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
   1222 
   1223 static int sunxi_nand_chip_set_timings(struct sunxi_nand_chip *chip,
   1224 				       const struct nand_sdr_timings *timings)
   1225 {
   1226 	u32 min_clk_period = 0;
   1227 	s32 tWB, tADL, tWHR, tRHW, tCAD;
   1228 
   1229 	/* T1 <=> tCLS */
   1230 	if (timings->tCLS_min > min_clk_period)
   1231 		min_clk_period = timings->tCLS_min;
   1232 
   1233 	/* T2 <=> tCLH */
   1234 	if (timings->tCLH_min > min_clk_period)
   1235 		min_clk_period = timings->tCLH_min;
   1236 
   1237 	/* T3 <=> tCS */
   1238 	if (timings->tCS_min > min_clk_period)
   1239 		min_clk_period = timings->tCS_min;
   1240 
   1241 	/* T4 <=> tCH */
   1242 	if (timings->tCH_min > min_clk_period)
   1243 		min_clk_period = timings->tCH_min;
   1244 
   1245 	/* T5 <=> tWP */
   1246 	if (timings->tWP_min > min_clk_period)
   1247 		min_clk_period = timings->tWP_min;
   1248 
   1249 	/* T6 <=> tWH */
   1250 	if (timings->tWH_min > min_clk_period)
   1251 		min_clk_period = timings->tWH_min;
   1252 
   1253 	/* T7 <=> tALS */
   1254 	if (timings->tALS_min > min_clk_period)
   1255 		min_clk_period = timings->tALS_min;
   1256 
   1257 	/* T8 <=> tDS */
   1258 	if (timings->tDS_min > min_clk_period)
   1259 		min_clk_period = timings->tDS_min;
   1260 
   1261 	/* T9 <=> tDH */
   1262 	if (timings->tDH_min > min_clk_period)
   1263 		min_clk_period = timings->tDH_min;
   1264 
   1265 	/* T10 <=> tRR */
   1266 	if (timings->tRR_min > (min_clk_period * 3))
   1267 		min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
   1268 
   1269 	/* T11 <=> tALH */
   1270 	if (timings->tALH_min > min_clk_period)
   1271 		min_clk_period = timings->tALH_min;
   1272 
   1273 	/* T12 <=> tRP */
   1274 	if (timings->tRP_min > min_clk_period)
   1275 		min_clk_period = timings->tRP_min;
   1276 
   1277 	/* T13 <=> tREH */
   1278 	if (timings->tREH_min > min_clk_period)
   1279 		min_clk_period = timings->tREH_min;
   1280 
   1281 	/* T14 <=> tRC */
   1282 	if (timings->tRC_min > (min_clk_period * 2))
   1283 		min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
   1284 
   1285 	/* T15 <=> tWC */
   1286 	if (timings->tWC_min > (min_clk_period * 2))
   1287 		min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
   1288 
   1289 	/* T16 - T19 + tCAD */
   1290 	tWB  = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
   1291 					min_clk_period);
   1292 	if (tWB < 0) {
   1293 		dev_err(nfc->dev, "unsupported tWB\n");
   1294 		return tWB;
   1295 	}
   1296 
   1297 	tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
   1298 	if (tADL > 3) {
   1299 		dev_err(nfc->dev, "unsupported tADL\n");
   1300 		return -EINVAL;
   1301 	}
   1302 
   1303 	tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
   1304 	if (tWHR > 3) {
   1305 		dev_err(nfc->dev, "unsupported tWHR\n");
   1306 		return -EINVAL;
   1307 	}
   1308 
   1309 	tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
   1310 					min_clk_period);
   1311 	if (tRHW < 0) {
   1312 		dev_err(nfc->dev, "unsupported tRHW\n");
   1313 		return tRHW;
   1314 	}
   1315 
   1316 	/*
   1317 	 * TODO: according to ONFI specs this value only applies for DDR NAND,
   1318 	 * but Allwinner seems to set this to 0x7. Mimic them for now.
   1319 	 */
   1320 	tCAD = 0x7;
   1321 
   1322 	/* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
   1323 	chip->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
   1324 
   1325 	/*
   1326 	 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
   1327 	 * output cycle timings shall be used if the host drives tRC less than
   1328 	 * 30 ns.
   1329 	 */
   1330 	chip->timing_ctl = (timings->tRC_min < 30000) ? NFC_TIMING_CTL_EDO : 0;
   1331 
   1332 	/* Convert min_clk_period from picoseconds to nanoseconds */
   1333 	min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
   1334 
   1335 	/*
   1336 	 * Convert min_clk_period into a clk frequency, then get the
   1337 	 * appropriate rate for the NAND controller IP given this formula
   1338 	 * (specified in the datasheet):
   1339 	 * nand clk_rate = min_clk_rate
   1340 	 */
   1341 	chip->clk_rate = 1000000000L / min_clk_period;
   1342 
   1343 	return 0;
   1344 }
   1345 
   1346 static int sunxi_nand_chip_init_timings(struct sunxi_nand_chip *chip)
   1347 {
   1348 	struct mtd_info *mtd = nand_to_mtd(&chip->nand);
   1349 	const struct nand_sdr_timings *timings;
   1350 	int ret;
   1351 	int mode;
   1352 
   1353 	mode = onfi_get_async_timing_mode(&chip->nand);
   1354 	if (mode == ONFI_TIMING_MODE_UNKNOWN) {
   1355 		mode = chip->nand.onfi_timing_mode_default;
   1356 	} else {
   1357 		uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {};
   1358 		int i;
   1359 
   1360 		mode = fls(mode) - 1;
   1361 		if (mode < 0)
   1362 			mode = 0;
   1363 
   1364 		feature[0] = mode;
   1365 		for (i = 0; i < chip->nsels; i++) {
   1366 			chip->nand.select_chip(mtd, i);
   1367 			ret = chip->nand.onfi_set_features(mtd,
   1368 						&chip->nand,
   1369 						ONFI_FEATURE_ADDR_TIMING_MODE,
   1370 						feature);
   1371 			chip->nand.select_chip(mtd, -1);
   1372 			if (ret)
   1373 				return ret;
   1374 		}
   1375 	}
   1376 
   1377 	timings = onfi_async_timing_mode_to_sdr_timings(mode);
   1378 	if (IS_ERR(timings))
   1379 		return PTR_ERR(timings);
   1380 
   1381 	return sunxi_nand_chip_set_timings(chip, timings);
   1382 }
   1383 
   1384 static int sunxi_nand_hw_common_ecc_ctrl_init(struct mtd_info *mtd,
   1385 					      struct nand_ecc_ctrl *ecc)
   1386 {
   1387 	static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
   1388 	struct sunxi_nand_hw_ecc *data;
   1389 	struct nand_ecclayout *layout;
   1390 	int nsectors;
   1391 	int ret;
   1392 	int i;
   1393 
   1394 	data = kzalloc(sizeof(*data), GFP_KERNEL);
   1395 	if (!data)
   1396 		return -ENOMEM;
   1397 
   1398 	if (ecc->size != 512 && ecc->size != 1024)
   1399 		return -EINVAL;
   1400 
   1401 	/* Prefer 1k ECC chunk over 512 ones */
   1402 	if (ecc->size == 512 && mtd->writesize > 512) {
   1403 		ecc->size = 1024;
   1404 		ecc->strength *= 2;
   1405 	}
   1406 
   1407 	/* Add ECC info retrieval from DT */
   1408 	for (i = 0; i < ARRAY_SIZE(strengths); i++) {
   1409 		if (ecc->strength <= strengths[i]) {
   1410 			/*
   1411 			 * Update ecc->strength value with the actual strength
   1412 			 * that will be used by the ECC engine.
   1413 			 */
   1414 			ecc->strength = strengths[i];
   1415 			break;
   1416 		}
   1417 	}
   1418 
   1419 	if (i >= ARRAY_SIZE(strengths)) {
   1420 		dev_err(nfc->dev, "unsupported strength\n");
   1421 		ret = -ENOTSUPP;
   1422 		goto err;
   1423 	}
   1424 
   1425 	data->mode = i;
   1426 
   1427 	/* HW ECC always request ECC bytes for 1024 bytes blocks */
   1428 	ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
   1429 
   1430 	/* HW ECC always work with even numbers of ECC bytes */
   1431 	ecc->bytes = ALIGN(ecc->bytes, 2);
   1432 
   1433 	layout = &data->layout;
   1434 	nsectors = mtd->writesize / ecc->size;
   1435 
   1436 	if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
   1437 		ret = -EINVAL;
   1438 		goto err;
   1439 	}
   1440 
   1441 	layout->eccbytes = (ecc->bytes * nsectors);
   1442 
   1443 	ecc->layout = layout;
   1444 	ecc->priv = data;
   1445 
   1446 	return 0;
   1447 
   1448 err:
   1449 	kfree(data);
   1450 
   1451 	return ret;
   1452 }
   1453 
   1454 #ifndef __UBOOT__
   1455 static void sunxi_nand_hw_common_ecc_ctrl_cleanup(struct nand_ecc_ctrl *ecc)
   1456 {
   1457 	kfree(ecc->priv);
   1458 }
   1459 #endif /* __UBOOT__ */
   1460 
   1461 static int sunxi_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
   1462 				       struct nand_ecc_ctrl *ecc)
   1463 {
   1464 	struct nand_ecclayout *layout;
   1465 	int nsectors;
   1466 	int i, j;
   1467 	int ret;
   1468 
   1469 	ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
   1470 	if (ret)
   1471 		return ret;
   1472 
   1473 	ecc->read_page = sunxi_nfc_hw_ecc_read_page;
   1474 	ecc->write_page = sunxi_nfc_hw_ecc_write_page;
   1475 	ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
   1476 	ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
   1477 	layout = ecc->layout;
   1478 	nsectors = mtd->writesize / ecc->size;
   1479 
   1480 	for (i = 0; i < nsectors; i++) {
   1481 		if (i) {
   1482 			layout->oobfree[i].offset =
   1483 				layout->oobfree[i - 1].offset +
   1484 				layout->oobfree[i - 1].length +
   1485 				ecc->bytes;
   1486 			layout->oobfree[i].length = 4;
   1487 		} else {
   1488 			/*
   1489 			 * The first 2 bytes are used for BB markers, hence we
   1490 			 * only have 2 bytes available in the first user data
   1491 			 * section.
   1492 			 */
   1493 			layout->oobfree[i].length = 2;
   1494 			layout->oobfree[i].offset = 2;
   1495 		}
   1496 
   1497 		for (j = 0; j < ecc->bytes; j++)
   1498 			layout->eccpos[(ecc->bytes * i) + j] =
   1499 					layout->oobfree[i].offset +
   1500 					layout->oobfree[i].length + j;
   1501 	}
   1502 
   1503 	if (mtd->oobsize > (ecc->bytes + 4) * nsectors) {
   1504 		layout->oobfree[nsectors].offset =
   1505 				layout->oobfree[nsectors - 1].offset +
   1506 				layout->oobfree[nsectors - 1].length +
   1507 				ecc->bytes;
   1508 		layout->oobfree[nsectors].length = mtd->oobsize -
   1509 				((ecc->bytes + 4) * nsectors);
   1510 	}
   1511 
   1512 	return 0;
   1513 }
   1514 
   1515 static int sunxi_nand_hw_syndrome_ecc_ctrl_init(struct mtd_info *mtd,
   1516 						struct nand_ecc_ctrl *ecc)
   1517 {
   1518 	struct nand_ecclayout *layout;
   1519 	int nsectors;
   1520 	int i;
   1521 	int ret;
   1522 
   1523 	ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
   1524 	if (ret)
   1525 		return ret;
   1526 
   1527 	ecc->prepad = 4;
   1528 	ecc->read_page = sunxi_nfc_hw_syndrome_ecc_read_page;
   1529 	ecc->write_page = sunxi_nfc_hw_syndrome_ecc_write_page;
   1530 
   1531 	layout = ecc->layout;
   1532 	nsectors = mtd->writesize / ecc->size;
   1533 
   1534 	for (i = 0; i < (ecc->bytes * nsectors); i++)
   1535 		layout->eccpos[i] = i;
   1536 
   1537 	layout->oobfree[0].length = mtd->oobsize - i;
   1538 	layout->oobfree[0].offset = i;
   1539 
   1540 	return 0;
   1541 }
   1542 
   1543 #ifndef __UBOOT__
   1544 static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl *ecc)
   1545 {
   1546 	switch (ecc->mode) {
   1547 	case NAND_ECC_HW:
   1548 	case NAND_ECC_HW_SYNDROME:
   1549 		sunxi_nand_hw_common_ecc_ctrl_cleanup(ecc);
   1550 		break;
   1551 	case NAND_ECC_NONE:
   1552 		kfree(ecc->layout);
   1553 	default:
   1554 		break;
   1555 	}
   1556 }
   1557 #endif /* __UBOOT__ */
   1558 
   1559 static int sunxi_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc)
   1560 {
   1561 	struct nand_chip *nand = mtd_to_nand(mtd);
   1562 	int ret;
   1563 
   1564 	if (!ecc->size) {
   1565 		ecc->size = nand->ecc_step_ds;
   1566 		ecc->strength = nand->ecc_strength_ds;
   1567 	}
   1568 
   1569 	if (!ecc->size || !ecc->strength)
   1570 		return -EINVAL;
   1571 
   1572 	switch (ecc->mode) {
   1573 	case NAND_ECC_SOFT_BCH:
   1574 		break;
   1575 	case NAND_ECC_HW:
   1576 		ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc);
   1577 		if (ret)
   1578 			return ret;
   1579 		break;
   1580 	case NAND_ECC_HW_SYNDROME:
   1581 		ret = sunxi_nand_hw_syndrome_ecc_ctrl_init(mtd, ecc);
   1582 		if (ret)
   1583 			return ret;
   1584 		break;
   1585 	case NAND_ECC_NONE:
   1586 		ecc->layout = kzalloc(sizeof(*ecc->layout), GFP_KERNEL);
   1587 		if (!ecc->layout)
   1588 			return -ENOMEM;
   1589 		ecc->layout->oobfree[0].length = mtd->oobsize;
   1590 	case NAND_ECC_SOFT:
   1591 		break;
   1592 	default:
   1593 		return -EINVAL;
   1594 	}
   1595 
   1596 	return 0;
   1597 }
   1598 
   1599 static int sunxi_nand_chip_init(int node, struct sunxi_nfc *nfc, int devnum)
   1600 {
   1601 	const struct nand_sdr_timings *timings;
   1602 	const void *blob = gd->fdt_blob;
   1603 	struct sunxi_nand_chip *chip;
   1604 	struct mtd_info *mtd;
   1605 	struct nand_chip *nand;
   1606 	int nsels;
   1607 	int ret;
   1608 	int i;
   1609 	u32 cs[8], rb[8];
   1610 
   1611 	if (!fdt_getprop(blob, node, "reg", &nsels))
   1612 		return -EINVAL;
   1613 
   1614 	nsels /= sizeof(u32);
   1615 	if (!nsels || nsels > 8) {
   1616 		dev_err(dev, "invalid reg property size\n");
   1617 		return -EINVAL;
   1618 	}
   1619 
   1620 	chip = kzalloc(sizeof(*chip) +
   1621 		       (nsels * sizeof(struct sunxi_nand_chip_sel)),
   1622 		       GFP_KERNEL);
   1623 	if (!chip) {
   1624 		dev_err(dev, "could not allocate chip\n");
   1625 		return -ENOMEM;
   1626 	}
   1627 
   1628 	chip->nsels = nsels;
   1629 	chip->selected = -1;
   1630 
   1631 	for (i = 0; i < nsels; i++) {
   1632 		cs[i] = -1;
   1633 		rb[i] = -1;
   1634 	}
   1635 
   1636 	ret = fdtdec_get_int_array(gd->fdt_blob, node, "reg", cs, nsels);
   1637 	if (ret) {
   1638 		dev_err(dev, "could not retrieve reg property: %d\n", ret);
   1639 		return ret;
   1640 	}
   1641 
   1642 	ret = fdtdec_get_int_array(gd->fdt_blob, node, "allwinner,rb", rb,
   1643 				   nsels);
   1644 	if (ret) {
   1645 		dev_err(dev, "could not retrieve reg property: %d\n", ret);
   1646 		return ret;
   1647 	}
   1648 
   1649 	for (i = 0; i < nsels; i++) {
   1650 		int tmp = cs[i];
   1651 
   1652 		if (tmp > NFC_MAX_CS) {
   1653 			dev_err(dev,
   1654 				"invalid reg value: %u (max CS = 7)\n",
   1655 				tmp);
   1656 			return -EINVAL;
   1657 		}
   1658 
   1659 		if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
   1660 			dev_err(dev, "CS %d already assigned\n", tmp);
   1661 			return -EINVAL;
   1662 		}
   1663 
   1664 		chip->sels[i].cs = tmp;
   1665 
   1666 		tmp = rb[i];
   1667 		if (tmp >= 0 && tmp < 2) {
   1668 			chip->sels[i].rb.type = RB_NATIVE;
   1669 			chip->sels[i].rb.info.nativeid = tmp;
   1670 		} else {
   1671 			ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
   1672 						"rb-gpios", i,
   1673 						&chip->sels[i].rb.info.gpio,
   1674 						GPIOD_IS_IN);
   1675 			if (ret)
   1676 				chip->sels[i].rb.type = RB_GPIO;
   1677 			else
   1678 				chip->sels[i].rb.type = RB_NONE;
   1679 		}
   1680 	}
   1681 
   1682 	timings = onfi_async_timing_mode_to_sdr_timings(0);
   1683 	if (IS_ERR(timings)) {
   1684 		ret = PTR_ERR(timings);
   1685 		dev_err(dev,
   1686 			"could not retrieve timings for ONFI mode 0: %d\n",
   1687 			ret);
   1688 		return ret;
   1689 	}
   1690 
   1691 	ret = sunxi_nand_chip_set_timings(chip, timings);
   1692 	if (ret) {
   1693 		dev_err(dev, "could not configure chip timings: %d\n", ret);
   1694 		return ret;
   1695 	}
   1696 
   1697 	nand = &chip->nand;
   1698 	/* Default tR value specified in the ONFI spec (chapter 4.15.1) */
   1699 	nand->chip_delay = 200;
   1700 	nand->controller = &nfc->controller;
   1701 	/*
   1702 	 * Set the ECC mode to the default value in case nothing is specified
   1703 	 * in the DT.
   1704 	 */
   1705 	nand->ecc.mode = NAND_ECC_HW;
   1706 	nand->flash_node = node;
   1707 	nand->select_chip = sunxi_nfc_select_chip;
   1708 	nand->cmd_ctrl = sunxi_nfc_cmd_ctrl;
   1709 	nand->read_buf = sunxi_nfc_read_buf;
   1710 	nand->write_buf = sunxi_nfc_write_buf;
   1711 	nand->read_byte = sunxi_nfc_read_byte;
   1712 
   1713 	mtd = nand_to_mtd(nand);
   1714 	ret = nand_scan_ident(mtd, nsels, NULL);
   1715 	if (ret)
   1716 		return ret;
   1717 
   1718 	if (nand->bbt_options & NAND_BBT_USE_FLASH)
   1719 		nand->bbt_options |= NAND_BBT_NO_OOB;
   1720 
   1721 	if (nand->options & NAND_NEED_SCRAMBLING)
   1722 		nand->options |= NAND_NO_SUBPAGE_WRITE;
   1723 
   1724 	nand->options |= NAND_SUBPAGE_READ;
   1725 
   1726 	ret = sunxi_nand_chip_init_timings(chip);
   1727 	if (ret) {
   1728 		dev_err(dev, "could not configure chip timings: %d\n", ret);
   1729 		return ret;
   1730 	}
   1731 
   1732 	ret = sunxi_nand_ecc_init(mtd, &nand->ecc);
   1733 	if (ret) {
   1734 		dev_err(dev, "ECC init failed: %d\n", ret);
   1735 		return ret;
   1736 	}
   1737 
   1738 	ret = nand_scan_tail(mtd);
   1739 	if (ret) {
   1740 		dev_err(dev, "nand_scan_tail failed: %d\n", ret);
   1741 		return ret;
   1742 	}
   1743 
   1744 	ret = nand_register(devnum, mtd);
   1745 	if (ret) {
   1746 		dev_err(dev, "failed to register mtd device: %d\n", ret);
   1747 		return ret;
   1748 	}
   1749 
   1750 	list_add_tail(&chip->node, &nfc->chips);
   1751 
   1752 	return 0;
   1753 }
   1754 
   1755 static int sunxi_nand_chips_init(int node, struct sunxi_nfc *nfc)
   1756 {
   1757 	const void *blob = gd->fdt_blob;
   1758 	int nand_node;
   1759 	int ret, i = 0;
   1760 
   1761 	for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
   1762 	     nand_node = fdt_next_subnode(blob, nand_node))
   1763 		i++;
   1764 
   1765 	if (i > 8) {
   1766 		dev_err(dev, "too many NAND chips: %d (max = 8)\n", i);
   1767 		return -EINVAL;
   1768 	}
   1769 
   1770 	i = 0;
   1771 	for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
   1772 	     nand_node = fdt_next_subnode(blob, nand_node)) {
   1773 		ret = sunxi_nand_chip_init(nand_node, nfc, i++);
   1774 		if (ret)
   1775 			return ret;
   1776 	}
   1777 
   1778 	return 0;
   1779 }
   1780 
   1781 #ifndef __UBOOT__
   1782 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
   1783 {
   1784 	struct sunxi_nand_chip *chip;
   1785 
   1786 	while (!list_empty(&nfc->chips)) {
   1787 		chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip,
   1788 					node);
   1789 		nand_release(&chip->mtd);
   1790 		sunxi_nand_ecc_cleanup(&chip->nand.ecc);
   1791 		list_del(&chip->node);
   1792 		kfree(chip);
   1793 	}
   1794 }
   1795 #endif /* __UBOOT__ */
   1796 
   1797 void sunxi_nand_init(void)
   1798 {
   1799 	const void *blob = gd->fdt_blob;
   1800 	struct sunxi_nfc *nfc;
   1801 	fdt_addr_t regs;
   1802 	int node;
   1803 	int ret;
   1804 
   1805 	nfc = kzalloc(sizeof(*nfc), GFP_KERNEL);
   1806 	if (!nfc)
   1807 		return;
   1808 
   1809 	spin_lock_init(&nfc->controller.lock);
   1810 	init_waitqueue_head(&nfc->controller.wq);
   1811 	INIT_LIST_HEAD(&nfc->chips);
   1812 
   1813 	node = fdtdec_next_compatible(blob, 0, COMPAT_SUNXI_NAND);
   1814 	if (node < 0) {
   1815 		pr_err("unable to find nfc node in device tree\n");
   1816 		goto err;
   1817 	}
   1818 
   1819 	if (!fdtdec_get_is_enabled(blob, node)) {
   1820 		pr_err("nfc disabled in device tree\n");
   1821 		goto err;
   1822 	}
   1823 
   1824 	regs = fdtdec_get_addr(blob, node, "reg");
   1825 	if (regs == FDT_ADDR_T_NONE) {
   1826 		pr_err("unable to find nfc address in device tree\n");
   1827 		goto err;
   1828 	}
   1829 
   1830 	nfc->regs = (void *)regs;
   1831 
   1832 	ret = sunxi_nfc_rst(nfc);
   1833 	if (ret)
   1834 		goto err;
   1835 
   1836 	ret = sunxi_nand_chips_init(node, nfc);
   1837 	if (ret) {
   1838 		dev_err(dev, "failed to init nand chips\n");
   1839 		goto err;
   1840 	}
   1841 
   1842 	return;
   1843 
   1844 err:
   1845 	kfree(nfc);
   1846 }
   1847 
   1848 MODULE_LICENSE("GPL v2");
   1849 MODULE_AUTHOR("Boris BREZILLON");
   1850 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");
   1851