Merge tag 'io_uring-5.11-2021-01-16' of git://git.kernel.dk/linux-block
[linux/fpc-iii.git] / drivers / mtd / nand / raw / sunxi_nand.c
blob923a9e236fcf62c92b466f6a95a8b952ff168899
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com>
5 * Derived from:
6 * https://github.com/yuq/sunxi-nfc-mtd
7 * Copyright (C) 2013 Qiang Yu <yuq825@gmail.com>
9 * https://github.com/hno/Allwinner-Info
10 * Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
12 * Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com>
13 * Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org>
16 #include <linux/dma-mapping.h>
17 #include <linux/slab.h>
18 #include <linux/module.h>
19 #include <linux/moduleparam.h>
20 #include <linux/platform_device.h>
21 #include <linux/of.h>
22 #include <linux/of_device.h>
23 #include <linux/mtd/mtd.h>
24 #include <linux/mtd/rawnand.h>
25 #include <linux/mtd/partitions.h>
26 #include <linux/clk.h>
27 #include <linux/delay.h>
28 #include <linux/dmaengine.h>
29 #include <linux/interrupt.h>
30 #include <linux/iopoll.h>
31 #include <linux/reset.h>
33 #define NFC_REG_CTL 0x0000
34 #define NFC_REG_ST 0x0004
35 #define NFC_REG_INT 0x0008
36 #define NFC_REG_TIMING_CTL 0x000C
37 #define NFC_REG_TIMING_CFG 0x0010
38 #define NFC_REG_ADDR_LOW 0x0014
39 #define NFC_REG_ADDR_HIGH 0x0018
40 #define NFC_REG_SECTOR_NUM 0x001C
41 #define NFC_REG_CNT 0x0020
42 #define NFC_REG_CMD 0x0024
43 #define NFC_REG_RCMD_SET 0x0028
44 #define NFC_REG_WCMD_SET 0x002C
45 #define NFC_REG_A10_IO_DATA 0x0030
46 #define NFC_REG_A23_IO_DATA 0x0300
47 #define NFC_REG_ECC_CTL 0x0034
48 #define NFC_REG_ECC_ST 0x0038
49 #define NFC_REG_DEBUG 0x003C
50 #define NFC_REG_ECC_ERR_CNT(x) ((0x0040 + (x)) & ~0x3)
51 #define NFC_REG_USER_DATA(x) (0x0050 + ((x) * 4))
52 #define NFC_REG_SPARE_AREA 0x00A0
53 #define NFC_REG_PAT_ID 0x00A4
54 #define NFC_REG_MDMA_ADDR 0x00C0
55 #define NFC_REG_MDMA_CNT 0x00C4
56 #define NFC_RAM0_BASE 0x0400
57 #define NFC_RAM1_BASE 0x0800
59 /* define bit use in NFC_CTL */
60 #define NFC_EN BIT(0)
61 #define NFC_RESET BIT(1)
62 #define NFC_BUS_WIDTH_MSK BIT(2)
63 #define NFC_BUS_WIDTH_8 (0 << 2)
64 #define NFC_BUS_WIDTH_16 (1 << 2)
65 #define NFC_RB_SEL_MSK BIT(3)
66 #define NFC_RB_SEL(x) ((x) << 3)
67 #define NFC_CE_SEL_MSK GENMASK(26, 24)
68 #define NFC_CE_SEL(x) ((x) << 24)
69 #define NFC_CE_CTL BIT(6)
70 #define NFC_PAGE_SHIFT_MSK GENMASK(11, 8)
71 #define NFC_PAGE_SHIFT(x) (((x) < 10 ? 0 : (x) - 10) << 8)
72 #define NFC_SAM BIT(12)
73 #define NFC_RAM_METHOD BIT(14)
74 #define NFC_DMA_TYPE_NORMAL BIT(15)
75 #define NFC_DEBUG_CTL BIT(31)
77 /* define bit use in NFC_ST */
78 #define NFC_RB_B2R BIT(0)
79 #define NFC_CMD_INT_FLAG BIT(1)
80 #define NFC_DMA_INT_FLAG BIT(2)
81 #define NFC_CMD_FIFO_STATUS BIT(3)
82 #define NFC_STA BIT(4)
83 #define NFC_NATCH_INT_FLAG BIT(5)
84 #define NFC_RB_STATE(x) BIT(x + 8)
86 /* define bit use in NFC_INT */
87 #define NFC_B2R_INT_ENABLE BIT(0)
88 #define NFC_CMD_INT_ENABLE BIT(1)
89 #define NFC_DMA_INT_ENABLE BIT(2)
90 #define NFC_INT_MASK (NFC_B2R_INT_ENABLE | \
91 NFC_CMD_INT_ENABLE | \
92 NFC_DMA_INT_ENABLE)
94 /* define bit use in NFC_TIMING_CTL */
95 #define NFC_TIMING_CTL_EDO BIT(8)
97 /* define NFC_TIMING_CFG register layout */
98 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD) \
99 (((tWB) & 0x3) | (((tADL) & 0x3) << 2) | \
100 (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) | \
101 (((tCAD) & 0x7) << 8))
103 /* define bit use in NFC_CMD */
104 #define NFC_CMD_LOW_BYTE_MSK GENMASK(7, 0)
105 #define NFC_CMD_HIGH_BYTE_MSK GENMASK(15, 8)
106 #define NFC_CMD(x) (x)
107 #define NFC_ADR_NUM_MSK GENMASK(18, 16)
108 #define NFC_ADR_NUM(x) (((x) - 1) << 16)
109 #define NFC_SEND_ADR BIT(19)
110 #define NFC_ACCESS_DIR BIT(20)
111 #define NFC_DATA_TRANS BIT(21)
112 #define NFC_SEND_CMD1 BIT(22)
113 #define NFC_WAIT_FLAG BIT(23)
114 #define NFC_SEND_CMD2 BIT(24)
115 #define NFC_SEQ BIT(25)
116 #define NFC_DATA_SWAP_METHOD BIT(26)
117 #define NFC_ROW_AUTO_INC BIT(27)
118 #define NFC_SEND_CMD3 BIT(28)
119 #define NFC_SEND_CMD4 BIT(29)
120 #define NFC_CMD_TYPE_MSK GENMASK(31, 30)
121 #define NFC_NORMAL_OP (0 << 30)
122 #define NFC_ECC_OP (1 << 30)
123 #define NFC_PAGE_OP (2U << 30)
125 /* define bit use in NFC_RCMD_SET */
126 #define NFC_READ_CMD_MSK GENMASK(7, 0)
127 #define NFC_RND_READ_CMD0_MSK GENMASK(15, 8)
128 #define NFC_RND_READ_CMD1_MSK GENMASK(23, 16)
130 /* define bit use in NFC_WCMD_SET */
131 #define NFC_PROGRAM_CMD_MSK GENMASK(7, 0)
132 #define NFC_RND_WRITE_CMD_MSK GENMASK(15, 8)
133 #define NFC_READ_CMD0_MSK GENMASK(23, 16)
134 #define NFC_READ_CMD1_MSK GENMASK(31, 24)
136 /* define bit use in NFC_ECC_CTL */
137 #define NFC_ECC_EN BIT(0)
138 #define NFC_ECC_PIPELINE BIT(3)
139 #define NFC_ECC_EXCEPTION BIT(4)
140 #define NFC_ECC_BLOCK_SIZE_MSK BIT(5)
141 #define NFC_ECC_BLOCK_512 BIT(5)
142 #define NFC_RANDOM_EN BIT(9)
143 #define NFC_RANDOM_DIRECTION BIT(10)
144 #define NFC_ECC_MODE_MSK GENMASK(15, 12)
145 #define NFC_ECC_MODE(x) ((x) << 12)
146 #define NFC_RANDOM_SEED_MSK GENMASK(30, 16)
147 #define NFC_RANDOM_SEED(x) ((x) << 16)
149 /* define bit use in NFC_ECC_ST */
150 #define NFC_ECC_ERR(x) BIT(x)
151 #define NFC_ECC_ERR_MSK GENMASK(15, 0)
152 #define NFC_ECC_PAT_FOUND(x) BIT(x + 16)
153 #define NFC_ECC_ERR_CNT(b, x) (((x) >> (((b) % 4) * 8)) & 0xff)
155 #define NFC_DEFAULT_TIMEOUT_MS 1000
157 #define NFC_SRAM_SIZE 1024
159 #define NFC_MAX_CS 7
162 * struct sunxi_nand_chip_sel - stores information related to NAND Chip Select
164 * @cs: the NAND CS id used to communicate with a NAND Chip
165 * @rb: the Ready/Busy pin ID. -1 means no R/B pin connected to the NFC
167 struct sunxi_nand_chip_sel {
168 u8 cs;
169 s8 rb;
173 * struct sunxi_nand_hw_ecc - stores information related to HW ECC support
175 * @mode: the sunxi ECC mode field deduced from ECC requirements
177 struct sunxi_nand_hw_ecc {
178 int mode;
182 * struct sunxi_nand_chip - stores NAND chip device related information
184 * @node: used to store NAND chips into a list
185 * @nand: base NAND chip structure
186 * @ecc: ECC controller structure
187 * @clk_rate: clk_rate required for this NAND chip
188 * @timing_cfg: TIMING_CFG register value for this NAND chip
189 * @timing_ctl: TIMING_CTL register value for this NAND chip
190 * @nsels: number of CS lines required by the NAND chip
191 * @sels: array of CS lines descriptions
193 struct sunxi_nand_chip {
194 struct list_head node;
195 struct nand_chip nand;
196 struct sunxi_nand_hw_ecc *ecc;
197 unsigned long clk_rate;
198 u32 timing_cfg;
199 u32 timing_ctl;
200 int nsels;
201 struct sunxi_nand_chip_sel sels[];
204 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
206 return container_of(nand, struct sunxi_nand_chip, nand);
210 * NAND Controller capabilities structure: stores NAND controller capabilities
211 * for distinction between compatible strings.
213 * @has_mdma: Use mbus dma mode, otherwise general dma
214 * through MBUS on A23/A33 needs extra configuration.
215 * @reg_io_data: I/O data register
216 * @dma_maxburst: DMA maxburst
218 struct sunxi_nfc_caps {
219 bool has_mdma;
220 unsigned int reg_io_data;
221 unsigned int dma_maxburst;
225 * struct sunxi_nfc - stores sunxi NAND controller information
227 * @controller: base controller structure
228 * @dev: parent device (used to print error messages)
229 * @regs: NAND controller registers
230 * @ahb_clk: NAND controller AHB clock
231 * @mod_clk: NAND controller mod clock
232 * @reset: NAND controller reset line
233 * @assigned_cs: bitmask describing already assigned CS lines
234 * @clk_rate: NAND controller current clock rate
235 * @chips: a list containing all the NAND chips attached to this NAND
236 * controller
237 * @complete: a completion object used to wait for NAND controller events
238 * @dmac: the DMA channel attached to the NAND controller
239 * @caps: NAND Controller capabilities
241 struct sunxi_nfc {
242 struct nand_controller controller;
243 struct device *dev;
244 void __iomem *regs;
245 struct clk *ahb_clk;
246 struct clk *mod_clk;
247 struct reset_control *reset;
248 unsigned long assigned_cs;
249 unsigned long clk_rate;
250 struct list_head chips;
251 struct completion complete;
252 struct dma_chan *dmac;
253 const struct sunxi_nfc_caps *caps;
256 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_controller *ctrl)
258 return container_of(ctrl, struct sunxi_nfc, controller);
261 static irqreturn_t sunxi_nfc_interrupt(int irq, void *dev_id)
263 struct sunxi_nfc *nfc = dev_id;
264 u32 st = readl(nfc->regs + NFC_REG_ST);
265 u32 ien = readl(nfc->regs + NFC_REG_INT);
267 if (!(ien & st))
268 return IRQ_NONE;
270 if ((ien & st) == ien)
271 complete(&nfc->complete);
273 writel(st & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
274 writel(~st & ien & NFC_INT_MASK, nfc->regs + NFC_REG_INT);
276 return IRQ_HANDLED;
279 static int sunxi_nfc_wait_events(struct sunxi_nfc *nfc, u32 events,
280 bool use_polling, unsigned int timeout_ms)
282 int ret;
284 if (events & ~NFC_INT_MASK)
285 return -EINVAL;
287 if (!timeout_ms)
288 timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
290 if (!use_polling) {
291 init_completion(&nfc->complete);
293 writel(events, nfc->regs + NFC_REG_INT);
295 ret = wait_for_completion_timeout(&nfc->complete,
296 msecs_to_jiffies(timeout_ms));
297 if (!ret)
298 ret = -ETIMEDOUT;
299 else
300 ret = 0;
302 writel(0, nfc->regs + NFC_REG_INT);
303 } else {
304 u32 status;
306 ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status,
307 (status & events) == events, 1,
308 timeout_ms * 1000);
311 writel(events & NFC_INT_MASK, nfc->regs + NFC_REG_ST);
313 if (ret)
314 dev_err(nfc->dev, "wait interrupt timedout\n");
316 return ret;
319 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
321 u32 status;
322 int ret;
324 ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status,
325 !(status & NFC_CMD_FIFO_STATUS), 1,
326 NFC_DEFAULT_TIMEOUT_MS * 1000);
327 if (ret)
328 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
330 return ret;
333 static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
335 u32 ctl;
336 int ret;
338 writel(0, nfc->regs + NFC_REG_ECC_CTL);
339 writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
341 ret = readl_poll_timeout(nfc->regs + NFC_REG_CTL, ctl,
342 !(ctl & NFC_RESET), 1,
343 NFC_DEFAULT_TIMEOUT_MS * 1000);
344 if (ret)
345 dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
347 return ret;
350 static int sunxi_nfc_dma_op_prepare(struct sunxi_nfc *nfc, const void *buf,
351 int chunksize, int nchunks,
352 enum dma_data_direction ddir,
353 struct scatterlist *sg)
355 struct dma_async_tx_descriptor *dmad;
356 enum dma_transfer_direction tdir;
357 dma_cookie_t dmat;
358 int ret;
360 if (ddir == DMA_FROM_DEVICE)
361 tdir = DMA_DEV_TO_MEM;
362 else
363 tdir = DMA_MEM_TO_DEV;
365 sg_init_one(sg, buf, nchunks * chunksize);
366 ret = dma_map_sg(nfc->dev, sg, 1, ddir);
367 if (!ret)
368 return -ENOMEM;
370 if (!nfc->caps->has_mdma) {
371 dmad = dmaengine_prep_slave_sg(nfc->dmac, sg, 1, tdir, DMA_CTRL_ACK);
372 if (!dmad) {
373 ret = -EINVAL;
374 goto err_unmap_buf;
378 writel(readl(nfc->regs + NFC_REG_CTL) | NFC_RAM_METHOD,
379 nfc->regs + NFC_REG_CTL);
380 writel(nchunks, nfc->regs + NFC_REG_SECTOR_NUM);
381 writel(chunksize, nfc->regs + NFC_REG_CNT);
383 if (nfc->caps->has_mdma) {
384 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_DMA_TYPE_NORMAL,
385 nfc->regs + NFC_REG_CTL);
386 writel(chunksize * nchunks, nfc->regs + NFC_REG_MDMA_CNT);
387 writel(sg_dma_address(sg), nfc->regs + NFC_REG_MDMA_ADDR);
388 } else {
389 dmat = dmaengine_submit(dmad);
391 ret = dma_submit_error(dmat);
392 if (ret)
393 goto err_clr_dma_flag;
396 return 0;
398 err_clr_dma_flag:
399 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD,
400 nfc->regs + NFC_REG_CTL);
402 err_unmap_buf:
403 dma_unmap_sg(nfc->dev, sg, 1, ddir);
404 return ret;
407 static void sunxi_nfc_dma_op_cleanup(struct sunxi_nfc *nfc,
408 enum dma_data_direction ddir,
409 struct scatterlist *sg)
411 dma_unmap_sg(nfc->dev, sg, 1, ddir);
412 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD,
413 nfc->regs + NFC_REG_CTL);
416 static void sunxi_nfc_select_chip(struct nand_chip *nand, unsigned int cs)
418 struct mtd_info *mtd = nand_to_mtd(nand);
419 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
420 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
421 struct sunxi_nand_chip_sel *sel;
422 u32 ctl;
424 if (cs > 0 && cs >= sunxi_nand->nsels)
425 return;
427 ctl = readl(nfc->regs + NFC_REG_CTL) &
428 ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
430 sel = &sunxi_nand->sels[cs];
431 ctl |= NFC_CE_SEL(sel->cs) | NFC_EN | NFC_PAGE_SHIFT(nand->page_shift);
432 if (sel->rb >= 0)
433 ctl |= NFC_RB_SEL(sel->rb);
435 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
437 if (nfc->clk_rate != sunxi_nand->clk_rate) {
438 clk_set_rate(nfc->mod_clk, sunxi_nand->clk_rate);
439 nfc->clk_rate = sunxi_nand->clk_rate;
442 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
443 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
444 writel(ctl, nfc->regs + NFC_REG_CTL);
447 static void sunxi_nfc_read_buf(struct nand_chip *nand, uint8_t *buf, int len)
449 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
450 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
451 int ret;
452 int cnt;
453 int offs = 0;
454 u32 tmp;
456 while (len > offs) {
457 bool poll = false;
459 cnt = min(len - offs, NFC_SRAM_SIZE);
461 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
462 if (ret)
463 break;
465 writel(cnt, nfc->regs + NFC_REG_CNT);
466 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
467 writel(tmp, nfc->regs + NFC_REG_CMD);
469 /* Arbitrary limit for polling mode */
470 if (cnt < 64)
471 poll = true;
473 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, poll, 0);
474 if (ret)
475 break;
477 if (buf)
478 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
479 cnt);
480 offs += cnt;
484 static void sunxi_nfc_write_buf(struct nand_chip *nand, const uint8_t *buf,
485 int len)
487 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
488 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
489 int ret;
490 int cnt;
491 int offs = 0;
492 u32 tmp;
494 while (len > offs) {
495 bool poll = false;
497 cnt = min(len - offs, NFC_SRAM_SIZE);
499 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
500 if (ret)
501 break;
503 writel(cnt, nfc->regs + NFC_REG_CNT);
504 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
505 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
506 NFC_ACCESS_DIR;
507 writel(tmp, nfc->regs + NFC_REG_CMD);
509 /* Arbitrary limit for polling mode */
510 if (cnt < 64)
511 poll = true;
513 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, poll, 0);
514 if (ret)
515 break;
517 offs += cnt;
521 /* These seed values have been extracted from Allwinner's BSP */
522 static const u16 sunxi_nfc_randomizer_page_seeds[] = {
523 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
524 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
525 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
526 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
527 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
528 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
529 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
530 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
531 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
532 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
533 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
534 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
535 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
536 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
537 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
538 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
542 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
543 * have been generated using
544 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
545 * the randomizer engine does internally before de/scrambling OOB data.
547 * Those tables are statically defined to avoid calculating randomizer state
548 * at runtime.
550 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
551 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
552 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
553 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
554 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
555 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
556 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
557 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
558 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
559 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
560 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
561 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
562 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
563 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
564 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
565 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
566 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
569 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
570 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
571 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
572 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
573 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
574 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
575 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
576 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
577 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
578 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
579 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
580 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
581 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
582 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
583 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
584 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
585 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
588 static u16 sunxi_nfc_randomizer_step(u16 state, int count)
590 state &= 0x7fff;
593 * This loop is just a simple implementation of a Fibonacci LFSR using
594 * the x16 + x15 + 1 polynomial.
596 while (count--)
597 state = ((state >> 1) |
598 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
600 return state;
603 static u16 sunxi_nfc_randomizer_state(struct nand_chip *nand, int page,
604 bool ecc)
606 struct mtd_info *mtd = nand_to_mtd(nand);
607 const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
608 int mod = mtd_div_by_ws(mtd->erasesize, mtd);
610 if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
611 mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
613 if (ecc) {
614 if (mtd->ecc_step_size == 512)
615 seeds = sunxi_nfc_randomizer_ecc512_seeds;
616 else
617 seeds = sunxi_nfc_randomizer_ecc1024_seeds;
620 return seeds[page % mod];
623 static void sunxi_nfc_randomizer_config(struct nand_chip *nand, int page,
624 bool ecc)
626 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
627 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
628 u16 state;
630 if (!(nand->options & NAND_NEED_SCRAMBLING))
631 return;
633 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
634 state = sunxi_nfc_randomizer_state(nand, page, ecc);
635 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
636 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
639 static void sunxi_nfc_randomizer_enable(struct nand_chip *nand)
641 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
643 if (!(nand->options & NAND_NEED_SCRAMBLING))
644 return;
646 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
647 nfc->regs + NFC_REG_ECC_CTL);
650 static void sunxi_nfc_randomizer_disable(struct nand_chip *nand)
652 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
654 if (!(nand->options & NAND_NEED_SCRAMBLING))
655 return;
657 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
658 nfc->regs + NFC_REG_ECC_CTL);
661 static void sunxi_nfc_randomize_bbm(struct nand_chip *nand, int page, u8 *bbm)
663 u16 state = sunxi_nfc_randomizer_state(nand, page, true);
665 bbm[0] ^= state;
666 bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
669 static void sunxi_nfc_randomizer_write_buf(struct nand_chip *nand,
670 const uint8_t *buf, int len,
671 bool ecc, int page)
673 sunxi_nfc_randomizer_config(nand, page, ecc);
674 sunxi_nfc_randomizer_enable(nand);
675 sunxi_nfc_write_buf(nand, buf, len);
676 sunxi_nfc_randomizer_disable(nand);
679 static void sunxi_nfc_randomizer_read_buf(struct nand_chip *nand, uint8_t *buf,
680 int len, bool ecc, int page)
682 sunxi_nfc_randomizer_config(nand, page, ecc);
683 sunxi_nfc_randomizer_enable(nand);
684 sunxi_nfc_read_buf(nand, buf, len);
685 sunxi_nfc_randomizer_disable(nand);
688 static void sunxi_nfc_hw_ecc_enable(struct nand_chip *nand)
690 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
691 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
692 u32 ecc_ctl;
694 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
695 ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
696 NFC_ECC_BLOCK_SIZE_MSK);
697 ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(sunxi_nand->ecc->mode) |
698 NFC_ECC_EXCEPTION | NFC_ECC_PIPELINE;
700 if (nand->ecc.size == 512)
701 ecc_ctl |= NFC_ECC_BLOCK_512;
703 writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
706 static void sunxi_nfc_hw_ecc_disable(struct nand_chip *nand)
708 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
710 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
711 nfc->regs + NFC_REG_ECC_CTL);
714 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
716 buf[0] = user_data;
717 buf[1] = user_data >> 8;
718 buf[2] = user_data >> 16;
719 buf[3] = user_data >> 24;
722 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
724 return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
727 static void sunxi_nfc_hw_ecc_get_prot_oob_bytes(struct nand_chip *nand, u8 *oob,
728 int step, bool bbm, int page)
730 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
732 sunxi_nfc_user_data_to_buf(readl(nfc->regs + NFC_REG_USER_DATA(step)),
733 oob);
735 /* De-randomize the Bad Block Marker. */
736 if (bbm && (nand->options & NAND_NEED_SCRAMBLING))
737 sunxi_nfc_randomize_bbm(nand, page, oob);
740 static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct nand_chip *nand,
741 const u8 *oob, int step,
742 bool bbm, int page)
744 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
745 u8 user_data[4];
747 /* Randomize the Bad Block Marker. */
748 if (bbm && (nand->options & NAND_NEED_SCRAMBLING)) {
749 memcpy(user_data, oob, sizeof(user_data));
750 sunxi_nfc_randomize_bbm(nand, page, user_data);
751 oob = user_data;
754 writel(sunxi_nfc_buf_to_user_data(oob),
755 nfc->regs + NFC_REG_USER_DATA(step));
758 static void sunxi_nfc_hw_ecc_update_stats(struct nand_chip *nand,
759 unsigned int *max_bitflips, int ret)
761 struct mtd_info *mtd = nand_to_mtd(nand);
763 if (ret < 0) {
764 mtd->ecc_stats.failed++;
765 } else {
766 mtd->ecc_stats.corrected += ret;
767 *max_bitflips = max_t(unsigned int, *max_bitflips, ret);
771 static int sunxi_nfc_hw_ecc_correct(struct nand_chip *nand, u8 *data, u8 *oob,
772 int step, u32 status, bool *erased)
774 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
775 struct nand_ecc_ctrl *ecc = &nand->ecc;
776 u32 tmp;
778 *erased = false;
780 if (status & NFC_ECC_ERR(step))
781 return -EBADMSG;
783 if (status & NFC_ECC_PAT_FOUND(step)) {
784 u8 pattern;
786 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1))) {
787 pattern = 0x0;
788 } else {
789 pattern = 0xff;
790 *erased = true;
793 if (data)
794 memset(data, pattern, ecc->size);
796 if (oob)
797 memset(oob, pattern, ecc->bytes + 4);
799 return 0;
802 tmp = readl(nfc->regs + NFC_REG_ECC_ERR_CNT(step));
804 return NFC_ECC_ERR_CNT(step, tmp);
807 static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand,
808 u8 *data, int data_off,
809 u8 *oob, int oob_off,
810 int *cur_off,
811 unsigned int *max_bitflips,
812 bool bbm, bool oob_required, int page)
814 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
815 struct nand_ecc_ctrl *ecc = &nand->ecc;
816 int raw_mode = 0;
817 bool erased;
818 int ret;
820 if (*cur_off != data_off)
821 nand_change_read_column_op(nand, data_off, NULL, 0, false);
823 sunxi_nfc_randomizer_read_buf(nand, NULL, ecc->size, false, page);
825 if (data_off + ecc->size != oob_off)
826 nand_change_read_column_op(nand, oob_off, NULL, 0, false);
828 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
829 if (ret)
830 return ret;
832 sunxi_nfc_randomizer_enable(nand);
833 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
834 nfc->regs + NFC_REG_CMD);
836 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0);
837 sunxi_nfc_randomizer_disable(nand);
838 if (ret)
839 return ret;
841 *cur_off = oob_off + ecc->bytes + 4;
843 ret = sunxi_nfc_hw_ecc_correct(nand, data, oob_required ? oob : NULL, 0,
844 readl(nfc->regs + NFC_REG_ECC_ST),
845 &erased);
846 if (erased)
847 return 1;
849 if (ret < 0) {
851 * Re-read the data with the randomizer disabled to identify
852 * bitflips in erased pages.
854 if (nand->options & NAND_NEED_SCRAMBLING)
855 nand_change_read_column_op(nand, data_off, data,
856 ecc->size, false);
857 else
858 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE,
859 ecc->size);
861 nand_change_read_column_op(nand, oob_off, oob, ecc->bytes + 4,
862 false);
864 ret = nand_check_erased_ecc_chunk(data, ecc->size,
865 oob, ecc->bytes + 4,
866 NULL, 0, ecc->strength);
867 if (ret >= 0)
868 raw_mode = 1;
869 } else {
870 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
872 if (oob_required) {
873 nand_change_read_column_op(nand, oob_off, NULL, 0,
874 false);
875 sunxi_nfc_randomizer_read_buf(nand, oob, ecc->bytes + 4,
876 true, page);
878 sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand, oob, 0,
879 bbm, page);
883 sunxi_nfc_hw_ecc_update_stats(nand, max_bitflips, ret);
885 return raw_mode;
888 static void sunxi_nfc_hw_ecc_read_extra_oob(struct nand_chip *nand,
889 u8 *oob, int *cur_off,
890 bool randomize, int page)
892 struct mtd_info *mtd = nand_to_mtd(nand);
893 struct nand_ecc_ctrl *ecc = &nand->ecc;
894 int offset = ((ecc->bytes + 4) * ecc->steps);
895 int len = mtd->oobsize - offset;
897 if (len <= 0)
898 return;
900 if (!cur_off || *cur_off != offset)
901 nand_change_read_column_op(nand, mtd->writesize, NULL, 0,
902 false);
904 if (!randomize)
905 sunxi_nfc_read_buf(nand, oob + offset, len);
906 else
907 sunxi_nfc_randomizer_read_buf(nand, oob + offset, len,
908 false, page);
910 if (cur_off)
911 *cur_off = mtd->oobsize + mtd->writesize;
914 static int sunxi_nfc_hw_ecc_read_chunks_dma(struct nand_chip *nand, uint8_t *buf,
915 int oob_required, int page,
916 int nchunks)
918 bool randomized = nand->options & NAND_NEED_SCRAMBLING;
919 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
920 struct mtd_info *mtd = nand_to_mtd(nand);
921 struct nand_ecc_ctrl *ecc = &nand->ecc;
922 unsigned int max_bitflips = 0;
923 int ret, i, raw_mode = 0;
924 struct scatterlist sg;
925 u32 status, wait;
927 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
928 if (ret)
929 return ret;
931 ret = sunxi_nfc_dma_op_prepare(nfc, buf, ecc->size, nchunks,
932 DMA_FROM_DEVICE, &sg);
933 if (ret)
934 return ret;
936 sunxi_nfc_hw_ecc_enable(nand);
937 sunxi_nfc_randomizer_config(nand, page, false);
938 sunxi_nfc_randomizer_enable(nand);
940 writel((NAND_CMD_RNDOUTSTART << 16) | (NAND_CMD_RNDOUT << 8) |
941 NAND_CMD_READSTART, nfc->regs + NFC_REG_RCMD_SET);
943 wait = NFC_CMD_INT_FLAG;
945 if (nfc->caps->has_mdma)
946 wait |= NFC_DMA_INT_FLAG;
947 else
948 dma_async_issue_pending(nfc->dmac);
950 writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD | NFC_DATA_TRANS,
951 nfc->regs + NFC_REG_CMD);
953 ret = sunxi_nfc_wait_events(nfc, wait, false, 0);
954 if (ret && !nfc->caps->has_mdma)
955 dmaengine_terminate_all(nfc->dmac);
957 sunxi_nfc_randomizer_disable(nand);
958 sunxi_nfc_hw_ecc_disable(nand);
960 sunxi_nfc_dma_op_cleanup(nfc, DMA_FROM_DEVICE, &sg);
962 if (ret)
963 return ret;
965 status = readl(nfc->regs + NFC_REG_ECC_ST);
967 for (i = 0; i < nchunks; i++) {
968 int data_off = i * ecc->size;
969 int oob_off = i * (ecc->bytes + 4);
970 u8 *data = buf + data_off;
971 u8 *oob = nand->oob_poi + oob_off;
972 bool erased;
974 ret = sunxi_nfc_hw_ecc_correct(nand, randomized ? data : NULL,
975 oob_required ? oob : NULL,
976 i, status, &erased);
978 /* ECC errors are handled in the second loop. */
979 if (ret < 0)
980 continue;
982 if (oob_required && !erased) {
983 /* TODO: use DMA to retrieve OOB */
984 nand_change_read_column_op(nand,
985 mtd->writesize + oob_off,
986 oob, ecc->bytes + 4, false);
988 sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand, oob, i,
989 !i, page);
992 if (erased)
993 raw_mode = 1;
995 sunxi_nfc_hw_ecc_update_stats(nand, &max_bitflips, ret);
998 if (status & NFC_ECC_ERR_MSK) {
999 for (i = 0; i < nchunks; i++) {
1000 int data_off = i * ecc->size;
1001 int oob_off = i * (ecc->bytes + 4);
1002 u8 *data = buf + data_off;
1003 u8 *oob = nand->oob_poi + oob_off;
1005 if (!(status & NFC_ECC_ERR(i)))
1006 continue;
1009 * Re-read the data with the randomizer disabled to
1010 * identify bitflips in erased pages.
1011 * TODO: use DMA to read page in raw mode
1013 if (randomized)
1014 nand_change_read_column_op(nand, data_off,
1015 data, ecc->size,
1016 false);
1018 /* TODO: use DMA to retrieve OOB */
1019 nand_change_read_column_op(nand,
1020 mtd->writesize + oob_off,
1021 oob, ecc->bytes + 4, false);
1023 ret = nand_check_erased_ecc_chunk(data, ecc->size,
1024 oob, ecc->bytes + 4,
1025 NULL, 0,
1026 ecc->strength);
1027 if (ret >= 0)
1028 raw_mode = 1;
1030 sunxi_nfc_hw_ecc_update_stats(nand, &max_bitflips, ret);
1034 if (oob_required)
1035 sunxi_nfc_hw_ecc_read_extra_oob(nand, nand->oob_poi,
1036 NULL, !raw_mode,
1037 page);
1039 return max_bitflips;
1042 static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip *nand,
1043 const u8 *data, int data_off,
1044 const u8 *oob, int oob_off,
1045 int *cur_off, bool bbm,
1046 int page)
1048 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1049 struct nand_ecc_ctrl *ecc = &nand->ecc;
1050 int ret;
1052 if (data_off != *cur_off)
1053 nand_change_write_column_op(nand, data_off, NULL, 0, false);
1055 sunxi_nfc_randomizer_write_buf(nand, data, ecc->size, false, page);
1057 if (data_off + ecc->size != oob_off)
1058 nand_change_write_column_op(nand, oob_off, NULL, 0, false);
1060 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1061 if (ret)
1062 return ret;
1064 sunxi_nfc_randomizer_enable(nand);
1065 sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, 0, bbm, page);
1067 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
1068 NFC_ACCESS_DIR | NFC_ECC_OP,
1069 nfc->regs + NFC_REG_CMD);
1071 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0);
1072 sunxi_nfc_randomizer_disable(nand);
1073 if (ret)
1074 return ret;
1076 *cur_off = oob_off + ecc->bytes + 4;
1078 return 0;
1081 static void sunxi_nfc_hw_ecc_write_extra_oob(struct nand_chip *nand,
1082 u8 *oob, int *cur_off,
1083 int page)
1085 struct mtd_info *mtd = nand_to_mtd(nand);
1086 struct nand_ecc_ctrl *ecc = &nand->ecc;
1087 int offset = ((ecc->bytes + 4) * ecc->steps);
1088 int len = mtd->oobsize - offset;
1090 if (len <= 0)
1091 return;
1093 if (!cur_off || *cur_off != offset)
1094 nand_change_write_column_op(nand, offset + mtd->writesize,
1095 NULL, 0, false);
1097 sunxi_nfc_randomizer_write_buf(nand, oob + offset, len, false, page);
1099 if (cur_off)
1100 *cur_off = mtd->oobsize + mtd->writesize;
1103 static int sunxi_nfc_hw_ecc_read_page(struct nand_chip *nand, uint8_t *buf,
1104 int oob_required, int page)
1106 struct mtd_info *mtd = nand_to_mtd(nand);
1107 struct nand_ecc_ctrl *ecc = &nand->ecc;
1108 unsigned int max_bitflips = 0;
1109 int ret, i, cur_off = 0;
1110 bool raw_mode = false;
1112 sunxi_nfc_select_chip(nand, nand->cur_cs);
1114 nand_read_page_op(nand, page, 0, NULL, 0);
1116 sunxi_nfc_hw_ecc_enable(nand);
1118 for (i = 0; i < ecc->steps; i++) {
1119 int data_off = i * ecc->size;
1120 int oob_off = i * (ecc->bytes + 4);
1121 u8 *data = buf + data_off;
1122 u8 *oob = nand->oob_poi + oob_off;
1124 ret = sunxi_nfc_hw_ecc_read_chunk(nand, data, data_off, oob,
1125 oob_off + mtd->writesize,
1126 &cur_off, &max_bitflips,
1127 !i, oob_required, page);
1128 if (ret < 0)
1129 return ret;
1130 else if (ret)
1131 raw_mode = true;
1134 if (oob_required)
1135 sunxi_nfc_hw_ecc_read_extra_oob(nand, nand->oob_poi, &cur_off,
1136 !raw_mode, page);
1138 sunxi_nfc_hw_ecc_disable(nand);
1140 return max_bitflips;
1143 static int sunxi_nfc_hw_ecc_read_page_dma(struct nand_chip *nand, u8 *buf,
1144 int oob_required, int page)
1146 int ret;
1148 sunxi_nfc_select_chip(nand, nand->cur_cs);
1150 nand_read_page_op(nand, page, 0, NULL, 0);
1152 ret = sunxi_nfc_hw_ecc_read_chunks_dma(nand, buf, oob_required, page,
1153 nand->ecc.steps);
1154 if (ret >= 0)
1155 return ret;
1157 /* Fallback to PIO mode */
1158 return sunxi_nfc_hw_ecc_read_page(nand, buf, oob_required, page);
1161 static int sunxi_nfc_hw_ecc_read_subpage(struct nand_chip *nand,
1162 u32 data_offs, u32 readlen,
1163 u8 *bufpoi, int page)
1165 struct mtd_info *mtd = nand_to_mtd(nand);
1166 struct nand_ecc_ctrl *ecc = &nand->ecc;
1167 int ret, i, cur_off = 0;
1168 unsigned int max_bitflips = 0;
1170 sunxi_nfc_select_chip(nand, nand->cur_cs);
1172 nand_read_page_op(nand, page, 0, NULL, 0);
1174 sunxi_nfc_hw_ecc_enable(nand);
1176 for (i = data_offs / ecc->size;
1177 i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
1178 int data_off = i * ecc->size;
1179 int oob_off = i * (ecc->bytes + 4);
1180 u8 *data = bufpoi + data_off;
1181 u8 *oob = nand->oob_poi + oob_off;
1183 ret = sunxi_nfc_hw_ecc_read_chunk(nand, data, data_off,
1184 oob,
1185 oob_off + mtd->writesize,
1186 &cur_off, &max_bitflips, !i,
1187 false, page);
1188 if (ret < 0)
1189 return ret;
1192 sunxi_nfc_hw_ecc_disable(nand);
1194 return max_bitflips;
1197 static int sunxi_nfc_hw_ecc_read_subpage_dma(struct nand_chip *nand,
1198 u32 data_offs, u32 readlen,
1199 u8 *buf, int page)
1201 int nchunks = DIV_ROUND_UP(data_offs + readlen, nand->ecc.size);
1202 int ret;
1204 sunxi_nfc_select_chip(nand, nand->cur_cs);
1206 nand_read_page_op(nand, page, 0, NULL, 0);
1208 ret = sunxi_nfc_hw_ecc_read_chunks_dma(nand, buf, false, page, nchunks);
1209 if (ret >= 0)
1210 return ret;
1212 /* Fallback to PIO mode */
1213 return sunxi_nfc_hw_ecc_read_subpage(nand, data_offs, readlen,
1214 buf, page);
1217 static int sunxi_nfc_hw_ecc_write_page(struct nand_chip *nand,
1218 const uint8_t *buf, int oob_required,
1219 int page)
1221 struct mtd_info *mtd = nand_to_mtd(nand);
1222 struct nand_ecc_ctrl *ecc = &nand->ecc;
1223 int ret, i, cur_off = 0;
1225 sunxi_nfc_select_chip(nand, nand->cur_cs);
1227 nand_prog_page_begin_op(nand, page, 0, NULL, 0);
1229 sunxi_nfc_hw_ecc_enable(nand);
1231 for (i = 0; i < ecc->steps; i++) {
1232 int data_off = i * ecc->size;
1233 int oob_off = i * (ecc->bytes + 4);
1234 const u8 *data = buf + data_off;
1235 const u8 *oob = nand->oob_poi + oob_off;
1237 ret = sunxi_nfc_hw_ecc_write_chunk(nand, data, data_off, oob,
1238 oob_off + mtd->writesize,
1239 &cur_off, !i, page);
1240 if (ret)
1241 return ret;
1244 if (oob_required || (nand->options & NAND_NEED_SCRAMBLING))
1245 sunxi_nfc_hw_ecc_write_extra_oob(nand, nand->oob_poi,
1246 &cur_off, page);
1248 sunxi_nfc_hw_ecc_disable(nand);
1250 return nand_prog_page_end_op(nand);
1253 static int sunxi_nfc_hw_ecc_write_subpage(struct nand_chip *nand,
1254 u32 data_offs, u32 data_len,
1255 const u8 *buf, int oob_required,
1256 int page)
1258 struct mtd_info *mtd = nand_to_mtd(nand);
1259 struct nand_ecc_ctrl *ecc = &nand->ecc;
1260 int ret, i, cur_off = 0;
1262 sunxi_nfc_select_chip(nand, nand->cur_cs);
1264 nand_prog_page_begin_op(nand, page, 0, NULL, 0);
1266 sunxi_nfc_hw_ecc_enable(nand);
1268 for (i = data_offs / ecc->size;
1269 i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
1270 int data_off = i * ecc->size;
1271 int oob_off = i * (ecc->bytes + 4);
1272 const u8 *data = buf + data_off;
1273 const u8 *oob = nand->oob_poi + oob_off;
1275 ret = sunxi_nfc_hw_ecc_write_chunk(nand, data, data_off, oob,
1276 oob_off + mtd->writesize,
1277 &cur_off, !i, page);
1278 if (ret)
1279 return ret;
1282 sunxi_nfc_hw_ecc_disable(nand);
1284 return nand_prog_page_end_op(nand);
1287 static int sunxi_nfc_hw_ecc_write_page_dma(struct nand_chip *nand,
1288 const u8 *buf,
1289 int oob_required,
1290 int page)
1292 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1293 struct nand_ecc_ctrl *ecc = &nand->ecc;
1294 struct scatterlist sg;
1295 u32 wait;
1296 int ret, i;
1298 sunxi_nfc_select_chip(nand, nand->cur_cs);
1300 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1301 if (ret)
1302 return ret;
1304 ret = sunxi_nfc_dma_op_prepare(nfc, buf, ecc->size, ecc->steps,
1305 DMA_TO_DEVICE, &sg);
1306 if (ret)
1307 goto pio_fallback;
1309 for (i = 0; i < ecc->steps; i++) {
1310 const u8 *oob = nand->oob_poi + (i * (ecc->bytes + 4));
1312 sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, i, !i, page);
1315 nand_prog_page_begin_op(nand, page, 0, NULL, 0);
1317 sunxi_nfc_hw_ecc_enable(nand);
1318 sunxi_nfc_randomizer_config(nand, page, false);
1319 sunxi_nfc_randomizer_enable(nand);
1321 writel((NAND_CMD_RNDIN << 8) | NAND_CMD_PAGEPROG,
1322 nfc->regs + NFC_REG_WCMD_SET);
1324 wait = NFC_CMD_INT_FLAG;
1326 if (nfc->caps->has_mdma)
1327 wait |= NFC_DMA_INT_FLAG;
1328 else
1329 dma_async_issue_pending(nfc->dmac);
1331 writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD |
1332 NFC_DATA_TRANS | NFC_ACCESS_DIR,
1333 nfc->regs + NFC_REG_CMD);
1335 ret = sunxi_nfc_wait_events(nfc, wait, false, 0);
1336 if (ret && !nfc->caps->has_mdma)
1337 dmaengine_terminate_all(nfc->dmac);
1339 sunxi_nfc_randomizer_disable(nand);
1340 sunxi_nfc_hw_ecc_disable(nand);
1342 sunxi_nfc_dma_op_cleanup(nfc, DMA_TO_DEVICE, &sg);
1344 if (ret)
1345 return ret;
1347 if (oob_required || (nand->options & NAND_NEED_SCRAMBLING))
1348 /* TODO: use DMA to transfer extra OOB bytes ? */
1349 sunxi_nfc_hw_ecc_write_extra_oob(nand, nand->oob_poi,
1350 NULL, page);
1352 return nand_prog_page_end_op(nand);
1354 pio_fallback:
1355 return sunxi_nfc_hw_ecc_write_page(nand, buf, oob_required, page);
1358 static int sunxi_nfc_hw_ecc_read_oob(struct nand_chip *nand, int page)
1360 u8 *buf = nand_get_data_buf(nand);
1362 return nand->ecc.read_page(nand, buf, 1, page);
1365 static int sunxi_nfc_hw_ecc_write_oob(struct nand_chip *nand, int page)
1367 struct mtd_info *mtd = nand_to_mtd(nand);
1368 u8 *buf = nand_get_data_buf(nand);
1369 int ret;
1371 memset(buf, 0xff, mtd->writesize);
1372 ret = nand->ecc.write_page(nand, buf, 1, page);
1373 if (ret)
1374 return ret;
1376 /* Send command to program the OOB data */
1377 return nand_prog_page_end_op(nand);
1380 static const s32 tWB_lut[] = {6, 12, 16, 20};
1381 static const s32 tRHW_lut[] = {4, 8, 12, 20};
1383 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
1384 u32 clk_period)
1386 u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
1387 int i;
1389 for (i = 0; i < lut_size; i++) {
1390 if (clk_cycles <= lut[i])
1391 return i;
1394 /* Doesn't fit */
1395 return -EINVAL;
1398 #define sunxi_nand_lookup_timing(l, p, c) \
1399 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1401 static int sunxi_nfc_setup_interface(struct nand_chip *nand, int csline,
1402 const struct nand_interface_config *conf)
1404 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
1405 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
1406 const struct nand_sdr_timings *timings;
1407 u32 min_clk_period = 0;
1408 s32 tWB, tADL, tWHR, tRHW, tCAD;
1409 long real_clk_rate;
1411 timings = nand_get_sdr_timings(conf);
1412 if (IS_ERR(timings))
1413 return -ENOTSUPP;
1415 /* T1 <=> tCLS */
1416 if (timings->tCLS_min > min_clk_period)
1417 min_clk_period = timings->tCLS_min;
1419 /* T2 <=> tCLH */
1420 if (timings->tCLH_min > min_clk_period)
1421 min_clk_period = timings->tCLH_min;
1423 /* T3 <=> tCS */
1424 if (timings->tCS_min > min_clk_period)
1425 min_clk_period = timings->tCS_min;
1427 /* T4 <=> tCH */
1428 if (timings->tCH_min > min_clk_period)
1429 min_clk_period = timings->tCH_min;
1431 /* T5 <=> tWP */
1432 if (timings->tWP_min > min_clk_period)
1433 min_clk_period = timings->tWP_min;
1435 /* T6 <=> tWH */
1436 if (timings->tWH_min > min_clk_period)
1437 min_clk_period = timings->tWH_min;
1439 /* T7 <=> tALS */
1440 if (timings->tALS_min > min_clk_period)
1441 min_clk_period = timings->tALS_min;
1443 /* T8 <=> tDS */
1444 if (timings->tDS_min > min_clk_period)
1445 min_clk_period = timings->tDS_min;
1447 /* T9 <=> tDH */
1448 if (timings->tDH_min > min_clk_period)
1449 min_clk_period = timings->tDH_min;
1451 /* T10 <=> tRR */
1452 if (timings->tRR_min > (min_clk_period * 3))
1453 min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
1455 /* T11 <=> tALH */
1456 if (timings->tALH_min > min_clk_period)
1457 min_clk_period = timings->tALH_min;
1459 /* T12 <=> tRP */
1460 if (timings->tRP_min > min_clk_period)
1461 min_clk_period = timings->tRP_min;
1463 /* T13 <=> tREH */
1464 if (timings->tREH_min > min_clk_period)
1465 min_clk_period = timings->tREH_min;
1467 /* T14 <=> tRC */
1468 if (timings->tRC_min > (min_clk_period * 2))
1469 min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
1471 /* T15 <=> tWC */
1472 if (timings->tWC_min > (min_clk_period * 2))
1473 min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
1475 /* T16 - T19 + tCAD */
1476 if (timings->tWB_max > (min_clk_period * 20))
1477 min_clk_period = DIV_ROUND_UP(timings->tWB_max, 20);
1479 if (timings->tADL_min > (min_clk_period * 32))
1480 min_clk_period = DIV_ROUND_UP(timings->tADL_min, 32);
1482 if (timings->tWHR_min > (min_clk_period * 32))
1483 min_clk_period = DIV_ROUND_UP(timings->tWHR_min, 32);
1485 if (timings->tRHW_min > (min_clk_period * 20))
1486 min_clk_period = DIV_ROUND_UP(timings->tRHW_min, 20);
1489 * In non-EDO, tREA should be less than tRP to guarantee that the
1490 * controller does not sample the IO lines too early. Unfortunately,
1491 * the sunxi NAND controller does not allow us to have different
1492 * values for tRP and tREH (tRP = tREH = tRW / 2).
1494 * We have 2 options to overcome this limitation:
1496 * 1/ Extend tRC to fulfil the tREA <= tRC / 2 constraint
1497 * 2/ Use EDO mode (only works if timings->tRLOH > 0)
1499 if (timings->tREA_max > min_clk_period && !timings->tRLOH_min)
1500 min_clk_period = timings->tREA_max;
1502 tWB = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
1503 min_clk_period);
1504 if (tWB < 0) {
1505 dev_err(nfc->dev, "unsupported tWB\n");
1506 return tWB;
1509 tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
1510 if (tADL > 3) {
1511 dev_err(nfc->dev, "unsupported tADL\n");
1512 return -EINVAL;
1515 tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
1516 if (tWHR > 3) {
1517 dev_err(nfc->dev, "unsupported tWHR\n");
1518 return -EINVAL;
1521 tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
1522 min_clk_period);
1523 if (tRHW < 0) {
1524 dev_err(nfc->dev, "unsupported tRHW\n");
1525 return tRHW;
1528 if (csline == NAND_DATA_IFACE_CHECK_ONLY)
1529 return 0;
1532 * TODO: according to ONFI specs this value only applies for DDR NAND,
1533 * but Allwinner seems to set this to 0x7. Mimic them for now.
1535 tCAD = 0x7;
1537 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1538 sunxi_nand->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
1540 /* Convert min_clk_period from picoseconds to nanoseconds */
1541 min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
1544 * Unlike what is stated in Allwinner datasheet, the clk_rate should
1545 * be set to (1 / min_clk_period), and not (2 / min_clk_period).
1546 * This new formula was verified with a scope and validated by
1547 * Allwinner engineers.
1549 sunxi_nand->clk_rate = NSEC_PER_SEC / min_clk_period;
1550 real_clk_rate = clk_round_rate(nfc->mod_clk, sunxi_nand->clk_rate);
1551 if (real_clk_rate <= 0) {
1552 dev_err(nfc->dev, "Unable to round clk %lu\n",
1553 sunxi_nand->clk_rate);
1554 return -EINVAL;
1557 sunxi_nand->timing_ctl = 0;
1560 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1561 * output cycle timings shall be used if the host drives tRC less than
1562 * 30 ns. We should also use EDO mode if tREA is bigger than tRP.
1564 min_clk_period = NSEC_PER_SEC / real_clk_rate;
1565 if (min_clk_period * 2 < 30 || min_clk_period * 1000 < timings->tREA_max)
1566 sunxi_nand->timing_ctl = NFC_TIMING_CTL_EDO;
1568 return 0;
1571 static int sunxi_nand_ooblayout_ecc(struct mtd_info *mtd, int section,
1572 struct mtd_oob_region *oobregion)
1574 struct nand_chip *nand = mtd_to_nand(mtd);
1575 struct nand_ecc_ctrl *ecc = &nand->ecc;
1577 if (section >= ecc->steps)
1578 return -ERANGE;
1580 oobregion->offset = section * (ecc->bytes + 4) + 4;
1581 oobregion->length = ecc->bytes;
1583 return 0;
1586 static int sunxi_nand_ooblayout_free(struct mtd_info *mtd, int section,
1587 struct mtd_oob_region *oobregion)
1589 struct nand_chip *nand = mtd_to_nand(mtd);
1590 struct nand_ecc_ctrl *ecc = &nand->ecc;
1592 if (section > ecc->steps)
1593 return -ERANGE;
1596 * The first 2 bytes are used for BB markers, hence we
1597 * only have 2 bytes available in the first user data
1598 * section.
1600 if (!section && ecc->engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST) {
1601 oobregion->offset = 2;
1602 oobregion->length = 2;
1604 return 0;
1607 oobregion->offset = section * (ecc->bytes + 4);
1609 if (section < ecc->steps)
1610 oobregion->length = 4;
1611 else
1612 oobregion->offset = mtd->oobsize - oobregion->offset;
1614 return 0;
1617 static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops = {
1618 .ecc = sunxi_nand_ooblayout_ecc,
1619 .free = sunxi_nand_ooblayout_free,
1622 static void sunxi_nand_hw_ecc_ctrl_cleanup(struct sunxi_nand_chip *sunxi_nand)
1624 kfree(sunxi_nand->ecc);
1627 static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
1628 struct nand_ecc_ctrl *ecc,
1629 struct device_node *np)
1631 static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1632 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
1633 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1634 struct mtd_info *mtd = nand_to_mtd(nand);
1635 struct nand_device *nanddev = mtd_to_nanddev(mtd);
1636 int nsectors;
1637 int ret;
1638 int i;
1640 if (nanddev->ecc.user_conf.flags & NAND_ECC_MAXIMIZE_STRENGTH) {
1641 int bytes;
1643 ecc->size = 1024;
1644 nsectors = mtd->writesize / ecc->size;
1646 /* Reserve 2 bytes for the BBM */
1647 bytes = (mtd->oobsize - 2) / nsectors;
1649 /* 4 non-ECC bytes are added before each ECC bytes section */
1650 bytes -= 4;
1652 /* and bytes has to be even. */
1653 if (bytes % 2)
1654 bytes--;
1656 ecc->strength = bytes * 8 / fls(8 * ecc->size);
1658 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1659 if (strengths[i] > ecc->strength)
1660 break;
1663 if (!i)
1664 ecc->strength = 0;
1665 else
1666 ecc->strength = strengths[i - 1];
1669 if (ecc->size != 512 && ecc->size != 1024)
1670 return -EINVAL;
1672 sunxi_nand->ecc = kzalloc(sizeof(*sunxi_nand->ecc), GFP_KERNEL);
1673 if (!sunxi_nand->ecc)
1674 return -ENOMEM;
1676 /* Prefer 1k ECC chunk over 512 ones */
1677 if (ecc->size == 512 && mtd->writesize > 512) {
1678 ecc->size = 1024;
1679 ecc->strength *= 2;
1682 /* Add ECC info retrieval from DT */
1683 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1684 if (ecc->strength <= strengths[i]) {
1686 * Update ecc->strength value with the actual strength
1687 * that will be used by the ECC engine.
1689 ecc->strength = strengths[i];
1690 break;
1694 if (i >= ARRAY_SIZE(strengths)) {
1695 dev_err(nfc->dev, "unsupported strength\n");
1696 ret = -ENOTSUPP;
1697 goto err;
1700 sunxi_nand->ecc->mode = i;
1702 /* HW ECC always request ECC bytes for 1024 bytes blocks */
1703 ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
1705 /* HW ECC always work with even numbers of ECC bytes */
1706 ecc->bytes = ALIGN(ecc->bytes, 2);
1708 nsectors = mtd->writesize / ecc->size;
1710 if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
1711 ret = -EINVAL;
1712 goto err;
1715 ecc->read_oob = sunxi_nfc_hw_ecc_read_oob;
1716 ecc->write_oob = sunxi_nfc_hw_ecc_write_oob;
1717 mtd_set_ooblayout(mtd, &sunxi_nand_ooblayout_ops);
1719 if (nfc->dmac || nfc->caps->has_mdma) {
1720 ecc->read_page = sunxi_nfc_hw_ecc_read_page_dma;
1721 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage_dma;
1722 ecc->write_page = sunxi_nfc_hw_ecc_write_page_dma;
1723 nand->options |= NAND_USES_DMA;
1724 } else {
1725 ecc->read_page = sunxi_nfc_hw_ecc_read_page;
1726 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
1727 ecc->write_page = sunxi_nfc_hw_ecc_write_page;
1730 /* TODO: support DMA for raw accesses and subpage write */
1731 ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
1732 ecc->read_oob_raw = nand_read_oob_std;
1733 ecc->write_oob_raw = nand_write_oob_std;
1735 return 0;
1737 err:
1738 kfree(sunxi_nand->ecc);
1740 return ret;
1743 static void sunxi_nand_ecc_cleanup(struct sunxi_nand_chip *sunxi_nand)
1745 struct nand_ecc_ctrl *ecc = &sunxi_nand->nand.ecc;
1747 switch (ecc->engine_type) {
1748 case NAND_ECC_ENGINE_TYPE_ON_HOST:
1749 sunxi_nand_hw_ecc_ctrl_cleanup(sunxi_nand);
1750 break;
1751 case NAND_ECC_ENGINE_TYPE_NONE:
1752 default:
1753 break;
1757 static int sunxi_nand_attach_chip(struct nand_chip *nand)
1759 const struct nand_ecc_props *requirements =
1760 nanddev_get_ecc_requirements(&nand->base);
1761 struct nand_ecc_ctrl *ecc = &nand->ecc;
1762 struct device_node *np = nand_get_flash_node(nand);
1763 int ret;
1765 if (nand->bbt_options & NAND_BBT_USE_FLASH)
1766 nand->bbt_options |= NAND_BBT_NO_OOB;
1768 if (nand->options & NAND_NEED_SCRAMBLING)
1769 nand->options |= NAND_NO_SUBPAGE_WRITE;
1771 nand->options |= NAND_SUBPAGE_READ;
1773 if (!ecc->size) {
1774 ecc->size = requirements->step_size;
1775 ecc->strength = requirements->strength;
1778 if (!ecc->size || !ecc->strength)
1779 return -EINVAL;
1781 switch (ecc->engine_type) {
1782 case NAND_ECC_ENGINE_TYPE_ON_HOST:
1783 ret = sunxi_nand_hw_ecc_ctrl_init(nand, ecc, np);
1784 if (ret)
1785 return ret;
1786 break;
1787 case NAND_ECC_ENGINE_TYPE_NONE:
1788 case NAND_ECC_ENGINE_TYPE_SOFT:
1789 break;
1790 default:
1791 return -EINVAL;
1794 return 0;
1797 static int sunxi_nfc_exec_subop(struct nand_chip *nand,
1798 const struct nand_subop *subop)
1800 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
1801 u32 cmd = 0, extcmd = 0, cnt = 0, addrs[2] = { };
1802 unsigned int i, j, remaining, start;
1803 void *inbuf = NULL;
1804 int ret;
1806 for (i = 0; i < subop->ninstrs; i++) {
1807 const struct nand_op_instr *instr = &subop->instrs[i];
1809 switch (instr->type) {
1810 case NAND_OP_CMD_INSTR:
1811 if (cmd & NFC_SEND_CMD1) {
1812 if (WARN_ON(cmd & NFC_SEND_CMD2))
1813 return -EINVAL;
1815 cmd |= NFC_SEND_CMD2;
1816 extcmd |= instr->ctx.cmd.opcode;
1817 } else {
1818 cmd |= NFC_SEND_CMD1 |
1819 NFC_CMD(instr->ctx.cmd.opcode);
1821 break;
1823 case NAND_OP_ADDR_INSTR:
1824 remaining = nand_subop_get_num_addr_cyc(subop, i);
1825 start = nand_subop_get_addr_start_off(subop, i);
1826 for (j = 0; j < 8 && j + start < remaining; j++) {
1827 u32 addr = instr->ctx.addr.addrs[j + start];
1829 addrs[j / 4] |= addr << (j % 4) * 8;
1832 if (j)
1833 cmd |= NFC_SEND_ADR | NFC_ADR_NUM(j);
1835 break;
1837 case NAND_OP_DATA_IN_INSTR:
1838 case NAND_OP_DATA_OUT_INSTR:
1839 start = nand_subop_get_data_start_off(subop, i);
1840 remaining = nand_subop_get_data_len(subop, i);
1841 cnt = min_t(u32, remaining, NFC_SRAM_SIZE);
1842 cmd |= NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
1844 if (instr->type == NAND_OP_DATA_OUT_INSTR) {
1845 cmd |= NFC_ACCESS_DIR;
1846 memcpy_toio(nfc->regs + NFC_RAM0_BASE,
1847 instr->ctx.data.buf.out + start,
1848 cnt);
1849 } else {
1850 inbuf = instr->ctx.data.buf.in + start;
1853 break;
1855 case NAND_OP_WAITRDY_INSTR:
1856 cmd |= NFC_WAIT_FLAG;
1857 break;
1861 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
1862 if (ret)
1863 return ret;
1865 if (cmd & NFC_SEND_ADR) {
1866 writel(addrs[0], nfc->regs + NFC_REG_ADDR_LOW);
1867 writel(addrs[1], nfc->regs + NFC_REG_ADDR_HIGH);
1870 if (cmd & NFC_SEND_CMD2)
1871 writel(extcmd,
1872 nfc->regs +
1873 (cmd & NFC_ACCESS_DIR ?
1874 NFC_REG_WCMD_SET : NFC_REG_RCMD_SET));
1876 if (cmd & NFC_DATA_TRANS)
1877 writel(cnt, nfc->regs + NFC_REG_CNT);
1879 writel(cmd, nfc->regs + NFC_REG_CMD);
1881 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG,
1882 !(cmd & NFC_WAIT_FLAG) && cnt < 64,
1884 if (ret)
1885 return ret;
1887 if (inbuf)
1888 memcpy_fromio(inbuf, nfc->regs + NFC_RAM0_BASE, cnt);
1890 return 0;
1893 static int sunxi_nfc_soft_waitrdy(struct nand_chip *nand,
1894 const struct nand_subop *subop)
1896 return nand_soft_waitrdy(nand,
1897 subop->instrs[0].ctx.waitrdy.timeout_ms);
1900 static const struct nand_op_parser sunxi_nfc_op_parser = NAND_OP_PARSER(
1901 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop,
1902 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1903 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1904 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1905 NAND_OP_PARSER_PAT_WAITRDY_ELEM(true),
1906 NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)),
1907 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop,
1908 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1909 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1910 NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024),
1911 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1912 NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)),
1915 static const struct nand_op_parser sunxi_nfc_norb_op_parser = NAND_OP_PARSER(
1916 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop,
1917 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1918 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1919 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1920 NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)),
1921 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop,
1922 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1923 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1924 NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024),
1925 NAND_OP_PARSER_PAT_CMD_ELEM(true)),
1926 NAND_OP_PARSER_PATTERN(sunxi_nfc_soft_waitrdy,
1927 NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)),
1930 static int sunxi_nfc_exec_op(struct nand_chip *nand,
1931 const struct nand_operation *op, bool check_only)
1933 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
1934 const struct nand_op_parser *parser;
1936 if (!check_only)
1937 sunxi_nfc_select_chip(nand, op->cs);
1939 if (sunxi_nand->sels[op->cs].rb >= 0)
1940 parser = &sunxi_nfc_op_parser;
1941 else
1942 parser = &sunxi_nfc_norb_op_parser;
1944 return nand_op_parser_exec_op(nand, parser, op, check_only);
1947 static const struct nand_controller_ops sunxi_nand_controller_ops = {
1948 .attach_chip = sunxi_nand_attach_chip,
1949 .setup_interface = sunxi_nfc_setup_interface,
1950 .exec_op = sunxi_nfc_exec_op,
1953 static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc,
1954 struct device_node *np)
1956 struct sunxi_nand_chip *sunxi_nand;
1957 struct mtd_info *mtd;
1958 struct nand_chip *nand;
1959 int nsels;
1960 int ret;
1961 int i;
1962 u32 tmp;
1964 if (!of_get_property(np, "reg", &nsels))
1965 return -EINVAL;
1967 nsels /= sizeof(u32);
1968 if (!nsels) {
1969 dev_err(dev, "invalid reg property size\n");
1970 return -EINVAL;
1973 sunxi_nand = devm_kzalloc(dev, struct_size(sunxi_nand, sels, nsels),
1974 GFP_KERNEL);
1975 if (!sunxi_nand) {
1976 dev_err(dev, "could not allocate chip\n");
1977 return -ENOMEM;
1980 sunxi_nand->nsels = nsels;
1982 for (i = 0; i < nsels; i++) {
1983 ret = of_property_read_u32_index(np, "reg", i, &tmp);
1984 if (ret) {
1985 dev_err(dev, "could not retrieve reg property: %d\n",
1986 ret);
1987 return ret;
1990 if (tmp > NFC_MAX_CS) {
1991 dev_err(dev,
1992 "invalid reg value: %u (max CS = 7)\n",
1993 tmp);
1994 return -EINVAL;
1997 if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
1998 dev_err(dev, "CS %d already assigned\n", tmp);
1999 return -EINVAL;
2002 sunxi_nand->sels[i].cs = tmp;
2004 if (!of_property_read_u32_index(np, "allwinner,rb", i, &tmp) &&
2005 tmp < 2)
2006 sunxi_nand->sels[i].rb = tmp;
2007 else
2008 sunxi_nand->sels[i].rb = -1;
2011 nand = &sunxi_nand->nand;
2012 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
2013 nand->controller = &nfc->controller;
2014 nand->controller->ops = &sunxi_nand_controller_ops;
2017 * Set the ECC mode to the default value in case nothing is specified
2018 * in the DT.
2020 nand->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
2021 nand_set_flash_node(nand, np);
2023 mtd = nand_to_mtd(nand);
2024 mtd->dev.parent = dev;
2026 ret = nand_scan(nand, nsels);
2027 if (ret)
2028 return ret;
2030 ret = mtd_device_register(mtd, NULL, 0);
2031 if (ret) {
2032 dev_err(dev, "failed to register mtd device: %d\n", ret);
2033 nand_cleanup(nand);
2034 return ret;
2037 list_add_tail(&sunxi_nand->node, &nfc->chips);
2039 return 0;
2042 static int sunxi_nand_chips_init(struct device *dev, struct sunxi_nfc *nfc)
2044 struct device_node *np = dev->of_node;
2045 struct device_node *nand_np;
2046 int nchips = of_get_child_count(np);
2047 int ret;
2049 if (nchips > 8) {
2050 dev_err(dev, "too many NAND chips: %d (max = 8)\n", nchips);
2051 return -EINVAL;
2054 for_each_child_of_node(np, nand_np) {
2055 ret = sunxi_nand_chip_init(dev, nfc, nand_np);
2056 if (ret) {
2057 of_node_put(nand_np);
2058 return ret;
2062 return 0;
2065 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
2067 struct sunxi_nand_chip *sunxi_nand;
2068 struct nand_chip *chip;
2069 int ret;
2071 while (!list_empty(&nfc->chips)) {
2072 sunxi_nand = list_first_entry(&nfc->chips,
2073 struct sunxi_nand_chip,
2074 node);
2075 chip = &sunxi_nand->nand;
2076 ret = mtd_device_unregister(nand_to_mtd(chip));
2077 WARN_ON(ret);
2078 nand_cleanup(chip);
2079 sunxi_nand_ecc_cleanup(sunxi_nand);
2080 list_del(&sunxi_nand->node);
2084 static int sunxi_nfc_dma_init(struct sunxi_nfc *nfc, struct resource *r)
2086 int ret;
2088 if (nfc->caps->has_mdma)
2089 return 0;
2091 nfc->dmac = dma_request_chan(nfc->dev, "rxtx");
2092 if (IS_ERR(nfc->dmac)) {
2093 ret = PTR_ERR(nfc->dmac);
2094 if (ret == -EPROBE_DEFER)
2095 return ret;
2097 /* Ignore errors to fall back to PIO mode */
2098 dev_warn(nfc->dev, "failed to request rxtx DMA channel: %d\n", ret);
2099 nfc->dmac = NULL;
2100 } else {
2101 struct dma_slave_config dmac_cfg = { };
2103 dmac_cfg.src_addr = r->start + nfc->caps->reg_io_data;
2104 dmac_cfg.dst_addr = dmac_cfg.src_addr;
2105 dmac_cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
2106 dmac_cfg.dst_addr_width = dmac_cfg.src_addr_width;
2107 dmac_cfg.src_maxburst = nfc->caps->dma_maxburst;
2108 dmac_cfg.dst_maxburst = nfc->caps->dma_maxburst;
2109 dmaengine_slave_config(nfc->dmac, &dmac_cfg);
2111 return 0;
2114 static int sunxi_nfc_probe(struct platform_device *pdev)
2116 struct device *dev = &pdev->dev;
2117 struct resource *r;
2118 struct sunxi_nfc *nfc;
2119 int irq;
2120 int ret;
2122 nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL);
2123 if (!nfc)
2124 return -ENOMEM;
2126 nfc->dev = dev;
2127 nand_controller_init(&nfc->controller);
2128 INIT_LIST_HEAD(&nfc->chips);
2130 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2131 nfc->regs = devm_ioremap_resource(dev, r);
2132 if (IS_ERR(nfc->regs))
2133 return PTR_ERR(nfc->regs);
2135 irq = platform_get_irq(pdev, 0);
2136 if (irq < 0)
2137 return irq;
2139 nfc->ahb_clk = devm_clk_get(dev, "ahb");
2140 if (IS_ERR(nfc->ahb_clk)) {
2141 dev_err(dev, "failed to retrieve ahb clk\n");
2142 return PTR_ERR(nfc->ahb_clk);
2145 ret = clk_prepare_enable(nfc->ahb_clk);
2146 if (ret)
2147 return ret;
2149 nfc->mod_clk = devm_clk_get(dev, "mod");
2150 if (IS_ERR(nfc->mod_clk)) {
2151 dev_err(dev, "failed to retrieve mod clk\n");
2152 ret = PTR_ERR(nfc->mod_clk);
2153 goto out_ahb_clk_unprepare;
2156 ret = clk_prepare_enable(nfc->mod_clk);
2157 if (ret)
2158 goto out_ahb_clk_unprepare;
2160 nfc->reset = devm_reset_control_get_optional_exclusive(dev, "ahb");
2161 if (IS_ERR(nfc->reset)) {
2162 ret = PTR_ERR(nfc->reset);
2163 goto out_mod_clk_unprepare;
2166 ret = reset_control_deassert(nfc->reset);
2167 if (ret) {
2168 dev_err(dev, "reset err %d\n", ret);
2169 goto out_mod_clk_unprepare;
2172 nfc->caps = of_device_get_match_data(&pdev->dev);
2173 if (!nfc->caps) {
2174 ret = -EINVAL;
2175 goto out_ahb_reset_reassert;
2178 ret = sunxi_nfc_rst(nfc);
2179 if (ret)
2180 goto out_ahb_reset_reassert;
2182 writel(0, nfc->regs + NFC_REG_INT);
2183 ret = devm_request_irq(dev, irq, sunxi_nfc_interrupt,
2184 0, "sunxi-nand", nfc);
2185 if (ret)
2186 goto out_ahb_reset_reassert;
2188 ret = sunxi_nfc_dma_init(nfc, r);
2190 if (ret)
2191 goto out_ahb_reset_reassert;
2193 platform_set_drvdata(pdev, nfc);
2195 ret = sunxi_nand_chips_init(dev, nfc);
2196 if (ret) {
2197 dev_err(dev, "failed to init nand chips\n");
2198 goto out_release_dmac;
2201 return 0;
2203 out_release_dmac:
2204 if (nfc->dmac)
2205 dma_release_channel(nfc->dmac);
2206 out_ahb_reset_reassert:
2207 reset_control_assert(nfc->reset);
2208 out_mod_clk_unprepare:
2209 clk_disable_unprepare(nfc->mod_clk);
2210 out_ahb_clk_unprepare:
2211 clk_disable_unprepare(nfc->ahb_clk);
2213 return ret;
2216 static int sunxi_nfc_remove(struct platform_device *pdev)
2218 struct sunxi_nfc *nfc = platform_get_drvdata(pdev);
2220 sunxi_nand_chips_cleanup(nfc);
2222 reset_control_assert(nfc->reset);
2224 if (nfc->dmac)
2225 dma_release_channel(nfc->dmac);
2226 clk_disable_unprepare(nfc->mod_clk);
2227 clk_disable_unprepare(nfc->ahb_clk);
2229 return 0;
2232 static const struct sunxi_nfc_caps sunxi_nfc_a10_caps = {
2233 .reg_io_data = NFC_REG_A10_IO_DATA,
2234 .dma_maxburst = 4,
2237 static const struct sunxi_nfc_caps sunxi_nfc_a23_caps = {
2238 .has_mdma = true,
2239 .reg_io_data = NFC_REG_A23_IO_DATA,
2240 .dma_maxburst = 8,
2243 static const struct of_device_id sunxi_nfc_ids[] = {
2245 .compatible = "allwinner,sun4i-a10-nand",
2246 .data = &sunxi_nfc_a10_caps,
2249 .compatible = "allwinner,sun8i-a23-nand-controller",
2250 .data = &sunxi_nfc_a23_caps,
2252 { /* sentinel */ }
2254 MODULE_DEVICE_TABLE(of, sunxi_nfc_ids);
2256 static struct platform_driver sunxi_nfc_driver = {
2257 .driver = {
2258 .name = "sunxi_nand",
2259 .of_match_table = sunxi_nfc_ids,
2261 .probe = sunxi_nfc_probe,
2262 .remove = sunxi_nfc_remove,
2264 module_platform_driver(sunxi_nfc_driver);
2266 MODULE_LICENSE("GPL");
2267 MODULE_AUTHOR("Boris BREZILLON");
2268 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");
2269 MODULE_ALIAS("platform:sunxi_nand");