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