]> git.sur5r.net Git - u-boot/blob - drivers/mtd/nand/sunxi_nand.c
SPDX: Convert all of our single license tags to Linux Kernel style
[u-boot] / drivers / mtd / nand / sunxi_nand.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com>
4  * Copyright (C) 2015 Roy Spliet <r.spliet@ultimaker.com>
5  *
6  * Derived from:
7  *      https://github.com/yuq/sunxi-nfc-mtd
8  *      Copyright (C) 2013 Qiang Yu <yuq825@gmail.com>
9  *
10  *      https://github.com/hno/Allwinner-Info
11  *      Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
12  *
13  *      Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com>
14  *      Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org>
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation; either version 2 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  */
26
27 #include <common.h>
28 #include <fdtdec.h>
29 #include <memalign.h>
30 #include <nand.h>
31
32 #include <linux/kernel.h>
33 #include <linux/mtd/mtd.h>
34 #include <linux/mtd/rawnand.h>
35 #include <linux/mtd/partitions.h>
36 #include <linux/io.h>
37
38 #include <asm/gpio.h>
39 #include <asm/arch/clock.h>
40
41 DECLARE_GLOBAL_DATA_PTR;
42
43 #define NFC_REG_CTL             0x0000
44 #define NFC_REG_ST              0x0004
45 #define NFC_REG_INT             0x0008
46 #define NFC_REG_TIMING_CTL      0x000C
47 #define NFC_REG_TIMING_CFG      0x0010
48 #define NFC_REG_ADDR_LOW        0x0014
49 #define NFC_REG_ADDR_HIGH       0x0018
50 #define NFC_REG_SECTOR_NUM      0x001C
51 #define NFC_REG_CNT             0x0020
52 #define NFC_REG_CMD             0x0024
53 #define NFC_REG_RCMD_SET        0x0028
54 #define NFC_REG_WCMD_SET        0x002C
55 #define NFC_REG_IO_DATA         0x0030
56 #define NFC_REG_ECC_CTL         0x0034
57 #define NFC_REG_ECC_ST          0x0038
58 #define NFC_REG_DEBUG           0x003C
59 #define NFC_REG_ECC_ERR_CNT(x)  ((0x0040 + (x)) & ~0x3)
60 #define NFC_REG_USER_DATA(x)    (0x0050 + ((x) * 4))
61 #define NFC_REG_SPARE_AREA      0x00A0
62 #define NFC_REG_PAT_ID          0x00A4
63 #define NFC_RAM0_BASE           0x0400
64 #define NFC_RAM1_BASE           0x0800
65
66 /* define bit use in NFC_CTL */
67 #define NFC_EN                  BIT(0)
68 #define NFC_RESET               BIT(1)
69 #define NFC_BUS_WIDTH_MSK       BIT(2)
70 #define NFC_BUS_WIDTH_8         (0 << 2)
71 #define NFC_BUS_WIDTH_16        (1 << 2)
72 #define NFC_RB_SEL_MSK          BIT(3)
73 #define NFC_RB_SEL(x)           ((x) << 3)
74 #define NFC_CE_SEL_MSK          (0x7 << 24)
75 #define NFC_CE_SEL(x)           ((x) << 24)
76 #define NFC_CE_CTL              BIT(6)
77 #define NFC_PAGE_SHIFT_MSK      (0xf << 8)
78 #define NFC_PAGE_SHIFT(x)       (((x) < 10 ? 0 : (x) - 10) << 8)
79 #define NFC_SAM                 BIT(12)
80 #define NFC_RAM_METHOD          BIT(14)
81 #define NFC_DEBUG_CTL           BIT(31)
82
83 /* define bit use in NFC_ST */
84 #define NFC_RB_B2R              BIT(0)
85 #define NFC_CMD_INT_FLAG        BIT(1)
86 #define NFC_DMA_INT_FLAG        BIT(2)
87 #define NFC_CMD_FIFO_STATUS     BIT(3)
88 #define NFC_STA                 BIT(4)
89 #define NFC_NATCH_INT_FLAG      BIT(5)
90 #define NFC_RB_STATE(x)         BIT(x + 8)
91
92 /* define bit use in NFC_INT */
93 #define NFC_B2R_INT_ENABLE      BIT(0)
94 #define NFC_CMD_INT_ENABLE      BIT(1)
95 #define NFC_DMA_INT_ENABLE      BIT(2)
96 #define NFC_INT_MASK            (NFC_B2R_INT_ENABLE | \
97                                  NFC_CMD_INT_ENABLE | \
98                                  NFC_DMA_INT_ENABLE)
99
100 /* define bit use in NFC_TIMING_CTL */
101 #define NFC_TIMING_CTL_EDO      BIT(8)
102
103 /* define NFC_TIMING_CFG register layout */
104 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD)             \
105         (((tWB) & 0x3) | (((tADL) & 0x3) << 2) |                \
106         (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) |         \
107         (((tCAD) & 0x7) << 8))
108
109 /* define bit use in NFC_CMD */
110 #define NFC_CMD_LOW_BYTE_MSK    0xff
111 #define NFC_CMD_HIGH_BYTE_MSK   (0xff << 8)
112 #define NFC_CMD(x)              (x)
113 #define NFC_ADR_NUM_MSK         (0x7 << 16)
114 #define NFC_ADR_NUM(x)          (((x) - 1) << 16)
115 #define NFC_SEND_ADR            BIT(19)
116 #define NFC_ACCESS_DIR          BIT(20)
117 #define NFC_DATA_TRANS          BIT(21)
118 #define NFC_SEND_CMD1           BIT(22)
119 #define NFC_WAIT_FLAG           BIT(23)
120 #define NFC_SEND_CMD2           BIT(24)
121 #define NFC_SEQ                 BIT(25)
122 #define NFC_DATA_SWAP_METHOD    BIT(26)
123 #define NFC_ROW_AUTO_INC        BIT(27)
124 #define NFC_SEND_CMD3           BIT(28)
125 #define NFC_SEND_CMD4           BIT(29)
126 #define NFC_CMD_TYPE_MSK        (0x3 << 30)
127 #define NFC_NORMAL_OP           (0 << 30)
128 #define NFC_ECC_OP              (1 << 30)
129 #define NFC_PAGE_OP             (2 << 30)
130
131 /* define bit use in NFC_RCMD_SET */
132 #define NFC_READ_CMD_MSK        0xff
133 #define NFC_RND_READ_CMD0_MSK   (0xff << 8)
134 #define NFC_RND_READ_CMD1_MSK   (0xff << 16)
135
136 /* define bit use in NFC_WCMD_SET */
137 #define NFC_PROGRAM_CMD_MSK     0xff
138 #define NFC_RND_WRITE_CMD_MSK   (0xff << 8)
139 #define NFC_READ_CMD0_MSK       (0xff << 16)
140 #define NFC_READ_CMD1_MSK       (0xff << 24)
141
142 /* define bit use in NFC_ECC_CTL */
143 #define NFC_ECC_EN              BIT(0)
144 #define NFC_ECC_PIPELINE        BIT(3)
145 #define NFC_ECC_EXCEPTION       BIT(4)
146 #define NFC_ECC_BLOCK_SIZE_MSK  BIT(5)
147 #define NFC_ECC_BLOCK_512       (1 << 5)
148 #define NFC_RANDOM_EN           BIT(9)
149 #define NFC_RANDOM_DIRECTION    BIT(10)
150 #define NFC_ECC_MODE_MSK        (0xf << 12)
151 #define NFC_ECC_MODE(x)         ((x) << 12)
152 #define NFC_RANDOM_SEED_MSK     (0x7fff << 16)
153 #define NFC_RANDOM_SEED(x)      ((x) << 16)
154
155 /* define bit use in NFC_ECC_ST */
156 #define NFC_ECC_ERR(x)          BIT(x)
157 #define NFC_ECC_PAT_FOUND(x)    BIT(x + 16)
158 #define NFC_ECC_ERR_CNT(b, x)   (((x) >> ((b) * 8)) & 0xff)
159
160 #define NFC_DEFAULT_TIMEOUT_MS  1000
161
162 #define NFC_SRAM_SIZE           1024
163
164 #define NFC_MAX_CS              7
165
166 /*
167  * Ready/Busy detection type: describes the Ready/Busy detection modes
168  *
169  * @RB_NONE:    no external detection available, rely on STATUS command
170  *              and software timeouts
171  * @RB_NATIVE:  use sunxi NAND controller Ready/Busy support. The Ready/Busy
172  *              pin of the NAND flash chip must be connected to one of the
173  *              native NAND R/B pins (those which can be muxed to the NAND
174  *              Controller)
175  * @RB_GPIO:    use a simple GPIO to handle Ready/Busy status. The Ready/Busy
176  *              pin of the NAND flash chip must be connected to a GPIO capable
177  *              pin.
178  */
179 enum sunxi_nand_rb_type {
180         RB_NONE,
181         RB_NATIVE,
182         RB_GPIO,
183 };
184
185 /*
186  * Ready/Busy structure: stores information related to Ready/Busy detection
187  *
188  * @type:       the Ready/Busy detection mode
189  * @info:       information related to the R/B detection mode. Either a gpio
190  *              id or a native R/B id (those supported by the NAND controller).
191  */
192 struct sunxi_nand_rb {
193         enum sunxi_nand_rb_type type;
194         union {
195                 struct gpio_desc gpio;
196                 int nativeid;
197         } info;
198 };
199
200 /*
201  * Chip Select structure: stores information related to NAND Chip Select
202  *
203  * @cs:         the NAND CS id used to communicate with a NAND Chip
204  * @rb:         the Ready/Busy description
205  */
206 struct sunxi_nand_chip_sel {
207         u8 cs;
208         struct sunxi_nand_rb rb;
209 };
210
211 /*
212  * sunxi HW ECC infos: stores information related to HW ECC support
213  *
214  * @mode:       the sunxi ECC mode field deduced from ECC requirements
215  * @layout:     the OOB layout depending on the ECC requirements and the
216  *              selected ECC mode
217  */
218 struct sunxi_nand_hw_ecc {
219         int mode;
220         struct nand_ecclayout layout;
221 };
222
223 /*
224  * NAND chip structure: stores NAND chip device related information
225  *
226  * @node:               used to store NAND chips into a list
227  * @nand:               base NAND chip structure
228  * @mtd:                base MTD structure
229  * @clk_rate:           clk_rate required for this NAND chip
230  * @timing_cfg          TIMING_CFG register value for this NAND chip
231  * @selected:           current active CS
232  * @nsels:              number of CS lines required by the NAND chip
233  * @sels:               array of CS lines descriptions
234  */
235 struct sunxi_nand_chip {
236         struct list_head node;
237         struct nand_chip nand;
238         unsigned long clk_rate;
239         u32 timing_cfg;
240         u32 timing_ctl;
241         int selected;
242         int addr_cycles;
243         u32 addr[2];
244         int cmd_cycles;
245         u8 cmd[2];
246         int nsels;
247         struct sunxi_nand_chip_sel sels[0];
248 };
249
250 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
251 {
252         return container_of(nand, struct sunxi_nand_chip, nand);
253 }
254
255 /*
256  * NAND Controller structure: stores sunxi NAND controller information
257  *
258  * @controller:         base controller structure
259  * @dev:                parent device (used to print error messages)
260  * @regs:               NAND controller registers
261  * @ahb_clk:            NAND Controller AHB clock
262  * @mod_clk:            NAND Controller mod clock
263  * @assigned_cs:        bitmask describing already assigned CS lines
264  * @clk_rate:           NAND controller current clock rate
265  * @chips:              a list containing all the NAND chips attached to
266  *                      this NAND controller
267  * @complete:           a completion object used to wait for NAND
268  *                      controller events
269  */
270 struct sunxi_nfc {
271         struct nand_hw_control controller;
272         struct device *dev;
273         void __iomem *regs;
274         struct clk *ahb_clk;
275         struct clk *mod_clk;
276         unsigned long assigned_cs;
277         unsigned long clk_rate;
278         struct list_head chips;
279 };
280
281 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_hw_control *ctrl)
282 {
283         return container_of(ctrl, struct sunxi_nfc, controller);
284 }
285
286 static void sunxi_nfc_set_clk_rate(unsigned long hz)
287 {
288         struct sunxi_ccm_reg *const ccm =
289         (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
290         int div_m, div_n;
291
292         div_m = (clock_get_pll6() + hz - 1) / hz;
293         for (div_n = 0; div_n < 3 && div_m > 16; div_n++) {
294                 if (div_m % 2)
295                         div_m++;
296                 div_m >>= 1;
297         }
298         if (div_m > 16)
299                 div_m = 16;
300
301         /* config mod clock */
302         writel(CCM_NAND_CTRL_ENABLE | CCM_NAND_CTRL_PLL6 |
303                CCM_NAND_CTRL_N(div_n) | CCM_NAND_CTRL_M(div_m),
304                &ccm->nand0_clk_cfg);
305
306         /* gate on nand clock */
307         setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_NAND0));
308 #ifdef CONFIG_MACH_SUN9I
309         setbits_le32(&ccm->ahb_gate1, (1 << AHB_GATE_OFFSET_DMA));
310 #else
311         setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_DMA));
312 #endif
313 }
314
315 static int sunxi_nfc_wait_int(struct sunxi_nfc *nfc, u32 flags,
316                               unsigned int timeout_ms)
317 {
318         unsigned int timeout_ticks;
319         u32 time_start, status;
320         int ret = -ETIMEDOUT;
321
322         if (!timeout_ms)
323                 timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
324
325         timeout_ticks = (timeout_ms * CONFIG_SYS_HZ) / 1000;
326
327         time_start = get_timer(0);
328
329         do {
330                 status = readl(nfc->regs + NFC_REG_ST);
331                 if ((status & flags) == flags) {
332                         ret = 0;
333                         break;
334                 }
335
336                 udelay(1);
337         } while (get_timer(time_start) < timeout_ticks);
338
339         writel(status & flags, nfc->regs + NFC_REG_ST);
340
341         return ret;
342 }
343
344 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
345 {
346         unsigned long timeout = (CONFIG_SYS_HZ *
347                                  NFC_DEFAULT_TIMEOUT_MS) / 1000;
348         u32 time_start;
349
350         time_start = get_timer(0);
351         do {
352                 if (!(readl(nfc->regs + NFC_REG_ST) & NFC_CMD_FIFO_STATUS))
353                         return 0;
354         } while (get_timer(time_start) < timeout);
355
356         dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
357         return -ETIMEDOUT;
358 }
359
360 static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
361 {
362         unsigned long timeout = (CONFIG_SYS_HZ *
363                                  NFC_DEFAULT_TIMEOUT_MS) / 1000;
364         u32 time_start;
365
366         writel(0, nfc->regs + NFC_REG_ECC_CTL);
367         writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
368
369         time_start = get_timer(0);
370         do {
371                 if (!(readl(nfc->regs + NFC_REG_CTL) & NFC_RESET))
372                         return 0;
373         } while (get_timer(time_start) < timeout);
374
375         dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
376         return -ETIMEDOUT;
377 }
378
379 static int sunxi_nfc_dev_ready(struct mtd_info *mtd)
380 {
381         struct nand_chip *nand = mtd_to_nand(mtd);
382         struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
383         struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
384         struct sunxi_nand_rb *rb;
385         unsigned long timeo = (sunxi_nand->nand.state == FL_ERASING ? 400 : 20);
386         int ret;
387
388         if (sunxi_nand->selected < 0)
389                 return 0;
390
391         rb = &sunxi_nand->sels[sunxi_nand->selected].rb;
392
393         switch (rb->type) {
394         case RB_NATIVE:
395                 ret = !!(readl(nfc->regs + NFC_REG_ST) &
396                          NFC_RB_STATE(rb->info.nativeid));
397                 if (ret)
398                         break;
399
400                 sunxi_nfc_wait_int(nfc, NFC_RB_B2R, timeo);
401                 ret = !!(readl(nfc->regs + NFC_REG_ST) &
402                          NFC_RB_STATE(rb->info.nativeid));
403                 break;
404         case RB_GPIO:
405                 ret = dm_gpio_get_value(&rb->info.gpio);
406                 break;
407         case RB_NONE:
408         default:
409                 ret = 0;
410                 dev_err(nfc->dev, "cannot check R/B NAND status!\n");
411                 break;
412         }
413
414         return ret;
415 }
416
417 static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
418 {
419         struct nand_chip *nand = mtd_to_nand(mtd);
420         struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
421         struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
422         struct sunxi_nand_chip_sel *sel;
423         u32 ctl;
424
425         if (chip > 0 && chip >= sunxi_nand->nsels)
426                 return;
427
428         if (chip == sunxi_nand->selected)
429                 return;
430
431         ctl = readl(nfc->regs + NFC_REG_CTL) &
432               ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
433
434         if (chip >= 0) {
435                 sel = &sunxi_nand->sels[chip];
436
437                 ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
438                        NFC_PAGE_SHIFT(nand->page_shift - 10);
439                 if (sel->rb.type == RB_NONE) {
440                         nand->dev_ready = NULL;
441                 } else {
442                         nand->dev_ready = sunxi_nfc_dev_ready;
443                         if (sel->rb.type == RB_NATIVE)
444                                 ctl |= NFC_RB_SEL(sel->rb.info.nativeid);
445                 }
446
447                 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
448
449                 if (nfc->clk_rate != sunxi_nand->clk_rate) {
450                         sunxi_nfc_set_clk_rate(sunxi_nand->clk_rate);
451                         nfc->clk_rate = sunxi_nand->clk_rate;
452                 }
453         }
454
455         writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
456         writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
457         writel(ctl, nfc->regs + NFC_REG_CTL);
458
459         sunxi_nand->selected = chip;
460 }
461
462 static void sunxi_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
463 {
464         struct nand_chip *nand = mtd_to_nand(mtd);
465         struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
466         struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
467         int ret;
468         int cnt;
469         int offs = 0;
470         u32 tmp;
471
472         while (len > offs) {
473                 cnt = min(len - offs, NFC_SRAM_SIZE);
474
475                 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
476                 if (ret)
477                         break;
478
479                 writel(cnt, nfc->regs + NFC_REG_CNT);
480                 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
481                 writel(tmp, nfc->regs + NFC_REG_CMD);
482
483                 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
484                 if (ret)
485                         break;
486
487                 if (buf)
488                         memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
489                                       cnt);
490                 offs += cnt;
491         }
492 }
493
494 static void sunxi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
495                                 int len)
496 {
497         struct nand_chip *nand = mtd_to_nand(mtd);
498         struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
499         struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
500         int ret;
501         int cnt;
502         int offs = 0;
503         u32 tmp;
504
505         while (len > offs) {
506                 cnt = min(len - offs, NFC_SRAM_SIZE);
507
508                 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
509                 if (ret)
510                         break;
511
512                 writel(cnt, nfc->regs + NFC_REG_CNT);
513                 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
514                 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
515                       NFC_ACCESS_DIR;
516                 writel(tmp, nfc->regs + NFC_REG_CMD);
517
518                 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
519                 if (ret)
520                         break;
521
522                 offs += cnt;
523         }
524 }
525
526 static uint8_t sunxi_nfc_read_byte(struct mtd_info *mtd)
527 {
528         uint8_t ret;
529
530         sunxi_nfc_read_buf(mtd, &ret, 1);
531
532         return ret;
533 }
534
535 static void sunxi_nfc_cmd_ctrl(struct mtd_info *mtd, int dat,
536                                unsigned int ctrl)
537 {
538         struct nand_chip *nand = mtd_to_nand(mtd);
539         struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
540         struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
541         int ret;
542         u32 tmp;
543
544         ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
545         if (ret)
546                 return;
547
548         if (ctrl & NAND_CTRL_CHANGE) {
549                 tmp = readl(nfc->regs + NFC_REG_CTL);
550                 if (ctrl & NAND_NCE)
551                         tmp |= NFC_CE_CTL;
552                 else
553                         tmp &= ~NFC_CE_CTL;
554                 writel(tmp, nfc->regs + NFC_REG_CTL);
555         }
556
557         if (dat == NAND_CMD_NONE && (ctrl & NAND_NCE) &&
558             !(ctrl & (NAND_CLE | NAND_ALE))) {
559                 u32 cmd = 0;
560
561                 if (!sunxi_nand->addr_cycles && !sunxi_nand->cmd_cycles)
562                         return;
563
564                 if (sunxi_nand->cmd_cycles--)
565                         cmd |= NFC_SEND_CMD1 | sunxi_nand->cmd[0];
566
567                 if (sunxi_nand->cmd_cycles--) {
568                         cmd |= NFC_SEND_CMD2;
569                         writel(sunxi_nand->cmd[1],
570                                nfc->regs + NFC_REG_RCMD_SET);
571                 }
572
573                 sunxi_nand->cmd_cycles = 0;
574
575                 if (sunxi_nand->addr_cycles) {
576                         cmd |= NFC_SEND_ADR |
577                                NFC_ADR_NUM(sunxi_nand->addr_cycles);
578                         writel(sunxi_nand->addr[0],
579                                nfc->regs + NFC_REG_ADDR_LOW);
580                 }
581
582                 if (sunxi_nand->addr_cycles > 4)
583                         writel(sunxi_nand->addr[1],
584                                nfc->regs + NFC_REG_ADDR_HIGH);
585
586                 writel(cmd, nfc->regs + NFC_REG_CMD);
587                 sunxi_nand->addr[0] = 0;
588                 sunxi_nand->addr[1] = 0;
589                 sunxi_nand->addr_cycles = 0;
590                 sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
591         }
592
593         if (ctrl & NAND_CLE) {
594                 sunxi_nand->cmd[sunxi_nand->cmd_cycles++] = dat;
595         } else if (ctrl & NAND_ALE) {
596                 sunxi_nand->addr[sunxi_nand->addr_cycles / 4] |=
597                                 dat << ((sunxi_nand->addr_cycles % 4) * 8);
598                 sunxi_nand->addr_cycles++;
599         }
600 }
601
602 /* These seed values have been extracted from Allwinner's BSP */
603 static const u16 sunxi_nfc_randomizer_page_seeds[] = {
604         0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
605         0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
606         0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
607         0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
608         0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
609         0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
610         0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
611         0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
612         0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
613         0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
614         0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
615         0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
616         0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
617         0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
618         0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
619         0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
620 };
621
622 /*
623  * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
624  * have been generated using
625  * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
626  * the randomizer engine does internally before de/scrambling OOB data.
627  *
628  * Those tables are statically defined to avoid calculating randomizer state
629  * at runtime.
630  */
631 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
632         0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
633         0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
634         0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
635         0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
636         0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
637         0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
638         0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
639         0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
640         0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
641         0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
642         0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
643         0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
644         0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
645         0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
646         0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
647         0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
648 };
649
650 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
651         0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
652         0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
653         0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
654         0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
655         0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
656         0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
657         0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
658         0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
659         0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
660         0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
661         0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
662         0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
663         0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
664         0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
665         0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
666         0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
667 };
668
669 static u16 sunxi_nfc_randomizer_step(u16 state, int count)
670 {
671         state &= 0x7fff;
672
673         /*
674          * This loop is just a simple implementation of a Fibonacci LFSR using
675          * the x16 + x15 + 1 polynomial.
676          */
677         while (count--)
678                 state = ((state >> 1) |
679                          (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
680
681         return state;
682 }
683
684 static u16 sunxi_nfc_randomizer_state(struct mtd_info *mtd, int page, bool ecc)
685 {
686         const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
687         int mod = mtd->erasesize / mtd->writesize;
688
689         if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
690                 mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
691
692         if (ecc) {
693                 if (mtd->ecc_step_size == 512)
694                         seeds = sunxi_nfc_randomizer_ecc512_seeds;
695                 else
696                         seeds = sunxi_nfc_randomizer_ecc1024_seeds;
697         }
698
699         return seeds[page % mod];
700 }
701
702 static void sunxi_nfc_randomizer_config(struct mtd_info *mtd,
703                                         int page, bool ecc)
704 {
705         struct nand_chip *nand = mtd_to_nand(mtd);
706         struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
707         u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
708         u16 state;
709
710         if (!(nand->options & NAND_NEED_SCRAMBLING))
711                 return;
712
713         ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
714         state = sunxi_nfc_randomizer_state(mtd, page, ecc);
715         ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
716         writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
717 }
718
719 static void sunxi_nfc_randomizer_enable(struct mtd_info *mtd)
720 {
721         struct nand_chip *nand = mtd_to_nand(mtd);
722         struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
723
724         if (!(nand->options & NAND_NEED_SCRAMBLING))
725                 return;
726
727         writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
728                nfc->regs + NFC_REG_ECC_CTL);
729 }
730
731 static void sunxi_nfc_randomizer_disable(struct mtd_info *mtd)
732 {
733         struct nand_chip *nand = mtd_to_nand(mtd);
734         struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
735
736         if (!(nand->options & NAND_NEED_SCRAMBLING))
737                 return;
738
739         writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
740                nfc->regs + NFC_REG_ECC_CTL);
741 }
742
743 static void sunxi_nfc_randomize_bbm(struct mtd_info *mtd, int page, u8 *bbm)
744 {
745         u16 state = sunxi_nfc_randomizer_state(mtd, page, true);
746
747         bbm[0] ^= state;
748         bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
749 }
750
751 static void sunxi_nfc_randomizer_write_buf(struct mtd_info *mtd,
752                                            const uint8_t *buf, int len,
753                                            bool ecc, int page)
754 {
755         sunxi_nfc_randomizer_config(mtd, page, ecc);
756         sunxi_nfc_randomizer_enable(mtd);
757         sunxi_nfc_write_buf(mtd, buf, len);
758         sunxi_nfc_randomizer_disable(mtd);
759 }
760
761 static void sunxi_nfc_randomizer_read_buf(struct mtd_info *mtd, uint8_t *buf,
762                                           int len, bool ecc, int page)
763 {
764         sunxi_nfc_randomizer_config(mtd, page, ecc);
765         sunxi_nfc_randomizer_enable(mtd);
766         sunxi_nfc_read_buf(mtd, buf, len);
767         sunxi_nfc_randomizer_disable(mtd);
768 }
769
770 static void sunxi_nfc_hw_ecc_enable(struct mtd_info *mtd)
771 {
772         struct nand_chip *nand = mtd_to_nand(mtd);
773         struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
774         struct sunxi_nand_hw_ecc *data = nand->ecc.priv;
775         u32 ecc_ctl;
776
777         ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
778         ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
779                      NFC_ECC_BLOCK_SIZE_MSK);
780         ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(data->mode) | NFC_ECC_EXCEPTION;
781
782         if (nand->ecc.size == 512)
783                 ecc_ctl |= NFC_ECC_BLOCK_512;
784
785         writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
786 }
787
788 static void sunxi_nfc_hw_ecc_disable(struct mtd_info *mtd)
789 {
790         struct nand_chip *nand = mtd_to_nand(mtd);
791         struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
792
793         writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
794                nfc->regs + NFC_REG_ECC_CTL);
795 }
796
797 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
798 {
799         buf[0] = user_data;
800         buf[1] = user_data >> 8;
801         buf[2] = user_data >> 16;
802         buf[3] = user_data >> 24;
803 }
804
805 static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
806                                        u8 *data, int data_off,
807                                        u8 *oob, int oob_off,
808                                        int *cur_off,
809                                        unsigned int *max_bitflips,
810                                        bool bbm, int page)
811 {
812         struct nand_chip *nand = mtd_to_nand(mtd);
813         struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
814         struct nand_ecc_ctrl *ecc = &nand->ecc;
815         int raw_mode = 0;
816         u32 status;
817         int ret;
818
819         if (*cur_off != data_off)
820                 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
821
822         sunxi_nfc_randomizer_read_buf(mtd, NULL, ecc->size, false, page);
823
824         if (data_off + ecc->size != oob_off)
825                 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
826
827         ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
828         if (ret)
829                 return ret;
830
831         sunxi_nfc_randomizer_enable(mtd);
832         writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
833                nfc->regs + NFC_REG_CMD);
834
835         ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
836         sunxi_nfc_randomizer_disable(mtd);
837         if (ret)
838                 return ret;
839
840         *cur_off = oob_off + ecc->bytes + 4;
841
842         status = readl(nfc->regs + NFC_REG_ECC_ST);
843         if (status & NFC_ECC_PAT_FOUND(0)) {
844                 u8 pattern = 0xff;
845
846                 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1)))
847                         pattern = 0x0;
848
849                 memset(data, pattern, ecc->size);
850                 memset(oob, pattern, ecc->bytes + 4);
851
852                 return 1;
853         }
854
855         ret = NFC_ECC_ERR_CNT(0, readl(nfc->regs + NFC_REG_ECC_ERR_CNT(0)));
856
857         memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
858
859         nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
860         sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4, true, page);
861
862         if (status & NFC_ECC_ERR(0)) {
863                 /*
864                  * Re-read the data with the randomizer disabled to identify
865                  * bitflips in erased pages.
866                  */
867                 if (nand->options & NAND_NEED_SCRAMBLING) {
868                         nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
869                         nand->read_buf(mtd, data, ecc->size);
870                         nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
871                         nand->read_buf(mtd, oob, ecc->bytes + 4);
872                 }
873
874                 ret = nand_check_erased_ecc_chunk(data, ecc->size,
875                                                   oob, ecc->bytes + 4,
876                                                   NULL, 0, ecc->strength);
877                 if (ret >= 0)
878                         raw_mode = 1;
879         } else {
880                 /*
881                  * The engine protects 4 bytes of OOB data per chunk.
882                  * Retrieve the corrected OOB bytes.
883                  */
884                 sunxi_nfc_user_data_to_buf(readl(nfc->regs +
885                                                  NFC_REG_USER_DATA(0)),
886                                            oob);
887
888                 /* De-randomize the Bad Block Marker. */
889                 if (bbm && nand->options & NAND_NEED_SCRAMBLING)
890                         sunxi_nfc_randomize_bbm(mtd, page, oob);
891         }
892
893         if (ret < 0) {
894                 mtd->ecc_stats.failed++;
895         } else {
896                 mtd->ecc_stats.corrected += ret;
897                 *max_bitflips = max_t(unsigned int, *max_bitflips, ret);
898         }
899
900         return raw_mode;
901 }
902
903 static void sunxi_nfc_hw_ecc_read_extra_oob(struct mtd_info *mtd,
904                                             u8 *oob, int *cur_off,
905                                             bool randomize, int page)
906 {
907         struct nand_chip *nand = mtd_to_nand(mtd);
908         struct nand_ecc_ctrl *ecc = &nand->ecc;
909         int offset = ((ecc->bytes + 4) * ecc->steps);
910         int len = mtd->oobsize - offset;
911
912         if (len <= 0)
913                 return;
914
915         if (*cur_off != offset)
916                 nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
917                               offset + mtd->writesize, -1);
918
919         if (!randomize)
920                 sunxi_nfc_read_buf(mtd, oob + offset, len);
921         else
922                 sunxi_nfc_randomizer_read_buf(mtd, oob + offset, len,
923                                               false, page);
924
925         *cur_off = mtd->oobsize + mtd->writesize;
926 }
927
928 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
929 {
930         return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
931 }
932
933 static int sunxi_nfc_hw_ecc_write_chunk(struct mtd_info *mtd,
934                                         const u8 *data, int data_off,
935                                         const u8 *oob, int oob_off,
936                                         int *cur_off, bool bbm,
937                                         int page)
938 {
939         struct nand_chip *nand = mtd_to_nand(mtd);
940         struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
941         struct nand_ecc_ctrl *ecc = &nand->ecc;
942         int ret;
943
944         if (data_off != *cur_off)
945                 nand->cmdfunc(mtd, NAND_CMD_RNDIN, data_off, -1);
946
947         sunxi_nfc_randomizer_write_buf(mtd, data, ecc->size, false, page);
948
949         /* Fill OOB data in */
950         if ((nand->options & NAND_NEED_SCRAMBLING) && bbm) {
951                 u8 user_data[4];
952
953                 memcpy(user_data, oob, 4);
954                 sunxi_nfc_randomize_bbm(mtd, page, user_data);
955                 writel(sunxi_nfc_buf_to_user_data(user_data),
956                        nfc->regs + NFC_REG_USER_DATA(0));
957         } else {
958                 writel(sunxi_nfc_buf_to_user_data(oob),
959                        nfc->regs + NFC_REG_USER_DATA(0));
960         }
961
962         if (data_off + ecc->size != oob_off)
963                 nand->cmdfunc(mtd, NAND_CMD_RNDIN, oob_off, -1);
964
965         ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
966         if (ret)
967                 return ret;
968
969         sunxi_nfc_randomizer_enable(mtd);
970         writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
971                NFC_ACCESS_DIR | NFC_ECC_OP,
972                nfc->regs + NFC_REG_CMD);
973
974         ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
975         sunxi_nfc_randomizer_disable(mtd);
976         if (ret)
977                 return ret;
978
979         *cur_off = oob_off + ecc->bytes + 4;
980
981         return 0;
982 }
983
984 static void sunxi_nfc_hw_ecc_write_extra_oob(struct mtd_info *mtd,
985                                              u8 *oob, int *cur_off,
986                                              int page)
987 {
988         struct nand_chip *nand = mtd_to_nand(mtd);
989         struct nand_ecc_ctrl *ecc = &nand->ecc;
990         int offset = ((ecc->bytes + 4) * ecc->steps);
991         int len = mtd->oobsize - offset;
992
993         if (len <= 0)
994                 return;
995
996         if (*cur_off != offset)
997                 nand->cmdfunc(mtd, NAND_CMD_RNDIN,
998                               offset + mtd->writesize, -1);
999
1000         sunxi_nfc_randomizer_write_buf(mtd, oob + offset, len, false, page);
1001
1002         *cur_off = mtd->oobsize + mtd->writesize;
1003 }
1004
1005 static int sunxi_nfc_hw_ecc_read_page(struct mtd_info *mtd,
1006                                       struct nand_chip *chip, uint8_t *buf,
1007                                       int oob_required, int page)
1008 {
1009         struct nand_ecc_ctrl *ecc = &chip->ecc;
1010         unsigned int max_bitflips = 0;
1011         int ret, i, cur_off = 0;
1012         bool raw_mode = false;
1013
1014         sunxi_nfc_hw_ecc_enable(mtd);
1015
1016         for (i = 0; i < ecc->steps; i++) {
1017                 int data_off = i * ecc->size;
1018                 int oob_off = i * (ecc->bytes + 4);
1019                 u8 *data = buf + data_off;
1020                 u8 *oob = chip->oob_poi + oob_off;
1021
1022                 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1023                                                   oob_off + mtd->writesize,
1024                                                   &cur_off, &max_bitflips,
1025                                                   !i, page);
1026                 if (ret < 0)
1027                         return ret;
1028                 else if (ret)
1029                         raw_mode = true;
1030         }
1031
1032         if (oob_required)
1033                 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1034                                                 !raw_mode, page);
1035
1036         sunxi_nfc_hw_ecc_disable(mtd);
1037
1038         return max_bitflips;
1039 }
1040
1041 static int sunxi_nfc_hw_ecc_read_subpage(struct mtd_info *mtd,
1042                                          struct nand_chip *chip,
1043                                          uint32_t data_offs, uint32_t readlen,
1044                                          uint8_t *bufpoi, int page)
1045 {
1046         struct nand_ecc_ctrl *ecc = &chip->ecc;
1047         int ret, i, cur_off = 0;
1048         unsigned int max_bitflips = 0;
1049
1050         sunxi_nfc_hw_ecc_enable(mtd);
1051
1052         chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
1053         for (i = data_offs / ecc->size;
1054              i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
1055                 int data_off = i * ecc->size;
1056                 int oob_off = i * (ecc->bytes + 4);
1057                 u8 *data = bufpoi + data_off;
1058                 u8 *oob = chip->oob_poi + oob_off;
1059
1060                 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off,
1061                         oob, oob_off + mtd->writesize,
1062                         &cur_off, &max_bitflips, !i, page);
1063                 if (ret < 0)
1064                         return ret;
1065         }
1066
1067         sunxi_nfc_hw_ecc_disable(mtd);
1068
1069         return max_bitflips;
1070 }
1071
1072 static int sunxi_nfc_hw_ecc_write_page(struct mtd_info *mtd,
1073                                        struct nand_chip *chip,
1074                                        const uint8_t *buf, int oob_required,
1075                                        int page)
1076 {
1077         struct nand_ecc_ctrl *ecc = &chip->ecc;
1078         int ret, i, cur_off = 0;
1079
1080         sunxi_nfc_hw_ecc_enable(mtd);
1081
1082         for (i = 0; i < ecc->steps; i++) {
1083                 int data_off = i * ecc->size;
1084                 int oob_off = i * (ecc->bytes + 4);
1085                 const u8 *data = buf + data_off;
1086                 const u8 *oob = chip->oob_poi + oob_off;
1087
1088                 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1089                                                    oob_off + mtd->writesize,
1090                                                    &cur_off, !i, page);
1091                 if (ret)
1092                         return ret;
1093         }
1094
1095         if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1096                 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1097                                                  &cur_off, page);
1098
1099         sunxi_nfc_hw_ecc_disable(mtd);
1100
1101         return 0;
1102 }
1103
1104 static int sunxi_nfc_hw_ecc_write_subpage(struct mtd_info *mtd,
1105                                           struct nand_chip *chip,
1106                                           u32 data_offs, u32 data_len,
1107                                           const u8 *buf, int oob_required,
1108                                           int page)
1109 {
1110         struct nand_ecc_ctrl *ecc = &chip->ecc;
1111         int ret, i, cur_off = 0;
1112
1113         sunxi_nfc_hw_ecc_enable(mtd);
1114
1115         for (i = data_offs / ecc->size;
1116              i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
1117                 int data_off = i * ecc->size;
1118                 int oob_off = i * (ecc->bytes + 4);
1119                 const u8 *data = buf + data_off;
1120                 const u8 *oob = chip->oob_poi + oob_off;
1121
1122                 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1123                                                    oob_off + mtd->writesize,
1124                                                    &cur_off, !i, page);
1125                 if (ret)
1126                         return ret;
1127         }
1128
1129         sunxi_nfc_hw_ecc_disable(mtd);
1130
1131         return 0;
1132 }
1133
1134 static int sunxi_nfc_hw_syndrome_ecc_read_page(struct mtd_info *mtd,
1135                                                struct nand_chip *chip,
1136                                                uint8_t *buf, int oob_required,
1137                                                int page)
1138 {
1139         struct nand_ecc_ctrl *ecc = &chip->ecc;
1140         unsigned int max_bitflips = 0;
1141         int ret, i, cur_off = 0;
1142         bool raw_mode = false;
1143
1144         sunxi_nfc_hw_ecc_enable(mtd);
1145
1146         for (i = 0; i < ecc->steps; i++) {
1147                 int data_off = i * (ecc->size + ecc->bytes + 4);
1148                 int oob_off = data_off + ecc->size;
1149                 u8 *data = buf + (i * ecc->size);
1150                 u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1151
1152                 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1153                                                   oob_off, &cur_off,
1154                                                   &max_bitflips, !i, page);
1155                 if (ret < 0)
1156                         return ret;
1157                 else if (ret)
1158                         raw_mode = true;
1159         }
1160
1161         if (oob_required)
1162                 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1163                                                 !raw_mode, page);
1164
1165         sunxi_nfc_hw_ecc_disable(mtd);
1166
1167         return max_bitflips;
1168 }
1169
1170 static int sunxi_nfc_hw_syndrome_ecc_write_page(struct mtd_info *mtd,
1171                                                 struct nand_chip *chip,
1172                                                 const uint8_t *buf,
1173                                                 int oob_required, int page)
1174 {
1175         struct nand_ecc_ctrl *ecc = &chip->ecc;
1176         int ret, i, cur_off = 0;
1177
1178         sunxi_nfc_hw_ecc_enable(mtd);
1179
1180         for (i = 0; i < ecc->steps; i++) {
1181                 int data_off = i * (ecc->size + ecc->bytes + 4);
1182                 int oob_off = data_off + ecc->size;
1183                 const u8 *data = buf + (i * ecc->size);
1184                 const u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1185
1186                 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off,
1187                                                    oob, oob_off, &cur_off,
1188                                                    false, page);
1189                 if (ret)
1190                         return ret;
1191         }
1192
1193         if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1194                 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1195                                                  &cur_off, page);
1196
1197         sunxi_nfc_hw_ecc_disable(mtd);
1198
1199         return 0;
1200 }
1201
1202 static const s32 tWB_lut[] = {6, 12, 16, 20};
1203 static const s32 tRHW_lut[] = {4, 8, 12, 20};
1204
1205 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
1206                 u32 clk_period)
1207 {
1208         u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
1209         int i;
1210
1211         for (i = 0; i < lut_size; i++) {
1212                 if (clk_cycles <= lut[i])
1213                         return i;
1214         }
1215
1216         /* Doesn't fit */
1217         return -EINVAL;
1218 }
1219
1220 #define sunxi_nand_lookup_timing(l, p, c) \
1221                         _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1222
1223 static int sunxi_nand_chip_set_timings(struct sunxi_nand_chip *chip,
1224                                        const struct nand_sdr_timings *timings)
1225 {
1226         u32 min_clk_period = 0;
1227         s32 tWB, tADL, tWHR, tRHW, tCAD;
1228
1229         /* T1 <=> tCLS */
1230         if (timings->tCLS_min > min_clk_period)
1231                 min_clk_period = timings->tCLS_min;
1232
1233         /* T2 <=> tCLH */
1234         if (timings->tCLH_min > min_clk_period)
1235                 min_clk_period = timings->tCLH_min;
1236
1237         /* T3 <=> tCS */
1238         if (timings->tCS_min > min_clk_period)
1239                 min_clk_period = timings->tCS_min;
1240
1241         /* T4 <=> tCH */
1242         if (timings->tCH_min > min_clk_period)
1243                 min_clk_period = timings->tCH_min;
1244
1245         /* T5 <=> tWP */
1246         if (timings->tWP_min > min_clk_period)
1247                 min_clk_period = timings->tWP_min;
1248
1249         /* T6 <=> tWH */
1250         if (timings->tWH_min > min_clk_period)
1251                 min_clk_period = timings->tWH_min;
1252
1253         /* T7 <=> tALS */
1254         if (timings->tALS_min > min_clk_period)
1255                 min_clk_period = timings->tALS_min;
1256
1257         /* T8 <=> tDS */
1258         if (timings->tDS_min > min_clk_period)
1259                 min_clk_period = timings->tDS_min;
1260
1261         /* T9 <=> tDH */
1262         if (timings->tDH_min > min_clk_period)
1263                 min_clk_period = timings->tDH_min;
1264
1265         /* T10 <=> tRR */
1266         if (timings->tRR_min > (min_clk_period * 3))
1267                 min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
1268
1269         /* T11 <=> tALH */
1270         if (timings->tALH_min > min_clk_period)
1271                 min_clk_period = timings->tALH_min;
1272
1273         /* T12 <=> tRP */
1274         if (timings->tRP_min > min_clk_period)
1275                 min_clk_period = timings->tRP_min;
1276
1277         /* T13 <=> tREH */
1278         if (timings->tREH_min > min_clk_period)
1279                 min_clk_period = timings->tREH_min;
1280
1281         /* T14 <=> tRC */
1282         if (timings->tRC_min > (min_clk_period * 2))
1283                 min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
1284
1285         /* T15 <=> tWC */
1286         if (timings->tWC_min > (min_clk_period * 2))
1287                 min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
1288
1289         /* T16 - T19 + tCAD */
1290         tWB  = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
1291                                         min_clk_period);
1292         if (tWB < 0) {
1293                 dev_err(nfc->dev, "unsupported tWB\n");
1294                 return tWB;
1295         }
1296
1297         tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
1298         if (tADL > 3) {
1299                 dev_err(nfc->dev, "unsupported tADL\n");
1300                 return -EINVAL;
1301         }
1302
1303         tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
1304         if (tWHR > 3) {
1305                 dev_err(nfc->dev, "unsupported tWHR\n");
1306                 return -EINVAL;
1307         }
1308
1309         tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
1310                                         min_clk_period);
1311         if (tRHW < 0) {
1312                 dev_err(nfc->dev, "unsupported tRHW\n");
1313                 return tRHW;
1314         }
1315
1316         /*
1317          * TODO: according to ONFI specs this value only applies for DDR NAND,
1318          * but Allwinner seems to set this to 0x7. Mimic them for now.
1319          */
1320         tCAD = 0x7;
1321
1322         /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1323         chip->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
1324
1325         /*
1326          * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1327          * output cycle timings shall be used if the host drives tRC less than
1328          * 30 ns.
1329          */
1330         chip->timing_ctl = (timings->tRC_min < 30000) ? NFC_TIMING_CTL_EDO : 0;
1331
1332         /* Convert min_clk_period from picoseconds to nanoseconds */
1333         min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
1334
1335         /*
1336          * Convert min_clk_period into a clk frequency, then get the
1337          * appropriate rate for the NAND controller IP given this formula
1338          * (specified in the datasheet):
1339          * nand clk_rate = min_clk_rate
1340          */
1341         chip->clk_rate = 1000000000L / min_clk_period;
1342
1343         return 0;
1344 }
1345
1346 static int sunxi_nand_chip_init_timings(struct sunxi_nand_chip *chip)
1347 {
1348         struct mtd_info *mtd = nand_to_mtd(&chip->nand);
1349         const struct nand_sdr_timings *timings;
1350         int ret;
1351         int mode;
1352
1353         mode = onfi_get_async_timing_mode(&chip->nand);
1354         if (mode == ONFI_TIMING_MODE_UNKNOWN) {
1355                 mode = chip->nand.onfi_timing_mode_default;
1356         } else {
1357                 uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {};
1358                 int i;
1359
1360                 mode = fls(mode) - 1;
1361                 if (mode < 0)
1362                         mode = 0;
1363
1364                 feature[0] = mode;
1365                 for (i = 0; i < chip->nsels; i++) {
1366                         chip->nand.select_chip(mtd, i);
1367                         ret = chip->nand.onfi_set_features(mtd,
1368                                                 &chip->nand,
1369                                                 ONFI_FEATURE_ADDR_TIMING_MODE,
1370                                                 feature);
1371                         chip->nand.select_chip(mtd, -1);
1372                         if (ret)
1373                                 return ret;
1374                 }
1375         }
1376
1377         timings = onfi_async_timing_mode_to_sdr_timings(mode);
1378         if (IS_ERR(timings))
1379                 return PTR_ERR(timings);
1380
1381         return sunxi_nand_chip_set_timings(chip, timings);
1382 }
1383
1384 static int sunxi_nand_hw_common_ecc_ctrl_init(struct mtd_info *mtd,
1385                                               struct nand_ecc_ctrl *ecc)
1386 {
1387         static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1388         struct sunxi_nand_hw_ecc *data;
1389         struct nand_ecclayout *layout;
1390         int nsectors;
1391         int ret;
1392         int i;
1393
1394         data = kzalloc(sizeof(*data), GFP_KERNEL);
1395         if (!data)
1396                 return -ENOMEM;
1397
1398         if (ecc->size != 512 && ecc->size != 1024)
1399                 return -EINVAL;
1400
1401         /* Prefer 1k ECC chunk over 512 ones */
1402         if (ecc->size == 512 && mtd->writesize > 512) {
1403                 ecc->size = 1024;
1404                 ecc->strength *= 2;
1405         }
1406
1407         /* Add ECC info retrieval from DT */
1408         for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1409                 if (ecc->strength <= strengths[i]) {
1410                         /*
1411                          * Update ecc->strength value with the actual strength
1412                          * that will be used by the ECC engine.
1413                          */
1414                         ecc->strength = strengths[i];
1415                         break;
1416                 }
1417         }
1418
1419         if (i >= ARRAY_SIZE(strengths)) {
1420                 dev_err(nfc->dev, "unsupported strength\n");
1421                 ret = -ENOTSUPP;
1422                 goto err;
1423         }
1424
1425         data->mode = i;
1426
1427         /* HW ECC always request ECC bytes for 1024 bytes blocks */
1428         ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
1429
1430         /* HW ECC always work with even numbers of ECC bytes */
1431         ecc->bytes = ALIGN(ecc->bytes, 2);
1432
1433         layout = &data->layout;
1434         nsectors = mtd->writesize / ecc->size;
1435
1436         if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
1437                 ret = -EINVAL;
1438                 goto err;
1439         }
1440
1441         layout->eccbytes = (ecc->bytes * nsectors);
1442
1443         ecc->layout = layout;
1444         ecc->priv = data;
1445
1446         return 0;
1447
1448 err:
1449         kfree(data);
1450
1451         return ret;
1452 }
1453
1454 #ifndef __UBOOT__
1455 static void sunxi_nand_hw_common_ecc_ctrl_cleanup(struct nand_ecc_ctrl *ecc)
1456 {
1457         kfree(ecc->priv);
1458 }
1459 #endif /* __UBOOT__ */
1460
1461 static int sunxi_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
1462                                        struct nand_ecc_ctrl *ecc)
1463 {
1464         struct nand_ecclayout *layout;
1465         int nsectors;
1466         int i, j;
1467         int ret;
1468
1469         ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
1470         if (ret)
1471                 return ret;
1472
1473         ecc->read_page = sunxi_nfc_hw_ecc_read_page;
1474         ecc->write_page = sunxi_nfc_hw_ecc_write_page;
1475         ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
1476         ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
1477         layout = ecc->layout;
1478         nsectors = mtd->writesize / ecc->size;
1479
1480         for (i = 0; i < nsectors; i++) {
1481                 if (i) {
1482                         layout->oobfree[i].offset =
1483                                 layout->oobfree[i - 1].offset +
1484                                 layout->oobfree[i - 1].length +
1485                                 ecc->bytes;
1486                         layout->oobfree[i].length = 4;
1487                 } else {
1488                         /*
1489                          * The first 2 bytes are used for BB markers, hence we
1490                          * only have 2 bytes available in the first user data
1491                          * section.
1492                          */
1493                         layout->oobfree[i].length = 2;
1494                         layout->oobfree[i].offset = 2;
1495                 }
1496
1497                 for (j = 0; j < ecc->bytes; j++)
1498                         layout->eccpos[(ecc->bytes * i) + j] =
1499                                         layout->oobfree[i].offset +
1500                                         layout->oobfree[i].length + j;
1501         }
1502
1503         if (mtd->oobsize > (ecc->bytes + 4) * nsectors) {
1504                 layout->oobfree[nsectors].offset =
1505                                 layout->oobfree[nsectors - 1].offset +
1506                                 layout->oobfree[nsectors - 1].length +
1507                                 ecc->bytes;
1508                 layout->oobfree[nsectors].length = mtd->oobsize -
1509                                 ((ecc->bytes + 4) * nsectors);
1510         }
1511
1512         return 0;
1513 }
1514
1515 static int sunxi_nand_hw_syndrome_ecc_ctrl_init(struct mtd_info *mtd,
1516                                                 struct nand_ecc_ctrl *ecc)
1517 {
1518         struct nand_ecclayout *layout;
1519         int nsectors;
1520         int i;
1521         int ret;
1522
1523         ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
1524         if (ret)
1525                 return ret;
1526
1527         ecc->prepad = 4;
1528         ecc->read_page = sunxi_nfc_hw_syndrome_ecc_read_page;
1529         ecc->write_page = sunxi_nfc_hw_syndrome_ecc_write_page;
1530
1531         layout = ecc->layout;
1532         nsectors = mtd->writesize / ecc->size;
1533
1534         for (i = 0; i < (ecc->bytes * nsectors); i++)
1535                 layout->eccpos[i] = i;
1536
1537         layout->oobfree[0].length = mtd->oobsize - i;
1538         layout->oobfree[0].offset = i;
1539
1540         return 0;
1541 }
1542
1543 #ifndef __UBOOT__
1544 static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl *ecc)
1545 {
1546         switch (ecc->mode) {
1547         case NAND_ECC_HW:
1548         case NAND_ECC_HW_SYNDROME:
1549                 sunxi_nand_hw_common_ecc_ctrl_cleanup(ecc);
1550                 break;
1551         case NAND_ECC_NONE:
1552                 kfree(ecc->layout);
1553         default:
1554                 break;
1555         }
1556 }
1557 #endif /* __UBOOT__ */
1558
1559 static int sunxi_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc)
1560 {
1561         struct nand_chip *nand = mtd_to_nand(mtd);
1562         int ret;
1563
1564         if (!ecc->size) {
1565                 ecc->size = nand->ecc_step_ds;
1566                 ecc->strength = nand->ecc_strength_ds;
1567         }
1568
1569         if (!ecc->size || !ecc->strength)
1570                 return -EINVAL;
1571
1572         switch (ecc->mode) {
1573         case NAND_ECC_SOFT_BCH:
1574                 break;
1575         case NAND_ECC_HW:
1576                 ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc);
1577                 if (ret)
1578                         return ret;
1579                 break;
1580         case NAND_ECC_HW_SYNDROME:
1581                 ret = sunxi_nand_hw_syndrome_ecc_ctrl_init(mtd, ecc);
1582                 if (ret)
1583                         return ret;
1584                 break;
1585         case NAND_ECC_NONE:
1586                 ecc->layout = kzalloc(sizeof(*ecc->layout), GFP_KERNEL);
1587                 if (!ecc->layout)
1588                         return -ENOMEM;
1589                 ecc->layout->oobfree[0].length = mtd->oobsize;
1590         case NAND_ECC_SOFT:
1591                 break;
1592         default:
1593                 return -EINVAL;
1594         }
1595
1596         return 0;
1597 }
1598
1599 static int sunxi_nand_chip_init(int node, struct sunxi_nfc *nfc, int devnum)
1600 {
1601         const struct nand_sdr_timings *timings;
1602         const void *blob = gd->fdt_blob;
1603         struct sunxi_nand_chip *chip;
1604         struct mtd_info *mtd;
1605         struct nand_chip *nand;
1606         int nsels;
1607         int ret;
1608         int i;
1609         u32 cs[8], rb[8];
1610
1611         if (!fdt_getprop(blob, node, "reg", &nsels))
1612                 return -EINVAL;
1613
1614         nsels /= sizeof(u32);
1615         if (!nsels || nsels > 8) {
1616                 dev_err(dev, "invalid reg property size\n");
1617                 return -EINVAL;
1618         }
1619
1620         chip = kzalloc(sizeof(*chip) +
1621                        (nsels * sizeof(struct sunxi_nand_chip_sel)),
1622                        GFP_KERNEL);
1623         if (!chip) {
1624                 dev_err(dev, "could not allocate chip\n");
1625                 return -ENOMEM;
1626         }
1627
1628         chip->nsels = nsels;
1629         chip->selected = -1;
1630
1631         for (i = 0; i < nsels; i++) {
1632                 cs[i] = -1;
1633                 rb[i] = -1;
1634         }
1635
1636         ret = fdtdec_get_int_array(gd->fdt_blob, node, "reg", cs, nsels);
1637         if (ret) {
1638                 dev_err(dev, "could not retrieve reg property: %d\n", ret);
1639                 return ret;
1640         }
1641
1642         ret = fdtdec_get_int_array(gd->fdt_blob, node, "allwinner,rb", rb,
1643                                    nsels);
1644         if (ret) {
1645                 dev_err(dev, "could not retrieve reg property: %d\n", ret);
1646                 return ret;
1647         }
1648
1649         for (i = 0; i < nsels; i++) {
1650                 int tmp = cs[i];
1651
1652                 if (tmp > NFC_MAX_CS) {
1653                         dev_err(dev,
1654                                 "invalid reg value: %u (max CS = 7)\n",
1655                                 tmp);
1656                         return -EINVAL;
1657                 }
1658
1659                 if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
1660                         dev_err(dev, "CS %d already assigned\n", tmp);
1661                         return -EINVAL;
1662                 }
1663
1664                 chip->sels[i].cs = tmp;
1665
1666                 tmp = rb[i];
1667                 if (tmp >= 0 && tmp < 2) {
1668                         chip->sels[i].rb.type = RB_NATIVE;
1669                         chip->sels[i].rb.info.nativeid = tmp;
1670                 } else {
1671                         ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
1672                                                 "rb-gpios", i,
1673                                                 &chip->sels[i].rb.info.gpio,
1674                                                 GPIOD_IS_IN);
1675                         if (ret)
1676                                 chip->sels[i].rb.type = RB_GPIO;
1677                         else
1678                                 chip->sels[i].rb.type = RB_NONE;
1679                 }
1680         }
1681
1682         timings = onfi_async_timing_mode_to_sdr_timings(0);
1683         if (IS_ERR(timings)) {
1684                 ret = PTR_ERR(timings);
1685                 dev_err(dev,
1686                         "could not retrieve timings for ONFI mode 0: %d\n",
1687                         ret);
1688                 return ret;
1689         }
1690
1691         ret = sunxi_nand_chip_set_timings(chip, timings);
1692         if (ret) {
1693                 dev_err(dev, "could not configure chip timings: %d\n", ret);
1694                 return ret;
1695         }
1696
1697         nand = &chip->nand;
1698         /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
1699         nand->chip_delay = 200;
1700         nand->controller = &nfc->controller;
1701         /*
1702          * Set the ECC mode to the default value in case nothing is specified
1703          * in the DT.
1704          */
1705         nand->ecc.mode = NAND_ECC_HW;
1706         nand->flash_node = node;
1707         nand->select_chip = sunxi_nfc_select_chip;
1708         nand->cmd_ctrl = sunxi_nfc_cmd_ctrl;
1709         nand->read_buf = sunxi_nfc_read_buf;
1710         nand->write_buf = sunxi_nfc_write_buf;
1711         nand->read_byte = sunxi_nfc_read_byte;
1712
1713         mtd = nand_to_mtd(nand);
1714         ret = nand_scan_ident(mtd, nsels, NULL);
1715         if (ret)
1716                 return 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         ret = sunxi_nand_chip_init_timings(chip);
1727         if (ret) {
1728                 dev_err(dev, "could not configure chip timings: %d\n", ret);
1729                 return ret;
1730         }
1731
1732         ret = sunxi_nand_ecc_init(mtd, &nand->ecc);
1733         if (ret) {
1734                 dev_err(dev, "ECC init failed: %d\n", ret);
1735                 return ret;
1736         }
1737
1738         ret = nand_scan_tail(mtd);
1739         if (ret) {
1740                 dev_err(dev, "nand_scan_tail failed: %d\n", ret);
1741                 return ret;
1742         }
1743
1744         ret = nand_register(devnum, mtd);
1745         if (ret) {
1746                 dev_err(dev, "failed to register mtd device: %d\n", ret);
1747                 return ret;
1748         }
1749
1750         list_add_tail(&chip->node, &nfc->chips);
1751
1752         return 0;
1753 }
1754
1755 static int sunxi_nand_chips_init(int node, struct sunxi_nfc *nfc)
1756 {
1757         const void *blob = gd->fdt_blob;
1758         int nand_node;
1759         int ret, i = 0;
1760
1761         for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
1762              nand_node = fdt_next_subnode(blob, nand_node))
1763                 i++;
1764
1765         if (i > 8) {
1766                 dev_err(dev, "too many NAND chips: %d (max = 8)\n", i);
1767                 return -EINVAL;
1768         }
1769
1770         i = 0;
1771         for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
1772              nand_node = fdt_next_subnode(blob, nand_node)) {
1773                 ret = sunxi_nand_chip_init(nand_node, nfc, i++);
1774                 if (ret)
1775                         return ret;
1776         }
1777
1778         return 0;
1779 }
1780
1781 #ifndef __UBOOT__
1782 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
1783 {
1784         struct sunxi_nand_chip *chip;
1785
1786         while (!list_empty(&nfc->chips)) {
1787                 chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip,
1788                                         node);
1789                 nand_release(&chip->mtd);
1790                 sunxi_nand_ecc_cleanup(&chip->nand.ecc);
1791                 list_del(&chip->node);
1792                 kfree(chip);
1793         }
1794 }
1795 #endif /* __UBOOT__ */
1796
1797 void sunxi_nand_init(void)
1798 {
1799         const void *blob = gd->fdt_blob;
1800         struct sunxi_nfc *nfc;
1801         fdt_addr_t regs;
1802         int node;
1803         int ret;
1804
1805         nfc = kzalloc(sizeof(*nfc), GFP_KERNEL);
1806         if (!nfc)
1807                 return;
1808
1809         spin_lock_init(&nfc->controller.lock);
1810         init_waitqueue_head(&nfc->controller.wq);
1811         INIT_LIST_HEAD(&nfc->chips);
1812
1813         node = fdtdec_next_compatible(blob, 0, COMPAT_SUNXI_NAND);
1814         if (node < 0) {
1815                 pr_err("unable to find nfc node in device tree\n");
1816                 goto err;
1817         }
1818
1819         if (!fdtdec_get_is_enabled(blob, node)) {
1820                 pr_err("nfc disabled in device tree\n");
1821                 goto err;
1822         }
1823
1824         regs = fdtdec_get_addr(blob, node, "reg");
1825         if (regs == FDT_ADDR_T_NONE) {
1826                 pr_err("unable to find nfc address in device tree\n");
1827                 goto err;
1828         }
1829
1830         nfc->regs = (void *)regs;
1831
1832         ret = sunxi_nfc_rst(nfc);
1833         if (ret)
1834                 goto err;
1835
1836         ret = sunxi_nand_chips_init(node, nfc);
1837         if (ret) {
1838                 dev_err(dev, "failed to init nand chips\n");
1839                 goto err;
1840         }
1841
1842         return;
1843
1844 err:
1845         kfree(nfc);
1846 }
1847
1848 MODULE_LICENSE("GPL v2");
1849 MODULE_AUTHOR("Boris BREZILLON");
1850 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");