1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com>
6 * https://github.com/yuq/sunxi-nfc-mtd
7 * Copyright (C) 2013 Qiang Yu <yuq825@gmail.com>
9 * https://github.com/hno/Allwinner-Info
10 * Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
12 * Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com>
13 * Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org>
16 #include <linux/dma-mapping.h>
17 #include <linux/slab.h>
18 #include <linux/module.h>
19 #include <linux/moduleparam.h>
20 #include <linux/platform_device.h>
22 #include <linux/of_device.h>
23 #include <linux/mtd/mtd.h>
24 #include <linux/mtd/rawnand.h>
25 #include <linux/mtd/partitions.h>
26 #include <linux/clk.h>
27 #include <linux/delay.h>
28 #include <linux/dmaengine.h>
29 #include <linux/interrupt.h>
30 #include <linux/iopoll.h>
31 #include <linux/reset.h>
33 #define NFC_REG_CTL 0x0000
34 #define NFC_REG_ST 0x0004
35 #define NFC_REG_INT 0x0008
36 #define NFC_REG_TIMING_CTL 0x000C
37 #define NFC_REG_TIMING_CFG 0x0010
38 #define NFC_REG_ADDR_LOW 0x0014
39 #define NFC_REG_ADDR_HIGH 0x0018
40 #define NFC_REG_SECTOR_NUM 0x001C
41 #define NFC_REG_CNT 0x0020
42 #define NFC_REG_CMD 0x0024
43 #define NFC_REG_RCMD_SET 0x0028
44 #define NFC_REG_WCMD_SET 0x002C
45 #define NFC_REG_A10_IO_DATA 0x0030
46 #define NFC_REG_ECC_CTL 0x0034
47 #define NFC_REG_ECC_ST 0x0038
48 #define NFC_REG_DEBUG 0x003C
49 #define NFC_REG_ECC_ERR_CNT(x) ((0x0040 + (x)) & ~0x3)
50 #define NFC_REG_USER_DATA(x) (0x0050 + ((x) * 4))
51 #define NFC_REG_SPARE_AREA 0x00A0
52 #define NFC_REG_PAT_ID 0x00A4
53 #define NFC_RAM0_BASE 0x0400
54 #define NFC_RAM1_BASE 0x0800
56 /* define bit use in NFC_CTL */
58 #define NFC_RESET BIT(1)
59 #define NFC_BUS_WIDTH_MSK BIT(2)
60 #define NFC_BUS_WIDTH_8 (0 << 2)
61 #define NFC_BUS_WIDTH_16 (1 << 2)
62 #define NFC_RB_SEL_MSK BIT(3)
63 #define NFC_RB_SEL(x) ((x) << 3)
64 #define NFC_CE_SEL_MSK GENMASK(26, 24)
65 #define NFC_CE_SEL(x) ((x) << 24)
66 #define NFC_CE_CTL BIT(6)
67 #define NFC_PAGE_SHIFT_MSK GENMASK(11, 8)
68 #define NFC_PAGE_SHIFT(x) (((x) < 10 ? 0 : (x) - 10) << 8)
69 #define NFC_SAM BIT(12)
70 #define NFC_RAM_METHOD BIT(14)
71 #define NFC_DEBUG_CTL BIT(31)
73 /* define bit use in NFC_ST */
74 #define NFC_RB_B2R BIT(0)
75 #define NFC_CMD_INT_FLAG BIT(1)
76 #define NFC_DMA_INT_FLAG BIT(2)
77 #define NFC_CMD_FIFO_STATUS BIT(3)
78 #define NFC_STA BIT(4)
79 #define NFC_NATCH_INT_FLAG BIT(5)
80 #define NFC_RB_STATE(x) BIT(x + 8)
82 /* define bit use in NFC_INT */
83 #define NFC_B2R_INT_ENABLE BIT(0)
84 #define NFC_CMD_INT_ENABLE BIT(1)
85 #define NFC_DMA_INT_ENABLE BIT(2)
86 #define NFC_INT_MASK (NFC_B2R_INT_ENABLE | \
87 NFC_CMD_INT_ENABLE | \
90 /* define bit use in NFC_TIMING_CTL */
91 #define NFC_TIMING_CTL_EDO BIT(8)
93 /* define NFC_TIMING_CFG register layout */
94 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD) \
95 (((tWB) & 0x3) | (((tADL) & 0x3) << 2) | \
96 (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) | \
97 (((tCAD) & 0x7) << 8))
99 /* define bit use in NFC_CMD */
100 #define NFC_CMD_LOW_BYTE_MSK GENMASK(7, 0)
101 #define NFC_CMD_HIGH_BYTE_MSK GENMASK(15, 8)
102 #define NFC_CMD(x) (x)
103 #define NFC_ADR_NUM_MSK GENMASK(18, 16)
104 #define NFC_ADR_NUM(x) (((x) - 1) << 16)
105 #define NFC_SEND_ADR BIT(19)
106 #define NFC_ACCESS_DIR BIT(20)
107 #define NFC_DATA_TRANS BIT(21)
108 #define NFC_SEND_CMD1 BIT(22)
109 #define NFC_WAIT_FLAG BIT(23)
110 #define NFC_SEND_CMD2 BIT(24)
111 #define NFC_SEQ BIT(25)
112 #define NFC_DATA_SWAP_METHOD BIT(26)
113 #define NFC_ROW_AUTO_INC BIT(27)
114 #define NFC_SEND_CMD3 BIT(28)
115 #define NFC_SEND_CMD4 BIT(29)
116 #define NFC_CMD_TYPE_MSK GENMASK(31, 30)
117 #define NFC_NORMAL_OP (0 << 30)
118 #define NFC_ECC_OP (1 << 30)
119 #define NFC_PAGE_OP (2U << 30)
121 /* define bit use in NFC_RCMD_SET */
122 #define NFC_READ_CMD_MSK GENMASK(7, 0)
123 #define NFC_RND_READ_CMD0_MSK GENMASK(15, 8)
124 #define NFC_RND_READ_CMD1_MSK GENMASK(23, 16)
126 /* define bit use in NFC_WCMD_SET */
127 #define NFC_PROGRAM_CMD_MSK GENMASK(7, 0)
128 #define NFC_RND_WRITE_CMD_MSK GENMASK(15, 8)
129 #define NFC_READ_CMD0_MSK GENMASK(23, 16)
130 #define NFC_READ_CMD1_MSK GENMASK(31, 24)
132 /* define bit use in NFC_ECC_CTL */
133 #define NFC_ECC_EN BIT(0)
134 #define NFC_ECC_PIPELINE BIT(3)
135 #define NFC_ECC_EXCEPTION BIT(4)
136 #define NFC_ECC_BLOCK_SIZE_MSK BIT(5)
137 #define NFC_ECC_BLOCK_512 BIT(5)
138 #define NFC_RANDOM_EN BIT(9)
139 #define NFC_RANDOM_DIRECTION BIT(10)
140 #define NFC_ECC_MODE_MSK GENMASK(15, 12)
141 #define NFC_ECC_MODE(x) ((x) << 12)
142 #define NFC_RANDOM_SEED_MSK GENMASK(30, 16)
143 #define NFC_RANDOM_SEED(x) ((x) << 16)
145 /* define bit use in NFC_ECC_ST */
146 #define NFC_ECC_ERR(x) BIT(x)
147 #define NFC_ECC_ERR_MSK GENMASK(15, 0)
148 #define NFC_ECC_PAT_FOUND(x) BIT(x + 16)
149 #define NFC_ECC_ERR_CNT(b, x) (((x) >> (((b) % 4) * 8)) & 0xff)
151 #define NFC_DEFAULT_TIMEOUT_MS 1000
153 #define NFC_SRAM_SIZE 1024
158 * struct sunxi_nand_chip_sel - stores information related to NAND Chip Select
160 * @cs: the NAND CS id used to communicate with a NAND Chip
161 * @rb: the Ready/Busy pin ID. -1 means no R/B pin connected to the NFC
163 struct sunxi_nand_chip_sel
{
169 * struct sunxi_nand_hw_ecc - stores information related to HW ECC support
171 * @mode: the sunxi ECC mode field deduced from ECC requirements
173 struct sunxi_nand_hw_ecc
{
178 * struct sunxi_nand_chip - stores NAND chip device related information
180 * @node: used to store NAND chips into a list
181 * @nand: base NAND chip structure
182 * @clk_rate: clk_rate required for this NAND chip
183 * @timing_cfg: TIMING_CFG register value for this NAND chip
184 * @timing_ctl: TIMING_CTL register value for this NAND chip
185 * @nsels: number of CS lines required by the NAND chip
186 * @sels: array of CS lines descriptions
188 struct sunxi_nand_chip
{
189 struct list_head node
;
190 struct nand_chip nand
;
191 unsigned long clk_rate
;
195 struct sunxi_nand_chip_sel sels
[0];
198 static inline struct sunxi_nand_chip
*to_sunxi_nand(struct nand_chip
*nand
)
200 return container_of(nand
, struct sunxi_nand_chip
, nand
);
204 * NAND Controller capabilities structure: stores NAND controller capabilities
205 * for distinction between compatible strings.
207 * @reg_io_data: I/O data register
208 * @dma_maxburst: DMA maxburst
210 struct sunxi_nfc_caps
{
211 unsigned int reg_io_data
;
212 unsigned int dma_maxburst
;
216 * struct sunxi_nfc - stores sunxi NAND controller information
218 * @controller: base controller structure
219 * @dev: parent device (used to print error messages)
220 * @regs: NAND controller registers
221 * @ahb_clk: NAND controller AHB clock
222 * @mod_clk: NAND controller mod clock
223 * @reset: NAND controller reset line
224 * @assigned_cs: bitmask describing already assigned CS lines
225 * @clk_rate: NAND controller current clock rate
226 * @chips: a list containing all the NAND chips attached to this NAND
228 * @complete: a completion object used to wait for NAND controller events
229 * @dmac: the DMA channel attached to the NAND controller
232 struct nand_controller controller
;
237 struct reset_control
*reset
;
238 unsigned long assigned_cs
;
239 unsigned long clk_rate
;
240 struct list_head chips
;
241 struct completion complete
;
242 struct dma_chan
*dmac
;
243 const struct sunxi_nfc_caps
*caps
;
246 static inline struct sunxi_nfc
*to_sunxi_nfc(struct nand_controller
*ctrl
)
248 return container_of(ctrl
, struct sunxi_nfc
, controller
);
251 static irqreturn_t
sunxi_nfc_interrupt(int irq
, void *dev_id
)
253 struct sunxi_nfc
*nfc
= dev_id
;
254 u32 st
= readl(nfc
->regs
+ NFC_REG_ST
);
255 u32 ien
= readl(nfc
->regs
+ NFC_REG_INT
);
260 if ((ien
& st
) == ien
)
261 complete(&nfc
->complete
);
263 writel(st
& NFC_INT_MASK
, nfc
->regs
+ NFC_REG_ST
);
264 writel(~st
& ien
& NFC_INT_MASK
, nfc
->regs
+ NFC_REG_INT
);
269 static int sunxi_nfc_wait_events(struct sunxi_nfc
*nfc
, u32 events
,
270 bool use_polling
, unsigned int timeout_ms
)
274 if (events
& ~NFC_INT_MASK
)
278 timeout_ms
= NFC_DEFAULT_TIMEOUT_MS
;
281 init_completion(&nfc
->complete
);
283 writel(events
, nfc
->regs
+ NFC_REG_INT
);
285 ret
= wait_for_completion_timeout(&nfc
->complete
,
286 msecs_to_jiffies(timeout_ms
));
292 writel(0, nfc
->regs
+ NFC_REG_INT
);
296 ret
= readl_poll_timeout(nfc
->regs
+ NFC_REG_ST
, status
,
297 (status
& events
) == events
, 1,
301 writel(events
& NFC_INT_MASK
, nfc
->regs
+ NFC_REG_ST
);
304 dev_err(nfc
->dev
, "wait interrupt timedout\n");
309 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc
*nfc
)
314 ret
= readl_poll_timeout(nfc
->regs
+ NFC_REG_ST
, status
,
315 !(status
& NFC_CMD_FIFO_STATUS
), 1,
316 NFC_DEFAULT_TIMEOUT_MS
* 1000);
318 dev_err(nfc
->dev
, "wait for empty cmd FIFO timedout\n");
323 static int sunxi_nfc_rst(struct sunxi_nfc
*nfc
)
328 writel(0, nfc
->regs
+ NFC_REG_ECC_CTL
);
329 writel(NFC_RESET
, nfc
->regs
+ NFC_REG_CTL
);
331 ret
= readl_poll_timeout(nfc
->regs
+ NFC_REG_CTL
, ctl
,
332 !(ctl
& NFC_RESET
), 1,
333 NFC_DEFAULT_TIMEOUT_MS
* 1000);
335 dev_err(nfc
->dev
, "wait for NAND controller reset timedout\n");
340 static int sunxi_nfc_dma_op_prepare(struct sunxi_nfc
*nfc
, const void *buf
,
341 int chunksize
, int nchunks
,
342 enum dma_data_direction ddir
,
343 struct scatterlist
*sg
)
345 struct dma_async_tx_descriptor
*dmad
;
346 enum dma_transfer_direction tdir
;
350 if (ddir
== DMA_FROM_DEVICE
)
351 tdir
= DMA_DEV_TO_MEM
;
353 tdir
= DMA_MEM_TO_DEV
;
355 sg_init_one(sg
, buf
, nchunks
* chunksize
);
356 ret
= dma_map_sg(nfc
->dev
, sg
, 1, ddir
);
360 dmad
= dmaengine_prep_slave_sg(nfc
->dmac
, sg
, 1, tdir
, DMA_CTRL_ACK
);
366 writel(readl(nfc
->regs
+ NFC_REG_CTL
) | NFC_RAM_METHOD
,
367 nfc
->regs
+ NFC_REG_CTL
);
368 writel(nchunks
, nfc
->regs
+ NFC_REG_SECTOR_NUM
);
369 writel(chunksize
, nfc
->regs
+ NFC_REG_CNT
);
370 dmat
= dmaengine_submit(dmad
);
372 ret
= dma_submit_error(dmat
);
374 goto err_clr_dma_flag
;
379 writel(readl(nfc
->regs
+ NFC_REG_CTL
) & ~NFC_RAM_METHOD
,
380 nfc
->regs
+ NFC_REG_CTL
);
383 dma_unmap_sg(nfc
->dev
, sg
, 1, ddir
);
387 static void sunxi_nfc_dma_op_cleanup(struct sunxi_nfc
*nfc
,
388 enum dma_data_direction ddir
,
389 struct scatterlist
*sg
)
391 dma_unmap_sg(nfc
->dev
, sg
, 1, ddir
);
392 writel(readl(nfc
->regs
+ NFC_REG_CTL
) & ~NFC_RAM_METHOD
,
393 nfc
->regs
+ NFC_REG_CTL
);
396 static void sunxi_nfc_select_chip(struct nand_chip
*nand
, unsigned int cs
)
398 struct mtd_info
*mtd
= nand_to_mtd(nand
);
399 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
400 struct sunxi_nfc
*nfc
= to_sunxi_nfc(sunxi_nand
->nand
.controller
);
401 struct sunxi_nand_chip_sel
*sel
;
404 if (cs
> 0 && cs
>= sunxi_nand
->nsels
)
407 ctl
= readl(nfc
->regs
+ NFC_REG_CTL
) &
408 ~(NFC_PAGE_SHIFT_MSK
| NFC_CE_SEL_MSK
| NFC_RB_SEL_MSK
| NFC_EN
);
410 sel
= &sunxi_nand
->sels
[cs
];
411 ctl
|= NFC_CE_SEL(sel
->cs
) | NFC_EN
| NFC_PAGE_SHIFT(nand
->page_shift
);
413 ctl
|= NFC_RB_SEL(sel
->rb
);
415 writel(mtd
->writesize
, nfc
->regs
+ NFC_REG_SPARE_AREA
);
417 if (nfc
->clk_rate
!= sunxi_nand
->clk_rate
) {
418 clk_set_rate(nfc
->mod_clk
, sunxi_nand
->clk_rate
);
419 nfc
->clk_rate
= sunxi_nand
->clk_rate
;
422 writel(sunxi_nand
->timing_ctl
, nfc
->regs
+ NFC_REG_TIMING_CTL
);
423 writel(sunxi_nand
->timing_cfg
, nfc
->regs
+ NFC_REG_TIMING_CFG
);
424 writel(ctl
, nfc
->regs
+ NFC_REG_CTL
);
427 static void sunxi_nfc_read_buf(struct nand_chip
*nand
, uint8_t *buf
, int len
)
429 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
430 struct sunxi_nfc
*nfc
= to_sunxi_nfc(sunxi_nand
->nand
.controller
);
439 cnt
= min(len
- offs
, NFC_SRAM_SIZE
);
441 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
445 writel(cnt
, nfc
->regs
+ NFC_REG_CNT
);
446 tmp
= NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
;
447 writel(tmp
, nfc
->regs
+ NFC_REG_CMD
);
449 /* Arbitrary limit for polling mode */
453 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, poll
, 0);
458 memcpy_fromio(buf
+ offs
, nfc
->regs
+ NFC_RAM0_BASE
,
464 static void sunxi_nfc_write_buf(struct nand_chip
*nand
, const uint8_t *buf
,
467 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
468 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 memcpy_toio(nfc
->regs
+ NFC_RAM0_BASE
, buf
+ offs
, cnt
);
485 tmp
= NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
|
487 writel(tmp
, nfc
->regs
+ NFC_REG_CMD
);
489 /* Arbitrary limit for polling mode */
493 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, poll
, 0);
501 /* These seed values have been extracted from Allwinner's BSP */
502 static const u16 sunxi_nfc_randomizer_page_seeds
[] = {
503 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
504 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
505 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
506 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
507 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
508 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
509 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
510 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
511 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
512 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
513 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
514 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
515 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
516 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
517 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
518 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
522 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
523 * have been generated using
524 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
525 * the randomizer engine does internally before de/scrambling OOB data.
527 * Those tables are statically defined to avoid calculating randomizer state
530 static const u16 sunxi_nfc_randomizer_ecc512_seeds
[] = {
531 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
532 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
533 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
534 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
535 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
536 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
537 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
538 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
539 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
540 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
541 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
542 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
543 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
544 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
545 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
546 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
549 static const u16 sunxi_nfc_randomizer_ecc1024_seeds
[] = {
550 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
551 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
552 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
553 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
554 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
555 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
556 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
557 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
558 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
559 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
560 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
561 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
562 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
563 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
564 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
565 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
568 static u16
sunxi_nfc_randomizer_step(u16 state
, int count
)
573 * This loop is just a simple implementation of a Fibonacci LFSR using
574 * the x16 + x15 + 1 polynomial.
577 state
= ((state
>> 1) |
578 (((state
^ (state
>> 1)) & 1) << 14)) & 0x7fff;
583 static u16
sunxi_nfc_randomizer_state(struct nand_chip
*nand
, int page
,
586 struct mtd_info
*mtd
= nand_to_mtd(nand
);
587 const u16
*seeds
= sunxi_nfc_randomizer_page_seeds
;
588 int mod
= mtd_div_by_ws(mtd
->erasesize
, mtd
);
590 if (mod
> ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds
))
591 mod
= ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds
);
594 if (mtd
->ecc_step_size
== 512)
595 seeds
= sunxi_nfc_randomizer_ecc512_seeds
;
597 seeds
= sunxi_nfc_randomizer_ecc1024_seeds
;
600 return seeds
[page
% mod
];
603 static void sunxi_nfc_randomizer_config(struct nand_chip
*nand
, int page
,
606 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
607 u32 ecc_ctl
= readl(nfc
->regs
+ NFC_REG_ECC_CTL
);
610 if (!(nand
->options
& NAND_NEED_SCRAMBLING
))
613 ecc_ctl
= readl(nfc
->regs
+ NFC_REG_ECC_CTL
);
614 state
= sunxi_nfc_randomizer_state(nand
, page
, ecc
);
615 ecc_ctl
= readl(nfc
->regs
+ NFC_REG_ECC_CTL
) & ~NFC_RANDOM_SEED_MSK
;
616 writel(ecc_ctl
| NFC_RANDOM_SEED(state
), nfc
->regs
+ NFC_REG_ECC_CTL
);
619 static void sunxi_nfc_randomizer_enable(struct nand_chip
*nand
)
621 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
623 if (!(nand
->options
& NAND_NEED_SCRAMBLING
))
626 writel(readl(nfc
->regs
+ NFC_REG_ECC_CTL
) | NFC_RANDOM_EN
,
627 nfc
->regs
+ NFC_REG_ECC_CTL
);
630 static void sunxi_nfc_randomizer_disable(struct nand_chip
*nand
)
632 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
634 if (!(nand
->options
& NAND_NEED_SCRAMBLING
))
637 writel(readl(nfc
->regs
+ NFC_REG_ECC_CTL
) & ~NFC_RANDOM_EN
,
638 nfc
->regs
+ NFC_REG_ECC_CTL
);
641 static void sunxi_nfc_randomize_bbm(struct nand_chip
*nand
, int page
, u8
*bbm
)
643 u16 state
= sunxi_nfc_randomizer_state(nand
, page
, true);
646 bbm
[1] ^= sunxi_nfc_randomizer_step(state
, 8);
649 static void sunxi_nfc_randomizer_write_buf(struct nand_chip
*nand
,
650 const uint8_t *buf
, int len
,
653 sunxi_nfc_randomizer_config(nand
, page
, ecc
);
654 sunxi_nfc_randomizer_enable(nand
);
655 sunxi_nfc_write_buf(nand
, buf
, len
);
656 sunxi_nfc_randomizer_disable(nand
);
659 static void sunxi_nfc_randomizer_read_buf(struct nand_chip
*nand
, uint8_t *buf
,
660 int len
, bool ecc
, int page
)
662 sunxi_nfc_randomizer_config(nand
, page
, ecc
);
663 sunxi_nfc_randomizer_enable(nand
);
664 sunxi_nfc_read_buf(nand
, buf
, len
);
665 sunxi_nfc_randomizer_disable(nand
);
668 static void sunxi_nfc_hw_ecc_enable(struct nand_chip
*nand
)
670 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
671 struct sunxi_nand_hw_ecc
*data
= nand
->ecc
.priv
;
674 ecc_ctl
= readl(nfc
->regs
+ NFC_REG_ECC_CTL
);
675 ecc_ctl
&= ~(NFC_ECC_MODE_MSK
| NFC_ECC_PIPELINE
|
676 NFC_ECC_BLOCK_SIZE_MSK
);
677 ecc_ctl
|= NFC_ECC_EN
| NFC_ECC_MODE(data
->mode
) | NFC_ECC_EXCEPTION
|
680 if (nand
->ecc
.size
== 512)
681 ecc_ctl
|= NFC_ECC_BLOCK_512
;
683 writel(ecc_ctl
, nfc
->regs
+ NFC_REG_ECC_CTL
);
686 static void sunxi_nfc_hw_ecc_disable(struct nand_chip
*nand
)
688 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
690 writel(readl(nfc
->regs
+ NFC_REG_ECC_CTL
) & ~NFC_ECC_EN
,
691 nfc
->regs
+ NFC_REG_ECC_CTL
);
694 static inline void sunxi_nfc_user_data_to_buf(u32 user_data
, u8
*buf
)
697 buf
[1] = user_data
>> 8;
698 buf
[2] = user_data
>> 16;
699 buf
[3] = user_data
>> 24;
702 static inline u32
sunxi_nfc_buf_to_user_data(const u8
*buf
)
704 return buf
[0] | (buf
[1] << 8) | (buf
[2] << 16) | (buf
[3] << 24);
707 static void sunxi_nfc_hw_ecc_get_prot_oob_bytes(struct nand_chip
*nand
, u8
*oob
,
708 int step
, bool bbm
, int page
)
710 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
712 sunxi_nfc_user_data_to_buf(readl(nfc
->regs
+ NFC_REG_USER_DATA(step
)),
715 /* De-randomize the Bad Block Marker. */
716 if (bbm
&& (nand
->options
& NAND_NEED_SCRAMBLING
))
717 sunxi_nfc_randomize_bbm(nand
, page
, oob
);
720 static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct nand_chip
*nand
,
721 const u8
*oob
, int step
,
724 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
727 /* Randomize the Bad Block Marker. */
728 if (bbm
&& (nand
->options
& NAND_NEED_SCRAMBLING
)) {
729 memcpy(user_data
, oob
, sizeof(user_data
));
730 sunxi_nfc_randomize_bbm(nand
, page
, user_data
);
734 writel(sunxi_nfc_buf_to_user_data(oob
),
735 nfc
->regs
+ NFC_REG_USER_DATA(step
));
738 static void sunxi_nfc_hw_ecc_update_stats(struct nand_chip
*nand
,
739 unsigned int *max_bitflips
, int ret
)
741 struct mtd_info
*mtd
= nand_to_mtd(nand
);
744 mtd
->ecc_stats
.failed
++;
746 mtd
->ecc_stats
.corrected
+= ret
;
747 *max_bitflips
= max_t(unsigned int, *max_bitflips
, ret
);
751 static int sunxi_nfc_hw_ecc_correct(struct nand_chip
*nand
, u8
*data
, u8
*oob
,
752 int step
, u32 status
, bool *erased
)
754 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
755 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
760 if (status
& NFC_ECC_ERR(step
))
763 if (status
& NFC_ECC_PAT_FOUND(step
)) {
766 if (unlikely(!(readl(nfc
->regs
+ NFC_REG_PAT_ID
) & 0x1))) {
774 memset(data
, pattern
, ecc
->size
);
777 memset(oob
, pattern
, ecc
->bytes
+ 4);
782 tmp
= readl(nfc
->regs
+ NFC_REG_ECC_ERR_CNT(step
));
784 return NFC_ECC_ERR_CNT(step
, tmp
);
787 static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip
*nand
,
788 u8
*data
, int data_off
,
789 u8
*oob
, int oob_off
,
791 unsigned int *max_bitflips
,
792 bool bbm
, bool oob_required
, int page
)
794 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
795 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
800 if (*cur_off
!= data_off
)
801 nand_change_read_column_op(nand
, data_off
, NULL
, 0, false);
803 sunxi_nfc_randomizer_read_buf(nand
, NULL
, ecc
->size
, false, page
);
805 if (data_off
+ ecc
->size
!= oob_off
)
806 nand_change_read_column_op(nand
, oob_off
, NULL
, 0, false);
808 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
812 sunxi_nfc_randomizer_enable(nand
);
813 writel(NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
| NFC_ECC_OP
,
814 nfc
->regs
+ NFC_REG_CMD
);
816 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, false, 0);
817 sunxi_nfc_randomizer_disable(nand
);
821 *cur_off
= oob_off
+ ecc
->bytes
+ 4;
823 ret
= sunxi_nfc_hw_ecc_correct(nand
, data
, oob_required
? oob
: NULL
, 0,
824 readl(nfc
->regs
+ NFC_REG_ECC_ST
),
831 * Re-read the data with the randomizer disabled to identify
832 * bitflips in erased pages.
834 if (nand
->options
& NAND_NEED_SCRAMBLING
)
835 nand_change_read_column_op(nand
, data_off
, data
,
838 memcpy_fromio(data
, nfc
->regs
+ NFC_RAM0_BASE
,
841 nand_change_read_column_op(nand
, oob_off
, oob
, ecc
->bytes
+ 4,
844 ret
= nand_check_erased_ecc_chunk(data
, ecc
->size
,
846 NULL
, 0, ecc
->strength
);
850 memcpy_fromio(data
, nfc
->regs
+ NFC_RAM0_BASE
, ecc
->size
);
853 nand_change_read_column_op(nand
, oob_off
, NULL
, 0,
855 sunxi_nfc_randomizer_read_buf(nand
, oob
, ecc
->bytes
+ 4,
858 sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand
, oob
, 0,
863 sunxi_nfc_hw_ecc_update_stats(nand
, max_bitflips
, ret
);
868 static void sunxi_nfc_hw_ecc_read_extra_oob(struct nand_chip
*nand
,
869 u8
*oob
, int *cur_off
,
870 bool randomize
, int page
)
872 struct mtd_info
*mtd
= nand_to_mtd(nand
);
873 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
874 int offset
= ((ecc
->bytes
+ 4) * ecc
->steps
);
875 int len
= mtd
->oobsize
- offset
;
880 if (!cur_off
|| *cur_off
!= offset
)
881 nand_change_read_column_op(nand
, mtd
->writesize
, NULL
, 0,
885 sunxi_nfc_read_buf(nand
, oob
+ offset
, len
);
887 sunxi_nfc_randomizer_read_buf(nand
, oob
+ offset
, len
,
891 *cur_off
= mtd
->oobsize
+ mtd
->writesize
;
894 static int sunxi_nfc_hw_ecc_read_chunks_dma(struct nand_chip
*nand
, uint8_t *buf
,
895 int oob_required
, int page
,
898 bool randomized
= nand
->options
& NAND_NEED_SCRAMBLING
;
899 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
900 struct mtd_info
*mtd
= nand_to_mtd(nand
);
901 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
902 unsigned int max_bitflips
= 0;
903 int ret
, i
, raw_mode
= 0;
904 struct scatterlist sg
;
907 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
911 ret
= sunxi_nfc_dma_op_prepare(nfc
, buf
, ecc
->size
, nchunks
,
912 DMA_FROM_DEVICE
, &sg
);
916 sunxi_nfc_hw_ecc_enable(nand
);
917 sunxi_nfc_randomizer_config(nand
, page
, false);
918 sunxi_nfc_randomizer_enable(nand
);
920 writel((NAND_CMD_RNDOUTSTART
<< 16) | (NAND_CMD_RNDOUT
<< 8) |
921 NAND_CMD_READSTART
, nfc
->regs
+ NFC_REG_RCMD_SET
);
923 dma_async_issue_pending(nfc
->dmac
);
925 writel(NFC_PAGE_OP
| NFC_DATA_SWAP_METHOD
| NFC_DATA_TRANS
,
926 nfc
->regs
+ NFC_REG_CMD
);
928 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, false, 0);
930 dmaengine_terminate_all(nfc
->dmac
);
932 sunxi_nfc_randomizer_disable(nand
);
933 sunxi_nfc_hw_ecc_disable(nand
);
935 sunxi_nfc_dma_op_cleanup(nfc
, DMA_FROM_DEVICE
, &sg
);
940 status
= readl(nfc
->regs
+ NFC_REG_ECC_ST
);
942 for (i
= 0; i
< nchunks
; i
++) {
943 int data_off
= i
* ecc
->size
;
944 int oob_off
= i
* (ecc
->bytes
+ 4);
945 u8
*data
= buf
+ data_off
;
946 u8
*oob
= nand
->oob_poi
+ oob_off
;
949 ret
= sunxi_nfc_hw_ecc_correct(nand
, randomized
? data
: NULL
,
950 oob_required
? oob
: NULL
,
953 /* ECC errors are handled in the second loop. */
957 if (oob_required
&& !erased
) {
958 /* TODO: use DMA to retrieve OOB */
959 nand_change_read_column_op(nand
,
960 mtd
->writesize
+ oob_off
,
961 oob
, ecc
->bytes
+ 4, false);
963 sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand
, oob
, i
,
970 sunxi_nfc_hw_ecc_update_stats(nand
, &max_bitflips
, ret
);
973 if (status
& NFC_ECC_ERR_MSK
) {
974 for (i
= 0; i
< nchunks
; i
++) {
975 int data_off
= i
* ecc
->size
;
976 int oob_off
= i
* (ecc
->bytes
+ 4);
977 u8
*data
= buf
+ data_off
;
978 u8
*oob
= nand
->oob_poi
+ oob_off
;
980 if (!(status
& NFC_ECC_ERR(i
)))
984 * Re-read the data with the randomizer disabled to
985 * identify bitflips in erased pages.
986 * TODO: use DMA to read page in raw mode
989 nand_change_read_column_op(nand
, data_off
,
993 /* TODO: use DMA to retrieve OOB */
994 nand_change_read_column_op(nand
,
995 mtd
->writesize
+ oob_off
,
996 oob
, ecc
->bytes
+ 4, false);
998 ret
= nand_check_erased_ecc_chunk(data
, ecc
->size
,
1005 sunxi_nfc_hw_ecc_update_stats(nand
, &max_bitflips
, ret
);
1010 sunxi_nfc_hw_ecc_read_extra_oob(nand
, nand
->oob_poi
,
1014 return max_bitflips
;
1017 static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip
*nand
,
1018 const u8
*data
, int data_off
,
1019 const u8
*oob
, int oob_off
,
1020 int *cur_off
, bool bbm
,
1023 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
1024 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1027 if (data_off
!= *cur_off
)
1028 nand_change_write_column_op(nand
, data_off
, NULL
, 0, false);
1030 sunxi_nfc_randomizer_write_buf(nand
, data
, ecc
->size
, false, page
);
1032 if (data_off
+ ecc
->size
!= oob_off
)
1033 nand_change_write_column_op(nand
, oob_off
, NULL
, 0, false);
1035 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
1039 sunxi_nfc_randomizer_enable(nand
);
1040 sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand
, oob
, 0, bbm
, page
);
1042 writel(NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
|
1043 NFC_ACCESS_DIR
| NFC_ECC_OP
,
1044 nfc
->regs
+ NFC_REG_CMD
);
1046 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, false, 0);
1047 sunxi_nfc_randomizer_disable(nand
);
1051 *cur_off
= oob_off
+ ecc
->bytes
+ 4;
1056 static void sunxi_nfc_hw_ecc_write_extra_oob(struct nand_chip
*nand
,
1057 u8
*oob
, int *cur_off
,
1060 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1061 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1062 int offset
= ((ecc
->bytes
+ 4) * ecc
->steps
);
1063 int len
= mtd
->oobsize
- offset
;
1068 if (!cur_off
|| *cur_off
!= offset
)
1069 nand_change_write_column_op(nand
, offset
+ mtd
->writesize
,
1072 sunxi_nfc_randomizer_write_buf(nand
, oob
+ offset
, len
, false, page
);
1075 *cur_off
= mtd
->oobsize
+ mtd
->writesize
;
1078 static int sunxi_nfc_hw_ecc_read_page(struct nand_chip
*nand
, uint8_t *buf
,
1079 int oob_required
, int page
)
1081 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1082 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1083 unsigned int max_bitflips
= 0;
1084 int ret
, i
, cur_off
= 0;
1085 bool raw_mode
= false;
1087 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1089 nand_read_page_op(nand
, page
, 0, NULL
, 0);
1091 sunxi_nfc_hw_ecc_enable(nand
);
1093 for (i
= 0; i
< ecc
->steps
; i
++) {
1094 int data_off
= i
* ecc
->size
;
1095 int oob_off
= i
* (ecc
->bytes
+ 4);
1096 u8
*data
= buf
+ data_off
;
1097 u8
*oob
= nand
->oob_poi
+ oob_off
;
1099 ret
= sunxi_nfc_hw_ecc_read_chunk(nand
, data
, data_off
, oob
,
1100 oob_off
+ mtd
->writesize
,
1101 &cur_off
, &max_bitflips
,
1102 !i
, oob_required
, page
);
1110 sunxi_nfc_hw_ecc_read_extra_oob(nand
, nand
->oob_poi
, &cur_off
,
1113 sunxi_nfc_hw_ecc_disable(nand
);
1115 return max_bitflips
;
1118 static int sunxi_nfc_hw_ecc_read_page_dma(struct nand_chip
*nand
, u8
*buf
,
1119 int oob_required
, int page
)
1123 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1125 nand_read_page_op(nand
, page
, 0, NULL
, 0);
1127 ret
= sunxi_nfc_hw_ecc_read_chunks_dma(nand
, buf
, oob_required
, page
,
1132 /* Fallback to PIO mode */
1133 return sunxi_nfc_hw_ecc_read_page(nand
, buf
, oob_required
, page
);
1136 static int sunxi_nfc_hw_ecc_read_subpage(struct nand_chip
*nand
,
1137 u32 data_offs
, u32 readlen
,
1138 u8
*bufpoi
, int page
)
1140 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1141 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1142 int ret
, i
, cur_off
= 0;
1143 unsigned int max_bitflips
= 0;
1145 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1147 nand_read_page_op(nand
, page
, 0, NULL
, 0);
1149 sunxi_nfc_hw_ecc_enable(nand
);
1151 for (i
= data_offs
/ ecc
->size
;
1152 i
< DIV_ROUND_UP(data_offs
+ readlen
, ecc
->size
); i
++) {
1153 int data_off
= i
* ecc
->size
;
1154 int oob_off
= i
* (ecc
->bytes
+ 4);
1155 u8
*data
= bufpoi
+ data_off
;
1156 u8
*oob
= nand
->oob_poi
+ oob_off
;
1158 ret
= sunxi_nfc_hw_ecc_read_chunk(nand
, data
, data_off
,
1160 oob_off
+ mtd
->writesize
,
1161 &cur_off
, &max_bitflips
, !i
,
1167 sunxi_nfc_hw_ecc_disable(nand
);
1169 return max_bitflips
;
1172 static int sunxi_nfc_hw_ecc_read_subpage_dma(struct nand_chip
*nand
,
1173 u32 data_offs
, u32 readlen
,
1176 int nchunks
= DIV_ROUND_UP(data_offs
+ readlen
, nand
->ecc
.size
);
1179 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1181 nand_read_page_op(nand
, page
, 0, NULL
, 0);
1183 ret
= sunxi_nfc_hw_ecc_read_chunks_dma(nand
, buf
, false, page
, nchunks
);
1187 /* Fallback to PIO mode */
1188 return sunxi_nfc_hw_ecc_read_subpage(nand
, data_offs
, readlen
,
1192 static int sunxi_nfc_hw_ecc_write_page(struct nand_chip
*nand
,
1193 const uint8_t *buf
, int oob_required
,
1196 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1197 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1198 int ret
, i
, cur_off
= 0;
1200 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1202 nand_prog_page_begin_op(nand
, page
, 0, NULL
, 0);
1204 sunxi_nfc_hw_ecc_enable(nand
);
1206 for (i
= 0; i
< ecc
->steps
; i
++) {
1207 int data_off
= i
* ecc
->size
;
1208 int oob_off
= i
* (ecc
->bytes
+ 4);
1209 const u8
*data
= buf
+ data_off
;
1210 const u8
*oob
= nand
->oob_poi
+ oob_off
;
1212 ret
= sunxi_nfc_hw_ecc_write_chunk(nand
, data
, data_off
, oob
,
1213 oob_off
+ mtd
->writesize
,
1214 &cur_off
, !i
, page
);
1219 if (oob_required
|| (nand
->options
& NAND_NEED_SCRAMBLING
))
1220 sunxi_nfc_hw_ecc_write_extra_oob(nand
, nand
->oob_poi
,
1223 sunxi_nfc_hw_ecc_disable(nand
);
1225 return nand_prog_page_end_op(nand
);
1228 static int sunxi_nfc_hw_ecc_write_subpage(struct nand_chip
*nand
,
1229 u32 data_offs
, u32 data_len
,
1230 const u8
*buf
, int oob_required
,
1233 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1234 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1235 int ret
, i
, cur_off
= 0;
1237 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1239 nand_prog_page_begin_op(nand
, page
, 0, NULL
, 0);
1241 sunxi_nfc_hw_ecc_enable(nand
);
1243 for (i
= data_offs
/ ecc
->size
;
1244 i
< DIV_ROUND_UP(data_offs
+ data_len
, ecc
->size
); i
++) {
1245 int data_off
= i
* ecc
->size
;
1246 int oob_off
= i
* (ecc
->bytes
+ 4);
1247 const u8
*data
= buf
+ data_off
;
1248 const u8
*oob
= nand
->oob_poi
+ oob_off
;
1250 ret
= sunxi_nfc_hw_ecc_write_chunk(nand
, data
, data_off
, oob
,
1251 oob_off
+ mtd
->writesize
,
1252 &cur_off
, !i
, page
);
1257 sunxi_nfc_hw_ecc_disable(nand
);
1259 return nand_prog_page_end_op(nand
);
1262 static int sunxi_nfc_hw_ecc_write_page_dma(struct nand_chip
*nand
,
1267 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
1268 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1269 struct scatterlist sg
;
1272 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1274 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
1278 ret
= sunxi_nfc_dma_op_prepare(nfc
, buf
, ecc
->size
, ecc
->steps
,
1279 DMA_TO_DEVICE
, &sg
);
1283 for (i
= 0; i
< ecc
->steps
; i
++) {
1284 const u8
*oob
= nand
->oob_poi
+ (i
* (ecc
->bytes
+ 4));
1286 sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand
, oob
, i
, !i
, page
);
1289 nand_prog_page_begin_op(nand
, page
, 0, NULL
, 0);
1291 sunxi_nfc_hw_ecc_enable(nand
);
1292 sunxi_nfc_randomizer_config(nand
, page
, false);
1293 sunxi_nfc_randomizer_enable(nand
);
1295 writel((NAND_CMD_RNDIN
<< 8) | NAND_CMD_PAGEPROG
,
1296 nfc
->regs
+ NFC_REG_WCMD_SET
);
1298 dma_async_issue_pending(nfc
->dmac
);
1300 writel(NFC_PAGE_OP
| NFC_DATA_SWAP_METHOD
|
1301 NFC_DATA_TRANS
| NFC_ACCESS_DIR
,
1302 nfc
->regs
+ NFC_REG_CMD
);
1304 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, false, 0);
1306 dmaengine_terminate_all(nfc
->dmac
);
1308 sunxi_nfc_randomizer_disable(nand
);
1309 sunxi_nfc_hw_ecc_disable(nand
);
1311 sunxi_nfc_dma_op_cleanup(nfc
, DMA_TO_DEVICE
, &sg
);
1316 if (oob_required
|| (nand
->options
& NAND_NEED_SCRAMBLING
))
1317 /* TODO: use DMA to transfer extra OOB bytes ? */
1318 sunxi_nfc_hw_ecc_write_extra_oob(nand
, nand
->oob_poi
,
1321 return nand_prog_page_end_op(nand
);
1324 return sunxi_nfc_hw_ecc_write_page(nand
, buf
, oob_required
, page
);
1327 static int sunxi_nfc_hw_ecc_read_oob(struct nand_chip
*nand
, int page
)
1329 u8
*buf
= nand_get_data_buf(nand
);
1331 return nand
->ecc
.read_page(nand
, buf
, 1, page
);
1334 static int sunxi_nfc_hw_ecc_write_oob(struct nand_chip
*nand
, int page
)
1336 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1337 u8
*buf
= nand_get_data_buf(nand
);
1340 memset(buf
, 0xff, mtd
->writesize
);
1341 ret
= nand
->ecc
.write_page(nand
, buf
, 1, page
);
1345 /* Send command to program the OOB data */
1346 return nand_prog_page_end_op(nand
);
1349 static const s32 tWB_lut
[] = {6, 12, 16, 20};
1350 static const s32 tRHW_lut
[] = {4, 8, 12, 20};
1352 static int _sunxi_nand_lookup_timing(const s32
*lut
, int lut_size
, u32 duration
,
1355 u32 clk_cycles
= DIV_ROUND_UP(duration
, clk_period
);
1358 for (i
= 0; i
< lut_size
; i
++) {
1359 if (clk_cycles
<= lut
[i
])
1367 #define sunxi_nand_lookup_timing(l, p, c) \
1368 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1370 static int sunxi_nfc_setup_data_interface(struct nand_chip
*nand
, int csline
,
1371 const struct nand_data_interface
*conf
)
1373 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
1374 struct sunxi_nfc
*nfc
= to_sunxi_nfc(sunxi_nand
->nand
.controller
);
1375 const struct nand_sdr_timings
*timings
;
1376 u32 min_clk_period
= 0;
1377 s32 tWB
, tADL
, tWHR
, tRHW
, tCAD
;
1380 timings
= nand_get_sdr_timings(conf
);
1381 if (IS_ERR(timings
))
1385 if (timings
->tCLS_min
> min_clk_period
)
1386 min_clk_period
= timings
->tCLS_min
;
1389 if (timings
->tCLH_min
> min_clk_period
)
1390 min_clk_period
= timings
->tCLH_min
;
1393 if (timings
->tCS_min
> min_clk_period
)
1394 min_clk_period
= timings
->tCS_min
;
1397 if (timings
->tCH_min
> min_clk_period
)
1398 min_clk_period
= timings
->tCH_min
;
1401 if (timings
->tWP_min
> min_clk_period
)
1402 min_clk_period
= timings
->tWP_min
;
1405 if (timings
->tWH_min
> min_clk_period
)
1406 min_clk_period
= timings
->tWH_min
;
1409 if (timings
->tALS_min
> min_clk_period
)
1410 min_clk_period
= timings
->tALS_min
;
1413 if (timings
->tDS_min
> min_clk_period
)
1414 min_clk_period
= timings
->tDS_min
;
1417 if (timings
->tDH_min
> min_clk_period
)
1418 min_clk_period
= timings
->tDH_min
;
1421 if (timings
->tRR_min
> (min_clk_period
* 3))
1422 min_clk_period
= DIV_ROUND_UP(timings
->tRR_min
, 3);
1425 if (timings
->tALH_min
> min_clk_period
)
1426 min_clk_period
= timings
->tALH_min
;
1429 if (timings
->tRP_min
> min_clk_period
)
1430 min_clk_period
= timings
->tRP_min
;
1433 if (timings
->tREH_min
> min_clk_period
)
1434 min_clk_period
= timings
->tREH_min
;
1437 if (timings
->tRC_min
> (min_clk_period
* 2))
1438 min_clk_period
= DIV_ROUND_UP(timings
->tRC_min
, 2);
1441 if (timings
->tWC_min
> (min_clk_period
* 2))
1442 min_clk_period
= DIV_ROUND_UP(timings
->tWC_min
, 2);
1444 /* T16 - T19 + tCAD */
1445 if (timings
->tWB_max
> (min_clk_period
* 20))
1446 min_clk_period
= DIV_ROUND_UP(timings
->tWB_max
, 20);
1448 if (timings
->tADL_min
> (min_clk_period
* 32))
1449 min_clk_period
= DIV_ROUND_UP(timings
->tADL_min
, 32);
1451 if (timings
->tWHR_min
> (min_clk_period
* 32))
1452 min_clk_period
= DIV_ROUND_UP(timings
->tWHR_min
, 32);
1454 if (timings
->tRHW_min
> (min_clk_period
* 20))
1455 min_clk_period
= DIV_ROUND_UP(timings
->tRHW_min
, 20);
1458 * In non-EDO, tREA should be less than tRP to guarantee that the
1459 * controller does not sample the IO lines too early. Unfortunately,
1460 * the sunxi NAND controller does not allow us to have different
1461 * values for tRP and tREH (tRP = tREH = tRW / 2).
1463 * We have 2 options to overcome this limitation:
1465 * 1/ Extend tRC to fulfil the tREA <= tRC / 2 constraint
1466 * 2/ Use EDO mode (only works if timings->tRLOH > 0)
1468 if (timings
->tREA_max
> min_clk_period
&& !timings
->tRLOH_min
)
1469 min_clk_period
= timings
->tREA_max
;
1471 tWB
= sunxi_nand_lookup_timing(tWB_lut
, timings
->tWB_max
,
1474 dev_err(nfc
->dev
, "unsupported tWB\n");
1478 tADL
= DIV_ROUND_UP(timings
->tADL_min
, min_clk_period
) >> 3;
1480 dev_err(nfc
->dev
, "unsupported tADL\n");
1484 tWHR
= DIV_ROUND_UP(timings
->tWHR_min
, min_clk_period
) >> 3;
1486 dev_err(nfc
->dev
, "unsupported tWHR\n");
1490 tRHW
= sunxi_nand_lookup_timing(tRHW_lut
, timings
->tRHW_min
,
1493 dev_err(nfc
->dev
, "unsupported tRHW\n");
1497 if (csline
== NAND_DATA_IFACE_CHECK_ONLY
)
1501 * TODO: according to ONFI specs this value only applies for DDR NAND,
1502 * but Allwinner seems to set this to 0x7. Mimic them for now.
1506 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1507 sunxi_nand
->timing_cfg
= NFC_TIMING_CFG(tWB
, tADL
, tWHR
, tRHW
, tCAD
);
1509 /* Convert min_clk_period from picoseconds to nanoseconds */
1510 min_clk_period
= DIV_ROUND_UP(min_clk_period
, 1000);
1513 * Unlike what is stated in Allwinner datasheet, the clk_rate should
1514 * be set to (1 / min_clk_period), and not (2 / min_clk_period).
1515 * This new formula was verified with a scope and validated by
1516 * Allwinner engineers.
1518 sunxi_nand
->clk_rate
= NSEC_PER_SEC
/ min_clk_period
;
1519 real_clk_rate
= clk_round_rate(nfc
->mod_clk
, sunxi_nand
->clk_rate
);
1520 if (real_clk_rate
<= 0) {
1521 dev_err(nfc
->dev
, "Unable to round clk %lu\n",
1522 sunxi_nand
->clk_rate
);
1526 sunxi_nand
->timing_ctl
= 0;
1529 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1530 * output cycle timings shall be used if the host drives tRC less than
1531 * 30 ns. We should also use EDO mode if tREA is bigger than tRP.
1533 min_clk_period
= NSEC_PER_SEC
/ real_clk_rate
;
1534 if (min_clk_period
* 2 < 30 || min_clk_period
* 1000 < timings
->tREA_max
)
1535 sunxi_nand
->timing_ctl
= NFC_TIMING_CTL_EDO
;
1540 static int sunxi_nand_ooblayout_ecc(struct mtd_info
*mtd
, int section
,
1541 struct mtd_oob_region
*oobregion
)
1543 struct nand_chip
*nand
= mtd_to_nand(mtd
);
1544 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1546 if (section
>= ecc
->steps
)
1549 oobregion
->offset
= section
* (ecc
->bytes
+ 4) + 4;
1550 oobregion
->length
= ecc
->bytes
;
1555 static int sunxi_nand_ooblayout_free(struct mtd_info
*mtd
, int section
,
1556 struct mtd_oob_region
*oobregion
)
1558 struct nand_chip
*nand
= mtd_to_nand(mtd
);
1559 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1561 if (section
> ecc
->steps
)
1565 * The first 2 bytes are used for BB markers, hence we
1566 * only have 2 bytes available in the first user data
1569 if (!section
&& ecc
->mode
== NAND_ECC_HW
) {
1570 oobregion
->offset
= 2;
1571 oobregion
->length
= 2;
1576 oobregion
->offset
= section
* (ecc
->bytes
+ 4);
1578 if (section
< ecc
->steps
)
1579 oobregion
->length
= 4;
1581 oobregion
->offset
= mtd
->oobsize
- oobregion
->offset
;
1586 static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops
= {
1587 .ecc
= sunxi_nand_ooblayout_ecc
,
1588 .free
= sunxi_nand_ooblayout_free
,
1591 static void sunxi_nand_hw_ecc_ctrl_cleanup(struct nand_ecc_ctrl
*ecc
)
1596 static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip
*nand
,
1597 struct nand_ecc_ctrl
*ecc
,
1598 struct device_node
*np
)
1600 static const u8 strengths
[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1601 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
1602 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1603 struct sunxi_nand_hw_ecc
*data
;
1608 if (ecc
->options
& NAND_ECC_MAXIMIZE
) {
1612 nsectors
= mtd
->writesize
/ ecc
->size
;
1614 /* Reserve 2 bytes for the BBM */
1615 bytes
= (mtd
->oobsize
- 2) / nsectors
;
1617 /* 4 non-ECC bytes are added before each ECC bytes section */
1620 /* and bytes has to be even. */
1624 ecc
->strength
= bytes
* 8 / fls(8 * ecc
->size
);
1626 for (i
= 0; i
< ARRAY_SIZE(strengths
); i
++) {
1627 if (strengths
[i
] > ecc
->strength
)
1634 ecc
->strength
= strengths
[i
- 1];
1637 if (ecc
->size
!= 512 && ecc
->size
!= 1024)
1640 data
= kzalloc(sizeof(*data
), GFP_KERNEL
);
1644 /* Prefer 1k ECC chunk over 512 ones */
1645 if (ecc
->size
== 512 && mtd
->writesize
> 512) {
1650 /* Add ECC info retrieval from DT */
1651 for (i
= 0; i
< ARRAY_SIZE(strengths
); i
++) {
1652 if (ecc
->strength
<= strengths
[i
]) {
1654 * Update ecc->strength value with the actual strength
1655 * that will be used by the ECC engine.
1657 ecc
->strength
= strengths
[i
];
1662 if (i
>= ARRAY_SIZE(strengths
)) {
1663 dev_err(nfc
->dev
, "unsupported strength\n");
1670 /* HW ECC always request ECC bytes for 1024 bytes blocks */
1671 ecc
->bytes
= DIV_ROUND_UP(ecc
->strength
* fls(8 * 1024), 8);
1673 /* HW ECC always work with even numbers of ECC bytes */
1674 ecc
->bytes
= ALIGN(ecc
->bytes
, 2);
1676 nsectors
= mtd
->writesize
/ ecc
->size
;
1678 if (mtd
->oobsize
< ((ecc
->bytes
+ 4) * nsectors
)) {
1683 ecc
->read_oob
= sunxi_nfc_hw_ecc_read_oob
;
1684 ecc
->write_oob
= sunxi_nfc_hw_ecc_write_oob
;
1685 mtd_set_ooblayout(mtd
, &sunxi_nand_ooblayout_ops
);
1689 ecc
->read_page
= sunxi_nfc_hw_ecc_read_page_dma
;
1690 ecc
->read_subpage
= sunxi_nfc_hw_ecc_read_subpage_dma
;
1691 ecc
->write_page
= sunxi_nfc_hw_ecc_write_page_dma
;
1692 nand
->options
|= NAND_USE_BOUNCE_BUFFER
;
1694 ecc
->read_page
= sunxi_nfc_hw_ecc_read_page
;
1695 ecc
->read_subpage
= sunxi_nfc_hw_ecc_read_subpage
;
1696 ecc
->write_page
= sunxi_nfc_hw_ecc_write_page
;
1699 /* TODO: support DMA for raw accesses and subpage write */
1700 ecc
->write_subpage
= sunxi_nfc_hw_ecc_write_subpage
;
1701 ecc
->read_oob_raw
= nand_read_oob_std
;
1702 ecc
->write_oob_raw
= nand_write_oob_std
;
1712 static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl
*ecc
)
1714 switch (ecc
->mode
) {
1716 sunxi_nand_hw_ecc_ctrl_cleanup(ecc
);
1724 static int sunxi_nand_attach_chip(struct nand_chip
*nand
)
1726 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1727 struct device_node
*np
= nand_get_flash_node(nand
);
1730 if (nand
->bbt_options
& NAND_BBT_USE_FLASH
)
1731 nand
->bbt_options
|= NAND_BBT_NO_OOB
;
1733 if (nand
->options
& NAND_NEED_SCRAMBLING
)
1734 nand
->options
|= NAND_NO_SUBPAGE_WRITE
;
1736 nand
->options
|= NAND_SUBPAGE_READ
;
1739 ecc
->size
= nand
->base
.eccreq
.step_size
;
1740 ecc
->strength
= nand
->base
.eccreq
.strength
;
1743 if (!ecc
->size
|| !ecc
->strength
)
1746 switch (ecc
->mode
) {
1748 ret
= sunxi_nand_hw_ecc_ctrl_init(nand
, ecc
, np
);
1762 static int sunxi_nfc_exec_subop(struct nand_chip
*nand
,
1763 const struct nand_subop
*subop
)
1765 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
1766 u32 cmd
= 0, extcmd
= 0, cnt
= 0, addrs
[2] = { };
1767 unsigned int i
, j
, remaining
, start
;
1771 for (i
= 0; i
< subop
->ninstrs
; i
++) {
1772 const struct nand_op_instr
*instr
= &subop
->instrs
[i
];
1774 switch (instr
->type
) {
1775 case NAND_OP_CMD_INSTR
:
1776 if (cmd
& NFC_SEND_CMD1
) {
1777 if (WARN_ON(cmd
& NFC_SEND_CMD2
))
1780 cmd
|= NFC_SEND_CMD2
;
1781 extcmd
|= instr
->ctx
.cmd
.opcode
;
1783 cmd
|= NFC_SEND_CMD1
|
1784 NFC_CMD(instr
->ctx
.cmd
.opcode
);
1788 case NAND_OP_ADDR_INSTR
:
1789 remaining
= nand_subop_get_num_addr_cyc(subop
, i
);
1790 start
= nand_subop_get_addr_start_off(subop
, i
);
1791 for (j
= 0; j
< 8 && j
+ start
< remaining
; j
++) {
1792 u32 addr
= instr
->ctx
.addr
.addrs
[j
+ start
];
1794 addrs
[j
/ 4] |= addr
<< (j
% 4) * 8;
1798 cmd
|= NFC_SEND_ADR
| NFC_ADR_NUM(j
);
1802 case NAND_OP_DATA_IN_INSTR
:
1803 case NAND_OP_DATA_OUT_INSTR
:
1804 start
= nand_subop_get_data_start_off(subop
, i
);
1805 remaining
= nand_subop_get_data_len(subop
, i
);
1806 cnt
= min_t(u32
, remaining
, NFC_SRAM_SIZE
);
1807 cmd
|= NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
;
1809 if (instr
->type
== NAND_OP_DATA_OUT_INSTR
) {
1810 cmd
|= NFC_ACCESS_DIR
;
1811 memcpy_toio(nfc
->regs
+ NFC_RAM0_BASE
,
1812 instr
->ctx
.data
.buf
.out
+ start
,
1815 inbuf
= instr
->ctx
.data
.buf
.in
+ start
;
1820 case NAND_OP_WAITRDY_INSTR
:
1821 cmd
|= NFC_WAIT_FLAG
;
1826 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
1830 if (cmd
& NFC_SEND_ADR
) {
1831 writel(addrs
[0], nfc
->regs
+ NFC_REG_ADDR_LOW
);
1832 writel(addrs
[1], nfc
->regs
+ NFC_REG_ADDR_HIGH
);
1835 if (cmd
& NFC_SEND_CMD2
)
1838 (cmd
& NFC_ACCESS_DIR
?
1839 NFC_REG_WCMD_SET
: NFC_REG_RCMD_SET
));
1841 if (cmd
& NFC_DATA_TRANS
)
1842 writel(cnt
, nfc
->regs
+ NFC_REG_CNT
);
1844 writel(cmd
, nfc
->regs
+ NFC_REG_CMD
);
1846 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
,
1847 !(cmd
& NFC_WAIT_FLAG
) && cnt
< 64,
1853 memcpy_fromio(inbuf
, nfc
->regs
+ NFC_RAM0_BASE
, cnt
);
1858 static int sunxi_nfc_soft_waitrdy(struct nand_chip
*nand
,
1859 const struct nand_subop
*subop
)
1861 return nand_soft_waitrdy(nand
,
1862 subop
->instrs
[0].ctx
.waitrdy
.timeout_ms
);
1865 static const struct nand_op_parser sunxi_nfc_op_parser
= NAND_OP_PARSER(
1866 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop
,
1867 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1868 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1869 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1870 NAND_OP_PARSER_PAT_WAITRDY_ELEM(true),
1871 NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)),
1872 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop
,
1873 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1874 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1875 NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024),
1876 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1877 NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)),
1880 static const struct nand_op_parser sunxi_nfc_norb_op_parser
= NAND_OP_PARSER(
1881 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop
,
1882 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1883 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1884 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1885 NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)),
1886 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop
,
1887 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1888 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1889 NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024),
1890 NAND_OP_PARSER_PAT_CMD_ELEM(true)),
1891 NAND_OP_PARSER_PATTERN(sunxi_nfc_soft_waitrdy
,
1892 NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)),
1895 static int sunxi_nfc_exec_op(struct nand_chip
*nand
,
1896 const struct nand_operation
*op
, bool check_only
)
1898 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
1899 const struct nand_op_parser
*parser
;
1901 sunxi_nfc_select_chip(nand
, op
->cs
);
1903 if (sunxi_nand
->sels
[op
->cs
].rb
>= 0)
1904 parser
= &sunxi_nfc_op_parser
;
1906 parser
= &sunxi_nfc_norb_op_parser
;
1908 return nand_op_parser_exec_op(nand
, parser
, op
, check_only
);
1911 static const struct nand_controller_ops sunxi_nand_controller_ops
= {
1912 .attach_chip
= sunxi_nand_attach_chip
,
1913 .setup_data_interface
= sunxi_nfc_setup_data_interface
,
1914 .exec_op
= sunxi_nfc_exec_op
,
1917 static int sunxi_nand_chip_init(struct device
*dev
, struct sunxi_nfc
*nfc
,
1918 struct device_node
*np
)
1920 struct sunxi_nand_chip
*sunxi_nand
;
1921 struct mtd_info
*mtd
;
1922 struct nand_chip
*nand
;
1928 if (!of_get_property(np
, "reg", &nsels
))
1931 nsels
/= sizeof(u32
);
1933 dev_err(dev
, "invalid reg property size\n");
1937 sunxi_nand
= devm_kzalloc(dev
, struct_size(sunxi_nand
, sels
, nsels
),
1940 dev_err(dev
, "could not allocate chip\n");
1944 sunxi_nand
->nsels
= nsels
;
1946 for (i
= 0; i
< nsels
; i
++) {
1947 ret
= of_property_read_u32_index(np
, "reg", i
, &tmp
);
1949 dev_err(dev
, "could not retrieve reg property: %d\n",
1954 if (tmp
> NFC_MAX_CS
) {
1956 "invalid reg value: %u (max CS = 7)\n",
1961 if (test_and_set_bit(tmp
, &nfc
->assigned_cs
)) {
1962 dev_err(dev
, "CS %d already assigned\n", tmp
);
1966 sunxi_nand
->sels
[i
].cs
= tmp
;
1968 if (!of_property_read_u32_index(np
, "allwinner,rb", i
, &tmp
) &&
1970 sunxi_nand
->sels
[i
].rb
= tmp
;
1972 sunxi_nand
->sels
[i
].rb
= -1;
1975 nand
= &sunxi_nand
->nand
;
1976 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
1977 nand
->controller
= &nfc
->controller
;
1978 nand
->controller
->ops
= &sunxi_nand_controller_ops
;
1981 * Set the ECC mode to the default value in case nothing is specified
1984 nand
->ecc
.mode
= NAND_ECC_HW
;
1985 nand_set_flash_node(nand
, np
);
1987 mtd
= nand_to_mtd(nand
);
1988 mtd
->dev
.parent
= dev
;
1990 ret
= nand_scan(nand
, nsels
);
1994 ret
= mtd_device_register(mtd
, NULL
, 0);
1996 dev_err(dev
, "failed to register mtd device: %d\n", ret
);
2001 list_add_tail(&sunxi_nand
->node
, &nfc
->chips
);
2006 static int sunxi_nand_chips_init(struct device
*dev
, struct sunxi_nfc
*nfc
)
2008 struct device_node
*np
= dev
->of_node
;
2009 struct device_node
*nand_np
;
2010 int nchips
= of_get_child_count(np
);
2014 dev_err(dev
, "too many NAND chips: %d (max = 8)\n", nchips
);
2018 for_each_child_of_node(np
, nand_np
) {
2019 ret
= sunxi_nand_chip_init(dev
, nfc
, nand_np
);
2021 of_node_put(nand_np
);
2029 static void sunxi_nand_chips_cleanup(struct sunxi_nfc
*nfc
)
2031 struct sunxi_nand_chip
*sunxi_nand
;
2033 while (!list_empty(&nfc
->chips
)) {
2034 sunxi_nand
= list_first_entry(&nfc
->chips
,
2035 struct sunxi_nand_chip
,
2037 nand_release(&sunxi_nand
->nand
);
2038 sunxi_nand_ecc_cleanup(&sunxi_nand
->nand
.ecc
);
2039 list_del(&sunxi_nand
->node
);
2043 static int sunxi_nfc_probe(struct platform_device
*pdev
)
2045 struct device
*dev
= &pdev
->dev
;
2047 struct sunxi_nfc
*nfc
;
2051 nfc
= devm_kzalloc(dev
, sizeof(*nfc
), GFP_KERNEL
);
2056 nand_controller_init(&nfc
->controller
);
2057 INIT_LIST_HEAD(&nfc
->chips
);
2059 r
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
2060 nfc
->regs
= devm_ioremap_resource(dev
, r
);
2061 if (IS_ERR(nfc
->regs
))
2062 return PTR_ERR(nfc
->regs
);
2064 irq
= platform_get_irq(pdev
, 0);
2066 dev_err(dev
, "failed to retrieve irq\n");
2070 nfc
->ahb_clk
= devm_clk_get(dev
, "ahb");
2071 if (IS_ERR(nfc
->ahb_clk
)) {
2072 dev_err(dev
, "failed to retrieve ahb clk\n");
2073 return PTR_ERR(nfc
->ahb_clk
);
2076 ret
= clk_prepare_enable(nfc
->ahb_clk
);
2080 nfc
->mod_clk
= devm_clk_get(dev
, "mod");
2081 if (IS_ERR(nfc
->mod_clk
)) {
2082 dev_err(dev
, "failed to retrieve mod clk\n");
2083 ret
= PTR_ERR(nfc
->mod_clk
);
2084 goto out_ahb_clk_unprepare
;
2087 ret
= clk_prepare_enable(nfc
->mod_clk
);
2089 goto out_ahb_clk_unprepare
;
2091 nfc
->reset
= devm_reset_control_get_optional_exclusive(dev
, "ahb");
2092 if (IS_ERR(nfc
->reset
)) {
2093 ret
= PTR_ERR(nfc
->reset
);
2094 goto out_mod_clk_unprepare
;
2097 ret
= reset_control_deassert(nfc
->reset
);
2099 dev_err(dev
, "reset err %d\n", ret
);
2100 goto out_mod_clk_unprepare
;
2103 nfc
->caps
= of_device_get_match_data(&pdev
->dev
);
2106 goto out_ahb_reset_reassert
;
2109 ret
= sunxi_nfc_rst(nfc
);
2111 goto out_ahb_reset_reassert
;
2113 writel(0, nfc
->regs
+ NFC_REG_INT
);
2114 ret
= devm_request_irq(dev
, irq
, sunxi_nfc_interrupt
,
2115 0, "sunxi-nand", nfc
);
2117 goto out_ahb_reset_reassert
;
2119 nfc
->dmac
= dma_request_slave_channel(dev
, "rxtx");
2121 struct dma_slave_config dmac_cfg
= { };
2123 dmac_cfg
.src_addr
= r
->start
+ nfc
->caps
->reg_io_data
;
2124 dmac_cfg
.dst_addr
= dmac_cfg
.src_addr
;
2125 dmac_cfg
.src_addr_width
= DMA_SLAVE_BUSWIDTH_4_BYTES
;
2126 dmac_cfg
.dst_addr_width
= dmac_cfg
.src_addr_width
;
2127 dmac_cfg
.src_maxburst
= nfc
->caps
->dma_maxburst
;
2128 dmac_cfg
.dst_maxburst
= nfc
->caps
->dma_maxburst
;
2129 dmaengine_slave_config(nfc
->dmac
, &dmac_cfg
);
2131 dev_warn(dev
, "failed to request rxtx DMA channel\n");
2134 platform_set_drvdata(pdev
, nfc
);
2136 ret
= sunxi_nand_chips_init(dev
, nfc
);
2138 dev_err(dev
, "failed to init nand chips\n");
2139 goto out_release_dmac
;
2146 dma_release_channel(nfc
->dmac
);
2147 out_ahb_reset_reassert
:
2148 reset_control_assert(nfc
->reset
);
2149 out_mod_clk_unprepare
:
2150 clk_disable_unprepare(nfc
->mod_clk
);
2151 out_ahb_clk_unprepare
:
2152 clk_disable_unprepare(nfc
->ahb_clk
);
2157 static int sunxi_nfc_remove(struct platform_device
*pdev
)
2159 struct sunxi_nfc
*nfc
= platform_get_drvdata(pdev
);
2161 sunxi_nand_chips_cleanup(nfc
);
2163 reset_control_assert(nfc
->reset
);
2166 dma_release_channel(nfc
->dmac
);
2167 clk_disable_unprepare(nfc
->mod_clk
);
2168 clk_disable_unprepare(nfc
->ahb_clk
);
2173 static const struct sunxi_nfc_caps sunxi_nfc_a10_caps
= {
2174 .reg_io_data
= NFC_REG_A10_IO_DATA
,
2178 static const struct of_device_id sunxi_nfc_ids
[] = {
2180 .compatible
= "allwinner,sun4i-a10-nand",
2181 .data
= &sunxi_nfc_a10_caps
,
2185 MODULE_DEVICE_TABLE(of
, sunxi_nfc_ids
);
2187 static struct platform_driver sunxi_nfc_driver
= {
2189 .name
= "sunxi_nand",
2190 .of_match_table
= sunxi_nfc_ids
,
2192 .probe
= sunxi_nfc_probe
,
2193 .remove
= sunxi_nfc_remove
,
2195 module_platform_driver(sunxi_nfc_driver
);
2197 MODULE_LICENSE("GPL");
2198 MODULE_AUTHOR("Boris BREZILLON");
2199 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");
2200 MODULE_ALIAS("platform:sunxi_nand");