5 * https://github.com/yuq/sunxi-nfc-mtd
8 * https://github.com/hno/Allwinner-Info
9 * Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
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/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>
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
65 /* define bit use in NFC_CTL */
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)
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)
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 | \
99 /* define bit use in NFC_TIMING_CTL */
100 #define NFC_TIMING_CTL_EDO BIT(8)
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))
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)
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)
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)
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)
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)
160 #define NFC_DEFAULT_TIMEOUT_MS 1000
162 #define NFC_SRAM_SIZE 1024
167 * Chip Select structure: stores information related to NAND Chip Select
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
173 struct sunxi_nand_chip_sel {
179 * sunxi HW ECC infos: stores information related to HW ECC support
181 * @mode: the sunxi ECC mode field deduced from ECC requirements
183 struct sunxi_nand_hw_ecc {
188 * NAND chip structure: stores NAND chip device related information
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
199 struct sunxi_nand_chip {
200 struct list_head node;
201 struct nand_chip nand;
202 unsigned long clk_rate;
211 struct sunxi_nand_chip_sel sels[0];
214 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
216 return container_of(nand, struct sunxi_nand_chip, nand);
220 * NAND Controller structure: stores sunxi NAND controller information
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
235 struct nand_controller controller;
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;
248 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_controller *ctrl)
250 return container_of(ctrl, struct sunxi_nfc, controller);
253 static irqreturn_t sunxi_nfc_interrupt(int irq, void *dev_id)
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);
262 if ((ien & st) == ien)
263 complete(&nfc->complete);
265 writel(st & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
266 writel(~st & ien & NFC_INT_MASK, nfc->regs + NFC_REG_INT);
271 static int sunxi_nfc_wait_events(struct sunxi_nfc *nfc, u32 events,
272 bool use_polling, unsigned int timeout_ms)
276 if (events & ~NFC_INT_MASK)
280 timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
283 init_completion(&nfc->complete);
285 writel(events, nfc->regs + NFC_REG_INT);
287 ret = wait_for_completion_timeout(&nfc->complete,
288 msecs_to_jiffies(timeout_ms));
294 writel(0, nfc->regs + NFC_REG_INT);
298 ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status,
299 (status & events) == events, 1,
303 writel(events & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
306 dev_err(nfc->dev, "wait interrupt timedout\n");
311 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
316 ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status,
317 !(status & NFC_CMD_FIFO_STATUS), 1,
318 NFC_DEFAULT_TIMEOUT_MS * 1000);
320 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
325 static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
330 writel(0, nfc->regs + NFC_REG_ECC_CTL);
331 writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
333 ret = readl_poll_timeout(nfc->regs + NFC_REG_CTL, ctl,
334 !(ctl & NFC_RESET), 1,
335 NFC_DEFAULT_TIMEOUT_MS * 1000);
337 dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
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)
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;
354 if (ddir == DMA_FROM_DEVICE)
355 tdir = DMA_DEV_TO_MEM;
357 tdir = DMA_MEM_TO_DEV;
359 sg_init_one(sg, buf, nchunks * chunksize);
360 ret = dma_map_sg(nfc->dev, sg, 1, ddir);
364 dmad = dmaengine_prep_slave_sg(nfc->dmac, sg, 1, tdir, DMA_CTRL_ACK);
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);
376 ret = dma_submit_error(dmat);
378 goto err_clr_dma_flag;
383 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD,
384 nfc->regs + NFC_REG_CTL);
387 dma_unmap_sg(nfc->dev, sg, 1, ddir);
391 static void sunxi_nfc_dma_op_cleanup(struct mtd_info *mtd,
392 enum dma_data_direction ddir,
393 struct scatterlist *sg)
395 struct nand_chip *nand = mtd_to_nand(mtd);
396 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
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);
403 static int sunxi_nfc_dev_ready(struct nand_chip *nand)
405 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
406 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
409 if (sunxi_nand->selected < 0)
412 if (sunxi_nand->sels[sunxi_nand->selected].rb < 0) {
413 dev_err(nfc->dev, "cannot check R/B NAND status!\n");
417 mask = NFC_RB_STATE(sunxi_nand->sels[sunxi_nand->selected].rb);
419 return !!(readl(nfc->regs + NFC_REG_ST) & mask);
422 static void sunxi_nfc_select_chip(struct nand_chip *nand, int chip)
424 struct mtd_info *mtd = nand_to_mtd(nand);
425 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
426 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
427 struct sunxi_nand_chip_sel *sel;
430 if (chip > 0 && chip >= sunxi_nand->nsels)
433 if (chip == sunxi_nand->selected)
436 ctl = readl(nfc->regs + NFC_REG_CTL) &
437 ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
440 sel = &sunxi_nand->sels[chip];
442 ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
443 NFC_PAGE_SHIFT(nand->page_shift);
445 nand->legacy.dev_ready = NULL;
447 nand->legacy.dev_ready = sunxi_nfc_dev_ready;
448 ctl |= NFC_RB_SEL(sel->rb);
451 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
453 if (nfc->clk_rate != sunxi_nand->clk_rate) {
454 clk_set_rate(nfc->mod_clk, sunxi_nand->clk_rate);
455 nfc->clk_rate = sunxi_nand->clk_rate;
459 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
460 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
461 writel(ctl, nfc->regs + NFC_REG_CTL);
463 sunxi_nand->selected = chip;
466 static void sunxi_nfc_read_buf(struct nand_chip *nand, uint8_t *buf, int len)
468 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
469 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
478 cnt = min(len - offs, NFC_SRAM_SIZE);
480 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
484 writel(cnt, nfc->regs + NFC_REG_CNT);
485 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
486 writel(tmp, nfc->regs + NFC_REG_CMD);
488 /* Arbitrary limit for polling mode */
492 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, poll, 0);
497 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
503 static void sunxi_nfc_write_buf(struct nand_chip *nand, const uint8_t *buf,
506 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
507 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
516 cnt = min(len - offs, NFC_SRAM_SIZE);
518 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
522 writel(cnt, nfc->regs + NFC_REG_CNT);
523 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
524 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
526 writel(tmp, nfc->regs + NFC_REG_CMD);
528 /* Arbitrary limit for polling mode */
532 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, poll, 0);
540 static uint8_t sunxi_nfc_read_byte(struct nand_chip *nand)
544 sunxi_nfc_read_buf(nand, &ret, 1);
549 static void sunxi_nfc_cmd_ctrl(struct nand_chip *nand, int dat,
552 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
553 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
556 if (dat == NAND_CMD_NONE && (ctrl & NAND_NCE) &&
557 !(ctrl & (NAND_CLE | NAND_ALE))) {
560 if (!sunxi_nand->addr_cycles && !sunxi_nand->cmd_cycles)
563 if (sunxi_nand->cmd_cycles--)
564 cmd |= NFC_SEND_CMD1 | sunxi_nand->cmd[0];
566 if (sunxi_nand->cmd_cycles--) {
567 cmd |= NFC_SEND_CMD2;
568 writel(sunxi_nand->cmd[1],
569 nfc->regs + NFC_REG_RCMD_SET);
572 sunxi_nand->cmd_cycles = 0;
574 if (sunxi_nand->addr_cycles) {
575 cmd |= NFC_SEND_ADR |
576 NFC_ADR_NUM(sunxi_nand->addr_cycles);
577 writel(sunxi_nand->addr[0],
578 nfc->regs + NFC_REG_ADDR_LOW);
581 if (sunxi_nand->addr_cycles > 4)
582 writel(sunxi_nand->addr[1],
583 nfc->regs + NFC_REG_ADDR_HIGH);
585 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
589 writel(cmd, nfc->regs + NFC_REG_CMD);
590 sunxi_nand->addr[0] = 0;
591 sunxi_nand->addr[1] = 0;
592 sunxi_nand->addr_cycles = 0;
593 sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, true, 0);
596 if (ctrl & NAND_CLE) {
597 sunxi_nand->cmd[sunxi_nand->cmd_cycles++] = dat;
598 } else if (ctrl & NAND_ALE) {
599 sunxi_nand->addr[sunxi_nand->addr_cycles / 4] |=
600 dat << ((sunxi_nand->addr_cycles % 4) * 8);
601 sunxi_nand->addr_cycles++;
605 /* These seed values have been extracted from Allwinner's BSP */
606 static const u16 sunxi_nfc_randomizer_page_seeds[] = {
607 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
608 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
609 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
610 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
611 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
612 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
613 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
614 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
615 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
616 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
617 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
618 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
619 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
620 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
621 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
622 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
626 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
627 * have been generated using
628 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
629 * the randomizer engine does internally before de/scrambling OOB data.
631 * Those tables are statically defined to avoid calculating randomizer state
634 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
635 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
636 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
637 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
638 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
639 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
640 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
641 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
642 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
643 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
644 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
645 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
646 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
647 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
648 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
649 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
650 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
653 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
654 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
655 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
656 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
657 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
658 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
659 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
660 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
661 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
662 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
663 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
664 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
665 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
666 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
667 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
668 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
669 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
672 static u16 sunxi_nfc_randomizer_step(u16 state, int count)
677 * This loop is just a simple implementation of a Fibonacci LFSR using
678 * the x16 + x15 + 1 polynomial.
681 state = ((state >> 1) |
682 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
687 static u16 sunxi_nfc_randomizer_state(struct mtd_info *mtd, int page, bool ecc)
689 const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
690 int mod = mtd_div_by_ws(mtd->erasesize, mtd);
692 if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
693 mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
696 if (mtd->ecc_step_size == 512)
697 seeds = sunxi_nfc_randomizer_ecc512_seeds;
699 seeds = sunxi_nfc_randomizer_ecc1024_seeds;
702 return seeds[page % mod];
705 static void sunxi_nfc_randomizer_config(struct mtd_info *mtd,
708 struct nand_chip *nand = mtd_to_nand(mtd);
709 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
710 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
713 if (!(nand->options & NAND_NEED_SCRAMBLING))
716 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
717 state = sunxi_nfc_randomizer_state(mtd, page, ecc);
718 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
719 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
722 static void sunxi_nfc_randomizer_enable(struct mtd_info *mtd)
724 struct nand_chip *nand = mtd_to_nand(mtd);
725 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
727 if (!(nand->options & NAND_NEED_SCRAMBLING))
730 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
731 nfc->regs + NFC_REG_ECC_CTL);
734 static void sunxi_nfc_randomizer_disable(struct mtd_info *mtd)
736 struct nand_chip *nand = mtd_to_nand(mtd);
737 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
739 if (!(nand->options & NAND_NEED_SCRAMBLING))
742 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
743 nfc->regs + NFC_REG_ECC_CTL);
746 static void sunxi_nfc_randomize_bbm(struct mtd_info *mtd, int page, u8 *bbm)
748 u16 state = sunxi_nfc_randomizer_state(mtd, page, true);
751 bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
754 static void sunxi_nfc_randomizer_write_buf(struct mtd_info *mtd,
755 const uint8_t *buf, int len,
758 sunxi_nfc_randomizer_config(mtd, page, ecc);
759 sunxi_nfc_randomizer_enable(mtd);
760 sunxi_nfc_write_buf(mtd_to_nand(mtd), buf, len);
761 sunxi_nfc_randomizer_disable(mtd);
764 static void sunxi_nfc_randomizer_read_buf(struct mtd_info *mtd, uint8_t *buf,
765 int len, bool ecc, int page)
767 sunxi_nfc_randomizer_config(mtd, page, ecc);
768 sunxi_nfc_randomizer_enable(mtd);
769 sunxi_nfc_read_buf(mtd_to_nand(mtd), buf, len);
770 sunxi_nfc_randomizer_disable(mtd);
773 static void sunxi_nfc_hw_ecc_enable(struct mtd_info *mtd)
775 struct nand_chip *nand = mtd_to_nand(mtd);
776 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
777 struct sunxi_nand_hw_ecc *data = nand->ecc.priv;
780 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
781 ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
782 NFC_ECC_BLOCK_SIZE_MSK);
783 ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(data->mode) | NFC_ECC_EXCEPTION |
786 if (nand->ecc.size == 512)
787 ecc_ctl |= NFC_ECC_BLOCK_512;
789 writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
792 static void sunxi_nfc_hw_ecc_disable(struct mtd_info *mtd)
794 struct nand_chip *nand = mtd_to_nand(mtd);
795 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
797 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
798 nfc->regs + NFC_REG_ECC_CTL);
801 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
804 buf[1] = user_data >> 8;
805 buf[2] = user_data >> 16;
806 buf[3] = user_data >> 24;
809 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
811 return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
814 static void sunxi_nfc_hw_ecc_get_prot_oob_bytes(struct mtd_info *mtd, u8 *oob,
815 int step, bool bbm, int page)
817 struct nand_chip *nand = mtd_to_nand(mtd);
818 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
820 sunxi_nfc_user_data_to_buf(readl(nfc->regs + NFC_REG_USER_DATA(step)),
823 /* De-randomize the Bad Block Marker. */
824 if (bbm && (nand->options & NAND_NEED_SCRAMBLING))
825 sunxi_nfc_randomize_bbm(mtd, page, oob);
828 static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct mtd_info *mtd,
829 const u8 *oob, int step,
832 struct nand_chip *nand = mtd_to_nand(mtd);
833 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
836 /* Randomize the Bad Block Marker. */
837 if (bbm && (nand->options & NAND_NEED_SCRAMBLING)) {
838 memcpy(user_data, oob, sizeof(user_data));
839 sunxi_nfc_randomize_bbm(mtd, page, user_data);
843 writel(sunxi_nfc_buf_to_user_data(oob),
844 nfc->regs + NFC_REG_USER_DATA(step));
847 static void sunxi_nfc_hw_ecc_update_stats(struct mtd_info *mtd,
848 unsigned int *max_bitflips, int ret)
851 mtd->ecc_stats.failed++;
853 mtd->ecc_stats.corrected += ret;
854 *max_bitflips = max_t(unsigned int, *max_bitflips, ret);
858 static int sunxi_nfc_hw_ecc_correct(struct mtd_info *mtd, u8 *data, u8 *oob,
859 int step, u32 status, bool *erased)
861 struct nand_chip *nand = mtd_to_nand(mtd);
862 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
863 struct nand_ecc_ctrl *ecc = &nand->ecc;
868 if (status & NFC_ECC_ERR(step))
871 if (status & NFC_ECC_PAT_FOUND(step)) {
874 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1))) {
882 memset(data, pattern, ecc->size);
885 memset(oob, pattern, ecc->bytes + 4);
890 tmp = readl(nfc->regs + NFC_REG_ECC_ERR_CNT(step));
892 return NFC_ECC_ERR_CNT(step, tmp);
895 static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
896 u8 *data, int data_off,
897 u8 *oob, int oob_off,
899 unsigned int *max_bitflips,
900 bool bbm, bool oob_required, int page)
902 struct nand_chip *nand = mtd_to_nand(mtd);
903 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
904 struct nand_ecc_ctrl *ecc = &nand->ecc;
909 if (*cur_off != data_off)
910 nand_change_read_column_op(nand, data_off, NULL, 0, false);
912 sunxi_nfc_randomizer_read_buf(mtd, NULL, ecc->size, false, page);
914 if (data_off + ecc->size != oob_off)
915 nand_change_read_column_op(nand, oob_off, NULL, 0, false);
917 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
921 sunxi_nfc_randomizer_enable(mtd);
922 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
923 nfc->regs + NFC_REG_CMD);
925 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0);
926 sunxi_nfc_randomizer_disable(mtd);
930 *cur_off = oob_off + ecc->bytes + 4;
932 ret = sunxi_nfc_hw_ecc_correct(mtd, data, oob_required ? oob : NULL, 0,
933 readl(nfc->regs + NFC_REG_ECC_ST),
940 * Re-read the data with the randomizer disabled to identify
941 * bitflips in erased pages.
943 if (nand->options & NAND_NEED_SCRAMBLING)
944 nand_change_read_column_op(nand, data_off, data,
947 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE,
950 nand_change_read_column_op(nand, oob_off, oob, ecc->bytes + 4,
953 ret = nand_check_erased_ecc_chunk(data, ecc->size,
955 NULL, 0, ecc->strength);
959 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
962 nand_change_read_column_op(nand, oob_off, NULL, 0,
964 sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4,
967 sunxi_nfc_hw_ecc_get_prot_oob_bytes(mtd, oob, 0,
972 sunxi_nfc_hw_ecc_update_stats(mtd, max_bitflips, ret);
977 static void sunxi_nfc_hw_ecc_read_extra_oob(struct mtd_info *mtd,
978 u8 *oob, int *cur_off,
979 bool randomize, int page)
981 struct nand_chip *nand = mtd_to_nand(mtd);
982 struct nand_ecc_ctrl *ecc = &nand->ecc;
983 int offset = ((ecc->bytes + 4) * ecc->steps);
984 int len = mtd->oobsize - offset;
989 if (!cur_off || *cur_off != offset)
990 nand_change_read_column_op(nand, mtd->writesize, NULL, 0,
994 sunxi_nfc_read_buf(nand, oob + offset, len);
996 sunxi_nfc_randomizer_read_buf(mtd, oob + offset, len,
1000 *cur_off = mtd->oobsize + mtd->writesize;
1003 static int sunxi_nfc_hw_ecc_read_chunks_dma(struct mtd_info *mtd, uint8_t *buf,
1004 int oob_required, int page,
1007 struct nand_chip *nand = mtd_to_nand(mtd);
1008 bool randomized = nand->options & NAND_NEED_SCRAMBLING;
1009 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1010 struct nand_ecc_ctrl *ecc = &nand->ecc;
1011 unsigned int max_bitflips = 0;
1012 int ret, i, raw_mode = 0;
1013 struct scatterlist sg;
1016 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1020 ret = sunxi_nfc_dma_op_prepare(mtd, buf, ecc->size, nchunks,
1021 DMA_FROM_DEVICE, &sg);
1025 sunxi_nfc_hw_ecc_enable(mtd);
1026 sunxi_nfc_randomizer_config(mtd, page, false);
1027 sunxi_nfc_randomizer_enable(mtd);
1029 writel((NAND_CMD_RNDOUTSTART << 16) | (NAND_CMD_RNDOUT << 8) |
1030 NAND_CMD_READSTART, nfc->regs + NFC_REG_RCMD_SET);
1032 dma_async_issue_pending(nfc->dmac);
1034 writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD | NFC_DATA_TRANS,
1035 nfc->regs + NFC_REG_CMD);
1037 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0);
1039 dmaengine_terminate_all(nfc->dmac);
1041 sunxi_nfc_randomizer_disable(mtd);
1042 sunxi_nfc_hw_ecc_disable(mtd);
1044 sunxi_nfc_dma_op_cleanup(mtd, DMA_FROM_DEVICE, &sg);
1049 status = readl(nfc->regs + NFC_REG_ECC_ST);
1051 for (i = 0; i < nchunks; i++) {
1052 int data_off = i * ecc->size;
1053 int oob_off = i * (ecc->bytes + 4);
1054 u8 *data = buf + data_off;
1055 u8 *oob = nand->oob_poi + oob_off;
1058 ret = sunxi_nfc_hw_ecc_correct(mtd, randomized ? data : NULL,
1059 oob_required ? oob : NULL,
1060 i, status, &erased);
1062 /* ECC errors are handled in the second loop. */
1066 if (oob_required && !erased) {
1067 /* TODO: use DMA to retrieve OOB */
1068 nand_change_read_column_op(nand,
1069 mtd->writesize + oob_off,
1070 oob, ecc->bytes + 4, false);
1072 sunxi_nfc_hw_ecc_get_prot_oob_bytes(mtd, oob, i,
1079 sunxi_nfc_hw_ecc_update_stats(mtd, &max_bitflips, ret);
1082 if (status & NFC_ECC_ERR_MSK) {
1083 for (i = 0; i < nchunks; i++) {
1084 int data_off = i * ecc->size;
1085 int oob_off = i * (ecc->bytes + 4);
1086 u8 *data = buf + data_off;
1087 u8 *oob = nand->oob_poi + oob_off;
1089 if (!(status & NFC_ECC_ERR(i)))
1093 * Re-read the data with the randomizer disabled to
1094 * identify bitflips in erased pages.
1095 * TODO: use DMA to read page in raw mode
1098 nand_change_read_column_op(nand, data_off,
1102 /* TODO: use DMA to retrieve OOB */
1103 nand_change_read_column_op(nand,
1104 mtd->writesize + oob_off,
1105 oob, ecc->bytes + 4, false);
1107 ret = nand_check_erased_ecc_chunk(data, ecc->size,
1108 oob, ecc->bytes + 4,
1114 sunxi_nfc_hw_ecc_update_stats(mtd, &max_bitflips, ret);
1119 sunxi_nfc_hw_ecc_read_extra_oob(mtd, nand->oob_poi,
1123 return max_bitflips;
1126 static int sunxi_nfc_hw_ecc_write_chunk(struct mtd_info *mtd,
1127 const u8 *data, int data_off,
1128 const u8 *oob, int oob_off,
1129 int *cur_off, bool bbm,
1132 struct nand_chip *nand = mtd_to_nand(mtd);
1133 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1134 struct nand_ecc_ctrl *ecc = &nand->ecc;
1137 if (data_off != *cur_off)
1138 nand_change_write_column_op(nand, data_off, NULL, 0, false);
1140 sunxi_nfc_randomizer_write_buf(mtd, data, ecc->size, false, page);
1142 if (data_off + ecc->size != oob_off)
1143 nand_change_write_column_op(nand, oob_off, NULL, 0, false);
1145 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1149 sunxi_nfc_randomizer_enable(mtd);
1150 sunxi_nfc_hw_ecc_set_prot_oob_bytes(mtd, oob, 0, bbm, page);
1152 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
1153 NFC_ACCESS_DIR | NFC_ECC_OP,
1154 nfc->regs + NFC_REG_CMD);
1156 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0);
1157 sunxi_nfc_randomizer_disable(mtd);
1161 *cur_off = oob_off + ecc->bytes + 4;
1166 static void sunxi_nfc_hw_ecc_write_extra_oob(struct mtd_info *mtd,
1167 u8 *oob, int *cur_off,
1170 struct nand_chip *nand = mtd_to_nand(mtd);
1171 struct nand_ecc_ctrl *ecc = &nand->ecc;
1172 int offset = ((ecc->bytes + 4) * ecc->steps);
1173 int len = mtd->oobsize - offset;
1178 if (!cur_off || *cur_off != offset)
1179 nand_change_write_column_op(nand, offset + mtd->writesize,
1182 sunxi_nfc_randomizer_write_buf(mtd, oob + offset, len, false, page);
1185 *cur_off = mtd->oobsize + mtd->writesize;
1188 static int sunxi_nfc_hw_ecc_read_page(struct nand_chip *chip, uint8_t *buf,
1189 int oob_required, int page)
1191 struct mtd_info *mtd = nand_to_mtd(chip);
1192 struct nand_ecc_ctrl *ecc = &chip->ecc;
1193 unsigned int max_bitflips = 0;
1194 int ret, i, cur_off = 0;
1195 bool raw_mode = false;
1197 nand_read_page_op(chip, page, 0, NULL, 0);
1199 sunxi_nfc_hw_ecc_enable(mtd);
1201 for (i = 0; i < ecc->steps; i++) {
1202 int data_off = i * ecc->size;
1203 int oob_off = i * (ecc->bytes + 4);
1204 u8 *data = buf + data_off;
1205 u8 *oob = chip->oob_poi + oob_off;
1207 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1208 oob_off + mtd->writesize,
1209 &cur_off, &max_bitflips,
1210 !i, oob_required, page);
1218 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1221 sunxi_nfc_hw_ecc_disable(mtd);
1223 return max_bitflips;
1226 static int sunxi_nfc_hw_ecc_read_page_dma(struct nand_chip *chip, u8 *buf,
1227 int oob_required, int page)
1229 struct mtd_info *mtd = nand_to_mtd(chip);
1232 nand_read_page_op(chip, page, 0, NULL, 0);
1234 ret = sunxi_nfc_hw_ecc_read_chunks_dma(mtd, buf, oob_required, page,
1239 /* Fallback to PIO mode */
1240 return sunxi_nfc_hw_ecc_read_page(chip, buf, oob_required, page);
1243 static int sunxi_nfc_hw_ecc_read_subpage(struct nand_chip *chip,
1244 u32 data_offs, u32 readlen,
1245 u8 *bufpoi, int page)
1247 struct mtd_info *mtd = nand_to_mtd(chip);
1248 struct nand_ecc_ctrl *ecc = &chip->ecc;
1249 int ret, i, cur_off = 0;
1250 unsigned int max_bitflips = 0;
1252 nand_read_page_op(chip, page, 0, NULL, 0);
1254 sunxi_nfc_hw_ecc_enable(mtd);
1256 for (i = data_offs / ecc->size;
1257 i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
1258 int data_off = i * ecc->size;
1259 int oob_off = i * (ecc->bytes + 4);
1260 u8 *data = bufpoi + data_off;
1261 u8 *oob = chip->oob_poi + oob_off;
1263 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off,
1265 oob_off + mtd->writesize,
1266 &cur_off, &max_bitflips, !i,
1272 sunxi_nfc_hw_ecc_disable(mtd);
1274 return max_bitflips;
1277 static int sunxi_nfc_hw_ecc_read_subpage_dma(struct nand_chip *chip,
1278 u32 data_offs, u32 readlen,
1281 struct mtd_info *mtd = nand_to_mtd(chip);
1282 int nchunks = DIV_ROUND_UP(data_offs + readlen, chip->ecc.size);
1285 nand_read_page_op(chip, page, 0, NULL, 0);
1287 ret = sunxi_nfc_hw_ecc_read_chunks_dma(mtd, buf, false, page, nchunks);
1291 /* Fallback to PIO mode */
1292 return sunxi_nfc_hw_ecc_read_subpage(chip, data_offs, readlen,
1296 static int sunxi_nfc_hw_ecc_write_page(struct nand_chip *chip,
1297 const uint8_t *buf, int oob_required,
1300 struct mtd_info *mtd = nand_to_mtd(chip);
1301 struct nand_ecc_ctrl *ecc = &chip->ecc;
1302 int ret, i, cur_off = 0;
1304 nand_prog_page_begin_op(chip, page, 0, NULL, 0);
1306 sunxi_nfc_hw_ecc_enable(mtd);
1308 for (i = 0; i < ecc->steps; i++) {
1309 int data_off = i * ecc->size;
1310 int oob_off = i * (ecc->bytes + 4);
1311 const u8 *data = buf + data_off;
1312 const u8 *oob = chip->oob_poi + oob_off;
1314 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1315 oob_off + mtd->writesize,
1316 &cur_off, !i, page);
1321 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1322 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1325 sunxi_nfc_hw_ecc_disable(mtd);
1327 return nand_prog_page_end_op(chip);
1330 static int sunxi_nfc_hw_ecc_write_subpage(struct nand_chip *chip,
1331 u32 data_offs, u32 data_len,
1332 const u8 *buf, int oob_required,
1335 struct mtd_info *mtd = nand_to_mtd(chip);
1336 struct nand_ecc_ctrl *ecc = &chip->ecc;
1337 int ret, i, cur_off = 0;
1339 nand_prog_page_begin_op(chip, page, 0, NULL, 0);
1341 sunxi_nfc_hw_ecc_enable(mtd);
1343 for (i = data_offs / ecc->size;
1344 i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
1345 int data_off = i * ecc->size;
1346 int oob_off = i * (ecc->bytes + 4);
1347 const u8 *data = buf + data_off;
1348 const u8 *oob = chip->oob_poi + oob_off;
1350 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1351 oob_off + mtd->writesize,
1352 &cur_off, !i, page);
1357 sunxi_nfc_hw_ecc_disable(mtd);
1359 return nand_prog_page_end_op(chip);
1362 static int sunxi_nfc_hw_ecc_write_page_dma(struct nand_chip *chip,
1367 struct mtd_info *mtd = nand_to_mtd(chip);
1368 struct nand_chip *nand = mtd_to_nand(mtd);
1369 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1370 struct nand_ecc_ctrl *ecc = &nand->ecc;
1371 struct scatterlist sg;
1374 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1378 ret = sunxi_nfc_dma_op_prepare(mtd, buf, ecc->size, ecc->steps,
1379 DMA_TO_DEVICE, &sg);
1383 for (i = 0; i < ecc->steps; i++) {
1384 const u8 *oob = nand->oob_poi + (i * (ecc->bytes + 4));
1386 sunxi_nfc_hw_ecc_set_prot_oob_bytes(mtd, oob, i, !i, page);
1389 nand_prog_page_begin_op(chip, page, 0, NULL, 0);
1391 sunxi_nfc_hw_ecc_enable(mtd);
1392 sunxi_nfc_randomizer_config(mtd, page, false);
1393 sunxi_nfc_randomizer_enable(mtd);
1395 writel((NAND_CMD_RNDIN << 8) | NAND_CMD_PAGEPROG,
1396 nfc->regs + NFC_REG_WCMD_SET);
1398 dma_async_issue_pending(nfc->dmac);
1400 writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD |
1401 NFC_DATA_TRANS | NFC_ACCESS_DIR,
1402 nfc->regs + NFC_REG_CMD);
1404 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0);
1406 dmaengine_terminate_all(nfc->dmac);
1408 sunxi_nfc_randomizer_disable(mtd);
1409 sunxi_nfc_hw_ecc_disable(mtd);
1411 sunxi_nfc_dma_op_cleanup(mtd, DMA_TO_DEVICE, &sg);
1416 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1417 /* TODO: use DMA to transfer extra OOB bytes ? */
1418 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1421 return nand_prog_page_end_op(chip);
1424 return sunxi_nfc_hw_ecc_write_page(chip, buf, oob_required, page);
1427 static int sunxi_nfc_hw_ecc_read_oob(struct nand_chip *chip, int page)
1431 return chip->ecc.read_page(chip, chip->data_buf, 1, page);
1434 static int sunxi_nfc_hw_ecc_write_oob(struct nand_chip *chip, int page)
1436 struct mtd_info *mtd = nand_to_mtd(chip);
1441 memset(chip->data_buf, 0xff, mtd->writesize);
1442 ret = chip->ecc.write_page(chip, chip->data_buf, 1, page);
1446 /* Send command to program the OOB data */
1447 return nand_prog_page_end_op(chip);
1450 static const s32 tWB_lut[] = {6, 12, 16, 20};
1451 static const s32 tRHW_lut[] = {4, 8, 12, 20};
1453 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
1456 u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
1459 for (i = 0; i < lut_size; i++) {
1460 if (clk_cycles <= lut[i])
1468 #define sunxi_nand_lookup_timing(l, p, c) \
1469 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1471 static int sunxi_nfc_setup_data_interface(struct nand_chip *nand, int csline,
1472 const struct nand_data_interface *conf)
1474 struct sunxi_nand_chip *chip = to_sunxi_nand(nand);
1475 struct sunxi_nfc *nfc = to_sunxi_nfc(chip->nand.controller);
1476 const struct nand_sdr_timings *timings;
1477 u32 min_clk_period = 0;
1478 s32 tWB, tADL, tWHR, tRHW, tCAD;
1481 timings = nand_get_sdr_timings(conf);
1482 if (IS_ERR(timings))
1486 if (timings->tCLS_min > min_clk_period)
1487 min_clk_period = timings->tCLS_min;
1490 if (timings->tCLH_min > min_clk_period)
1491 min_clk_period = timings->tCLH_min;
1494 if (timings->tCS_min > min_clk_period)
1495 min_clk_period = timings->tCS_min;
1498 if (timings->tCH_min > min_clk_period)
1499 min_clk_period = timings->tCH_min;
1502 if (timings->tWP_min > min_clk_period)
1503 min_clk_period = timings->tWP_min;
1506 if (timings->tWH_min > min_clk_period)
1507 min_clk_period = timings->tWH_min;
1510 if (timings->tALS_min > min_clk_period)
1511 min_clk_period = timings->tALS_min;
1514 if (timings->tDS_min > min_clk_period)
1515 min_clk_period = timings->tDS_min;
1518 if (timings->tDH_min > min_clk_period)
1519 min_clk_period = timings->tDH_min;
1522 if (timings->tRR_min > (min_clk_period * 3))
1523 min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
1526 if (timings->tALH_min > min_clk_period)
1527 min_clk_period = timings->tALH_min;
1530 if (timings->tRP_min > min_clk_period)
1531 min_clk_period = timings->tRP_min;
1534 if (timings->tREH_min > min_clk_period)
1535 min_clk_period = timings->tREH_min;
1538 if (timings->tRC_min > (min_clk_period * 2))
1539 min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
1542 if (timings->tWC_min > (min_clk_period * 2))
1543 min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
1545 /* T16 - T19 + tCAD */
1546 if (timings->tWB_max > (min_clk_period * 20))
1547 min_clk_period = DIV_ROUND_UP(timings->tWB_max, 20);
1549 if (timings->tADL_min > (min_clk_period * 32))
1550 min_clk_period = DIV_ROUND_UP(timings->tADL_min, 32);
1552 if (timings->tWHR_min > (min_clk_period * 32))
1553 min_clk_period = DIV_ROUND_UP(timings->tWHR_min, 32);
1555 if (timings->tRHW_min > (min_clk_period * 20))
1556 min_clk_period = DIV_ROUND_UP(timings->tRHW_min, 20);
1558 tWB = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
1561 dev_err(nfc->dev, "unsupported tWB\n");
1565 tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
1567 dev_err(nfc->dev, "unsupported tADL\n");
1571 tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
1573 dev_err(nfc->dev, "unsupported tWHR\n");
1577 tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
1580 dev_err(nfc->dev, "unsupported tRHW\n");
1584 if (csline == NAND_DATA_IFACE_CHECK_ONLY)
1588 * TODO: according to ONFI specs this value only applies for DDR NAND,
1589 * but Allwinner seems to set this to 0x7. Mimic them for now.
1593 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1594 chip->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
1596 /* Convert min_clk_period from picoseconds to nanoseconds */
1597 min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
1600 * Unlike what is stated in Allwinner datasheet, the clk_rate should
1601 * be set to (1 / min_clk_period), and not (2 / min_clk_period).
1602 * This new formula was verified with a scope and validated by
1603 * Allwinner engineers.
1605 chip->clk_rate = NSEC_PER_SEC / min_clk_period;
1606 real_clk_rate = clk_round_rate(nfc->mod_clk, chip->clk_rate);
1607 if (real_clk_rate <= 0) {
1608 dev_err(nfc->dev, "Unable to round clk %lu\n", chip->clk_rate);
1613 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1614 * output cycle timings shall be used if the host drives tRC less than
1617 min_clk_period = NSEC_PER_SEC / real_clk_rate;
1618 chip->timing_ctl = ((min_clk_period * 2) < 30) ?
1619 NFC_TIMING_CTL_EDO : 0;
1624 static int sunxi_nand_ooblayout_ecc(struct mtd_info *mtd, int section,
1625 struct mtd_oob_region *oobregion)
1627 struct nand_chip *nand = mtd_to_nand(mtd);
1628 struct nand_ecc_ctrl *ecc = &nand->ecc;
1630 if (section >= ecc->steps)
1633 oobregion->offset = section * (ecc->bytes + 4) + 4;
1634 oobregion->length = ecc->bytes;
1639 static int sunxi_nand_ooblayout_free(struct mtd_info *mtd, int section,
1640 struct mtd_oob_region *oobregion)
1642 struct nand_chip *nand = mtd_to_nand(mtd);
1643 struct nand_ecc_ctrl *ecc = &nand->ecc;
1645 if (section > ecc->steps)
1649 * The first 2 bytes are used for BB markers, hence we
1650 * only have 2 bytes available in the first user data
1653 if (!section && ecc->mode == NAND_ECC_HW) {
1654 oobregion->offset = 2;
1655 oobregion->length = 2;
1660 oobregion->offset = section * (ecc->bytes + 4);
1662 if (section < ecc->steps)
1663 oobregion->length = 4;
1665 oobregion->offset = mtd->oobsize - oobregion->offset;
1670 static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops = {
1671 .ecc = sunxi_nand_ooblayout_ecc,
1672 .free = sunxi_nand_ooblayout_free,
1675 static void sunxi_nand_hw_ecc_ctrl_cleanup(struct nand_ecc_ctrl *ecc)
1680 static int sunxi_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
1681 struct nand_ecc_ctrl *ecc,
1682 struct device_node *np)
1684 static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1685 struct nand_chip *nand = mtd_to_nand(mtd);
1686 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
1687 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
1688 struct sunxi_nand_hw_ecc *data;
1693 if (ecc->options & NAND_ECC_MAXIMIZE) {
1697 nsectors = mtd->writesize / ecc->size;
1699 /* Reserve 2 bytes for the BBM */
1700 bytes = (mtd->oobsize - 2) / nsectors;
1702 /* 4 non-ECC bytes are added before each ECC bytes section */
1705 /* and bytes has to be even. */
1709 ecc->strength = bytes * 8 / fls(8 * ecc->size);
1711 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1712 if (strengths[i] > ecc->strength)
1719 ecc->strength = strengths[i - 1];
1722 if (ecc->size != 512 && ecc->size != 1024)
1725 data = kzalloc(sizeof(*data), GFP_KERNEL);
1729 /* Prefer 1k ECC chunk over 512 ones */
1730 if (ecc->size == 512 && mtd->writesize > 512) {
1735 /* Add ECC info retrieval from DT */
1736 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1737 if (ecc->strength <= strengths[i]) {
1739 * Update ecc->strength value with the actual strength
1740 * that will be used by the ECC engine.
1742 ecc->strength = strengths[i];
1747 if (i >= ARRAY_SIZE(strengths)) {
1748 dev_err(nfc->dev, "unsupported strength\n");
1755 /* HW ECC always request ECC bytes for 1024 bytes blocks */
1756 ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
1758 /* HW ECC always work with even numbers of ECC bytes */
1759 ecc->bytes = ALIGN(ecc->bytes, 2);
1761 nsectors = mtd->writesize / ecc->size;
1763 if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
1768 ecc->read_oob = sunxi_nfc_hw_ecc_read_oob;
1769 ecc->write_oob = sunxi_nfc_hw_ecc_write_oob;
1770 mtd_set_ooblayout(mtd, &sunxi_nand_ooblayout_ops);
1774 ecc->read_page = sunxi_nfc_hw_ecc_read_page_dma;
1775 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage_dma;
1776 ecc->write_page = sunxi_nfc_hw_ecc_write_page_dma;
1777 nand->options |= NAND_USE_BOUNCE_BUFFER;
1779 ecc->read_page = sunxi_nfc_hw_ecc_read_page;
1780 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
1781 ecc->write_page = sunxi_nfc_hw_ecc_write_page;
1784 /* TODO: support DMA for raw accesses and subpage write */
1785 ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
1786 ecc->read_oob_raw = nand_read_oob_std;
1787 ecc->write_oob_raw = nand_write_oob_std;
1797 static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl *ecc)
1799 switch (ecc->mode) {
1801 sunxi_nand_hw_ecc_ctrl_cleanup(ecc);
1809 static int sunxi_nand_attach_chip(struct nand_chip *nand)
1811 struct mtd_info *mtd = nand_to_mtd(nand);
1812 struct nand_ecc_ctrl *ecc = &nand->ecc;
1813 struct device_node *np = nand_get_flash_node(nand);
1816 if (nand->bbt_options & NAND_BBT_USE_FLASH)
1817 nand->bbt_options |= NAND_BBT_NO_OOB;
1819 if (nand->options & NAND_NEED_SCRAMBLING)
1820 nand->options |= NAND_NO_SUBPAGE_WRITE;
1822 nand->options |= NAND_SUBPAGE_READ;
1825 ecc->size = nand->ecc_step_ds;
1826 ecc->strength = nand->ecc_strength_ds;
1829 if (!ecc->size || !ecc->strength)
1832 switch (ecc->mode) {
1834 ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc, np);
1848 static const struct nand_controller_ops sunxi_nand_controller_ops = {
1849 .attach_chip = sunxi_nand_attach_chip,
1850 .setup_data_interface = sunxi_nfc_setup_data_interface,
1853 static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc,
1854 struct device_node *np)
1856 struct sunxi_nand_chip *chip;
1857 struct mtd_info *mtd;
1858 struct nand_chip *nand;
1864 if (!of_get_property(np, "reg", &nsels))
1867 nsels /= sizeof(u32);
1869 dev_err(dev, "invalid reg property size\n");
1873 chip = devm_kzalloc(dev,
1875 (nsels * sizeof(struct sunxi_nand_chip_sel)),
1878 dev_err(dev, "could not allocate chip\n");
1882 chip->nsels = nsels;
1883 chip->selected = -1;
1885 for (i = 0; i < nsels; i++) {
1886 ret = of_property_read_u32_index(np, "reg", i, &tmp);
1888 dev_err(dev, "could not retrieve reg property: %d\n",
1893 if (tmp > NFC_MAX_CS) {
1895 "invalid reg value: %u (max CS = 7)\n",
1900 if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
1901 dev_err(dev, "CS %d already assigned\n", tmp);
1905 chip->sels[i].cs = tmp;
1907 if (!of_property_read_u32_index(np, "allwinner,rb", i, &tmp) &&
1909 chip->sels[i].rb = tmp;
1911 chip->sels[i].rb = -1;
1915 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
1916 nand->legacy.chip_delay = 200;
1917 nand->controller = &nfc->controller;
1918 nand->controller->ops = &sunxi_nand_controller_ops;
1921 * Set the ECC mode to the default value in case nothing is specified
1924 nand->ecc.mode = NAND_ECC_HW;
1925 nand_set_flash_node(nand, np);
1926 nand->legacy.select_chip = sunxi_nfc_select_chip;
1927 nand->legacy.cmd_ctrl = sunxi_nfc_cmd_ctrl;
1928 nand->legacy.read_buf = sunxi_nfc_read_buf;
1929 nand->legacy.write_buf = sunxi_nfc_write_buf;
1930 nand->legacy.read_byte = sunxi_nfc_read_byte;
1932 mtd = nand_to_mtd(nand);
1933 mtd->dev.parent = dev;
1935 ret = nand_scan(nand, nsels);
1939 ret = mtd_device_register(mtd, NULL, 0);
1941 dev_err(dev, "failed to register mtd device: %d\n", ret);
1946 list_add_tail(&chip->node, &nfc->chips);
1951 static int sunxi_nand_chips_init(struct device *dev, struct sunxi_nfc *nfc)
1953 struct device_node *np = dev->of_node;
1954 struct device_node *nand_np;
1955 int nchips = of_get_child_count(np);
1959 dev_err(dev, "too many NAND chips: %d (max = 8)\n", nchips);
1963 for_each_child_of_node(np, nand_np) {
1964 ret = sunxi_nand_chip_init(dev, nfc, nand_np);
1966 of_node_put(nand_np);
1974 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
1976 struct sunxi_nand_chip *chip;
1978 while (!list_empty(&nfc->chips)) {
1979 chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip,
1981 nand_release(&chip->nand);
1982 sunxi_nand_ecc_cleanup(&chip->nand.ecc);
1983 list_del(&chip->node);
1987 static int sunxi_nfc_probe(struct platform_device *pdev)
1989 struct device *dev = &pdev->dev;
1991 struct sunxi_nfc *nfc;
1995 nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL);
2000 nand_controller_init(&nfc->controller);
2001 INIT_LIST_HEAD(&nfc->chips);
2003 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2004 nfc->regs = devm_ioremap_resource(dev, r);
2005 if (IS_ERR(nfc->regs))
2006 return PTR_ERR(nfc->regs);
2008 irq = platform_get_irq(pdev, 0);
2010 dev_err(dev, "failed to retrieve irq\n");
2014 nfc->ahb_clk = devm_clk_get(dev, "ahb");
2015 if (IS_ERR(nfc->ahb_clk)) {
2016 dev_err(dev, "failed to retrieve ahb clk\n");
2017 return PTR_ERR(nfc->ahb_clk);
2020 ret = clk_prepare_enable(nfc->ahb_clk);
2024 nfc->mod_clk = devm_clk_get(dev, "mod");
2025 if (IS_ERR(nfc->mod_clk)) {
2026 dev_err(dev, "failed to retrieve mod clk\n");
2027 ret = PTR_ERR(nfc->mod_clk);
2028 goto out_ahb_clk_unprepare;
2031 ret = clk_prepare_enable(nfc->mod_clk);
2033 goto out_ahb_clk_unprepare;
2035 nfc->reset = devm_reset_control_get_optional_exclusive(dev, "ahb");
2036 if (IS_ERR(nfc->reset)) {
2037 ret = PTR_ERR(nfc->reset);
2038 goto out_mod_clk_unprepare;
2041 ret = reset_control_deassert(nfc->reset);
2043 dev_err(dev, "reset err %d\n", ret);
2044 goto out_mod_clk_unprepare;
2047 ret = sunxi_nfc_rst(nfc);
2049 goto out_ahb_reset_reassert;
2051 writel(0, nfc->regs + NFC_REG_INT);
2052 ret = devm_request_irq(dev, irq, sunxi_nfc_interrupt,
2053 0, "sunxi-nand", nfc);
2055 goto out_ahb_reset_reassert;
2057 nfc->dmac = dma_request_slave_channel(dev, "rxtx");
2059 struct dma_slave_config dmac_cfg = { };
2061 dmac_cfg.src_addr = r->start + NFC_REG_IO_DATA;
2062 dmac_cfg.dst_addr = dmac_cfg.src_addr;
2063 dmac_cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
2064 dmac_cfg.dst_addr_width = dmac_cfg.src_addr_width;
2065 dmac_cfg.src_maxburst = 4;
2066 dmac_cfg.dst_maxburst = 4;
2067 dmaengine_slave_config(nfc->dmac, &dmac_cfg);
2069 dev_warn(dev, "failed to request rxtx DMA channel\n");
2072 platform_set_drvdata(pdev, nfc);
2074 ret = sunxi_nand_chips_init(dev, nfc);
2076 dev_err(dev, "failed to init nand chips\n");
2077 goto out_release_dmac;
2084 dma_release_channel(nfc->dmac);
2085 out_ahb_reset_reassert:
2086 reset_control_assert(nfc->reset);
2087 out_mod_clk_unprepare:
2088 clk_disable_unprepare(nfc->mod_clk);
2089 out_ahb_clk_unprepare:
2090 clk_disable_unprepare(nfc->ahb_clk);
2095 static int sunxi_nfc_remove(struct platform_device *pdev)
2097 struct sunxi_nfc *nfc = platform_get_drvdata(pdev);
2099 sunxi_nand_chips_cleanup(nfc);
2101 reset_control_assert(nfc->reset);
2104 dma_release_channel(nfc->dmac);
2105 clk_disable_unprepare(nfc->mod_clk);
2106 clk_disable_unprepare(nfc->ahb_clk);
2111 static const struct of_device_id sunxi_nfc_ids[] = {
2112 { .compatible = "allwinner,sun4i-a10-nand" },
2115 MODULE_DEVICE_TABLE(of, sunxi_nfc_ids);
2117 static struct platform_driver sunxi_nfc_driver = {
2119 .name = "sunxi_nand",
2120 .of_match_table = sunxi_nfc_ids,
2122 .probe = sunxi_nfc_probe,
2123 .remove = sunxi_nfc_remove,
2125 module_platform_driver(sunxi_nfc_driver);
2127 MODULE_LICENSE("GPL v2");
2128 MODULE_AUTHOR("Boris BREZILLON");
2129 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");
2130 MODULE_ALIAS("platform:sunxi_nand");