2 * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com>
5 * https://github.com/yuq/sunxi-nfc-mtd
6 * Copyright (C) 2013 Qiang Yu <yuq825@gmail.com>
8 * https://github.com/hno/Allwinner-Info
9 * Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
11 * Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com>
12 * Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org>
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.
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.
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>
31 #include <linux/of_device.h>
32 #include <linux/of_gpio.h>
33 #include <linux/mtd/mtd.h>
34 #include <linux/mtd/nand.h>
35 #include <linux/mtd/partitions.h>
36 #include <linux/clk.h>
37 #include <linux/delay.h>
38 #include <linux/dmaengine.h>
39 #include <linux/gpio.h>
40 #include <linux/interrupt.h>
41 #include <linux/iopoll.h>
42 #include <linux/reset.h>
44 #define NFC_REG_CTL 0x0000
45 #define NFC_REG_ST 0x0004
46 #define NFC_REG_INT 0x0008
47 #define NFC_REG_TIMING_CTL 0x000C
48 #define NFC_REG_TIMING_CFG 0x0010
49 #define NFC_REG_ADDR_LOW 0x0014
50 #define NFC_REG_ADDR_HIGH 0x0018
51 #define NFC_REG_SECTOR_NUM 0x001C
52 #define NFC_REG_CNT 0x0020
53 #define NFC_REG_CMD 0x0024
54 #define NFC_REG_RCMD_SET 0x0028
55 #define NFC_REG_WCMD_SET 0x002C
56 #define NFC_REG_IO_DATA 0x0030
57 #define NFC_REG_ECC_CTL 0x0034
58 #define NFC_REG_ECC_ST 0x0038
59 #define NFC_REG_DEBUG 0x003C
60 #define NFC_REG_ECC_ERR_CNT(x) ((0x0040 + (x)) & ~0x3)
61 #define NFC_REG_USER_DATA(x) (0x0050 + ((x) * 4))
62 #define NFC_REG_SPARE_AREA 0x00A0
63 #define NFC_REG_PAT_ID 0x00A4
64 #define NFC_RAM0_BASE 0x0400
65 #define NFC_RAM1_BASE 0x0800
67 /* define bit use in NFC_CTL */
69 #define NFC_RESET BIT(1)
70 #define NFC_BUS_WIDTH_MSK BIT(2)
71 #define NFC_BUS_WIDTH_8 (0 << 2)
72 #define NFC_BUS_WIDTH_16 (1 << 2)
73 #define NFC_RB_SEL_MSK BIT(3)
74 #define NFC_RB_SEL(x) ((x) << 3)
75 #define NFC_CE_SEL_MSK GENMASK(26, 24)
76 #define NFC_CE_SEL(x) ((x) << 24)
77 #define NFC_CE_CTL BIT(6)
78 #define NFC_PAGE_SHIFT_MSK GENMASK(11, 8)
79 #define NFC_PAGE_SHIFT(x) (((x) < 10 ? 0 : (x) - 10) << 8)
80 #define NFC_SAM BIT(12)
81 #define NFC_RAM_METHOD BIT(14)
82 #define NFC_DEBUG_CTL BIT(31)
84 /* define bit use in NFC_ST */
85 #define NFC_RB_B2R BIT(0)
86 #define NFC_CMD_INT_FLAG BIT(1)
87 #define NFC_DMA_INT_FLAG BIT(2)
88 #define NFC_CMD_FIFO_STATUS BIT(3)
89 #define NFC_STA BIT(4)
90 #define NFC_NATCH_INT_FLAG BIT(5)
91 #define NFC_RB_STATE(x) BIT(x + 8)
93 /* define bit use in NFC_INT */
94 #define NFC_B2R_INT_ENABLE BIT(0)
95 #define NFC_CMD_INT_ENABLE BIT(1)
96 #define NFC_DMA_INT_ENABLE BIT(2)
97 #define NFC_INT_MASK (NFC_B2R_INT_ENABLE | \
98 NFC_CMD_INT_ENABLE | \
101 /* define bit use in NFC_TIMING_CTL */
102 #define NFC_TIMING_CTL_EDO BIT(8)
104 /* define NFC_TIMING_CFG register layout */
105 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD) \
106 (((tWB) & 0x3) | (((tADL) & 0x3) << 2) | \
107 (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) | \
108 (((tCAD) & 0x7) << 8))
110 /* define bit use in NFC_CMD */
111 #define NFC_CMD_LOW_BYTE_MSK GENMASK(7, 0)
112 #define NFC_CMD_HIGH_BYTE_MSK GENMASK(15, 8)
113 #define NFC_CMD(x) (x)
114 #define NFC_ADR_NUM_MSK GENMASK(18, 16)
115 #define NFC_ADR_NUM(x) (((x) - 1) << 16)
116 #define NFC_SEND_ADR BIT(19)
117 #define NFC_ACCESS_DIR BIT(20)
118 #define NFC_DATA_TRANS BIT(21)
119 #define NFC_SEND_CMD1 BIT(22)
120 #define NFC_WAIT_FLAG BIT(23)
121 #define NFC_SEND_CMD2 BIT(24)
122 #define NFC_SEQ BIT(25)
123 #define NFC_DATA_SWAP_METHOD BIT(26)
124 #define NFC_ROW_AUTO_INC BIT(27)
125 #define NFC_SEND_CMD3 BIT(28)
126 #define NFC_SEND_CMD4 BIT(29)
127 #define NFC_CMD_TYPE_MSK GENMASK(31, 30)
128 #define NFC_NORMAL_OP (0 << 30)
129 #define NFC_ECC_OP (1 << 30)
130 #define NFC_PAGE_OP (2 << 30)
132 /* define bit use in NFC_RCMD_SET */
133 #define NFC_READ_CMD_MSK GENMASK(7, 0)
134 #define NFC_RND_READ_CMD0_MSK GENMASK(15, 8)
135 #define NFC_RND_READ_CMD1_MSK GENMASK(23, 16)
137 /* define bit use in NFC_WCMD_SET */
138 #define NFC_PROGRAM_CMD_MSK GENMASK(7, 0)
139 #define NFC_RND_WRITE_CMD_MSK GENMASK(15, 8)
140 #define NFC_READ_CMD0_MSK GENMASK(23, 16)
141 #define NFC_READ_CMD1_MSK GENMASK(31, 24)
143 /* define bit use in NFC_ECC_CTL */
144 #define NFC_ECC_EN BIT(0)
145 #define NFC_ECC_PIPELINE BIT(3)
146 #define NFC_ECC_EXCEPTION BIT(4)
147 #define NFC_ECC_BLOCK_SIZE_MSK BIT(5)
148 #define NFC_ECC_BLOCK_512 BIT(5)
149 #define NFC_RANDOM_EN BIT(9)
150 #define NFC_RANDOM_DIRECTION BIT(10)
151 #define NFC_ECC_MODE_MSK GENMASK(15, 12)
152 #define NFC_ECC_MODE(x) ((x) << 12)
153 #define NFC_RANDOM_SEED_MSK GENMASK(30, 16)
154 #define NFC_RANDOM_SEED(x) ((x) << 16)
156 /* define bit use in NFC_ECC_ST */
157 #define NFC_ECC_ERR(x) BIT(x)
158 #define NFC_ECC_ERR_MSK GENMASK(15, 0)
159 #define NFC_ECC_PAT_FOUND(x) BIT(x + 16)
160 #define NFC_ECC_ERR_CNT(b, x) (((x) >> (((b) % 4) * 8)) & 0xff)
162 #define NFC_DEFAULT_TIMEOUT_MS 1000
164 #define NFC_SRAM_SIZE 1024
169 * Ready/Busy detection type: describes the Ready/Busy detection modes
171 * @RB_NONE: no external detection available, rely on STATUS command
172 * and software timeouts
173 * @RB_NATIVE: use sunxi NAND controller Ready/Busy support. The Ready/Busy
174 * pin of the NAND flash chip must be connected to one of the
175 * native NAND R/B pins (those which can be muxed to the NAND
177 * @RB_GPIO: use a simple GPIO to handle Ready/Busy status. The Ready/Busy
178 * pin of the NAND flash chip must be connected to a GPIO capable
181 enum sunxi_nand_rb_type {
188 * Ready/Busy structure: stores information related to Ready/Busy detection
190 * @type: the Ready/Busy detection mode
191 * @info: information related to the R/B detection mode. Either a gpio
192 * id or a native R/B id (those supported by the NAND controller).
194 struct sunxi_nand_rb {
195 enum sunxi_nand_rb_type type;
203 * Chip Select structure: stores information related to NAND Chip Select
205 * @cs: the NAND CS id used to communicate with a NAND Chip
206 * @rb: the Ready/Busy description
208 struct sunxi_nand_chip_sel {
210 struct sunxi_nand_rb rb;
214 * sunxi HW ECC infos: stores information related to HW ECC support
216 * @mode: the sunxi ECC mode field deduced from ECC requirements
218 struct sunxi_nand_hw_ecc {
223 * NAND chip structure: stores NAND chip device related information
225 * @node: used to store NAND chips into a list
226 * @nand: base NAND chip structure
227 * @mtd: base MTD structure
228 * @clk_rate: clk_rate required for this NAND chip
229 * @timing_cfg TIMING_CFG register value for this NAND chip
230 * @selected: current active CS
231 * @nsels: number of CS lines required by the NAND chip
232 * @sels: array of CS lines descriptions
234 struct sunxi_nand_chip {
235 struct list_head node;
236 struct nand_chip nand;
237 unsigned long clk_rate;
246 struct sunxi_nand_chip_sel sels[0];
249 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
251 return container_of(nand, struct sunxi_nand_chip, nand);
255 * NAND Controller structure: stores sunxi NAND controller information
257 * @controller: base controller structure
258 * @dev: parent device (used to print error messages)
259 * @regs: NAND controller registers
260 * @ahb_clk: NAND Controller AHB clock
261 * @mod_clk: NAND Controller mod clock
262 * @assigned_cs: bitmask describing already assigned CS lines
263 * @clk_rate: NAND controller current clock rate
264 * @chips: a list containing all the NAND chips attached to
265 * this NAND controller
266 * @complete: a completion object used to wait for NAND
270 struct nand_hw_control controller;
275 struct reset_control *reset;
276 unsigned long assigned_cs;
277 unsigned long clk_rate;
278 struct list_head chips;
279 struct completion complete;
280 struct dma_chan *dmac;
283 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_hw_control *ctrl)
285 return container_of(ctrl, struct sunxi_nfc, controller);
288 static irqreturn_t sunxi_nfc_interrupt(int irq, void *dev_id)
290 struct sunxi_nfc *nfc = dev_id;
291 u32 st = readl(nfc->regs + NFC_REG_ST);
292 u32 ien = readl(nfc->regs + NFC_REG_INT);
297 if ((ien & st) == ien)
298 complete(&nfc->complete);
300 writel(st & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
301 writel(~st & ien & NFC_INT_MASK, nfc->regs + NFC_REG_INT);
306 static int sunxi_nfc_wait_events(struct sunxi_nfc *nfc, u32 events,
307 bool use_polling, unsigned int timeout_ms)
311 if (events & ~NFC_INT_MASK)
315 timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
318 init_completion(&nfc->complete);
320 writel(events, nfc->regs + NFC_REG_INT);
322 ret = wait_for_completion_timeout(&nfc->complete,
323 msecs_to_jiffies(timeout_ms));
329 writel(0, nfc->regs + NFC_REG_INT);
333 ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status,
334 (status & events) == events, 1,
338 writel(events & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
341 dev_err(nfc->dev, "wait interrupt timedout\n");
346 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
351 ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status,
352 !(status & NFC_CMD_FIFO_STATUS), 1,
353 NFC_DEFAULT_TIMEOUT_MS * 1000);
355 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
360 static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
365 writel(0, nfc->regs + NFC_REG_ECC_CTL);
366 writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
368 ret = readl_poll_timeout(nfc->regs + NFC_REG_CTL, ctl,
369 !(ctl & NFC_RESET), 1,
370 NFC_DEFAULT_TIMEOUT_MS * 1000);
372 dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
377 static int sunxi_nfc_dma_op_prepare(struct mtd_info *mtd, const void *buf,
378 int chunksize, int nchunks,
379 enum dma_data_direction ddir,
380 struct scatterlist *sg)
382 struct nand_chip *nand = mtd_to_nand(mtd);
383 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
384 struct dma_async_tx_descriptor *dmad;
385 enum dma_transfer_direction tdir;
389 if (ddir == DMA_FROM_DEVICE)
390 tdir = DMA_DEV_TO_MEM;
392 tdir = DMA_MEM_TO_DEV;
394 sg_init_one(sg, buf, nchunks * chunksize);
395 ret = dma_map_sg(nfc->dev, sg, 1, ddir);
399 dmad = dmaengine_prep_slave_sg(nfc->dmac, sg, 1, tdir, DMA_CTRL_ACK);
405 writel(readl(nfc->regs + NFC_REG_CTL) | NFC_RAM_METHOD,
406 nfc->regs + NFC_REG_CTL);
407 writel(nchunks, nfc->regs + NFC_REG_SECTOR_NUM);
408 writel(chunksize, nfc->regs + NFC_REG_CNT);
409 dmat = dmaengine_submit(dmad);
411 ret = dma_submit_error(dmat);
413 goto err_clr_dma_flag;
418 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD,
419 nfc->regs + NFC_REG_CTL);
422 dma_unmap_sg(nfc->dev, sg, 1, ddir);
426 static void sunxi_nfc_dma_op_cleanup(struct mtd_info *mtd,
427 enum dma_data_direction ddir,
428 struct scatterlist *sg)
430 struct nand_chip *nand = mtd_to_nand(mtd);
431 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
433 dma_unmap_sg(nfc->dev, sg, 1, ddir);
434 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD,
435 nfc->regs + NFC_REG_CTL);
438 static int sunxi_nfc_dev_ready(struct mtd_info *mtd)
440 struct nand_chip *nand = mtd_to_nand(mtd);
441 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
442 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
443 struct sunxi_nand_rb *rb;
446 if (sunxi_nand->selected < 0)
449 rb = &sunxi_nand->sels[sunxi_nand->selected].rb;
453 ret = !!(readl(nfc->regs + NFC_REG_ST) &
454 NFC_RB_STATE(rb->info.nativeid));
457 ret = gpio_get_value(rb->info.gpio);
462 dev_err(nfc->dev, "cannot check R/B NAND status!\n");
469 static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
471 struct nand_chip *nand = mtd_to_nand(mtd);
472 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
473 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
474 struct sunxi_nand_chip_sel *sel;
477 if (chip > 0 && chip >= sunxi_nand->nsels)
480 if (chip == sunxi_nand->selected)
483 ctl = readl(nfc->regs + NFC_REG_CTL) &
484 ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
487 sel = &sunxi_nand->sels[chip];
489 ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
490 NFC_PAGE_SHIFT(nand->page_shift);
491 if (sel->rb.type == RB_NONE) {
492 nand->dev_ready = NULL;
494 nand->dev_ready = sunxi_nfc_dev_ready;
495 if (sel->rb.type == RB_NATIVE)
496 ctl |= NFC_RB_SEL(sel->rb.info.nativeid);
499 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
501 if (nfc->clk_rate != sunxi_nand->clk_rate) {
502 clk_set_rate(nfc->mod_clk, sunxi_nand->clk_rate);
503 nfc->clk_rate = sunxi_nand->clk_rate;
507 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
508 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
509 writel(ctl, nfc->regs + NFC_REG_CTL);
511 sunxi_nand->selected = chip;
514 static void sunxi_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
516 struct nand_chip *nand = mtd_to_nand(mtd);
517 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
518 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
525 cnt = min(len - offs, NFC_SRAM_SIZE);
527 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
531 writel(cnt, nfc->regs + NFC_REG_CNT);
532 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
533 writel(tmp, nfc->regs + NFC_REG_CMD);
535 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, true, 0);
540 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
546 static void sunxi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
549 struct nand_chip *nand = mtd_to_nand(mtd);
550 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
551 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
558 cnt = min(len - offs, NFC_SRAM_SIZE);
560 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
564 writel(cnt, nfc->regs + NFC_REG_CNT);
565 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
566 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
568 writel(tmp, nfc->regs + NFC_REG_CMD);
570 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, true, 0);
578 static uint8_t sunxi_nfc_read_byte(struct mtd_info *mtd)
582 sunxi_nfc_read_buf(mtd, &ret, 1);
587 static void sunxi_nfc_cmd_ctrl(struct mtd_info *mtd, int dat,
590 struct nand_chip *nand = mtd_to_nand(mtd);
591 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
592 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
595 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
599 if (dat == NAND_CMD_NONE && (ctrl & NAND_NCE) &&
600 !(ctrl & (NAND_CLE | NAND_ALE))) {
603 if (!sunxi_nand->addr_cycles && !sunxi_nand->cmd_cycles)
606 if (sunxi_nand->cmd_cycles--)
607 cmd |= NFC_SEND_CMD1 | sunxi_nand->cmd[0];
609 if (sunxi_nand->cmd_cycles--) {
610 cmd |= NFC_SEND_CMD2;
611 writel(sunxi_nand->cmd[1],
612 nfc->regs + NFC_REG_RCMD_SET);
615 sunxi_nand->cmd_cycles = 0;
617 if (sunxi_nand->addr_cycles) {
618 cmd |= NFC_SEND_ADR |
619 NFC_ADR_NUM(sunxi_nand->addr_cycles);
620 writel(sunxi_nand->addr[0],
621 nfc->regs + NFC_REG_ADDR_LOW);
624 if (sunxi_nand->addr_cycles > 4)
625 writel(sunxi_nand->addr[1],
626 nfc->regs + NFC_REG_ADDR_HIGH);
628 writel(cmd, nfc->regs + NFC_REG_CMD);
629 sunxi_nand->addr[0] = 0;
630 sunxi_nand->addr[1] = 0;
631 sunxi_nand->addr_cycles = 0;
632 sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, true, 0);
635 if (ctrl & NAND_CLE) {
636 sunxi_nand->cmd[sunxi_nand->cmd_cycles++] = dat;
637 } else if (ctrl & NAND_ALE) {
638 sunxi_nand->addr[sunxi_nand->addr_cycles / 4] |=
639 dat << ((sunxi_nand->addr_cycles % 4) * 8);
640 sunxi_nand->addr_cycles++;
644 /* These seed values have been extracted from Allwinner's BSP */
645 static const u16 sunxi_nfc_randomizer_page_seeds[] = {
646 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
647 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
648 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
649 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
650 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
651 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
652 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
653 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
654 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
655 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
656 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
657 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
658 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
659 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
660 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
661 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
665 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
666 * have been generated using
667 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
668 * the randomizer engine does internally before de/scrambling OOB data.
670 * Those tables are statically defined to avoid calculating randomizer state
673 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
674 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
675 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
676 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
677 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
678 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
679 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
680 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
681 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
682 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
683 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
684 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
685 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
686 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
687 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
688 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
689 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
692 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
693 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
694 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
695 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
696 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
697 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
698 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
699 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
700 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
701 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
702 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
703 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
704 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
705 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
706 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
707 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
708 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
711 static u16 sunxi_nfc_randomizer_step(u16 state, int count)
716 * This loop is just a simple implementation of a Fibonacci LFSR using
717 * the x16 + x15 + 1 polynomial.
720 state = ((state >> 1) |
721 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
726 static u16 sunxi_nfc_randomizer_state(struct mtd_info *mtd, int page, bool ecc)
728 const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
729 int mod = mtd_div_by_ws(mtd->erasesize, mtd);
731 if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
732 mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
735 if (mtd->ecc_step_size == 512)
736 seeds = sunxi_nfc_randomizer_ecc512_seeds;
738 seeds = sunxi_nfc_randomizer_ecc1024_seeds;
741 return seeds[page % mod];
744 static void sunxi_nfc_randomizer_config(struct mtd_info *mtd,
747 struct nand_chip *nand = mtd_to_nand(mtd);
748 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
749 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
752 if (!(nand->options & NAND_NEED_SCRAMBLING))
755 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
756 state = sunxi_nfc_randomizer_state(mtd, page, ecc);
757 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
758 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
761 static void sunxi_nfc_randomizer_enable(struct mtd_info *mtd)
763 struct nand_chip *nand = mtd_to_nand(mtd);
764 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
766 if (!(nand->options & NAND_NEED_SCRAMBLING))
769 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
770 nfc->regs + NFC_REG_ECC_CTL);
773 static void sunxi_nfc_randomizer_disable(struct mtd_info *mtd)
775 struct nand_chip *nand = mtd_to_nand(mtd);
776 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
778 if (!(nand->options & NAND_NEED_SCRAMBLING))
781 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
782 nfc->regs + NFC_REG_ECC_CTL);
785 static void sunxi_nfc_randomize_bbm(struct mtd_info *mtd, int page, u8 *bbm)
787 u16 state = sunxi_nfc_randomizer_state(mtd, page, true);
790 bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
793 static void sunxi_nfc_randomizer_write_buf(struct mtd_info *mtd,
794 const uint8_t *buf, int len,
797 sunxi_nfc_randomizer_config(mtd, page, ecc);
798 sunxi_nfc_randomizer_enable(mtd);
799 sunxi_nfc_write_buf(mtd, buf, len);
800 sunxi_nfc_randomizer_disable(mtd);
803 static void sunxi_nfc_randomizer_read_buf(struct mtd_info *mtd, uint8_t *buf,
804 int len, bool ecc, int page)
806 sunxi_nfc_randomizer_config(mtd, page, ecc);
807 sunxi_nfc_randomizer_enable(mtd);
808 sunxi_nfc_read_buf(mtd, buf, len);
809 sunxi_nfc_randomizer_disable(mtd);
812 static void sunxi_nfc_hw_ecc_enable(struct mtd_info *mtd)
814 struct nand_chip *nand = mtd_to_nand(mtd);
815 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
816 struct sunxi_nand_hw_ecc *data = nand->ecc.priv;
819 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
820 ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
821 NFC_ECC_BLOCK_SIZE_MSK);
822 ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(data->mode) | NFC_ECC_EXCEPTION |
825 if (nand->ecc.size == 512)
826 ecc_ctl |= NFC_ECC_BLOCK_512;
828 writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
831 static void sunxi_nfc_hw_ecc_disable(struct mtd_info *mtd)
833 struct nand_chip *nand = mtd_to_nand(mtd);
834 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
836 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
837 nfc->regs + NFC_REG_ECC_CTL);
840 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
843 buf[1] = user_data >> 8;
844 buf[2] = user_data >> 16;
845 buf[3] = user_data >> 24;
848 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
850 return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
853 static void sunxi_nfc_hw_ecc_get_prot_oob_bytes(struct mtd_info *mtd, u8 *oob,
854 int step, bool bbm, int page)
856 struct nand_chip *nand = mtd_to_nand(mtd);
857 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
859 sunxi_nfc_user_data_to_buf(readl(nfc->regs + NFC_REG_USER_DATA(step)),
862 /* De-randomize the Bad Block Marker. */
863 if (bbm && (nand->options & NAND_NEED_SCRAMBLING))
864 sunxi_nfc_randomize_bbm(mtd, page, oob);
867 static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct mtd_info *mtd,
868 const u8 *oob, int step,
871 struct nand_chip *nand = mtd_to_nand(mtd);
872 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
875 /* Randomize the Bad Block Marker. */
876 if (bbm && (nand->options & NAND_NEED_SCRAMBLING)) {
877 memcpy(user_data, oob, sizeof(user_data));
878 sunxi_nfc_randomize_bbm(mtd, page, user_data);
882 writel(sunxi_nfc_buf_to_user_data(oob),
883 nfc->regs + NFC_REG_USER_DATA(step));
886 static void sunxi_nfc_hw_ecc_update_stats(struct mtd_info *mtd,
887 unsigned int *max_bitflips, int ret)
890 mtd->ecc_stats.failed++;
892 mtd->ecc_stats.corrected += ret;
893 *max_bitflips = max_t(unsigned int, *max_bitflips, ret);
897 static int sunxi_nfc_hw_ecc_correct(struct mtd_info *mtd, u8 *data, u8 *oob,
898 int step, u32 status, bool *erased)
900 struct nand_chip *nand = mtd_to_nand(mtd);
901 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
902 struct nand_ecc_ctrl *ecc = &nand->ecc;
907 if (status & NFC_ECC_ERR(step))
910 if (status & NFC_ECC_PAT_FOUND(step)) {
913 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1))) {
921 memset(data, pattern, ecc->size);
924 memset(oob, pattern, ecc->bytes + 4);
929 tmp = readl(nfc->regs + NFC_REG_ECC_ERR_CNT(step));
931 return NFC_ECC_ERR_CNT(step, tmp);
934 static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
935 u8 *data, int data_off,
936 u8 *oob, int oob_off,
938 unsigned int *max_bitflips,
939 bool bbm, bool oob_required, int page)
941 struct nand_chip *nand = mtd_to_nand(mtd);
942 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
943 struct nand_ecc_ctrl *ecc = &nand->ecc;
948 if (*cur_off != data_off)
949 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
951 sunxi_nfc_randomizer_read_buf(mtd, NULL, ecc->size, false, page);
953 if (data_off + ecc->size != oob_off)
954 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
956 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
960 sunxi_nfc_randomizer_enable(mtd);
961 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
962 nfc->regs + NFC_REG_CMD);
964 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, true, 0);
965 sunxi_nfc_randomizer_disable(mtd);
969 *cur_off = oob_off + ecc->bytes + 4;
971 ret = sunxi_nfc_hw_ecc_correct(mtd, data, oob_required ? oob : NULL, 0,
972 readl(nfc->regs + NFC_REG_ECC_ST),
979 * Re-read the data with the randomizer disabled to identify
980 * bitflips in erased pages.
982 if (nand->options & NAND_NEED_SCRAMBLING) {
983 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
984 nand->read_buf(mtd, data, ecc->size);
986 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE,
990 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
991 nand->read_buf(mtd, oob, ecc->bytes + 4);
993 ret = nand_check_erased_ecc_chunk(data, ecc->size,
995 NULL, 0, ecc->strength);
999 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
1002 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
1003 sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4,
1006 sunxi_nfc_hw_ecc_get_prot_oob_bytes(mtd, oob, 0,
1011 sunxi_nfc_hw_ecc_update_stats(mtd, max_bitflips, ret);
1016 static void sunxi_nfc_hw_ecc_read_extra_oob(struct mtd_info *mtd,
1017 u8 *oob, int *cur_off,
1018 bool randomize, int page)
1020 struct nand_chip *nand = mtd_to_nand(mtd);
1021 struct nand_ecc_ctrl *ecc = &nand->ecc;
1022 int offset = ((ecc->bytes + 4) * ecc->steps);
1023 int len = mtd->oobsize - offset;
1028 if (!cur_off || *cur_off != offset)
1029 nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
1030 offset + mtd->writesize, -1);
1033 sunxi_nfc_read_buf(mtd, oob + offset, len);
1035 sunxi_nfc_randomizer_read_buf(mtd, oob + offset, len,
1039 *cur_off = mtd->oobsize + mtd->writesize;
1042 static int sunxi_nfc_hw_ecc_read_chunks_dma(struct mtd_info *mtd, uint8_t *buf,
1043 int oob_required, int page,
1046 struct nand_chip *nand = mtd_to_nand(mtd);
1047 bool randomized = nand->options & NAND_NEED_SCRAMBLING;
1048 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1049 struct nand_ecc_ctrl *ecc = &nand->ecc;
1050 unsigned int max_bitflips = 0;
1051 int ret, i, raw_mode = 0;
1052 struct scatterlist sg;
1055 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1059 ret = sunxi_nfc_dma_op_prepare(mtd, buf, ecc->size, nchunks,
1060 DMA_FROM_DEVICE, &sg);
1064 sunxi_nfc_hw_ecc_enable(mtd);
1065 sunxi_nfc_randomizer_config(mtd, page, false);
1066 sunxi_nfc_randomizer_enable(mtd);
1068 writel((NAND_CMD_RNDOUTSTART << 16) | (NAND_CMD_RNDOUT << 8) |
1069 NAND_CMD_READSTART, nfc->regs + NFC_REG_RCMD_SET);
1071 dma_async_issue_pending(nfc->dmac);
1073 writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD | NFC_DATA_TRANS,
1074 nfc->regs + NFC_REG_CMD);
1076 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, true, 0);
1078 dmaengine_terminate_all(nfc->dmac);
1080 sunxi_nfc_randomizer_disable(mtd);
1081 sunxi_nfc_hw_ecc_disable(mtd);
1083 sunxi_nfc_dma_op_cleanup(mtd, DMA_FROM_DEVICE, &sg);
1088 status = readl(nfc->regs + NFC_REG_ECC_ST);
1090 for (i = 0; i < nchunks; i++) {
1091 int data_off = i * ecc->size;
1092 int oob_off = i * (ecc->bytes + 4);
1093 u8 *data = buf + data_off;
1094 u8 *oob = nand->oob_poi + oob_off;
1097 ret = sunxi_nfc_hw_ecc_correct(mtd, randomized ? data : NULL,
1098 oob_required ? oob : NULL,
1099 i, status, &erased);
1101 /* ECC errors are handled in the second loop. */
1105 if (oob_required && !erased) {
1106 /* TODO: use DMA to retrieve OOB */
1107 nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
1108 mtd->writesize + oob_off, -1);
1109 nand->read_buf(mtd, oob, ecc->bytes + 4);
1111 sunxi_nfc_hw_ecc_get_prot_oob_bytes(mtd, oob, i,
1118 sunxi_nfc_hw_ecc_update_stats(mtd, &max_bitflips, ret);
1121 if (status & NFC_ECC_ERR_MSK) {
1122 for (i = 0; i < nchunks; i++) {
1123 int data_off = i * ecc->size;
1124 int oob_off = i * (ecc->bytes + 4);
1125 u8 *data = buf + data_off;
1126 u8 *oob = nand->oob_poi + oob_off;
1128 if (!(status & NFC_ECC_ERR(i)))
1132 * Re-read the data with the randomizer disabled to
1133 * identify bitflips in erased pages.
1136 /* TODO: use DMA to read page in raw mode */
1137 nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
1139 nand->read_buf(mtd, data, ecc->size);
1142 /* TODO: use DMA to retrieve OOB */
1143 nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
1144 mtd->writesize + oob_off, -1);
1145 nand->read_buf(mtd, oob, ecc->bytes + 4);
1147 ret = nand_check_erased_ecc_chunk(data, ecc->size,
1148 oob, ecc->bytes + 4,
1154 sunxi_nfc_hw_ecc_update_stats(mtd, &max_bitflips, ret);
1159 sunxi_nfc_hw_ecc_read_extra_oob(mtd, nand->oob_poi,
1163 return max_bitflips;
1166 static int sunxi_nfc_hw_ecc_write_chunk(struct mtd_info *mtd,
1167 const u8 *data, int data_off,
1168 const u8 *oob, int oob_off,
1169 int *cur_off, bool bbm,
1172 struct nand_chip *nand = mtd_to_nand(mtd);
1173 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1174 struct nand_ecc_ctrl *ecc = &nand->ecc;
1177 if (data_off != *cur_off)
1178 nand->cmdfunc(mtd, NAND_CMD_RNDIN, data_off, -1);
1180 sunxi_nfc_randomizer_write_buf(mtd, data, ecc->size, false, page);
1182 if (data_off + ecc->size != oob_off)
1183 nand->cmdfunc(mtd, NAND_CMD_RNDIN, oob_off, -1);
1185 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1189 sunxi_nfc_randomizer_enable(mtd);
1190 sunxi_nfc_hw_ecc_set_prot_oob_bytes(mtd, oob, 0, bbm, page);
1192 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
1193 NFC_ACCESS_DIR | NFC_ECC_OP,
1194 nfc->regs + NFC_REG_CMD);
1196 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, true, 0);
1197 sunxi_nfc_randomizer_disable(mtd);
1201 *cur_off = oob_off + ecc->bytes + 4;
1206 static void sunxi_nfc_hw_ecc_write_extra_oob(struct mtd_info *mtd,
1207 u8 *oob, int *cur_off,
1210 struct nand_chip *nand = mtd_to_nand(mtd);
1211 struct nand_ecc_ctrl *ecc = &nand->ecc;
1212 int offset = ((ecc->bytes + 4) * ecc->steps);
1213 int len = mtd->oobsize - offset;
1218 if (!cur_off || *cur_off != offset)
1219 nand->cmdfunc(mtd, NAND_CMD_RNDIN,
1220 offset + mtd->writesize, -1);
1222 sunxi_nfc_randomizer_write_buf(mtd, oob + offset, len, false, page);
1225 *cur_off = mtd->oobsize + mtd->writesize;
1228 static int sunxi_nfc_hw_ecc_read_page(struct mtd_info *mtd,
1229 struct nand_chip *chip, uint8_t *buf,
1230 int oob_required, int page)
1232 struct nand_ecc_ctrl *ecc = &chip->ecc;
1233 unsigned int max_bitflips = 0;
1234 int ret, i, cur_off = 0;
1235 bool raw_mode = false;
1237 sunxi_nfc_hw_ecc_enable(mtd);
1239 for (i = 0; i < ecc->steps; i++) {
1240 int data_off = i * ecc->size;
1241 int oob_off = i * (ecc->bytes + 4);
1242 u8 *data = buf + data_off;
1243 u8 *oob = chip->oob_poi + oob_off;
1245 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1246 oob_off + mtd->writesize,
1247 &cur_off, &max_bitflips,
1248 !i, oob_required, page);
1256 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1259 sunxi_nfc_hw_ecc_disable(mtd);
1261 return max_bitflips;
1264 static int sunxi_nfc_hw_ecc_read_page_dma(struct mtd_info *mtd,
1265 struct nand_chip *chip, u8 *buf,
1266 int oob_required, int page)
1270 ret = sunxi_nfc_hw_ecc_read_chunks_dma(mtd, buf, oob_required, page,
1275 /* Fallback to PIO mode */
1276 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, 0, -1);
1278 return sunxi_nfc_hw_ecc_read_page(mtd, chip, buf, oob_required, page);
1281 static int sunxi_nfc_hw_ecc_read_subpage(struct mtd_info *mtd,
1282 struct nand_chip *chip,
1283 u32 data_offs, u32 readlen,
1284 u8 *bufpoi, int page)
1286 struct nand_ecc_ctrl *ecc = &chip->ecc;
1287 int ret, i, cur_off = 0;
1288 unsigned int max_bitflips = 0;
1290 sunxi_nfc_hw_ecc_enable(mtd);
1292 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
1293 for (i = data_offs / ecc->size;
1294 i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
1295 int data_off = i * ecc->size;
1296 int oob_off = i * (ecc->bytes + 4);
1297 u8 *data = bufpoi + data_off;
1298 u8 *oob = chip->oob_poi + oob_off;
1300 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off,
1302 oob_off + mtd->writesize,
1303 &cur_off, &max_bitflips, !i,
1309 sunxi_nfc_hw_ecc_disable(mtd);
1311 return max_bitflips;
1314 static int sunxi_nfc_hw_ecc_read_subpage_dma(struct mtd_info *mtd,
1315 struct nand_chip *chip,
1316 u32 data_offs, u32 readlen,
1319 int nchunks = DIV_ROUND_UP(data_offs + readlen, chip->ecc.size);
1322 ret = sunxi_nfc_hw_ecc_read_chunks_dma(mtd, buf, false, page, nchunks);
1326 /* Fallback to PIO mode */
1327 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, 0, -1);
1329 return sunxi_nfc_hw_ecc_read_subpage(mtd, chip, data_offs, readlen,
1333 static int sunxi_nfc_hw_ecc_write_page(struct mtd_info *mtd,
1334 struct nand_chip *chip,
1335 const uint8_t *buf, int oob_required,
1338 struct nand_ecc_ctrl *ecc = &chip->ecc;
1339 int ret, i, cur_off = 0;
1341 sunxi_nfc_hw_ecc_enable(mtd);
1343 for (i = 0; i < ecc->steps; i++) {
1344 int data_off = i * ecc->size;
1345 int oob_off = i * (ecc->bytes + 4);
1346 const u8 *data = buf + data_off;
1347 const u8 *oob = chip->oob_poi + oob_off;
1349 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1350 oob_off + mtd->writesize,
1351 &cur_off, !i, page);
1356 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1357 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1360 sunxi_nfc_hw_ecc_disable(mtd);
1365 static int sunxi_nfc_hw_ecc_write_subpage(struct mtd_info *mtd,
1366 struct nand_chip *chip,
1367 u32 data_offs, u32 data_len,
1368 const u8 *buf, int oob_required,
1371 struct nand_ecc_ctrl *ecc = &chip->ecc;
1372 int ret, i, cur_off = 0;
1374 sunxi_nfc_hw_ecc_enable(mtd);
1376 for (i = data_offs / ecc->size;
1377 i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
1378 int data_off = i * ecc->size;
1379 int oob_off = i * (ecc->bytes + 4);
1380 const u8 *data = buf + data_off;
1381 const u8 *oob = chip->oob_poi + oob_off;
1383 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1384 oob_off + mtd->writesize,
1385 &cur_off, !i, page);
1390 sunxi_nfc_hw_ecc_disable(mtd);
1395 static int sunxi_nfc_hw_ecc_write_page_dma(struct mtd_info *mtd,
1396 struct nand_chip *chip,
1401 struct nand_chip *nand = mtd_to_nand(mtd);
1402 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1403 struct nand_ecc_ctrl *ecc = &nand->ecc;
1404 struct scatterlist sg;
1407 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1411 ret = sunxi_nfc_dma_op_prepare(mtd, buf, ecc->size, ecc->steps,
1412 DMA_TO_DEVICE, &sg);
1416 for (i = 0; i < ecc->steps; i++) {
1417 const u8 *oob = nand->oob_poi + (i * (ecc->bytes + 4));
1419 sunxi_nfc_hw_ecc_set_prot_oob_bytes(mtd, oob, i, !i, page);
1422 sunxi_nfc_hw_ecc_enable(mtd);
1423 sunxi_nfc_randomizer_config(mtd, page, false);
1424 sunxi_nfc_randomizer_enable(mtd);
1426 writel((NAND_CMD_RNDIN << 8) | NAND_CMD_PAGEPROG,
1427 nfc->regs + NFC_REG_RCMD_SET);
1429 dma_async_issue_pending(nfc->dmac);
1431 writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD |
1432 NFC_DATA_TRANS | NFC_ACCESS_DIR,
1433 nfc->regs + NFC_REG_CMD);
1435 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, true, 0);
1437 dmaengine_terminate_all(nfc->dmac);
1439 sunxi_nfc_randomizer_disable(mtd);
1440 sunxi_nfc_hw_ecc_disable(mtd);
1442 sunxi_nfc_dma_op_cleanup(mtd, DMA_TO_DEVICE, &sg);
1447 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1448 /* TODO: use DMA to transfer extra OOB bytes ? */
1449 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1455 return sunxi_nfc_hw_ecc_write_page(mtd, chip, buf, oob_required, page);
1458 static int sunxi_nfc_hw_syndrome_ecc_read_page(struct mtd_info *mtd,
1459 struct nand_chip *chip,
1460 uint8_t *buf, int oob_required,
1463 struct nand_ecc_ctrl *ecc = &chip->ecc;
1464 unsigned int max_bitflips = 0;
1465 int ret, i, cur_off = 0;
1466 bool raw_mode = false;
1468 sunxi_nfc_hw_ecc_enable(mtd);
1470 for (i = 0; i < ecc->steps; i++) {
1471 int data_off = i * (ecc->size + ecc->bytes + 4);
1472 int oob_off = data_off + ecc->size;
1473 u8 *data = buf + (i * ecc->size);
1474 u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1476 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1488 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1491 sunxi_nfc_hw_ecc_disable(mtd);
1493 return max_bitflips;
1496 static int sunxi_nfc_hw_syndrome_ecc_write_page(struct mtd_info *mtd,
1497 struct nand_chip *chip,
1499 int oob_required, int page)
1501 struct nand_ecc_ctrl *ecc = &chip->ecc;
1502 int ret, i, cur_off = 0;
1504 sunxi_nfc_hw_ecc_enable(mtd);
1506 for (i = 0; i < ecc->steps; i++) {
1507 int data_off = i * (ecc->size + ecc->bytes + 4);
1508 int oob_off = data_off + ecc->size;
1509 const u8 *data = buf + (i * ecc->size);
1510 const u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1512 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off,
1513 oob, oob_off, &cur_off,
1519 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1520 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1523 sunxi_nfc_hw_ecc_disable(mtd);
1528 static int sunxi_nfc_hw_common_ecc_read_oob(struct mtd_info *mtd,
1529 struct nand_chip *chip,
1532 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
1536 return chip->ecc.read_page(mtd, chip, chip->buffers->databuf, 1, page);
1539 static int sunxi_nfc_hw_common_ecc_write_oob(struct mtd_info *mtd,
1540 struct nand_chip *chip,
1545 chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0, page);
1549 memset(chip->buffers->databuf, 0xff, mtd->writesize);
1550 ret = chip->ecc.write_page(mtd, chip, chip->buffers->databuf, 1, page);
1554 /* Send command to program the OOB data */
1555 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
1557 status = chip->waitfunc(mtd, chip);
1559 return status & NAND_STATUS_FAIL ? -EIO : 0;
1562 static const s32 tWB_lut[] = {6, 12, 16, 20};
1563 static const s32 tRHW_lut[] = {4, 8, 12, 20};
1565 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
1568 u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
1571 for (i = 0; i < lut_size; i++) {
1572 if (clk_cycles <= lut[i])
1580 #define sunxi_nand_lookup_timing(l, p, c) \
1581 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1583 static int sunxi_nfc_setup_data_interface(struct mtd_info *mtd,
1584 const struct nand_data_interface *conf,
1587 struct nand_chip *nand = mtd_to_nand(mtd);
1588 struct sunxi_nand_chip *chip = to_sunxi_nand(nand);
1589 struct sunxi_nfc *nfc = to_sunxi_nfc(chip->nand.controller);
1590 const struct nand_sdr_timings *timings;
1591 u32 min_clk_period = 0;
1592 s32 tWB, tADL, tWHR, tRHW, tCAD;
1595 timings = nand_get_sdr_timings(conf);
1596 if (IS_ERR(timings))
1600 if (timings->tCLS_min > min_clk_period)
1601 min_clk_period = timings->tCLS_min;
1604 if (timings->tCLH_min > min_clk_period)
1605 min_clk_period = timings->tCLH_min;
1608 if (timings->tCS_min > min_clk_period)
1609 min_clk_period = timings->tCS_min;
1612 if (timings->tCH_min > min_clk_period)
1613 min_clk_period = timings->tCH_min;
1616 if (timings->tWP_min > min_clk_period)
1617 min_clk_period = timings->tWP_min;
1620 if (timings->tWH_min > min_clk_period)
1621 min_clk_period = timings->tWH_min;
1624 if (timings->tALS_min > min_clk_period)
1625 min_clk_period = timings->tALS_min;
1628 if (timings->tDS_min > min_clk_period)
1629 min_clk_period = timings->tDS_min;
1632 if (timings->tDH_min > min_clk_period)
1633 min_clk_period = timings->tDH_min;
1636 if (timings->tRR_min > (min_clk_period * 3))
1637 min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
1640 if (timings->tALH_min > min_clk_period)
1641 min_clk_period = timings->tALH_min;
1644 if (timings->tRP_min > min_clk_period)
1645 min_clk_period = timings->tRP_min;
1648 if (timings->tREH_min > min_clk_period)
1649 min_clk_period = timings->tREH_min;
1652 if (timings->tRC_min > (min_clk_period * 2))
1653 min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
1656 if (timings->tWC_min > (min_clk_period * 2))
1657 min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
1659 /* T16 - T19 + tCAD */
1660 if (timings->tWB_max > (min_clk_period * 20))
1661 min_clk_period = DIV_ROUND_UP(timings->tWB_max, 20);
1663 if (timings->tADL_min > (min_clk_period * 32))
1664 min_clk_period = DIV_ROUND_UP(timings->tADL_min, 32);
1666 if (timings->tWHR_min > (min_clk_period * 32))
1667 min_clk_period = DIV_ROUND_UP(timings->tWHR_min, 32);
1669 if (timings->tRHW_min > (min_clk_period * 20))
1670 min_clk_period = DIV_ROUND_UP(timings->tRHW_min, 20);
1672 tWB = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
1675 dev_err(nfc->dev, "unsupported tWB\n");
1679 tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
1681 dev_err(nfc->dev, "unsupported tADL\n");
1685 tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
1687 dev_err(nfc->dev, "unsupported tWHR\n");
1691 tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
1694 dev_err(nfc->dev, "unsupported tRHW\n");
1702 * TODO: according to ONFI specs this value only applies for DDR NAND,
1703 * but Allwinner seems to set this to 0x7. Mimic them for now.
1707 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1708 chip->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
1710 /* Convert min_clk_period from picoseconds to nanoseconds */
1711 min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
1714 * Unlike what is stated in Allwinner datasheet, the clk_rate should
1715 * be set to (1 / min_clk_period), and not (2 / min_clk_period).
1716 * This new formula was verified with a scope and validated by
1717 * Allwinner engineers.
1719 chip->clk_rate = NSEC_PER_SEC / min_clk_period;
1720 real_clk_rate = clk_round_rate(nfc->mod_clk, chip->clk_rate);
1723 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1724 * output cycle timings shall be used if the host drives tRC less than
1727 min_clk_period = NSEC_PER_SEC / real_clk_rate;
1728 chip->timing_ctl = ((min_clk_period * 2) < 30) ?
1729 NFC_TIMING_CTL_EDO : 0;
1734 static int sunxi_nand_ooblayout_ecc(struct mtd_info *mtd, int section,
1735 struct mtd_oob_region *oobregion)
1737 struct nand_chip *nand = mtd_to_nand(mtd);
1738 struct nand_ecc_ctrl *ecc = &nand->ecc;
1740 if (section >= ecc->steps)
1743 oobregion->offset = section * (ecc->bytes + 4) + 4;
1744 oobregion->length = ecc->bytes;
1749 static int sunxi_nand_ooblayout_free(struct mtd_info *mtd, int section,
1750 struct mtd_oob_region *oobregion)
1752 struct nand_chip *nand = mtd_to_nand(mtd);
1753 struct nand_ecc_ctrl *ecc = &nand->ecc;
1755 if (section > ecc->steps)
1759 * The first 2 bytes are used for BB markers, hence we
1760 * only have 2 bytes available in the first user data
1763 if (!section && ecc->mode == NAND_ECC_HW) {
1764 oobregion->offset = 2;
1765 oobregion->length = 2;
1770 oobregion->offset = section * (ecc->bytes + 4);
1772 if (section < ecc->steps)
1773 oobregion->length = 4;
1775 oobregion->offset = mtd->oobsize - oobregion->offset;
1780 static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops = {
1781 .ecc = sunxi_nand_ooblayout_ecc,
1782 .free = sunxi_nand_ooblayout_free,
1785 static int sunxi_nand_hw_common_ecc_ctrl_init(struct mtd_info *mtd,
1786 struct nand_ecc_ctrl *ecc,
1787 struct device_node *np)
1789 static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1790 struct nand_chip *nand = mtd_to_nand(mtd);
1791 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
1792 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
1793 struct sunxi_nand_hw_ecc *data;
1798 if (ecc->options & NAND_ECC_MAXIMIZE) {
1802 nsectors = mtd->writesize / ecc->size;
1804 /* Reserve 2 bytes for the BBM */
1805 bytes = (mtd->oobsize - 2) / nsectors;
1807 /* 4 non-ECC bytes are added before each ECC bytes section */
1810 /* and bytes has to be even. */
1814 ecc->strength = bytes * 8 / fls(8 * ecc->size);
1816 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1817 if (strengths[i] > ecc->strength)
1824 ecc->strength = strengths[i - 1];
1827 if (ecc->size != 512 && ecc->size != 1024)
1830 data = kzalloc(sizeof(*data), GFP_KERNEL);
1834 /* Prefer 1k ECC chunk over 512 ones */
1835 if (ecc->size == 512 && mtd->writesize > 512) {
1840 /* Add ECC info retrieval from DT */
1841 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1842 if (ecc->strength <= strengths[i])
1846 if (i >= ARRAY_SIZE(strengths)) {
1847 dev_err(nfc->dev, "unsupported strength\n");
1854 /* HW ECC always request ECC bytes for 1024 bytes blocks */
1855 ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
1857 /* HW ECC always work with even numbers of ECC bytes */
1858 ecc->bytes = ALIGN(ecc->bytes, 2);
1860 nsectors = mtd->writesize / ecc->size;
1862 if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
1867 ecc->read_oob = sunxi_nfc_hw_common_ecc_read_oob;
1868 ecc->write_oob = sunxi_nfc_hw_common_ecc_write_oob;
1869 mtd_set_ooblayout(mtd, &sunxi_nand_ooblayout_ops);
1880 static void sunxi_nand_hw_common_ecc_ctrl_cleanup(struct nand_ecc_ctrl *ecc)
1885 static int sunxi_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
1886 struct nand_ecc_ctrl *ecc,
1887 struct device_node *np)
1889 struct nand_chip *nand = mtd_to_nand(mtd);
1890 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
1891 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
1894 ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc, np);
1899 ecc->read_page = sunxi_nfc_hw_ecc_read_page_dma;
1900 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage_dma;
1901 ecc->write_page = sunxi_nfc_hw_ecc_write_page_dma;
1902 nand->options |= NAND_USE_BOUNCE_BUFFER;
1904 ecc->read_page = sunxi_nfc_hw_ecc_read_page;
1905 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
1906 ecc->write_page = sunxi_nfc_hw_ecc_write_page;
1909 /* TODO: support DMA for raw accesses and subpage write */
1910 ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
1911 ecc->read_oob_raw = nand_read_oob_std;
1912 ecc->write_oob_raw = nand_write_oob_std;
1913 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
1918 static int sunxi_nand_hw_syndrome_ecc_ctrl_init(struct mtd_info *mtd,
1919 struct nand_ecc_ctrl *ecc,
1920 struct device_node *np)
1924 ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc, np);
1929 ecc->read_page = sunxi_nfc_hw_syndrome_ecc_read_page;
1930 ecc->write_page = sunxi_nfc_hw_syndrome_ecc_write_page;
1931 ecc->read_oob_raw = nand_read_oob_syndrome;
1932 ecc->write_oob_raw = nand_write_oob_syndrome;
1937 static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl *ecc)
1939 switch (ecc->mode) {
1941 case NAND_ECC_HW_SYNDROME:
1942 sunxi_nand_hw_common_ecc_ctrl_cleanup(ecc);
1950 static int sunxi_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc,
1951 struct device_node *np)
1953 struct nand_chip *nand = mtd_to_nand(mtd);
1957 ecc->size = nand->ecc_step_ds;
1958 ecc->strength = nand->ecc_strength_ds;
1961 if (!ecc->size || !ecc->strength)
1964 switch (ecc->mode) {
1966 ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc, np);
1970 case NAND_ECC_HW_SYNDROME:
1971 ret = sunxi_nand_hw_syndrome_ecc_ctrl_init(mtd, ecc, np);
1985 static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc,
1986 struct device_node *np)
1988 struct sunxi_nand_chip *chip;
1989 struct mtd_info *mtd;
1990 struct nand_chip *nand;
1996 if (!of_get_property(np, "reg", &nsels))
1999 nsels /= sizeof(u32);
2001 dev_err(dev, "invalid reg property size\n");
2005 chip = devm_kzalloc(dev,
2007 (nsels * sizeof(struct sunxi_nand_chip_sel)),
2010 dev_err(dev, "could not allocate chip\n");
2014 chip->nsels = nsels;
2015 chip->selected = -1;
2017 for (i = 0; i < nsels; i++) {
2018 ret = of_property_read_u32_index(np, "reg", i, &tmp);
2020 dev_err(dev, "could not retrieve reg property: %d\n",
2025 if (tmp > NFC_MAX_CS) {
2027 "invalid reg value: %u (max CS = 7)\n",
2032 if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
2033 dev_err(dev, "CS %d already assigned\n", tmp);
2037 chip->sels[i].cs = tmp;
2039 if (!of_property_read_u32_index(np, "allwinner,rb", i, &tmp) &&
2041 chip->sels[i].rb.type = RB_NATIVE;
2042 chip->sels[i].rb.info.nativeid = tmp;
2044 ret = of_get_named_gpio(np, "rb-gpios", i);
2047 chip->sels[i].rb.type = RB_GPIO;
2048 chip->sels[i].rb.info.gpio = tmp;
2049 ret = devm_gpio_request(dev, tmp, "nand-rb");
2053 ret = gpio_direction_input(tmp);
2057 chip->sels[i].rb.type = RB_NONE;
2063 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
2064 nand->chip_delay = 200;
2065 nand->controller = &nfc->controller;
2067 * Set the ECC mode to the default value in case nothing is specified
2070 nand->ecc.mode = NAND_ECC_HW;
2071 nand_set_flash_node(nand, np);
2072 nand->select_chip = sunxi_nfc_select_chip;
2073 nand->cmd_ctrl = sunxi_nfc_cmd_ctrl;
2074 nand->read_buf = sunxi_nfc_read_buf;
2075 nand->write_buf = sunxi_nfc_write_buf;
2076 nand->read_byte = sunxi_nfc_read_byte;
2077 nand->setup_data_interface = sunxi_nfc_setup_data_interface;
2079 mtd = nand_to_mtd(nand);
2080 mtd->dev.parent = dev;
2082 ret = nand_scan_ident(mtd, nsels, NULL);
2086 if (nand->bbt_options & NAND_BBT_USE_FLASH)
2087 nand->bbt_options |= NAND_BBT_NO_OOB;
2089 if (nand->options & NAND_NEED_SCRAMBLING)
2090 nand->options |= NAND_NO_SUBPAGE_WRITE;
2092 nand->options |= NAND_SUBPAGE_READ;
2094 ret = sunxi_nand_ecc_init(mtd, &nand->ecc, np);
2096 dev_err(dev, "ECC init failed: %d\n", ret);
2100 ret = nand_scan_tail(mtd);
2102 dev_err(dev, "nand_scan_tail failed: %d\n", ret);
2106 ret = mtd_device_register(mtd, NULL, 0);
2108 dev_err(dev, "failed to register mtd device: %d\n", ret);
2113 list_add_tail(&chip->node, &nfc->chips);
2118 static int sunxi_nand_chips_init(struct device *dev, struct sunxi_nfc *nfc)
2120 struct device_node *np = dev->of_node;
2121 struct device_node *nand_np;
2122 int nchips = of_get_child_count(np);
2126 dev_err(dev, "too many NAND chips: %d (max = 8)\n", nchips);
2130 for_each_child_of_node(np, nand_np) {
2131 ret = sunxi_nand_chip_init(dev, nfc, nand_np);
2133 of_node_put(nand_np);
2141 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
2143 struct sunxi_nand_chip *chip;
2145 while (!list_empty(&nfc->chips)) {
2146 chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip,
2148 nand_release(nand_to_mtd(&chip->nand));
2149 sunxi_nand_ecc_cleanup(&chip->nand.ecc);
2150 list_del(&chip->node);
2154 static int sunxi_nfc_probe(struct platform_device *pdev)
2156 struct device *dev = &pdev->dev;
2158 struct sunxi_nfc *nfc;
2162 nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL);
2167 nand_hw_control_init(&nfc->controller);
2168 INIT_LIST_HEAD(&nfc->chips);
2170 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2171 nfc->regs = devm_ioremap_resource(dev, r);
2172 if (IS_ERR(nfc->regs))
2173 return PTR_ERR(nfc->regs);
2175 irq = platform_get_irq(pdev, 0);
2177 dev_err(dev, "failed to retrieve irq\n");
2181 nfc->ahb_clk = devm_clk_get(dev, "ahb");
2182 if (IS_ERR(nfc->ahb_clk)) {
2183 dev_err(dev, "failed to retrieve ahb clk\n");
2184 return PTR_ERR(nfc->ahb_clk);
2187 ret = clk_prepare_enable(nfc->ahb_clk);
2191 nfc->mod_clk = devm_clk_get(dev, "mod");
2192 if (IS_ERR(nfc->mod_clk)) {
2193 dev_err(dev, "failed to retrieve mod clk\n");
2194 ret = PTR_ERR(nfc->mod_clk);
2195 goto out_ahb_clk_unprepare;
2198 ret = clk_prepare_enable(nfc->mod_clk);
2200 goto out_ahb_clk_unprepare;
2202 nfc->reset = devm_reset_control_get_optional(dev, "ahb");
2203 if (!IS_ERR(nfc->reset)) {
2204 ret = reset_control_deassert(nfc->reset);
2206 dev_err(dev, "reset err %d\n", ret);
2207 goto out_mod_clk_unprepare;
2209 } else if (PTR_ERR(nfc->reset) != -ENOENT) {
2210 ret = PTR_ERR(nfc->reset);
2211 goto out_mod_clk_unprepare;
2214 ret = sunxi_nfc_rst(nfc);
2216 goto out_ahb_reset_reassert;
2218 writel(0, nfc->regs + NFC_REG_INT);
2219 ret = devm_request_irq(dev, irq, sunxi_nfc_interrupt,
2220 0, "sunxi-nand", nfc);
2222 goto out_ahb_reset_reassert;
2224 nfc->dmac = dma_request_slave_channel(dev, "rxtx");
2226 struct dma_slave_config dmac_cfg = { };
2228 dmac_cfg.src_addr = r->start + NFC_REG_IO_DATA;
2229 dmac_cfg.dst_addr = dmac_cfg.src_addr;
2230 dmac_cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
2231 dmac_cfg.dst_addr_width = dmac_cfg.src_addr_width;
2232 dmac_cfg.src_maxburst = 4;
2233 dmac_cfg.dst_maxburst = 4;
2234 dmaengine_slave_config(nfc->dmac, &dmac_cfg);
2236 dev_warn(dev, "failed to request rxtx DMA channel\n");
2239 platform_set_drvdata(pdev, nfc);
2241 ret = sunxi_nand_chips_init(dev, nfc);
2243 dev_err(dev, "failed to init nand chips\n");
2244 goto out_release_dmac;
2251 dma_release_channel(nfc->dmac);
2252 out_ahb_reset_reassert:
2253 if (!IS_ERR(nfc->reset))
2254 reset_control_assert(nfc->reset);
2255 out_mod_clk_unprepare:
2256 clk_disable_unprepare(nfc->mod_clk);
2257 out_ahb_clk_unprepare:
2258 clk_disable_unprepare(nfc->ahb_clk);
2263 static int sunxi_nfc_remove(struct platform_device *pdev)
2265 struct sunxi_nfc *nfc = platform_get_drvdata(pdev);
2267 sunxi_nand_chips_cleanup(nfc);
2269 if (!IS_ERR(nfc->reset))
2270 reset_control_assert(nfc->reset);
2273 dma_release_channel(nfc->dmac);
2274 clk_disable_unprepare(nfc->mod_clk);
2275 clk_disable_unprepare(nfc->ahb_clk);
2280 static const struct of_device_id sunxi_nfc_ids[] = {
2281 { .compatible = "allwinner,sun4i-a10-nand" },
2284 MODULE_DEVICE_TABLE(of, sunxi_nfc_ids);
2286 static struct platform_driver sunxi_nfc_driver = {
2288 .name = "sunxi_nand",
2289 .of_match_table = sunxi_nfc_ids,
2291 .probe = sunxi_nfc_probe,
2292 .remove = sunxi_nfc_remove,
2294 module_platform_driver(sunxi_nfc_driver);
2296 MODULE_LICENSE("GPL v2");
2297 MODULE_AUTHOR("Boris BREZILLON");
2298 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");
2299 MODULE_ALIAS("platform:sunxi_nand");