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