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