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