1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com>
4 * Copyright (C) 2015 Roy Spliet <r.spliet@ultimaker.com>
7 * https://github.com/yuq/sunxi-nfc-mtd
8 * Copyright (C) 2013 Qiang Yu <yuq825@gmail.com>
10 * https://github.com/hno/Allwinner-Info
11 * Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
13 * Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com>
14 * Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org>
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.
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.
32 #include <dm/device_compat.h>
33 #include <dm/devres.h>
34 #include <linux/err.h>
36 #include <linux/kernel.h>
37 #include <linux/mtd/mtd.h>
38 #include <linux/mtd/rawnand.h>
39 #include <linux/mtd/partitions.h>
43 #include <asm/arch/clock.h>
45 DECLARE_GLOBAL_DATA_PTR;
47 #define NFC_REG_CTL 0x0000
48 #define NFC_REG_ST 0x0004
49 #define NFC_REG_INT 0x0008
50 #define NFC_REG_TIMING_CTL 0x000C
51 #define NFC_REG_TIMING_CFG 0x0010
52 #define NFC_REG_ADDR_LOW 0x0014
53 #define NFC_REG_ADDR_HIGH 0x0018
54 #define NFC_REG_SECTOR_NUM 0x001C
55 #define NFC_REG_CNT 0x0020
56 #define NFC_REG_CMD 0x0024
57 #define NFC_REG_RCMD_SET 0x0028
58 #define NFC_REG_WCMD_SET 0x002C
59 #define NFC_REG_IO_DATA 0x0030
60 #define NFC_REG_ECC_CTL 0x0034
61 #define NFC_REG_ECC_ST 0x0038
62 #define NFC_REG_DEBUG 0x003C
63 #define NFC_REG_ECC_ERR_CNT(x) ((0x0040 + (x)) & ~0x3)
64 #define NFC_REG_USER_DATA(x) (0x0050 + ((x) * 4))
65 #define NFC_REG_SPARE_AREA 0x00A0
66 #define NFC_REG_PAT_ID 0x00A4
67 #define NFC_RAM0_BASE 0x0400
68 #define NFC_RAM1_BASE 0x0800
70 /* define bit use in NFC_CTL */
72 #define NFC_RESET BIT(1)
73 #define NFC_BUS_WIDTH_MSK BIT(2)
74 #define NFC_BUS_WIDTH_8 (0 << 2)
75 #define NFC_BUS_WIDTH_16 (1 << 2)
76 #define NFC_RB_SEL_MSK BIT(3)
77 #define NFC_RB_SEL(x) ((x) << 3)
78 #define NFC_CE_SEL_MSK (0x7 << 24)
79 #define NFC_CE_SEL(x) ((x) << 24)
80 #define NFC_CE_CTL BIT(6)
81 #define NFC_PAGE_SHIFT_MSK (0xf << 8)
82 #define NFC_PAGE_SHIFT(x) (((x) < 10 ? 0 : (x) - 10) << 8)
83 #define NFC_SAM BIT(12)
84 #define NFC_RAM_METHOD BIT(14)
85 #define NFC_DEBUG_CTL BIT(31)
87 /* define bit use in NFC_ST */
88 #define NFC_RB_B2R BIT(0)
89 #define NFC_CMD_INT_FLAG BIT(1)
90 #define NFC_DMA_INT_FLAG BIT(2)
91 #define NFC_CMD_FIFO_STATUS BIT(3)
92 #define NFC_STA BIT(4)
93 #define NFC_NATCH_INT_FLAG BIT(5)
94 #define NFC_RB_STATE(x) BIT(x + 8)
96 /* define bit use in NFC_INT */
97 #define NFC_B2R_INT_ENABLE BIT(0)
98 #define NFC_CMD_INT_ENABLE BIT(1)
99 #define NFC_DMA_INT_ENABLE BIT(2)
100 #define NFC_INT_MASK (NFC_B2R_INT_ENABLE | \
101 NFC_CMD_INT_ENABLE | \
104 /* define bit use in NFC_TIMING_CTL */
105 #define NFC_TIMING_CTL_EDO BIT(8)
107 /* define NFC_TIMING_CFG register layout */
108 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD) \
109 (((tWB) & 0x3) | (((tADL) & 0x3) << 2) | \
110 (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) | \
111 (((tCAD) & 0x7) << 8))
113 /* define bit use in NFC_CMD */
114 #define NFC_CMD_LOW_BYTE_MSK 0xff
115 #define NFC_CMD_HIGH_BYTE_MSK (0xff << 8)
116 #define NFC_CMD(x) (x)
117 #define NFC_ADR_NUM_MSK (0x7 << 16)
118 #define NFC_ADR_NUM(x) (((x) - 1) << 16)
119 #define NFC_SEND_ADR BIT(19)
120 #define NFC_ACCESS_DIR BIT(20)
121 #define NFC_DATA_TRANS BIT(21)
122 #define NFC_SEND_CMD1 BIT(22)
123 #define NFC_WAIT_FLAG BIT(23)
124 #define NFC_SEND_CMD2 BIT(24)
125 #define NFC_SEQ BIT(25)
126 #define NFC_DATA_SWAP_METHOD BIT(26)
127 #define NFC_ROW_AUTO_INC BIT(27)
128 #define NFC_SEND_CMD3 BIT(28)
129 #define NFC_SEND_CMD4 BIT(29)
130 #define NFC_CMD_TYPE_MSK (0x3 << 30)
131 #define NFC_NORMAL_OP (0 << 30)
132 #define NFC_ECC_OP (1 << 30)
133 #define NFC_PAGE_OP (2 << 30)
135 /* define bit use in NFC_RCMD_SET */
136 #define NFC_READ_CMD_MSK 0xff
137 #define NFC_RND_READ_CMD0_MSK (0xff << 8)
138 #define NFC_RND_READ_CMD1_MSK (0xff << 16)
140 /* define bit use in NFC_WCMD_SET */
141 #define NFC_PROGRAM_CMD_MSK 0xff
142 #define NFC_RND_WRITE_CMD_MSK (0xff << 8)
143 #define NFC_READ_CMD0_MSK (0xff << 16)
144 #define NFC_READ_CMD1_MSK (0xff << 24)
146 /* define bit use in NFC_ECC_CTL */
147 #define NFC_ECC_EN BIT(0)
148 #define NFC_ECC_PIPELINE BIT(3)
149 #define NFC_ECC_EXCEPTION BIT(4)
150 #define NFC_ECC_BLOCK_SIZE_MSK BIT(5)
151 #define NFC_ECC_BLOCK_512 (1 << 5)
152 #define NFC_RANDOM_EN BIT(9)
153 #define NFC_RANDOM_DIRECTION BIT(10)
154 #define NFC_ECC_MODE_MSK (0xf << 12)
155 #define NFC_ECC_MODE(x) ((x) << 12)
156 #define NFC_RANDOM_SEED_MSK (0x7fff << 16)
157 #define NFC_RANDOM_SEED(x) ((x) << 16)
159 /* define bit use in NFC_ECC_ST */
160 #define NFC_ECC_ERR(x) BIT(x)
161 #define NFC_ECC_PAT_FOUND(x) BIT(x + 16)
162 #define NFC_ECC_ERR_CNT(b, x) (((x) >> ((b) * 8)) & 0xff)
164 #define NFC_DEFAULT_TIMEOUT_MS 1000
166 #define NFC_SRAM_SIZE 1024
171 * Ready/Busy detection type: describes the Ready/Busy detection modes
173 * @RB_NONE: no external detection available, rely on STATUS command
174 * and software timeouts
175 * @RB_NATIVE: use sunxi NAND controller Ready/Busy support. The Ready/Busy
176 * pin of the NAND flash chip must be connected to one of the
177 * native NAND R/B pins (those which can be muxed to the NAND
179 * @RB_GPIO: use a simple GPIO to handle Ready/Busy status. The Ready/Busy
180 * pin of the NAND flash chip must be connected to a GPIO capable
183 enum sunxi_nand_rb_type {
190 * Ready/Busy structure: stores information related to Ready/Busy detection
192 * @type: the Ready/Busy detection mode
193 * @info: information related to the R/B detection mode. Either a gpio
194 * id or a native R/B id (those supported by the NAND controller).
196 struct sunxi_nand_rb {
197 enum sunxi_nand_rb_type type;
199 struct gpio_desc gpio;
205 * Chip Select structure: stores information related to NAND Chip Select
207 * @cs: the NAND CS id used to communicate with a NAND Chip
208 * @rb: the Ready/Busy description
210 struct sunxi_nand_chip_sel {
212 struct sunxi_nand_rb rb;
216 * sunxi HW ECC infos: stores information related to HW ECC support
218 * @mode: the sunxi ECC mode field deduced from ECC requirements
219 * @layout: the OOB layout depending on the ECC requirements and the
222 struct sunxi_nand_hw_ecc {
224 struct nand_ecclayout layout;
228 * NAND chip structure: stores NAND chip device related information
230 * @node: used to store NAND chips into a list
231 * @nand: base NAND chip structure
232 * @mtd: base MTD structure
233 * @clk_rate: clk_rate required for this NAND chip
234 * @timing_cfg TIMING_CFG register value for this NAND chip
235 * @selected: current active CS
236 * @nsels: number of CS lines required by the NAND chip
237 * @sels: array of CS lines descriptions
239 struct sunxi_nand_chip {
240 struct list_head node;
241 struct nand_chip nand;
242 unsigned long clk_rate;
251 struct sunxi_nand_chip_sel sels[0];
254 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
256 return container_of(nand, struct sunxi_nand_chip, nand);
260 * NAND Controller structure: stores sunxi NAND controller information
262 * @controller: base controller structure
263 * @dev: parent device (used to print error messages)
264 * @regs: NAND controller registers
265 * @ahb_clk: NAND Controller AHB clock
266 * @mod_clk: NAND Controller mod clock
267 * @assigned_cs: bitmask describing already assigned CS lines
268 * @clk_rate: NAND controller current clock rate
269 * @chips: a list containing all the NAND chips attached to
270 * this NAND controller
271 * @complete: a completion object used to wait for NAND
275 struct nand_hw_control controller;
280 unsigned long assigned_cs;
281 unsigned long clk_rate;
282 struct list_head chips;
285 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_hw_control *ctrl)
287 return container_of(ctrl, struct sunxi_nfc, controller);
290 static void sunxi_nfc_set_clk_rate(unsigned long hz)
292 struct sunxi_ccm_reg *const ccm =
293 (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
296 div_m = (clock_get_pll6() + hz - 1) / hz;
297 for (div_n = 0; div_n < 3 && div_m > 16; div_n++) {
305 /* config mod clock */
306 writel(CCM_NAND_CTRL_ENABLE | CCM_NAND_CTRL_PLL6 |
307 CCM_NAND_CTRL_N(div_n) | CCM_NAND_CTRL_M(div_m),
308 &ccm->nand0_clk_cfg);
310 /* gate on nand clock */
311 setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_NAND0));
312 #ifdef CONFIG_MACH_SUN9I
313 setbits_le32(&ccm->ahb_gate1, (1 << AHB_GATE_OFFSET_DMA));
315 setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_DMA));
319 static int sunxi_nfc_wait_int(struct sunxi_nfc *nfc, u32 flags,
320 unsigned int timeout_ms)
322 unsigned int timeout_ticks;
323 u32 time_start, status;
324 int ret = -ETIMEDOUT;
327 timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
329 timeout_ticks = (timeout_ms * CONFIG_SYS_HZ) / 1000;
331 time_start = get_timer(0);
334 status = readl(nfc->regs + NFC_REG_ST);
335 if ((status & flags) == flags) {
341 } while (get_timer(time_start) < timeout_ticks);
343 writel(status & flags, nfc->regs + NFC_REG_ST);
348 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
350 unsigned long timeout = (CONFIG_SYS_HZ *
351 NFC_DEFAULT_TIMEOUT_MS) / 1000;
354 time_start = get_timer(0);
356 if (!(readl(nfc->regs + NFC_REG_ST) & NFC_CMD_FIFO_STATUS))
358 } while (get_timer(time_start) < timeout);
360 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
364 static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
366 unsigned long timeout = (CONFIG_SYS_HZ *
367 NFC_DEFAULT_TIMEOUT_MS) / 1000;
370 writel(0, nfc->regs + NFC_REG_ECC_CTL);
371 writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
373 time_start = get_timer(0);
375 if (!(readl(nfc->regs + NFC_REG_CTL) & NFC_RESET))
377 } while (get_timer(time_start) < timeout);
379 dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
383 static int sunxi_nfc_dev_ready(struct mtd_info *mtd)
385 struct nand_chip *nand = mtd_to_nand(mtd);
386 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
387 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
388 struct sunxi_nand_rb *rb;
389 unsigned long timeo = (sunxi_nand->nand.state == FL_ERASING ? 400 : 20);
392 if (sunxi_nand->selected < 0)
395 rb = &sunxi_nand->sels[sunxi_nand->selected].rb;
399 ret = !!(readl(nfc->regs + NFC_REG_ST) &
400 NFC_RB_STATE(rb->info.nativeid));
404 sunxi_nfc_wait_int(nfc, NFC_RB_B2R, timeo);
405 ret = !!(readl(nfc->regs + NFC_REG_ST) &
406 NFC_RB_STATE(rb->info.nativeid));
409 ret = dm_gpio_get_value(&rb->info.gpio);
414 dev_err(nfc->dev, "cannot check R/B NAND status!\n");
421 static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
423 struct nand_chip *nand = mtd_to_nand(mtd);
424 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
425 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
426 struct sunxi_nand_chip_sel *sel;
429 if (chip > 0 && chip >= sunxi_nand->nsels)
432 if (chip == sunxi_nand->selected)
435 ctl = readl(nfc->regs + NFC_REG_CTL) &
436 ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
439 sel = &sunxi_nand->sels[chip];
441 ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
442 NFC_PAGE_SHIFT(nand->page_shift - 10);
443 if (sel->rb.type == RB_NONE) {
444 nand->dev_ready = NULL;
446 nand->dev_ready = sunxi_nfc_dev_ready;
447 if (sel->rb.type == RB_NATIVE)
448 ctl |= NFC_RB_SEL(sel->rb.info.nativeid);
451 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
453 if (nfc->clk_rate != sunxi_nand->clk_rate) {
454 sunxi_nfc_set_clk_rate(sunxi_nand->clk_rate);
455 nfc->clk_rate = sunxi_nand->clk_rate;
459 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
460 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
461 writel(ctl, nfc->regs + NFC_REG_CTL);
463 sunxi_nand->selected = chip;
466 static void sunxi_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
468 struct nand_chip *nand = mtd_to_nand(mtd);
469 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
470 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
477 cnt = min(len - offs, NFC_SRAM_SIZE);
479 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
483 writel(cnt, nfc->regs + NFC_REG_CNT);
484 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
485 writel(tmp, nfc->regs + NFC_REG_CMD);
487 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
492 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
498 static void sunxi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
501 struct nand_chip *nand = mtd_to_nand(mtd);
502 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
503 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
510 cnt = min(len - offs, NFC_SRAM_SIZE);
512 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
516 writel(cnt, nfc->regs + NFC_REG_CNT);
517 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
518 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
520 writel(tmp, nfc->regs + NFC_REG_CMD);
522 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
530 static uint8_t sunxi_nfc_read_byte(struct mtd_info *mtd)
534 sunxi_nfc_read_buf(mtd, &ret, 1);
539 static void sunxi_nfc_cmd_ctrl(struct mtd_info *mtd, int dat,
542 struct nand_chip *nand = mtd_to_nand(mtd);
543 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
544 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
548 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
552 if (ctrl & NAND_CTRL_CHANGE) {
553 tmp = readl(nfc->regs + NFC_REG_CTL);
558 writel(tmp, nfc->regs + NFC_REG_CTL);
561 if (dat == NAND_CMD_NONE && (ctrl & NAND_NCE) &&
562 !(ctrl & (NAND_CLE | NAND_ALE))) {
565 if (!sunxi_nand->addr_cycles && !sunxi_nand->cmd_cycles)
568 if (sunxi_nand->cmd_cycles--)
569 cmd |= NFC_SEND_CMD1 | sunxi_nand->cmd[0];
571 if (sunxi_nand->cmd_cycles--) {
572 cmd |= NFC_SEND_CMD2;
573 writel(sunxi_nand->cmd[1],
574 nfc->regs + NFC_REG_RCMD_SET);
577 sunxi_nand->cmd_cycles = 0;
579 if (sunxi_nand->addr_cycles) {
580 cmd |= NFC_SEND_ADR |
581 NFC_ADR_NUM(sunxi_nand->addr_cycles);
582 writel(sunxi_nand->addr[0],
583 nfc->regs + NFC_REG_ADDR_LOW);
586 if (sunxi_nand->addr_cycles > 4)
587 writel(sunxi_nand->addr[1],
588 nfc->regs + NFC_REG_ADDR_HIGH);
590 writel(cmd, nfc->regs + NFC_REG_CMD);
591 sunxi_nand->addr[0] = 0;
592 sunxi_nand->addr[1] = 0;
593 sunxi_nand->addr_cycles = 0;
594 sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
597 if (ctrl & NAND_CLE) {
598 sunxi_nand->cmd[sunxi_nand->cmd_cycles++] = dat;
599 } else if (ctrl & NAND_ALE) {
600 sunxi_nand->addr[sunxi_nand->addr_cycles / 4] |=
601 dat << ((sunxi_nand->addr_cycles % 4) * 8);
602 sunxi_nand->addr_cycles++;
606 /* These seed values have been extracted from Allwinner's BSP */
607 static const u16 sunxi_nfc_randomizer_page_seeds[] = {
608 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
609 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
610 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
611 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
612 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
613 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
614 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
615 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
616 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
617 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
618 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
619 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
620 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
621 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
622 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
623 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
627 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
628 * have been generated using
629 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
630 * the randomizer engine does internally before de/scrambling OOB data.
632 * Those tables are statically defined to avoid calculating randomizer state
635 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
636 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
637 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
638 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
639 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
640 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
641 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
642 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
643 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
644 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
645 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
646 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
647 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
648 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
649 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
650 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
651 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
654 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
655 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
656 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
657 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
658 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
659 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
660 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
661 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
662 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
663 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
664 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
665 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
666 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
667 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
668 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
669 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
670 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
673 static u16 sunxi_nfc_randomizer_step(u16 state, int count)
678 * This loop is just a simple implementation of a Fibonacci LFSR using
679 * the x16 + x15 + 1 polynomial.
682 state = ((state >> 1) |
683 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
688 static u16 sunxi_nfc_randomizer_state(struct mtd_info *mtd, int page, bool ecc)
690 const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
691 int mod = mtd->erasesize / mtd->writesize;
693 if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
694 mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
697 if (mtd->ecc_step_size == 512)
698 seeds = sunxi_nfc_randomizer_ecc512_seeds;
700 seeds = sunxi_nfc_randomizer_ecc1024_seeds;
703 return seeds[page % mod];
706 static void sunxi_nfc_randomizer_config(struct mtd_info *mtd,
709 struct nand_chip *nand = mtd_to_nand(mtd);
710 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
711 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
714 if (!(nand->options & NAND_NEED_SCRAMBLING))
717 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
718 state = sunxi_nfc_randomizer_state(mtd, page, ecc);
719 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
720 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
723 static void sunxi_nfc_randomizer_enable(struct mtd_info *mtd)
725 struct nand_chip *nand = mtd_to_nand(mtd);
726 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
728 if (!(nand->options & NAND_NEED_SCRAMBLING))
731 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
732 nfc->regs + NFC_REG_ECC_CTL);
735 static void sunxi_nfc_randomizer_disable(struct mtd_info *mtd)
737 struct nand_chip *nand = mtd_to_nand(mtd);
738 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
740 if (!(nand->options & NAND_NEED_SCRAMBLING))
743 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
744 nfc->regs + NFC_REG_ECC_CTL);
747 static void sunxi_nfc_randomize_bbm(struct mtd_info *mtd, int page, u8 *bbm)
749 u16 state = sunxi_nfc_randomizer_state(mtd, page, true);
752 bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
755 static void sunxi_nfc_randomizer_write_buf(struct mtd_info *mtd,
756 const uint8_t *buf, int len,
759 sunxi_nfc_randomizer_config(mtd, page, ecc);
760 sunxi_nfc_randomizer_enable(mtd);
761 sunxi_nfc_write_buf(mtd, buf, len);
762 sunxi_nfc_randomizer_disable(mtd);
765 static void sunxi_nfc_randomizer_read_buf(struct mtd_info *mtd, uint8_t *buf,
766 int len, bool ecc, int page)
768 sunxi_nfc_randomizer_config(mtd, page, ecc);
769 sunxi_nfc_randomizer_enable(mtd);
770 sunxi_nfc_read_buf(mtd, buf, len);
771 sunxi_nfc_randomizer_disable(mtd);
774 static void sunxi_nfc_hw_ecc_enable(struct mtd_info *mtd)
776 struct nand_chip *nand = mtd_to_nand(mtd);
777 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
778 struct sunxi_nand_hw_ecc *data = nand->ecc.priv;
781 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
782 ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
783 NFC_ECC_BLOCK_SIZE_MSK);
784 ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(data->mode) | NFC_ECC_EXCEPTION;
786 if (nand->ecc.size == 512)
787 ecc_ctl |= NFC_ECC_BLOCK_512;
789 writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
792 static void sunxi_nfc_hw_ecc_disable(struct mtd_info *mtd)
794 struct nand_chip *nand = mtd_to_nand(mtd);
795 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
797 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
798 nfc->regs + NFC_REG_ECC_CTL);
801 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
804 buf[1] = user_data >> 8;
805 buf[2] = user_data >> 16;
806 buf[3] = user_data >> 24;
809 static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
810 u8 *data, int data_off,
811 u8 *oob, int oob_off,
813 unsigned int *max_bitflips,
816 struct nand_chip *nand = mtd_to_nand(mtd);
817 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
818 struct nand_ecc_ctrl *ecc = &nand->ecc;
823 if (*cur_off != data_off)
824 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
826 sunxi_nfc_randomizer_read_buf(mtd, NULL, ecc->size, false, page);
828 if (data_off + ecc->size != oob_off)
829 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
831 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
835 sunxi_nfc_randomizer_enable(mtd);
836 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
837 nfc->regs + NFC_REG_CMD);
839 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
840 sunxi_nfc_randomizer_disable(mtd);
844 *cur_off = oob_off + ecc->bytes + 4;
846 status = readl(nfc->regs + NFC_REG_ECC_ST);
847 if (status & NFC_ECC_PAT_FOUND(0)) {
850 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1)))
853 memset(data, pattern, ecc->size);
854 memset(oob, pattern, ecc->bytes + 4);
859 ret = NFC_ECC_ERR_CNT(0, readl(nfc->regs + NFC_REG_ECC_ERR_CNT(0)));
861 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
863 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
864 sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4, true, page);
866 if (status & NFC_ECC_ERR(0)) {
868 * Re-read the data with the randomizer disabled to identify
869 * bitflips in erased pages.
871 if (nand->options & NAND_NEED_SCRAMBLING) {
872 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
873 nand->read_buf(mtd, data, ecc->size);
874 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
875 nand->read_buf(mtd, oob, ecc->bytes + 4);
878 ret = nand_check_erased_ecc_chunk(data, ecc->size,
880 NULL, 0, ecc->strength);
885 * The engine protects 4 bytes of OOB data per chunk.
886 * Retrieve the corrected OOB bytes.
888 sunxi_nfc_user_data_to_buf(readl(nfc->regs +
889 NFC_REG_USER_DATA(0)),
892 /* De-randomize the Bad Block Marker. */
893 if (bbm && nand->options & NAND_NEED_SCRAMBLING)
894 sunxi_nfc_randomize_bbm(mtd, page, oob);
898 mtd->ecc_stats.failed++;
900 mtd->ecc_stats.corrected += ret;
901 *max_bitflips = max_t(unsigned int, *max_bitflips, ret);
907 static void sunxi_nfc_hw_ecc_read_extra_oob(struct mtd_info *mtd,
908 u8 *oob, int *cur_off,
909 bool randomize, int page)
911 struct nand_chip *nand = mtd_to_nand(mtd);
912 struct nand_ecc_ctrl *ecc = &nand->ecc;
913 int offset = ((ecc->bytes + 4) * ecc->steps);
914 int len = mtd->oobsize - offset;
919 if (*cur_off != offset)
920 nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
921 offset + mtd->writesize, -1);
924 sunxi_nfc_read_buf(mtd, oob + offset, len);
926 sunxi_nfc_randomizer_read_buf(mtd, oob + offset, len,
929 *cur_off = mtd->oobsize + mtd->writesize;
932 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
934 return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
937 static int sunxi_nfc_hw_ecc_write_chunk(struct mtd_info *mtd,
938 const u8 *data, int data_off,
939 const u8 *oob, int oob_off,
940 int *cur_off, bool bbm,
943 struct nand_chip *nand = mtd_to_nand(mtd);
944 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
945 struct nand_ecc_ctrl *ecc = &nand->ecc;
948 if (data_off != *cur_off)
949 nand->cmdfunc(mtd, NAND_CMD_RNDIN, data_off, -1);
951 sunxi_nfc_randomizer_write_buf(mtd, data, ecc->size, false, page);
953 /* Fill OOB data in */
954 if ((nand->options & NAND_NEED_SCRAMBLING) && bbm) {
957 memcpy(user_data, oob, 4);
958 sunxi_nfc_randomize_bbm(mtd, page, user_data);
959 writel(sunxi_nfc_buf_to_user_data(user_data),
960 nfc->regs + NFC_REG_USER_DATA(0));
962 writel(sunxi_nfc_buf_to_user_data(oob),
963 nfc->regs + NFC_REG_USER_DATA(0));
966 if (data_off + ecc->size != oob_off)
967 nand->cmdfunc(mtd, NAND_CMD_RNDIN, oob_off, -1);
969 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
973 sunxi_nfc_randomizer_enable(mtd);
974 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
975 NFC_ACCESS_DIR | NFC_ECC_OP,
976 nfc->regs + NFC_REG_CMD);
978 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
979 sunxi_nfc_randomizer_disable(mtd);
983 *cur_off = oob_off + ecc->bytes + 4;
988 static void sunxi_nfc_hw_ecc_write_extra_oob(struct mtd_info *mtd,
989 u8 *oob, int *cur_off,
992 struct nand_chip *nand = mtd_to_nand(mtd);
993 struct nand_ecc_ctrl *ecc = &nand->ecc;
994 int offset = ((ecc->bytes + 4) * ecc->steps);
995 int len = mtd->oobsize - offset;
1000 if (*cur_off != offset)
1001 nand->cmdfunc(mtd, NAND_CMD_RNDIN,
1002 offset + mtd->writesize, -1);
1004 sunxi_nfc_randomizer_write_buf(mtd, oob + offset, len, false, page);
1006 *cur_off = mtd->oobsize + mtd->writesize;
1009 static int sunxi_nfc_hw_ecc_read_page(struct mtd_info *mtd,
1010 struct nand_chip *chip, uint8_t *buf,
1011 int oob_required, int page)
1013 struct nand_ecc_ctrl *ecc = &chip->ecc;
1014 unsigned int max_bitflips = 0;
1015 int ret, i, cur_off = 0;
1016 bool raw_mode = false;
1018 sunxi_nfc_hw_ecc_enable(mtd);
1020 for (i = 0; i < ecc->steps; i++) {
1021 int data_off = i * ecc->size;
1022 int oob_off = i * (ecc->bytes + 4);
1023 u8 *data = buf + data_off;
1024 u8 *oob = chip->oob_poi + oob_off;
1026 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1027 oob_off + mtd->writesize,
1028 &cur_off, &max_bitflips,
1037 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1040 sunxi_nfc_hw_ecc_disable(mtd);
1042 return max_bitflips;
1045 static int sunxi_nfc_hw_ecc_read_subpage(struct mtd_info *mtd,
1046 struct nand_chip *chip,
1047 uint32_t data_offs, uint32_t readlen,
1048 uint8_t *bufpoi, int page)
1050 struct nand_ecc_ctrl *ecc = &chip->ecc;
1051 int ret, i, cur_off = 0;
1052 unsigned int max_bitflips = 0;
1054 sunxi_nfc_hw_ecc_enable(mtd);
1056 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
1057 for (i = data_offs / ecc->size;
1058 i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
1059 int data_off = i * ecc->size;
1060 int oob_off = i * (ecc->bytes + 4);
1061 u8 *data = bufpoi + data_off;
1062 u8 *oob = chip->oob_poi + oob_off;
1064 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off,
1065 oob, oob_off + mtd->writesize,
1066 &cur_off, &max_bitflips, !i, page);
1071 sunxi_nfc_hw_ecc_disable(mtd);
1073 return max_bitflips;
1076 static int sunxi_nfc_hw_ecc_write_page(struct mtd_info *mtd,
1077 struct nand_chip *chip,
1078 const uint8_t *buf, int oob_required,
1081 struct nand_ecc_ctrl *ecc = &chip->ecc;
1082 int ret, i, cur_off = 0;
1084 sunxi_nfc_hw_ecc_enable(mtd);
1086 for (i = 0; i < ecc->steps; i++) {
1087 int data_off = i * ecc->size;
1088 int oob_off = i * (ecc->bytes + 4);
1089 const u8 *data = buf + data_off;
1090 const u8 *oob = chip->oob_poi + oob_off;
1092 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1093 oob_off + mtd->writesize,
1094 &cur_off, !i, page);
1099 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1100 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1103 sunxi_nfc_hw_ecc_disable(mtd);
1108 static int sunxi_nfc_hw_ecc_write_subpage(struct mtd_info *mtd,
1109 struct nand_chip *chip,
1110 u32 data_offs, u32 data_len,
1111 const u8 *buf, int oob_required,
1114 struct nand_ecc_ctrl *ecc = &chip->ecc;
1115 int ret, i, cur_off = 0;
1117 sunxi_nfc_hw_ecc_enable(mtd);
1119 for (i = data_offs / ecc->size;
1120 i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
1121 int data_off = i * ecc->size;
1122 int oob_off = i * (ecc->bytes + 4);
1123 const u8 *data = buf + data_off;
1124 const u8 *oob = chip->oob_poi + oob_off;
1126 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1127 oob_off + mtd->writesize,
1128 &cur_off, !i, page);
1133 sunxi_nfc_hw_ecc_disable(mtd);
1138 static int sunxi_nfc_hw_syndrome_ecc_read_page(struct mtd_info *mtd,
1139 struct nand_chip *chip,
1140 uint8_t *buf, int oob_required,
1143 struct nand_ecc_ctrl *ecc = &chip->ecc;
1144 unsigned int max_bitflips = 0;
1145 int ret, i, cur_off = 0;
1146 bool raw_mode = false;
1148 sunxi_nfc_hw_ecc_enable(mtd);
1150 for (i = 0; i < ecc->steps; i++) {
1151 int data_off = i * (ecc->size + ecc->bytes + 4);
1152 int oob_off = data_off + ecc->size;
1153 u8 *data = buf + (i * ecc->size);
1154 u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1156 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1158 &max_bitflips, !i, page);
1166 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1169 sunxi_nfc_hw_ecc_disable(mtd);
1171 return max_bitflips;
1174 static int sunxi_nfc_hw_syndrome_ecc_write_page(struct mtd_info *mtd,
1175 struct nand_chip *chip,
1177 int oob_required, int page)
1179 struct nand_ecc_ctrl *ecc = &chip->ecc;
1180 int ret, i, cur_off = 0;
1182 sunxi_nfc_hw_ecc_enable(mtd);
1184 for (i = 0; i < ecc->steps; i++) {
1185 int data_off = i * (ecc->size + ecc->bytes + 4);
1186 int oob_off = data_off + ecc->size;
1187 const u8 *data = buf + (i * ecc->size);
1188 const u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1190 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off,
1191 oob, oob_off, &cur_off,
1197 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1198 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1201 sunxi_nfc_hw_ecc_disable(mtd);
1206 static const s32 tWB_lut[] = {6, 12, 16, 20};
1207 static const s32 tRHW_lut[] = {4, 8, 12, 20};
1209 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
1212 u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
1215 for (i = 0; i < lut_size; i++) {
1216 if (clk_cycles <= lut[i])
1224 #define sunxi_nand_lookup_timing(l, p, c) \
1225 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1227 static int sunxi_nand_chip_set_timings(struct sunxi_nand_chip *chip,
1228 const struct nand_sdr_timings *timings)
1230 u32 min_clk_period = 0;
1231 s32 tWB, tADL, tWHR, tRHW, tCAD;
1234 if (timings->tCLS_min > min_clk_period)
1235 min_clk_period = timings->tCLS_min;
1238 if (timings->tCLH_min > min_clk_period)
1239 min_clk_period = timings->tCLH_min;
1242 if (timings->tCS_min > min_clk_period)
1243 min_clk_period = timings->tCS_min;
1246 if (timings->tCH_min > min_clk_period)
1247 min_clk_period = timings->tCH_min;
1250 if (timings->tWP_min > min_clk_period)
1251 min_clk_period = timings->tWP_min;
1254 if (timings->tWH_min > min_clk_period)
1255 min_clk_period = timings->tWH_min;
1258 if (timings->tALS_min > min_clk_period)
1259 min_clk_period = timings->tALS_min;
1262 if (timings->tDS_min > min_clk_period)
1263 min_clk_period = timings->tDS_min;
1266 if (timings->tDH_min > min_clk_period)
1267 min_clk_period = timings->tDH_min;
1270 if (timings->tRR_min > (min_clk_period * 3))
1271 min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
1274 if (timings->tALH_min > min_clk_period)
1275 min_clk_period = timings->tALH_min;
1278 if (timings->tRP_min > min_clk_period)
1279 min_clk_period = timings->tRP_min;
1282 if (timings->tREH_min > min_clk_period)
1283 min_clk_period = timings->tREH_min;
1286 if (timings->tRC_min > (min_clk_period * 2))
1287 min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
1290 if (timings->tWC_min > (min_clk_period * 2))
1291 min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
1293 /* T16 - T19 + tCAD */
1294 tWB = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
1297 dev_err(nfc->dev, "unsupported tWB\n");
1301 tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
1303 dev_err(nfc->dev, "unsupported tADL\n");
1307 tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
1309 dev_err(nfc->dev, "unsupported tWHR\n");
1313 tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
1316 dev_err(nfc->dev, "unsupported tRHW\n");
1321 * TODO: according to ONFI specs this value only applies for DDR NAND,
1322 * but Allwinner seems to set this to 0x7. Mimic them for now.
1326 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1327 chip->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
1330 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1331 * output cycle timings shall be used if the host drives tRC less than
1334 chip->timing_ctl = (timings->tRC_min < 30000) ? NFC_TIMING_CTL_EDO : 0;
1336 /* Convert min_clk_period from picoseconds to nanoseconds */
1337 min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
1340 * Convert min_clk_period into a clk frequency, then get the
1341 * appropriate rate for the NAND controller IP given this formula
1342 * (specified in the datasheet):
1343 * nand clk_rate = min_clk_rate
1345 chip->clk_rate = 1000000000L / min_clk_period;
1350 static int sunxi_nand_chip_init_timings(struct sunxi_nand_chip *chip)
1352 struct mtd_info *mtd = nand_to_mtd(&chip->nand);
1353 const struct nand_sdr_timings *timings;
1357 mode = onfi_get_async_timing_mode(&chip->nand);
1358 if (mode == ONFI_TIMING_MODE_UNKNOWN) {
1359 mode = chip->nand.onfi_timing_mode_default;
1361 uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {};
1364 mode = fls(mode) - 1;
1369 for (i = 0; i < chip->nsels; i++) {
1370 chip->nand.select_chip(mtd, i);
1371 ret = chip->nand.onfi_set_features(mtd,
1373 ONFI_FEATURE_ADDR_TIMING_MODE,
1375 chip->nand.select_chip(mtd, -1);
1376 if (ret && ret != -ENOTSUPP)
1381 timings = onfi_async_timing_mode_to_sdr_timings(mode);
1382 if (IS_ERR(timings))
1383 return PTR_ERR(timings);
1385 return sunxi_nand_chip_set_timings(chip, timings);
1388 static int sunxi_nand_hw_common_ecc_ctrl_init(struct mtd_info *mtd,
1389 struct nand_ecc_ctrl *ecc)
1391 static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1392 struct sunxi_nand_hw_ecc *data;
1393 struct nand_ecclayout *layout;
1398 data = kzalloc(sizeof(*data), GFP_KERNEL);
1402 if (ecc->size != 512 && ecc->size != 1024)
1405 /* Prefer 1k ECC chunk over 512 ones */
1406 if (ecc->size == 512 && mtd->writesize > 512) {
1411 /* Add ECC info retrieval from DT */
1412 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1413 if (ecc->strength <= strengths[i]) {
1415 * Update ecc->strength value with the actual strength
1416 * that will be used by the ECC engine.
1418 ecc->strength = strengths[i];
1423 if (i >= ARRAY_SIZE(strengths)) {
1424 dev_err(nfc->dev, "unsupported strength\n");
1431 /* HW ECC always request ECC bytes for 1024 bytes blocks */
1432 ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
1434 /* HW ECC always work with even numbers of ECC bytes */
1435 ecc->bytes = ALIGN(ecc->bytes, 2);
1437 layout = &data->layout;
1438 nsectors = mtd->writesize / ecc->size;
1440 if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
1445 layout->eccbytes = (ecc->bytes * nsectors);
1447 ecc->layout = layout;
1459 static void sunxi_nand_hw_common_ecc_ctrl_cleanup(struct nand_ecc_ctrl *ecc)
1463 #endif /* __UBOOT__ */
1465 static int sunxi_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
1466 struct nand_ecc_ctrl *ecc)
1468 struct nand_ecclayout *layout;
1473 ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
1477 ecc->read_page = sunxi_nfc_hw_ecc_read_page;
1478 ecc->write_page = sunxi_nfc_hw_ecc_write_page;
1479 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
1480 ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
1481 layout = ecc->layout;
1482 nsectors = mtd->writesize / ecc->size;
1484 for (i = 0; i < nsectors; i++) {
1486 layout->oobfree[i].offset =
1487 layout->oobfree[i - 1].offset +
1488 layout->oobfree[i - 1].length +
1490 layout->oobfree[i].length = 4;
1493 * The first 2 bytes are used for BB markers, hence we
1494 * only have 2 bytes available in the first user data
1497 layout->oobfree[i].length = 2;
1498 layout->oobfree[i].offset = 2;
1501 for (j = 0; j < ecc->bytes; j++)
1502 layout->eccpos[(ecc->bytes * i) + j] =
1503 layout->oobfree[i].offset +
1504 layout->oobfree[i].length + j;
1507 if (mtd->oobsize > (ecc->bytes + 4) * nsectors) {
1508 layout->oobfree[nsectors].offset =
1509 layout->oobfree[nsectors - 1].offset +
1510 layout->oobfree[nsectors - 1].length +
1512 layout->oobfree[nsectors].length = mtd->oobsize -
1513 ((ecc->bytes + 4) * nsectors);
1519 static int sunxi_nand_hw_syndrome_ecc_ctrl_init(struct mtd_info *mtd,
1520 struct nand_ecc_ctrl *ecc)
1522 struct nand_ecclayout *layout;
1527 ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
1532 ecc->read_page = sunxi_nfc_hw_syndrome_ecc_read_page;
1533 ecc->write_page = sunxi_nfc_hw_syndrome_ecc_write_page;
1535 layout = ecc->layout;
1536 nsectors = mtd->writesize / ecc->size;
1538 for (i = 0; i < (ecc->bytes * nsectors); i++)
1539 layout->eccpos[i] = i;
1541 layout->oobfree[0].length = mtd->oobsize - i;
1542 layout->oobfree[0].offset = i;
1548 static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl *ecc)
1550 switch (ecc->mode) {
1552 case NAND_ECC_HW_SYNDROME:
1553 sunxi_nand_hw_common_ecc_ctrl_cleanup(ecc);
1561 #endif /* __UBOOT__ */
1563 static int sunxi_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc)
1565 struct nand_chip *nand = mtd_to_nand(mtd);
1569 ecc->size = nand->ecc_step_ds;
1570 ecc->strength = nand->ecc_strength_ds;
1573 if (!ecc->size || !ecc->strength)
1576 switch (ecc->mode) {
1577 case NAND_ECC_SOFT_BCH:
1580 ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc);
1584 case NAND_ECC_HW_SYNDROME:
1585 ret = sunxi_nand_hw_syndrome_ecc_ctrl_init(mtd, ecc);
1590 ecc->layout = kzalloc(sizeof(*ecc->layout), GFP_KERNEL);
1593 ecc->layout->oobfree[0].length = mtd->oobsize;
1603 static int sunxi_nand_chip_init(int node, struct sunxi_nfc *nfc, int devnum)
1605 const struct nand_sdr_timings *timings;
1606 const void *blob = gd->fdt_blob;
1607 struct sunxi_nand_chip *chip;
1608 struct mtd_info *mtd;
1609 struct nand_chip *nand;
1615 if (!fdt_getprop(blob, node, "reg", &nsels))
1618 nsels /= sizeof(u32);
1619 if (!nsels || nsels > 8) {
1620 dev_err(dev, "invalid reg property size\n");
1624 chip = kzalloc(sizeof(*chip) +
1625 (nsels * sizeof(struct sunxi_nand_chip_sel)),
1628 dev_err(dev, "could not allocate chip\n");
1632 chip->nsels = nsels;
1633 chip->selected = -1;
1635 for (i = 0; i < nsels; i++) {
1640 ret = fdtdec_get_int_array(gd->fdt_blob, node, "reg", cs, nsels);
1642 dev_err(dev, "could not retrieve reg property: %d\n", ret);
1646 ret = fdtdec_get_int_array(gd->fdt_blob, node, "allwinner,rb", rb,
1649 dev_err(dev, "could not retrieve reg property: %d\n", ret);
1653 for (i = 0; i < nsels; i++) {
1656 if (tmp > NFC_MAX_CS) {
1658 "invalid reg value: %u (max CS = 7)\n",
1663 if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
1664 dev_err(dev, "CS %d already assigned\n", tmp);
1668 chip->sels[i].cs = tmp;
1671 if (tmp >= 0 && tmp < 2) {
1672 chip->sels[i].rb.type = RB_NATIVE;
1673 chip->sels[i].rb.info.nativeid = tmp;
1675 ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
1677 &chip->sels[i].rb.info.gpio,
1680 chip->sels[i].rb.type = RB_GPIO;
1682 chip->sels[i].rb.type = RB_NONE;
1686 timings = onfi_async_timing_mode_to_sdr_timings(0);
1687 if (IS_ERR(timings)) {
1688 ret = PTR_ERR(timings);
1690 "could not retrieve timings for ONFI mode 0: %d\n",
1695 ret = sunxi_nand_chip_set_timings(chip, timings);
1697 dev_err(dev, "could not configure chip timings: %d\n", ret);
1702 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
1703 nand->chip_delay = 200;
1704 nand->controller = &nfc->controller;
1706 * Set the ECC mode to the default value in case nothing is specified
1709 nand->ecc.mode = NAND_ECC_HW;
1710 nand->flash_node = node;
1711 nand->select_chip = sunxi_nfc_select_chip;
1712 nand->cmd_ctrl = sunxi_nfc_cmd_ctrl;
1713 nand->read_buf = sunxi_nfc_read_buf;
1714 nand->write_buf = sunxi_nfc_write_buf;
1715 nand->read_byte = sunxi_nfc_read_byte;
1717 mtd = nand_to_mtd(nand);
1718 ret = nand_scan_ident(mtd, nsels, NULL);
1722 if (nand->bbt_options & NAND_BBT_USE_FLASH)
1723 nand->bbt_options |= NAND_BBT_NO_OOB;
1725 if (nand->options & NAND_NEED_SCRAMBLING)
1726 nand->options |= NAND_NO_SUBPAGE_WRITE;
1728 nand->options |= NAND_SUBPAGE_READ;
1730 ret = sunxi_nand_chip_init_timings(chip);
1732 dev_err(dev, "could not configure chip timings: %d\n", ret);
1736 ret = sunxi_nand_ecc_init(mtd, &nand->ecc);
1738 dev_err(dev, "ECC init failed: %d\n", ret);
1742 ret = nand_scan_tail(mtd);
1744 dev_err(dev, "nand_scan_tail failed: %d\n", ret);
1748 ret = nand_register(devnum, mtd);
1750 dev_err(dev, "failed to register mtd device: %d\n", ret);
1754 list_add_tail(&chip->node, &nfc->chips);
1759 static int sunxi_nand_chips_init(int node, struct sunxi_nfc *nfc)
1761 const void *blob = gd->fdt_blob;
1765 for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
1766 nand_node = fdt_next_subnode(blob, nand_node))
1770 dev_err(dev, "too many NAND chips: %d (max = 8)\n", i);
1775 for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
1776 nand_node = fdt_next_subnode(blob, nand_node)) {
1777 ret = sunxi_nand_chip_init(nand_node, nfc, i++);
1786 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
1788 struct sunxi_nand_chip *chip;
1790 while (!list_empty(&nfc->chips)) {
1791 chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip,
1793 nand_release(&chip->mtd);
1794 sunxi_nand_ecc_cleanup(&chip->nand.ecc);
1795 list_del(&chip->node);
1799 #endif /* __UBOOT__ */
1801 void sunxi_nand_init(void)
1803 const void *blob = gd->fdt_blob;
1804 struct sunxi_nfc *nfc;
1809 nfc = kzalloc(sizeof(*nfc), GFP_KERNEL);
1813 spin_lock_init(&nfc->controller.lock);
1814 init_waitqueue_head(&nfc->controller.wq);
1815 INIT_LIST_HEAD(&nfc->chips);
1817 node = fdtdec_next_compatible(blob, 0, COMPAT_SUNXI_NAND);
1819 pr_err("unable to find nfc node in device tree\n");
1823 if (!fdtdec_get_is_enabled(blob, node)) {
1824 pr_err("nfc disabled in device tree\n");
1828 regs = fdtdec_get_addr(blob, node, "reg");
1829 if (regs == FDT_ADDR_T_NONE) {
1830 pr_err("unable to find nfc address in device tree\n");
1834 nfc->regs = (void *)regs;
1836 ret = sunxi_nfc_rst(nfc);
1840 ret = sunxi_nand_chips_init(node, nfc);
1842 dev_err(dev, "failed to init nand chips\n");
1852 MODULE_LICENSE("GPL v2");
1853 MODULE_AUTHOR("Boris BREZILLON");
1854 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");