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_A23_IO_DATA 0x0300
47 #define NFC_REG_ECC_CTL 0x0034
48 #define NFC_REG_ECC_ST 0x0038
49 #define NFC_REG_DEBUG 0x003C
50 #define NFC_REG_ECC_ERR_CNT(x) ((0x0040 + (x)) & ~0x3)
51 #define NFC_REG_USER_DATA(x) (0x0050 + ((x) * 4))
52 #define NFC_REG_SPARE_AREA 0x00A0
53 #define NFC_REG_PAT_ID 0x00A4
54 #define NFC_REG_MDMA_ADDR 0x00C0
55 #define NFC_REG_MDMA_CNT 0x00C4
56 #define NFC_RAM0_BASE 0x0400
57 #define NFC_RAM1_BASE 0x0800
59 /* define bit use in NFC_CTL */
61 #define NFC_RESET BIT(1)
62 #define NFC_BUS_WIDTH_MSK BIT(2)
63 #define NFC_BUS_WIDTH_8 (0 << 2)
64 #define NFC_BUS_WIDTH_16 (1 << 2)
65 #define NFC_RB_SEL_MSK BIT(3)
66 #define NFC_RB_SEL(x) ((x) << 3)
67 #define NFC_CE_SEL_MSK GENMASK(26, 24)
68 #define NFC_CE_SEL(x) ((x) << 24)
69 #define NFC_CE_CTL BIT(6)
70 #define NFC_PAGE_SHIFT_MSK GENMASK(11, 8)
71 #define NFC_PAGE_SHIFT(x) (((x) < 10 ? 0 : (x) - 10) << 8)
72 #define NFC_SAM BIT(12)
73 #define NFC_RAM_METHOD BIT(14)
74 #define NFC_DMA_TYPE_NORMAL BIT(15)
75 #define NFC_DEBUG_CTL BIT(31)
77 /* define bit use in NFC_ST */
78 #define NFC_RB_B2R BIT(0)
79 #define NFC_CMD_INT_FLAG BIT(1)
80 #define NFC_DMA_INT_FLAG BIT(2)
81 #define NFC_CMD_FIFO_STATUS BIT(3)
82 #define NFC_STA BIT(4)
83 #define NFC_NATCH_INT_FLAG BIT(5)
84 #define NFC_RB_STATE(x) BIT(x + 8)
86 /* define bit use in NFC_INT */
87 #define NFC_B2R_INT_ENABLE BIT(0)
88 #define NFC_CMD_INT_ENABLE BIT(1)
89 #define NFC_DMA_INT_ENABLE BIT(2)
90 #define NFC_INT_MASK (NFC_B2R_INT_ENABLE | \
91 NFC_CMD_INT_ENABLE | \
94 /* define bit use in NFC_TIMING_CTL */
95 #define NFC_TIMING_CTL_EDO BIT(8)
97 /* define NFC_TIMING_CFG register layout */
98 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD) \
99 (((tWB) & 0x3) | (((tADL) & 0x3) << 2) | \
100 (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) | \
101 (((tCAD) & 0x7) << 8))
103 /* define bit use in NFC_CMD */
104 #define NFC_CMD_LOW_BYTE_MSK GENMASK(7, 0)
105 #define NFC_CMD_HIGH_BYTE_MSK GENMASK(15, 8)
106 #define NFC_CMD(x) (x)
107 #define NFC_ADR_NUM_MSK GENMASK(18, 16)
108 #define NFC_ADR_NUM(x) (((x) - 1) << 16)
109 #define NFC_SEND_ADR BIT(19)
110 #define NFC_ACCESS_DIR BIT(20)
111 #define NFC_DATA_TRANS BIT(21)
112 #define NFC_SEND_CMD1 BIT(22)
113 #define NFC_WAIT_FLAG BIT(23)
114 #define NFC_SEND_CMD2 BIT(24)
115 #define NFC_SEQ BIT(25)
116 #define NFC_DATA_SWAP_METHOD BIT(26)
117 #define NFC_ROW_AUTO_INC BIT(27)
118 #define NFC_SEND_CMD3 BIT(28)
119 #define NFC_SEND_CMD4 BIT(29)
120 #define NFC_CMD_TYPE_MSK GENMASK(31, 30)
121 #define NFC_NORMAL_OP (0 << 30)
122 #define NFC_ECC_OP (1 << 30)
123 #define NFC_PAGE_OP (2U << 30)
125 /* define bit use in NFC_RCMD_SET */
126 #define NFC_READ_CMD_MSK GENMASK(7, 0)
127 #define NFC_RND_READ_CMD0_MSK GENMASK(15, 8)
128 #define NFC_RND_READ_CMD1_MSK GENMASK(23, 16)
130 /* define bit use in NFC_WCMD_SET */
131 #define NFC_PROGRAM_CMD_MSK GENMASK(7, 0)
132 #define NFC_RND_WRITE_CMD_MSK GENMASK(15, 8)
133 #define NFC_READ_CMD0_MSK GENMASK(23, 16)
134 #define NFC_READ_CMD1_MSK GENMASK(31, 24)
136 /* define bit use in NFC_ECC_CTL */
137 #define NFC_ECC_EN BIT(0)
138 #define NFC_ECC_PIPELINE BIT(3)
139 #define NFC_ECC_EXCEPTION BIT(4)
140 #define NFC_ECC_BLOCK_SIZE_MSK BIT(5)
141 #define NFC_ECC_BLOCK_512 BIT(5)
142 #define NFC_RANDOM_EN BIT(9)
143 #define NFC_RANDOM_DIRECTION BIT(10)
144 #define NFC_ECC_MODE_MSK GENMASK(15, 12)
145 #define NFC_ECC_MODE(x) ((x) << 12)
146 #define NFC_RANDOM_SEED_MSK GENMASK(30, 16)
147 #define NFC_RANDOM_SEED(x) ((x) << 16)
149 /* define bit use in NFC_ECC_ST */
150 #define NFC_ECC_ERR(x) BIT(x)
151 #define NFC_ECC_ERR_MSK GENMASK(15, 0)
152 #define NFC_ECC_PAT_FOUND(x) BIT(x + 16)
153 #define NFC_ECC_ERR_CNT(b, x) (((x) >> (((b) % 4) * 8)) & 0xff)
155 #define NFC_DEFAULT_TIMEOUT_MS 1000
157 #define NFC_SRAM_SIZE 1024
162 * struct sunxi_nand_chip_sel - stores information related to NAND Chip Select
164 * @cs: the NAND CS id used to communicate with a NAND Chip
165 * @rb: the Ready/Busy pin ID. -1 means no R/B pin connected to the NFC
167 struct sunxi_nand_chip_sel
{
173 * struct sunxi_nand_hw_ecc - stores information related to HW ECC support
175 * @mode: the sunxi ECC mode field deduced from ECC requirements
177 struct sunxi_nand_hw_ecc
{
182 * struct sunxi_nand_chip - stores NAND chip device related information
184 * @node: used to store NAND chips into a list
185 * @nand: base NAND chip structure
186 * @ecc: ECC controller structure
187 * @clk_rate: clk_rate required for this NAND chip
188 * @timing_cfg: TIMING_CFG register value for this NAND chip
189 * @timing_ctl: TIMING_CTL register value for this NAND chip
190 * @nsels: number of CS lines required by the NAND chip
191 * @sels: array of CS lines descriptions
193 struct sunxi_nand_chip
{
194 struct list_head node
;
195 struct nand_chip nand
;
196 struct sunxi_nand_hw_ecc
*ecc
;
197 unsigned long clk_rate
;
201 struct sunxi_nand_chip_sel sels
[];
204 static inline struct sunxi_nand_chip
*to_sunxi_nand(struct nand_chip
*nand
)
206 return container_of(nand
, struct sunxi_nand_chip
, nand
);
210 * NAND Controller capabilities structure: stores NAND controller capabilities
211 * for distinction between compatible strings.
213 * @has_mdma: Use mbus dma mode, otherwise general dma
214 * through MBUS on A23/A33 needs extra configuration.
215 * @reg_io_data: I/O data register
216 * @dma_maxburst: DMA maxburst
218 struct sunxi_nfc_caps
{
220 unsigned int reg_io_data
;
221 unsigned int dma_maxburst
;
225 * struct sunxi_nfc - stores sunxi NAND controller information
227 * @controller: base controller structure
228 * @dev: parent device (used to print error messages)
229 * @regs: NAND controller registers
230 * @ahb_clk: NAND controller AHB clock
231 * @mod_clk: NAND controller mod clock
232 * @reset: NAND controller reset line
233 * @assigned_cs: bitmask describing already assigned CS lines
234 * @clk_rate: NAND controller current clock rate
235 * @chips: a list containing all the NAND chips attached to this NAND
237 * @complete: a completion object used to wait for NAND controller events
238 * @dmac: the DMA channel attached to the NAND controller
239 * @caps: NAND Controller capabilities
242 struct nand_controller controller
;
247 struct reset_control
*reset
;
248 unsigned long assigned_cs
;
249 unsigned long clk_rate
;
250 struct list_head chips
;
251 struct completion complete
;
252 struct dma_chan
*dmac
;
253 const struct sunxi_nfc_caps
*caps
;
256 static inline struct sunxi_nfc
*to_sunxi_nfc(struct nand_controller
*ctrl
)
258 return container_of(ctrl
, struct sunxi_nfc
, controller
);
261 static irqreturn_t
sunxi_nfc_interrupt(int irq
, void *dev_id
)
263 struct sunxi_nfc
*nfc
= dev_id
;
264 u32 st
= readl(nfc
->regs
+ NFC_REG_ST
);
265 u32 ien
= readl(nfc
->regs
+ NFC_REG_INT
);
270 if ((ien
& st
) == ien
)
271 complete(&nfc
->complete
);
273 writel(st
& NFC_INT_MASK
, nfc
->regs
+ NFC_REG_ST
);
274 writel(~st
& ien
& NFC_INT_MASK
, nfc
->regs
+ NFC_REG_INT
);
279 static int sunxi_nfc_wait_events(struct sunxi_nfc
*nfc
, u32 events
,
280 bool use_polling
, unsigned int timeout_ms
)
284 if (events
& ~NFC_INT_MASK
)
288 timeout_ms
= NFC_DEFAULT_TIMEOUT_MS
;
291 init_completion(&nfc
->complete
);
293 writel(events
, nfc
->regs
+ NFC_REG_INT
);
295 ret
= wait_for_completion_timeout(&nfc
->complete
,
296 msecs_to_jiffies(timeout_ms
));
302 writel(0, nfc
->regs
+ NFC_REG_INT
);
306 ret
= readl_poll_timeout(nfc
->regs
+ NFC_REG_ST
, status
,
307 (status
& events
) == events
, 1,
311 writel(events
& NFC_INT_MASK
, nfc
->regs
+ NFC_REG_ST
);
314 dev_err(nfc
->dev
, "wait interrupt timedout\n");
319 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc
*nfc
)
324 ret
= readl_poll_timeout(nfc
->regs
+ NFC_REG_ST
, status
,
325 !(status
& NFC_CMD_FIFO_STATUS
), 1,
326 NFC_DEFAULT_TIMEOUT_MS
* 1000);
328 dev_err(nfc
->dev
, "wait for empty cmd FIFO timedout\n");
333 static int sunxi_nfc_rst(struct sunxi_nfc
*nfc
)
338 writel(0, nfc
->regs
+ NFC_REG_ECC_CTL
);
339 writel(NFC_RESET
, nfc
->regs
+ NFC_REG_CTL
);
341 ret
= readl_poll_timeout(nfc
->regs
+ NFC_REG_CTL
, ctl
,
342 !(ctl
& NFC_RESET
), 1,
343 NFC_DEFAULT_TIMEOUT_MS
* 1000);
345 dev_err(nfc
->dev
, "wait for NAND controller reset timedout\n");
350 static int sunxi_nfc_dma_op_prepare(struct sunxi_nfc
*nfc
, const void *buf
,
351 int chunksize
, int nchunks
,
352 enum dma_data_direction ddir
,
353 struct scatterlist
*sg
)
355 struct dma_async_tx_descriptor
*dmad
;
356 enum dma_transfer_direction tdir
;
360 if (ddir
== DMA_FROM_DEVICE
)
361 tdir
= DMA_DEV_TO_MEM
;
363 tdir
= DMA_MEM_TO_DEV
;
365 sg_init_one(sg
, buf
, nchunks
* chunksize
);
366 ret
= dma_map_sg(nfc
->dev
, sg
, 1, ddir
);
370 if (!nfc
->caps
->has_mdma
) {
371 dmad
= dmaengine_prep_slave_sg(nfc
->dmac
, sg
, 1, tdir
, DMA_CTRL_ACK
);
378 writel(readl(nfc
->regs
+ NFC_REG_CTL
) | NFC_RAM_METHOD
,
379 nfc
->regs
+ NFC_REG_CTL
);
380 writel(nchunks
, nfc
->regs
+ NFC_REG_SECTOR_NUM
);
381 writel(chunksize
, nfc
->regs
+ NFC_REG_CNT
);
383 if (nfc
->caps
->has_mdma
) {
384 writel(readl(nfc
->regs
+ NFC_REG_CTL
) & ~NFC_DMA_TYPE_NORMAL
,
385 nfc
->regs
+ NFC_REG_CTL
);
386 writel(chunksize
* nchunks
, nfc
->regs
+ NFC_REG_MDMA_CNT
);
387 writel(sg_dma_address(sg
), nfc
->regs
+ NFC_REG_MDMA_ADDR
);
389 dmat
= dmaengine_submit(dmad
);
391 ret
= dma_submit_error(dmat
);
393 goto err_clr_dma_flag
;
399 writel(readl(nfc
->regs
+ NFC_REG_CTL
) & ~NFC_RAM_METHOD
,
400 nfc
->regs
+ NFC_REG_CTL
);
403 dma_unmap_sg(nfc
->dev
, sg
, 1, ddir
);
407 static void sunxi_nfc_dma_op_cleanup(struct sunxi_nfc
*nfc
,
408 enum dma_data_direction ddir
,
409 struct scatterlist
*sg
)
411 dma_unmap_sg(nfc
->dev
, sg
, 1, ddir
);
412 writel(readl(nfc
->regs
+ NFC_REG_CTL
) & ~NFC_RAM_METHOD
,
413 nfc
->regs
+ NFC_REG_CTL
);
416 static void sunxi_nfc_select_chip(struct nand_chip
*nand
, unsigned int cs
)
418 struct mtd_info
*mtd
= nand_to_mtd(nand
);
419 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
420 struct sunxi_nfc
*nfc
= to_sunxi_nfc(sunxi_nand
->nand
.controller
);
421 struct sunxi_nand_chip_sel
*sel
;
424 if (cs
> 0 && cs
>= sunxi_nand
->nsels
)
427 ctl
= readl(nfc
->regs
+ NFC_REG_CTL
) &
428 ~(NFC_PAGE_SHIFT_MSK
| NFC_CE_SEL_MSK
| NFC_RB_SEL_MSK
| NFC_EN
);
430 sel
= &sunxi_nand
->sels
[cs
];
431 ctl
|= NFC_CE_SEL(sel
->cs
) | NFC_EN
| NFC_PAGE_SHIFT(nand
->page_shift
);
433 ctl
|= NFC_RB_SEL(sel
->rb
);
435 writel(mtd
->writesize
, nfc
->regs
+ NFC_REG_SPARE_AREA
);
437 if (nfc
->clk_rate
!= sunxi_nand
->clk_rate
) {
438 clk_set_rate(nfc
->mod_clk
, sunxi_nand
->clk_rate
);
439 nfc
->clk_rate
= sunxi_nand
->clk_rate
;
442 writel(sunxi_nand
->timing_ctl
, nfc
->regs
+ NFC_REG_TIMING_CTL
);
443 writel(sunxi_nand
->timing_cfg
, nfc
->regs
+ NFC_REG_TIMING_CFG
);
444 writel(ctl
, nfc
->regs
+ NFC_REG_CTL
);
447 static void sunxi_nfc_read_buf(struct nand_chip
*nand
, uint8_t *buf
, int len
)
449 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
450 struct sunxi_nfc
*nfc
= to_sunxi_nfc(sunxi_nand
->nand
.controller
);
459 cnt
= min(len
- offs
, NFC_SRAM_SIZE
);
461 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
465 writel(cnt
, nfc
->regs
+ NFC_REG_CNT
);
466 tmp
= NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
;
467 writel(tmp
, nfc
->regs
+ NFC_REG_CMD
);
469 /* Arbitrary limit for polling mode */
473 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, poll
, 0);
478 memcpy_fromio(buf
+ offs
, nfc
->regs
+ NFC_RAM0_BASE
,
484 static void sunxi_nfc_write_buf(struct nand_chip
*nand
, const uint8_t *buf
,
487 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
488 struct sunxi_nfc
*nfc
= to_sunxi_nfc(sunxi_nand
->nand
.controller
);
497 cnt
= min(len
- offs
, NFC_SRAM_SIZE
);
499 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
503 writel(cnt
, nfc
->regs
+ NFC_REG_CNT
);
504 memcpy_toio(nfc
->regs
+ NFC_RAM0_BASE
, buf
+ offs
, cnt
);
505 tmp
= NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
|
507 writel(tmp
, nfc
->regs
+ NFC_REG_CMD
);
509 /* Arbitrary limit for polling mode */
513 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, poll
, 0);
521 /* These seed values have been extracted from Allwinner's BSP */
522 static const u16 sunxi_nfc_randomizer_page_seeds
[] = {
523 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
524 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
525 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
526 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
527 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
528 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
529 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
530 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
531 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
532 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
533 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
534 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
535 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
536 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
537 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
538 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
542 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
543 * have been generated using
544 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
545 * the randomizer engine does internally before de/scrambling OOB data.
547 * Those tables are statically defined to avoid calculating randomizer state
550 static const u16 sunxi_nfc_randomizer_ecc512_seeds
[] = {
551 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
552 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
553 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
554 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
555 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
556 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
557 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
558 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
559 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
560 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
561 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
562 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
563 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
564 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
565 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
566 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
569 static const u16 sunxi_nfc_randomizer_ecc1024_seeds
[] = {
570 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
571 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
572 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
573 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
574 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
575 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
576 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
577 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
578 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
579 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
580 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
581 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
582 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
583 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
584 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
585 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
588 static u16
sunxi_nfc_randomizer_step(u16 state
, int count
)
593 * This loop is just a simple implementation of a Fibonacci LFSR using
594 * the x16 + x15 + 1 polynomial.
597 state
= ((state
>> 1) |
598 (((state
^ (state
>> 1)) & 1) << 14)) & 0x7fff;
603 static u16
sunxi_nfc_randomizer_state(struct nand_chip
*nand
, int page
,
606 struct mtd_info
*mtd
= nand_to_mtd(nand
);
607 const u16
*seeds
= sunxi_nfc_randomizer_page_seeds
;
608 int mod
= mtd_div_by_ws(mtd
->erasesize
, mtd
);
610 if (mod
> ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds
))
611 mod
= ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds
);
614 if (mtd
->ecc_step_size
== 512)
615 seeds
= sunxi_nfc_randomizer_ecc512_seeds
;
617 seeds
= sunxi_nfc_randomizer_ecc1024_seeds
;
620 return seeds
[page
% mod
];
623 static void sunxi_nfc_randomizer_config(struct nand_chip
*nand
, int page
,
626 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
627 u32 ecc_ctl
= readl(nfc
->regs
+ NFC_REG_ECC_CTL
);
630 if (!(nand
->options
& NAND_NEED_SCRAMBLING
))
633 ecc_ctl
= readl(nfc
->regs
+ NFC_REG_ECC_CTL
);
634 state
= sunxi_nfc_randomizer_state(nand
, page
, ecc
);
635 ecc_ctl
= readl(nfc
->regs
+ NFC_REG_ECC_CTL
) & ~NFC_RANDOM_SEED_MSK
;
636 writel(ecc_ctl
| NFC_RANDOM_SEED(state
), nfc
->regs
+ NFC_REG_ECC_CTL
);
639 static void sunxi_nfc_randomizer_enable(struct nand_chip
*nand
)
641 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
643 if (!(nand
->options
& NAND_NEED_SCRAMBLING
))
646 writel(readl(nfc
->regs
+ NFC_REG_ECC_CTL
) | NFC_RANDOM_EN
,
647 nfc
->regs
+ NFC_REG_ECC_CTL
);
650 static void sunxi_nfc_randomizer_disable(struct nand_chip
*nand
)
652 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
654 if (!(nand
->options
& NAND_NEED_SCRAMBLING
))
657 writel(readl(nfc
->regs
+ NFC_REG_ECC_CTL
) & ~NFC_RANDOM_EN
,
658 nfc
->regs
+ NFC_REG_ECC_CTL
);
661 static void sunxi_nfc_randomize_bbm(struct nand_chip
*nand
, int page
, u8
*bbm
)
663 u16 state
= sunxi_nfc_randomizer_state(nand
, page
, true);
666 bbm
[1] ^= sunxi_nfc_randomizer_step(state
, 8);
669 static void sunxi_nfc_randomizer_write_buf(struct nand_chip
*nand
,
670 const uint8_t *buf
, int len
,
673 sunxi_nfc_randomizer_config(nand
, page
, ecc
);
674 sunxi_nfc_randomizer_enable(nand
);
675 sunxi_nfc_write_buf(nand
, buf
, len
);
676 sunxi_nfc_randomizer_disable(nand
);
679 static void sunxi_nfc_randomizer_read_buf(struct nand_chip
*nand
, uint8_t *buf
,
680 int len
, bool ecc
, int page
)
682 sunxi_nfc_randomizer_config(nand
, page
, ecc
);
683 sunxi_nfc_randomizer_enable(nand
);
684 sunxi_nfc_read_buf(nand
, buf
, len
);
685 sunxi_nfc_randomizer_disable(nand
);
688 static void sunxi_nfc_hw_ecc_enable(struct nand_chip
*nand
)
690 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
691 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
694 ecc_ctl
= readl(nfc
->regs
+ NFC_REG_ECC_CTL
);
695 ecc_ctl
&= ~(NFC_ECC_MODE_MSK
| NFC_ECC_PIPELINE
|
696 NFC_ECC_BLOCK_SIZE_MSK
);
697 ecc_ctl
|= NFC_ECC_EN
| NFC_ECC_MODE(sunxi_nand
->ecc
->mode
) |
698 NFC_ECC_EXCEPTION
| NFC_ECC_PIPELINE
;
700 if (nand
->ecc
.size
== 512)
701 ecc_ctl
|= NFC_ECC_BLOCK_512
;
703 writel(ecc_ctl
, nfc
->regs
+ NFC_REG_ECC_CTL
);
706 static void sunxi_nfc_hw_ecc_disable(struct nand_chip
*nand
)
708 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
710 writel(readl(nfc
->regs
+ NFC_REG_ECC_CTL
) & ~NFC_ECC_EN
,
711 nfc
->regs
+ NFC_REG_ECC_CTL
);
714 static inline void sunxi_nfc_user_data_to_buf(u32 user_data
, u8
*buf
)
717 buf
[1] = user_data
>> 8;
718 buf
[2] = user_data
>> 16;
719 buf
[3] = user_data
>> 24;
722 static inline u32
sunxi_nfc_buf_to_user_data(const u8
*buf
)
724 return buf
[0] | (buf
[1] << 8) | (buf
[2] << 16) | (buf
[3] << 24);
727 static void sunxi_nfc_hw_ecc_get_prot_oob_bytes(struct nand_chip
*nand
, u8
*oob
,
728 int step
, bool bbm
, int page
)
730 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
732 sunxi_nfc_user_data_to_buf(readl(nfc
->regs
+ NFC_REG_USER_DATA(step
)),
735 /* De-randomize the Bad Block Marker. */
736 if (bbm
&& (nand
->options
& NAND_NEED_SCRAMBLING
))
737 sunxi_nfc_randomize_bbm(nand
, page
, oob
);
740 static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct nand_chip
*nand
,
741 const u8
*oob
, int step
,
744 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
747 /* Randomize the Bad Block Marker. */
748 if (bbm
&& (nand
->options
& NAND_NEED_SCRAMBLING
)) {
749 memcpy(user_data
, oob
, sizeof(user_data
));
750 sunxi_nfc_randomize_bbm(nand
, page
, user_data
);
754 writel(sunxi_nfc_buf_to_user_data(oob
),
755 nfc
->regs
+ NFC_REG_USER_DATA(step
));
758 static void sunxi_nfc_hw_ecc_update_stats(struct nand_chip
*nand
,
759 unsigned int *max_bitflips
, int ret
)
761 struct mtd_info
*mtd
= nand_to_mtd(nand
);
764 mtd
->ecc_stats
.failed
++;
766 mtd
->ecc_stats
.corrected
+= ret
;
767 *max_bitflips
= max_t(unsigned int, *max_bitflips
, ret
);
771 static int sunxi_nfc_hw_ecc_correct(struct nand_chip
*nand
, u8
*data
, u8
*oob
,
772 int step
, u32 status
, bool *erased
)
774 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
775 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
780 if (status
& NFC_ECC_ERR(step
))
783 if (status
& NFC_ECC_PAT_FOUND(step
)) {
786 if (unlikely(!(readl(nfc
->regs
+ NFC_REG_PAT_ID
) & 0x1))) {
794 memset(data
, pattern
, ecc
->size
);
797 memset(oob
, pattern
, ecc
->bytes
+ 4);
802 tmp
= readl(nfc
->regs
+ NFC_REG_ECC_ERR_CNT(step
));
804 return NFC_ECC_ERR_CNT(step
, tmp
);
807 static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip
*nand
,
808 u8
*data
, int data_off
,
809 u8
*oob
, int oob_off
,
811 unsigned int *max_bitflips
,
812 bool bbm
, bool oob_required
, int page
)
814 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
815 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
820 if (*cur_off
!= data_off
)
821 nand_change_read_column_op(nand
, data_off
, NULL
, 0, false);
823 sunxi_nfc_randomizer_read_buf(nand
, NULL
, ecc
->size
, false, page
);
825 if (data_off
+ ecc
->size
!= oob_off
)
826 nand_change_read_column_op(nand
, oob_off
, NULL
, 0, false);
828 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
832 sunxi_nfc_randomizer_enable(nand
);
833 writel(NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
| NFC_ECC_OP
,
834 nfc
->regs
+ NFC_REG_CMD
);
836 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, false, 0);
837 sunxi_nfc_randomizer_disable(nand
);
841 *cur_off
= oob_off
+ ecc
->bytes
+ 4;
843 ret
= sunxi_nfc_hw_ecc_correct(nand
, data
, oob_required
? oob
: NULL
, 0,
844 readl(nfc
->regs
+ NFC_REG_ECC_ST
),
851 * Re-read the data with the randomizer disabled to identify
852 * bitflips in erased pages.
854 if (nand
->options
& NAND_NEED_SCRAMBLING
)
855 nand_change_read_column_op(nand
, data_off
, data
,
858 memcpy_fromio(data
, nfc
->regs
+ NFC_RAM0_BASE
,
861 nand_change_read_column_op(nand
, oob_off
, oob
, ecc
->bytes
+ 4,
864 ret
= nand_check_erased_ecc_chunk(data
, ecc
->size
,
866 NULL
, 0, ecc
->strength
);
870 memcpy_fromio(data
, nfc
->regs
+ NFC_RAM0_BASE
, ecc
->size
);
873 nand_change_read_column_op(nand
, oob_off
, NULL
, 0,
875 sunxi_nfc_randomizer_read_buf(nand
, oob
, ecc
->bytes
+ 4,
878 sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand
, oob
, 0,
883 sunxi_nfc_hw_ecc_update_stats(nand
, max_bitflips
, ret
);
888 static void sunxi_nfc_hw_ecc_read_extra_oob(struct nand_chip
*nand
,
889 u8
*oob
, int *cur_off
,
890 bool randomize
, int page
)
892 struct mtd_info
*mtd
= nand_to_mtd(nand
);
893 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
894 int offset
= ((ecc
->bytes
+ 4) * ecc
->steps
);
895 int len
= mtd
->oobsize
- offset
;
900 if (!cur_off
|| *cur_off
!= offset
)
901 nand_change_read_column_op(nand
, mtd
->writesize
, NULL
, 0,
905 sunxi_nfc_read_buf(nand
, oob
+ offset
, len
);
907 sunxi_nfc_randomizer_read_buf(nand
, oob
+ offset
, len
,
911 *cur_off
= mtd
->oobsize
+ mtd
->writesize
;
914 static int sunxi_nfc_hw_ecc_read_chunks_dma(struct nand_chip
*nand
, uint8_t *buf
,
915 int oob_required
, int page
,
918 bool randomized
= nand
->options
& NAND_NEED_SCRAMBLING
;
919 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
920 struct mtd_info
*mtd
= nand_to_mtd(nand
);
921 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
922 unsigned int max_bitflips
= 0;
923 int ret
, i
, raw_mode
= 0;
924 struct scatterlist sg
;
927 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
931 ret
= sunxi_nfc_dma_op_prepare(nfc
, buf
, ecc
->size
, nchunks
,
932 DMA_FROM_DEVICE
, &sg
);
936 sunxi_nfc_hw_ecc_enable(nand
);
937 sunxi_nfc_randomizer_config(nand
, page
, false);
938 sunxi_nfc_randomizer_enable(nand
);
940 writel((NAND_CMD_RNDOUTSTART
<< 16) | (NAND_CMD_RNDOUT
<< 8) |
941 NAND_CMD_READSTART
, nfc
->regs
+ NFC_REG_RCMD_SET
);
943 wait
= NFC_CMD_INT_FLAG
;
945 if (nfc
->caps
->has_mdma
)
946 wait
|= NFC_DMA_INT_FLAG
;
948 dma_async_issue_pending(nfc
->dmac
);
950 writel(NFC_PAGE_OP
| NFC_DATA_SWAP_METHOD
| NFC_DATA_TRANS
,
951 nfc
->regs
+ NFC_REG_CMD
);
953 ret
= sunxi_nfc_wait_events(nfc
, wait
, false, 0);
954 if (ret
&& !nfc
->caps
->has_mdma
)
955 dmaengine_terminate_all(nfc
->dmac
);
957 sunxi_nfc_randomizer_disable(nand
);
958 sunxi_nfc_hw_ecc_disable(nand
);
960 sunxi_nfc_dma_op_cleanup(nfc
, DMA_FROM_DEVICE
, &sg
);
965 status
= readl(nfc
->regs
+ NFC_REG_ECC_ST
);
967 for (i
= 0; i
< nchunks
; i
++) {
968 int data_off
= i
* ecc
->size
;
969 int oob_off
= i
* (ecc
->bytes
+ 4);
970 u8
*data
= buf
+ data_off
;
971 u8
*oob
= nand
->oob_poi
+ oob_off
;
974 ret
= sunxi_nfc_hw_ecc_correct(nand
, randomized
? data
: NULL
,
975 oob_required
? oob
: NULL
,
978 /* ECC errors are handled in the second loop. */
982 if (oob_required
&& !erased
) {
983 /* TODO: use DMA to retrieve OOB */
984 nand_change_read_column_op(nand
,
985 mtd
->writesize
+ oob_off
,
986 oob
, ecc
->bytes
+ 4, false);
988 sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand
, oob
, i
,
995 sunxi_nfc_hw_ecc_update_stats(nand
, &max_bitflips
, ret
);
998 if (status
& NFC_ECC_ERR_MSK
) {
999 for (i
= 0; i
< nchunks
; i
++) {
1000 int data_off
= i
* ecc
->size
;
1001 int oob_off
= i
* (ecc
->bytes
+ 4);
1002 u8
*data
= buf
+ data_off
;
1003 u8
*oob
= nand
->oob_poi
+ oob_off
;
1005 if (!(status
& NFC_ECC_ERR(i
)))
1009 * Re-read the data with the randomizer disabled to
1010 * identify bitflips in erased pages.
1011 * TODO: use DMA to read page in raw mode
1014 nand_change_read_column_op(nand
, data_off
,
1018 /* TODO: use DMA to retrieve OOB */
1019 nand_change_read_column_op(nand
,
1020 mtd
->writesize
+ oob_off
,
1021 oob
, ecc
->bytes
+ 4, false);
1023 ret
= nand_check_erased_ecc_chunk(data
, ecc
->size
,
1024 oob
, ecc
->bytes
+ 4,
1030 sunxi_nfc_hw_ecc_update_stats(nand
, &max_bitflips
, ret
);
1035 sunxi_nfc_hw_ecc_read_extra_oob(nand
, nand
->oob_poi
,
1039 return max_bitflips
;
1042 static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip
*nand
,
1043 const u8
*data
, int data_off
,
1044 const u8
*oob
, int oob_off
,
1045 int *cur_off
, bool bbm
,
1048 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
1049 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1052 if (data_off
!= *cur_off
)
1053 nand_change_write_column_op(nand
, data_off
, NULL
, 0, false);
1055 sunxi_nfc_randomizer_write_buf(nand
, data
, ecc
->size
, false, page
);
1057 if (data_off
+ ecc
->size
!= oob_off
)
1058 nand_change_write_column_op(nand
, oob_off
, NULL
, 0, false);
1060 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
1064 sunxi_nfc_randomizer_enable(nand
);
1065 sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand
, oob
, 0, bbm
, page
);
1067 writel(NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
|
1068 NFC_ACCESS_DIR
| NFC_ECC_OP
,
1069 nfc
->regs
+ NFC_REG_CMD
);
1071 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
, false, 0);
1072 sunxi_nfc_randomizer_disable(nand
);
1076 *cur_off
= oob_off
+ ecc
->bytes
+ 4;
1081 static void sunxi_nfc_hw_ecc_write_extra_oob(struct nand_chip
*nand
,
1082 u8
*oob
, int *cur_off
,
1085 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1086 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1087 int offset
= ((ecc
->bytes
+ 4) * ecc
->steps
);
1088 int len
= mtd
->oobsize
- offset
;
1093 if (!cur_off
|| *cur_off
!= offset
)
1094 nand_change_write_column_op(nand
, offset
+ mtd
->writesize
,
1097 sunxi_nfc_randomizer_write_buf(nand
, oob
+ offset
, len
, false, page
);
1100 *cur_off
= mtd
->oobsize
+ mtd
->writesize
;
1103 static int sunxi_nfc_hw_ecc_read_page(struct nand_chip
*nand
, uint8_t *buf
,
1104 int oob_required
, int page
)
1106 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1107 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1108 unsigned int max_bitflips
= 0;
1109 int ret
, i
, cur_off
= 0;
1110 bool raw_mode
= false;
1112 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1114 nand_read_page_op(nand
, page
, 0, NULL
, 0);
1116 sunxi_nfc_hw_ecc_enable(nand
);
1118 for (i
= 0; i
< ecc
->steps
; i
++) {
1119 int data_off
= i
* ecc
->size
;
1120 int oob_off
= i
* (ecc
->bytes
+ 4);
1121 u8
*data
= buf
+ data_off
;
1122 u8
*oob
= nand
->oob_poi
+ oob_off
;
1124 ret
= sunxi_nfc_hw_ecc_read_chunk(nand
, data
, data_off
, oob
,
1125 oob_off
+ mtd
->writesize
,
1126 &cur_off
, &max_bitflips
,
1127 !i
, oob_required
, page
);
1135 sunxi_nfc_hw_ecc_read_extra_oob(nand
, nand
->oob_poi
, &cur_off
,
1138 sunxi_nfc_hw_ecc_disable(nand
);
1140 return max_bitflips
;
1143 static int sunxi_nfc_hw_ecc_read_page_dma(struct nand_chip
*nand
, u8
*buf
,
1144 int oob_required
, int page
)
1148 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1150 nand_read_page_op(nand
, page
, 0, NULL
, 0);
1152 ret
= sunxi_nfc_hw_ecc_read_chunks_dma(nand
, buf
, oob_required
, page
,
1157 /* Fallback to PIO mode */
1158 return sunxi_nfc_hw_ecc_read_page(nand
, buf
, oob_required
, page
);
1161 static int sunxi_nfc_hw_ecc_read_subpage(struct nand_chip
*nand
,
1162 u32 data_offs
, u32 readlen
,
1163 u8
*bufpoi
, int page
)
1165 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1166 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1167 int ret
, i
, cur_off
= 0;
1168 unsigned int max_bitflips
= 0;
1170 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1172 nand_read_page_op(nand
, page
, 0, NULL
, 0);
1174 sunxi_nfc_hw_ecc_enable(nand
);
1176 for (i
= data_offs
/ ecc
->size
;
1177 i
< DIV_ROUND_UP(data_offs
+ readlen
, ecc
->size
); i
++) {
1178 int data_off
= i
* ecc
->size
;
1179 int oob_off
= i
* (ecc
->bytes
+ 4);
1180 u8
*data
= bufpoi
+ data_off
;
1181 u8
*oob
= nand
->oob_poi
+ oob_off
;
1183 ret
= sunxi_nfc_hw_ecc_read_chunk(nand
, data
, data_off
,
1185 oob_off
+ mtd
->writesize
,
1186 &cur_off
, &max_bitflips
, !i
,
1192 sunxi_nfc_hw_ecc_disable(nand
);
1194 return max_bitflips
;
1197 static int sunxi_nfc_hw_ecc_read_subpage_dma(struct nand_chip
*nand
,
1198 u32 data_offs
, u32 readlen
,
1201 int nchunks
= DIV_ROUND_UP(data_offs
+ readlen
, nand
->ecc
.size
);
1204 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1206 nand_read_page_op(nand
, page
, 0, NULL
, 0);
1208 ret
= sunxi_nfc_hw_ecc_read_chunks_dma(nand
, buf
, false, page
, nchunks
);
1212 /* Fallback to PIO mode */
1213 return sunxi_nfc_hw_ecc_read_subpage(nand
, data_offs
, readlen
,
1217 static int sunxi_nfc_hw_ecc_write_page(struct nand_chip
*nand
,
1218 const uint8_t *buf
, int oob_required
,
1221 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1222 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1223 int ret
, i
, cur_off
= 0;
1225 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1227 nand_prog_page_begin_op(nand
, page
, 0, NULL
, 0);
1229 sunxi_nfc_hw_ecc_enable(nand
);
1231 for (i
= 0; i
< ecc
->steps
; i
++) {
1232 int data_off
= i
* ecc
->size
;
1233 int oob_off
= i
* (ecc
->bytes
+ 4);
1234 const u8
*data
= buf
+ data_off
;
1235 const u8
*oob
= nand
->oob_poi
+ oob_off
;
1237 ret
= sunxi_nfc_hw_ecc_write_chunk(nand
, data
, data_off
, oob
,
1238 oob_off
+ mtd
->writesize
,
1239 &cur_off
, !i
, page
);
1244 if (oob_required
|| (nand
->options
& NAND_NEED_SCRAMBLING
))
1245 sunxi_nfc_hw_ecc_write_extra_oob(nand
, nand
->oob_poi
,
1248 sunxi_nfc_hw_ecc_disable(nand
);
1250 return nand_prog_page_end_op(nand
);
1253 static int sunxi_nfc_hw_ecc_write_subpage(struct nand_chip
*nand
,
1254 u32 data_offs
, u32 data_len
,
1255 const u8
*buf
, int oob_required
,
1258 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1259 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1260 int ret
, i
, cur_off
= 0;
1262 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1264 nand_prog_page_begin_op(nand
, page
, 0, NULL
, 0);
1266 sunxi_nfc_hw_ecc_enable(nand
);
1268 for (i
= data_offs
/ ecc
->size
;
1269 i
< DIV_ROUND_UP(data_offs
+ data_len
, ecc
->size
); i
++) {
1270 int data_off
= i
* ecc
->size
;
1271 int oob_off
= i
* (ecc
->bytes
+ 4);
1272 const u8
*data
= buf
+ data_off
;
1273 const u8
*oob
= nand
->oob_poi
+ oob_off
;
1275 ret
= sunxi_nfc_hw_ecc_write_chunk(nand
, data
, data_off
, oob
,
1276 oob_off
+ mtd
->writesize
,
1277 &cur_off
, !i
, page
);
1282 sunxi_nfc_hw_ecc_disable(nand
);
1284 return nand_prog_page_end_op(nand
);
1287 static int sunxi_nfc_hw_ecc_write_page_dma(struct nand_chip
*nand
,
1292 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
1293 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1294 struct scatterlist sg
;
1298 sunxi_nfc_select_chip(nand
, nand
->cur_cs
);
1300 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
1304 ret
= sunxi_nfc_dma_op_prepare(nfc
, buf
, ecc
->size
, ecc
->steps
,
1305 DMA_TO_DEVICE
, &sg
);
1309 for (i
= 0; i
< ecc
->steps
; i
++) {
1310 const u8
*oob
= nand
->oob_poi
+ (i
* (ecc
->bytes
+ 4));
1312 sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand
, oob
, i
, !i
, page
);
1315 nand_prog_page_begin_op(nand
, page
, 0, NULL
, 0);
1317 sunxi_nfc_hw_ecc_enable(nand
);
1318 sunxi_nfc_randomizer_config(nand
, page
, false);
1319 sunxi_nfc_randomizer_enable(nand
);
1321 writel((NAND_CMD_RNDIN
<< 8) | NAND_CMD_PAGEPROG
,
1322 nfc
->regs
+ NFC_REG_WCMD_SET
);
1324 wait
= NFC_CMD_INT_FLAG
;
1326 if (nfc
->caps
->has_mdma
)
1327 wait
|= NFC_DMA_INT_FLAG
;
1329 dma_async_issue_pending(nfc
->dmac
);
1331 writel(NFC_PAGE_OP
| NFC_DATA_SWAP_METHOD
|
1332 NFC_DATA_TRANS
| NFC_ACCESS_DIR
,
1333 nfc
->regs
+ NFC_REG_CMD
);
1335 ret
= sunxi_nfc_wait_events(nfc
, wait
, false, 0);
1336 if (ret
&& !nfc
->caps
->has_mdma
)
1337 dmaengine_terminate_all(nfc
->dmac
);
1339 sunxi_nfc_randomizer_disable(nand
);
1340 sunxi_nfc_hw_ecc_disable(nand
);
1342 sunxi_nfc_dma_op_cleanup(nfc
, DMA_TO_DEVICE
, &sg
);
1347 if (oob_required
|| (nand
->options
& NAND_NEED_SCRAMBLING
))
1348 /* TODO: use DMA to transfer extra OOB bytes ? */
1349 sunxi_nfc_hw_ecc_write_extra_oob(nand
, nand
->oob_poi
,
1352 return nand_prog_page_end_op(nand
);
1355 return sunxi_nfc_hw_ecc_write_page(nand
, buf
, oob_required
, page
);
1358 static int sunxi_nfc_hw_ecc_read_oob(struct nand_chip
*nand
, int page
)
1360 u8
*buf
= nand_get_data_buf(nand
);
1362 return nand
->ecc
.read_page(nand
, buf
, 1, page
);
1365 static int sunxi_nfc_hw_ecc_write_oob(struct nand_chip
*nand
, int page
)
1367 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1368 u8
*buf
= nand_get_data_buf(nand
);
1371 memset(buf
, 0xff, mtd
->writesize
);
1372 ret
= nand
->ecc
.write_page(nand
, buf
, 1, page
);
1376 /* Send command to program the OOB data */
1377 return nand_prog_page_end_op(nand
);
1380 static const s32 tWB_lut
[] = {6, 12, 16, 20};
1381 static const s32 tRHW_lut
[] = {4, 8, 12, 20};
1383 static int _sunxi_nand_lookup_timing(const s32
*lut
, int lut_size
, u32 duration
,
1386 u32 clk_cycles
= DIV_ROUND_UP(duration
, clk_period
);
1389 for (i
= 0; i
< lut_size
; i
++) {
1390 if (clk_cycles
<= lut
[i
])
1398 #define sunxi_nand_lookup_timing(l, p, c) \
1399 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1401 static int sunxi_nfc_setup_interface(struct nand_chip
*nand
, int csline
,
1402 const struct nand_interface_config
*conf
)
1404 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
1405 struct sunxi_nfc
*nfc
= to_sunxi_nfc(sunxi_nand
->nand
.controller
);
1406 const struct nand_sdr_timings
*timings
;
1407 u32 min_clk_period
= 0;
1408 s32 tWB
, tADL
, tWHR
, tRHW
, tCAD
;
1411 timings
= nand_get_sdr_timings(conf
);
1412 if (IS_ERR(timings
))
1416 if (timings
->tCLS_min
> min_clk_period
)
1417 min_clk_period
= timings
->tCLS_min
;
1420 if (timings
->tCLH_min
> min_clk_period
)
1421 min_clk_period
= timings
->tCLH_min
;
1424 if (timings
->tCS_min
> min_clk_period
)
1425 min_clk_period
= timings
->tCS_min
;
1428 if (timings
->tCH_min
> min_clk_period
)
1429 min_clk_period
= timings
->tCH_min
;
1432 if (timings
->tWP_min
> min_clk_period
)
1433 min_clk_period
= timings
->tWP_min
;
1436 if (timings
->tWH_min
> min_clk_period
)
1437 min_clk_period
= timings
->tWH_min
;
1440 if (timings
->tALS_min
> min_clk_period
)
1441 min_clk_period
= timings
->tALS_min
;
1444 if (timings
->tDS_min
> min_clk_period
)
1445 min_clk_period
= timings
->tDS_min
;
1448 if (timings
->tDH_min
> min_clk_period
)
1449 min_clk_period
= timings
->tDH_min
;
1452 if (timings
->tRR_min
> (min_clk_period
* 3))
1453 min_clk_period
= DIV_ROUND_UP(timings
->tRR_min
, 3);
1456 if (timings
->tALH_min
> min_clk_period
)
1457 min_clk_period
= timings
->tALH_min
;
1460 if (timings
->tRP_min
> min_clk_period
)
1461 min_clk_period
= timings
->tRP_min
;
1464 if (timings
->tREH_min
> min_clk_period
)
1465 min_clk_period
= timings
->tREH_min
;
1468 if (timings
->tRC_min
> (min_clk_period
* 2))
1469 min_clk_period
= DIV_ROUND_UP(timings
->tRC_min
, 2);
1472 if (timings
->tWC_min
> (min_clk_period
* 2))
1473 min_clk_period
= DIV_ROUND_UP(timings
->tWC_min
, 2);
1475 /* T16 - T19 + tCAD */
1476 if (timings
->tWB_max
> (min_clk_period
* 20))
1477 min_clk_period
= DIV_ROUND_UP(timings
->tWB_max
, 20);
1479 if (timings
->tADL_min
> (min_clk_period
* 32))
1480 min_clk_period
= DIV_ROUND_UP(timings
->tADL_min
, 32);
1482 if (timings
->tWHR_min
> (min_clk_period
* 32))
1483 min_clk_period
= DIV_ROUND_UP(timings
->tWHR_min
, 32);
1485 if (timings
->tRHW_min
> (min_clk_period
* 20))
1486 min_clk_period
= DIV_ROUND_UP(timings
->tRHW_min
, 20);
1489 * In non-EDO, tREA should be less than tRP to guarantee that the
1490 * controller does not sample the IO lines too early. Unfortunately,
1491 * the sunxi NAND controller does not allow us to have different
1492 * values for tRP and tREH (tRP = tREH = tRW / 2).
1494 * We have 2 options to overcome this limitation:
1496 * 1/ Extend tRC to fulfil the tREA <= tRC / 2 constraint
1497 * 2/ Use EDO mode (only works if timings->tRLOH > 0)
1499 if (timings
->tREA_max
> min_clk_period
&& !timings
->tRLOH_min
)
1500 min_clk_period
= timings
->tREA_max
;
1502 tWB
= sunxi_nand_lookup_timing(tWB_lut
, timings
->tWB_max
,
1505 dev_err(nfc
->dev
, "unsupported tWB\n");
1509 tADL
= DIV_ROUND_UP(timings
->tADL_min
, min_clk_period
) >> 3;
1511 dev_err(nfc
->dev
, "unsupported tADL\n");
1515 tWHR
= DIV_ROUND_UP(timings
->tWHR_min
, min_clk_period
) >> 3;
1517 dev_err(nfc
->dev
, "unsupported tWHR\n");
1521 tRHW
= sunxi_nand_lookup_timing(tRHW_lut
, timings
->tRHW_min
,
1524 dev_err(nfc
->dev
, "unsupported tRHW\n");
1528 if (csline
== NAND_DATA_IFACE_CHECK_ONLY
)
1532 * TODO: according to ONFI specs this value only applies for DDR NAND,
1533 * but Allwinner seems to set this to 0x7. Mimic them for now.
1537 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1538 sunxi_nand
->timing_cfg
= NFC_TIMING_CFG(tWB
, tADL
, tWHR
, tRHW
, tCAD
);
1540 /* Convert min_clk_period from picoseconds to nanoseconds */
1541 min_clk_period
= DIV_ROUND_UP(min_clk_period
, 1000);
1544 * Unlike what is stated in Allwinner datasheet, the clk_rate should
1545 * be set to (1 / min_clk_period), and not (2 / min_clk_period).
1546 * This new formula was verified with a scope and validated by
1547 * Allwinner engineers.
1549 sunxi_nand
->clk_rate
= NSEC_PER_SEC
/ min_clk_period
;
1550 real_clk_rate
= clk_round_rate(nfc
->mod_clk
, sunxi_nand
->clk_rate
);
1551 if (real_clk_rate
<= 0) {
1552 dev_err(nfc
->dev
, "Unable to round clk %lu\n",
1553 sunxi_nand
->clk_rate
);
1557 sunxi_nand
->timing_ctl
= 0;
1560 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1561 * output cycle timings shall be used if the host drives tRC less than
1562 * 30 ns. We should also use EDO mode if tREA is bigger than tRP.
1564 min_clk_period
= NSEC_PER_SEC
/ real_clk_rate
;
1565 if (min_clk_period
* 2 < 30 || min_clk_period
* 1000 < timings
->tREA_max
)
1566 sunxi_nand
->timing_ctl
= NFC_TIMING_CTL_EDO
;
1571 static int sunxi_nand_ooblayout_ecc(struct mtd_info
*mtd
, int section
,
1572 struct mtd_oob_region
*oobregion
)
1574 struct nand_chip
*nand
= mtd_to_nand(mtd
);
1575 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1577 if (section
>= ecc
->steps
)
1580 oobregion
->offset
= section
* (ecc
->bytes
+ 4) + 4;
1581 oobregion
->length
= ecc
->bytes
;
1586 static int sunxi_nand_ooblayout_free(struct mtd_info
*mtd
, int section
,
1587 struct mtd_oob_region
*oobregion
)
1589 struct nand_chip
*nand
= mtd_to_nand(mtd
);
1590 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1592 if (section
> ecc
->steps
)
1596 * The first 2 bytes are used for BB markers, hence we
1597 * only have 2 bytes available in the first user data
1600 if (!section
&& ecc
->engine_type
== NAND_ECC_ENGINE_TYPE_ON_HOST
) {
1601 oobregion
->offset
= 2;
1602 oobregion
->length
= 2;
1607 oobregion
->offset
= section
* (ecc
->bytes
+ 4);
1609 if (section
< ecc
->steps
)
1610 oobregion
->length
= 4;
1612 oobregion
->offset
= mtd
->oobsize
- oobregion
->offset
;
1617 static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops
= {
1618 .ecc
= sunxi_nand_ooblayout_ecc
,
1619 .free
= sunxi_nand_ooblayout_free
,
1622 static void sunxi_nand_hw_ecc_ctrl_cleanup(struct sunxi_nand_chip
*sunxi_nand
)
1624 kfree(sunxi_nand
->ecc
);
1627 static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip
*nand
,
1628 struct nand_ecc_ctrl
*ecc
,
1629 struct device_node
*np
)
1631 static const u8 strengths
[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1632 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
1633 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
1634 struct mtd_info
*mtd
= nand_to_mtd(nand
);
1635 struct nand_device
*nanddev
= mtd_to_nanddev(mtd
);
1640 if (nanddev
->ecc
.user_conf
.flags
& NAND_ECC_MAXIMIZE_STRENGTH
) {
1644 nsectors
= mtd
->writesize
/ ecc
->size
;
1646 /* Reserve 2 bytes for the BBM */
1647 bytes
= (mtd
->oobsize
- 2) / nsectors
;
1649 /* 4 non-ECC bytes are added before each ECC bytes section */
1652 /* and bytes has to be even. */
1656 ecc
->strength
= bytes
* 8 / fls(8 * ecc
->size
);
1658 for (i
= 0; i
< ARRAY_SIZE(strengths
); i
++) {
1659 if (strengths
[i
] > ecc
->strength
)
1666 ecc
->strength
= strengths
[i
- 1];
1669 if (ecc
->size
!= 512 && ecc
->size
!= 1024)
1672 sunxi_nand
->ecc
= kzalloc(sizeof(*sunxi_nand
->ecc
), GFP_KERNEL
);
1673 if (!sunxi_nand
->ecc
)
1676 /* Prefer 1k ECC chunk over 512 ones */
1677 if (ecc
->size
== 512 && mtd
->writesize
> 512) {
1682 /* Add ECC info retrieval from DT */
1683 for (i
= 0; i
< ARRAY_SIZE(strengths
); i
++) {
1684 if (ecc
->strength
<= strengths
[i
]) {
1686 * Update ecc->strength value with the actual strength
1687 * that will be used by the ECC engine.
1689 ecc
->strength
= strengths
[i
];
1694 if (i
>= ARRAY_SIZE(strengths
)) {
1695 dev_err(nfc
->dev
, "unsupported strength\n");
1700 sunxi_nand
->ecc
->mode
= i
;
1702 /* HW ECC always request ECC bytes for 1024 bytes blocks */
1703 ecc
->bytes
= DIV_ROUND_UP(ecc
->strength
* fls(8 * 1024), 8);
1705 /* HW ECC always work with even numbers of ECC bytes */
1706 ecc
->bytes
= ALIGN(ecc
->bytes
, 2);
1708 nsectors
= mtd
->writesize
/ ecc
->size
;
1710 if (mtd
->oobsize
< ((ecc
->bytes
+ 4) * nsectors
)) {
1715 ecc
->read_oob
= sunxi_nfc_hw_ecc_read_oob
;
1716 ecc
->write_oob
= sunxi_nfc_hw_ecc_write_oob
;
1717 mtd_set_ooblayout(mtd
, &sunxi_nand_ooblayout_ops
);
1719 if (nfc
->dmac
|| nfc
->caps
->has_mdma
) {
1720 ecc
->read_page
= sunxi_nfc_hw_ecc_read_page_dma
;
1721 ecc
->read_subpage
= sunxi_nfc_hw_ecc_read_subpage_dma
;
1722 ecc
->write_page
= sunxi_nfc_hw_ecc_write_page_dma
;
1723 nand
->options
|= NAND_USES_DMA
;
1725 ecc
->read_page
= sunxi_nfc_hw_ecc_read_page
;
1726 ecc
->read_subpage
= sunxi_nfc_hw_ecc_read_subpage
;
1727 ecc
->write_page
= sunxi_nfc_hw_ecc_write_page
;
1730 /* TODO: support DMA for raw accesses and subpage write */
1731 ecc
->write_subpage
= sunxi_nfc_hw_ecc_write_subpage
;
1732 ecc
->read_oob_raw
= nand_read_oob_std
;
1733 ecc
->write_oob_raw
= nand_write_oob_std
;
1738 kfree(sunxi_nand
->ecc
);
1743 static void sunxi_nand_ecc_cleanup(struct sunxi_nand_chip
*sunxi_nand
)
1745 struct nand_ecc_ctrl
*ecc
= &sunxi_nand
->nand
.ecc
;
1747 switch (ecc
->engine_type
) {
1748 case NAND_ECC_ENGINE_TYPE_ON_HOST
:
1749 sunxi_nand_hw_ecc_ctrl_cleanup(sunxi_nand
);
1751 case NAND_ECC_ENGINE_TYPE_NONE
:
1757 static int sunxi_nand_attach_chip(struct nand_chip
*nand
)
1759 const struct nand_ecc_props
*requirements
=
1760 nanddev_get_ecc_requirements(&nand
->base
);
1761 struct nand_ecc_ctrl
*ecc
= &nand
->ecc
;
1762 struct device_node
*np
= nand_get_flash_node(nand
);
1765 if (nand
->bbt_options
& NAND_BBT_USE_FLASH
)
1766 nand
->bbt_options
|= NAND_BBT_NO_OOB
;
1768 if (nand
->options
& NAND_NEED_SCRAMBLING
)
1769 nand
->options
|= NAND_NO_SUBPAGE_WRITE
;
1771 nand
->options
|= NAND_SUBPAGE_READ
;
1774 ecc
->size
= requirements
->step_size
;
1775 ecc
->strength
= requirements
->strength
;
1778 if (!ecc
->size
|| !ecc
->strength
)
1781 switch (ecc
->engine_type
) {
1782 case NAND_ECC_ENGINE_TYPE_ON_HOST
:
1783 ret
= sunxi_nand_hw_ecc_ctrl_init(nand
, ecc
, np
);
1787 case NAND_ECC_ENGINE_TYPE_NONE
:
1788 case NAND_ECC_ENGINE_TYPE_SOFT
:
1797 static int sunxi_nfc_exec_subop(struct nand_chip
*nand
,
1798 const struct nand_subop
*subop
)
1800 struct sunxi_nfc
*nfc
= to_sunxi_nfc(nand
->controller
);
1801 u32 cmd
= 0, extcmd
= 0, cnt
= 0, addrs
[2] = { };
1802 unsigned int i
, j
, remaining
, start
;
1806 for (i
= 0; i
< subop
->ninstrs
; i
++) {
1807 const struct nand_op_instr
*instr
= &subop
->instrs
[i
];
1809 switch (instr
->type
) {
1810 case NAND_OP_CMD_INSTR
:
1811 if (cmd
& NFC_SEND_CMD1
) {
1812 if (WARN_ON(cmd
& NFC_SEND_CMD2
))
1815 cmd
|= NFC_SEND_CMD2
;
1816 extcmd
|= instr
->ctx
.cmd
.opcode
;
1818 cmd
|= NFC_SEND_CMD1
|
1819 NFC_CMD(instr
->ctx
.cmd
.opcode
);
1823 case NAND_OP_ADDR_INSTR
:
1824 remaining
= nand_subop_get_num_addr_cyc(subop
, i
);
1825 start
= nand_subop_get_addr_start_off(subop
, i
);
1826 for (j
= 0; j
< 8 && j
+ start
< remaining
; j
++) {
1827 u32 addr
= instr
->ctx
.addr
.addrs
[j
+ start
];
1829 addrs
[j
/ 4] |= addr
<< (j
% 4) * 8;
1833 cmd
|= NFC_SEND_ADR
| NFC_ADR_NUM(j
);
1837 case NAND_OP_DATA_IN_INSTR
:
1838 case NAND_OP_DATA_OUT_INSTR
:
1839 start
= nand_subop_get_data_start_off(subop
, i
);
1840 remaining
= nand_subop_get_data_len(subop
, i
);
1841 cnt
= min_t(u32
, remaining
, NFC_SRAM_SIZE
);
1842 cmd
|= NFC_DATA_TRANS
| NFC_DATA_SWAP_METHOD
;
1844 if (instr
->type
== NAND_OP_DATA_OUT_INSTR
) {
1845 cmd
|= NFC_ACCESS_DIR
;
1846 memcpy_toio(nfc
->regs
+ NFC_RAM0_BASE
,
1847 instr
->ctx
.data
.buf
.out
+ start
,
1850 inbuf
= instr
->ctx
.data
.buf
.in
+ start
;
1855 case NAND_OP_WAITRDY_INSTR
:
1856 cmd
|= NFC_WAIT_FLAG
;
1861 ret
= sunxi_nfc_wait_cmd_fifo_empty(nfc
);
1865 if (cmd
& NFC_SEND_ADR
) {
1866 writel(addrs
[0], nfc
->regs
+ NFC_REG_ADDR_LOW
);
1867 writel(addrs
[1], nfc
->regs
+ NFC_REG_ADDR_HIGH
);
1870 if (cmd
& NFC_SEND_CMD2
)
1873 (cmd
& NFC_ACCESS_DIR
?
1874 NFC_REG_WCMD_SET
: NFC_REG_RCMD_SET
));
1876 if (cmd
& NFC_DATA_TRANS
)
1877 writel(cnt
, nfc
->regs
+ NFC_REG_CNT
);
1879 writel(cmd
, nfc
->regs
+ NFC_REG_CMD
);
1881 ret
= sunxi_nfc_wait_events(nfc
, NFC_CMD_INT_FLAG
,
1882 !(cmd
& NFC_WAIT_FLAG
) && cnt
< 64,
1888 memcpy_fromio(inbuf
, nfc
->regs
+ NFC_RAM0_BASE
, cnt
);
1893 static int sunxi_nfc_soft_waitrdy(struct nand_chip
*nand
,
1894 const struct nand_subop
*subop
)
1896 return nand_soft_waitrdy(nand
,
1897 subop
->instrs
[0].ctx
.waitrdy
.timeout_ms
);
1900 static const struct nand_op_parser sunxi_nfc_op_parser
= NAND_OP_PARSER(
1901 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop
,
1902 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1903 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1904 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1905 NAND_OP_PARSER_PAT_WAITRDY_ELEM(true),
1906 NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)),
1907 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop
,
1908 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1909 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1910 NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024),
1911 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1912 NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)),
1915 static const struct nand_op_parser sunxi_nfc_norb_op_parser
= NAND_OP_PARSER(
1916 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop
,
1917 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1918 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1919 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1920 NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)),
1921 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop
,
1922 NAND_OP_PARSER_PAT_CMD_ELEM(true),
1923 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8),
1924 NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024),
1925 NAND_OP_PARSER_PAT_CMD_ELEM(true)),
1926 NAND_OP_PARSER_PATTERN(sunxi_nfc_soft_waitrdy
,
1927 NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)),
1930 static int sunxi_nfc_exec_op(struct nand_chip
*nand
,
1931 const struct nand_operation
*op
, bool check_only
)
1933 struct sunxi_nand_chip
*sunxi_nand
= to_sunxi_nand(nand
);
1934 const struct nand_op_parser
*parser
;
1937 sunxi_nfc_select_chip(nand
, op
->cs
);
1939 if (sunxi_nand
->sels
[op
->cs
].rb
>= 0)
1940 parser
= &sunxi_nfc_op_parser
;
1942 parser
= &sunxi_nfc_norb_op_parser
;
1944 return nand_op_parser_exec_op(nand
, parser
, op
, check_only
);
1947 static const struct nand_controller_ops sunxi_nand_controller_ops
= {
1948 .attach_chip
= sunxi_nand_attach_chip
,
1949 .setup_interface
= sunxi_nfc_setup_interface
,
1950 .exec_op
= sunxi_nfc_exec_op
,
1953 static int sunxi_nand_chip_init(struct device
*dev
, struct sunxi_nfc
*nfc
,
1954 struct device_node
*np
)
1956 struct sunxi_nand_chip
*sunxi_nand
;
1957 struct mtd_info
*mtd
;
1958 struct nand_chip
*nand
;
1964 if (!of_get_property(np
, "reg", &nsels
))
1967 nsels
/= sizeof(u32
);
1969 dev_err(dev
, "invalid reg property size\n");
1973 sunxi_nand
= devm_kzalloc(dev
, struct_size(sunxi_nand
, sels
, nsels
),
1976 dev_err(dev
, "could not allocate chip\n");
1980 sunxi_nand
->nsels
= nsels
;
1982 for (i
= 0; i
< nsels
; i
++) {
1983 ret
= of_property_read_u32_index(np
, "reg", i
, &tmp
);
1985 dev_err(dev
, "could not retrieve reg property: %d\n",
1990 if (tmp
> NFC_MAX_CS
) {
1992 "invalid reg value: %u (max CS = 7)\n",
1997 if (test_and_set_bit(tmp
, &nfc
->assigned_cs
)) {
1998 dev_err(dev
, "CS %d already assigned\n", tmp
);
2002 sunxi_nand
->sels
[i
].cs
= tmp
;
2004 if (!of_property_read_u32_index(np
, "allwinner,rb", i
, &tmp
) &&
2006 sunxi_nand
->sels
[i
].rb
= tmp
;
2008 sunxi_nand
->sels
[i
].rb
= -1;
2011 nand
= &sunxi_nand
->nand
;
2012 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
2013 nand
->controller
= &nfc
->controller
;
2014 nand
->controller
->ops
= &sunxi_nand_controller_ops
;
2017 * Set the ECC mode to the default value in case nothing is specified
2020 nand
->ecc
.engine_type
= NAND_ECC_ENGINE_TYPE_ON_HOST
;
2021 nand_set_flash_node(nand
, np
);
2023 mtd
= nand_to_mtd(nand
);
2024 mtd
->dev
.parent
= dev
;
2026 ret
= nand_scan(nand
, nsels
);
2030 ret
= mtd_device_register(mtd
, NULL
, 0);
2032 dev_err(dev
, "failed to register mtd device: %d\n", ret
);
2037 list_add_tail(&sunxi_nand
->node
, &nfc
->chips
);
2042 static int sunxi_nand_chips_init(struct device
*dev
, struct sunxi_nfc
*nfc
)
2044 struct device_node
*np
= dev
->of_node
;
2045 struct device_node
*nand_np
;
2046 int nchips
= of_get_child_count(np
);
2050 dev_err(dev
, "too many NAND chips: %d (max = 8)\n", nchips
);
2054 for_each_child_of_node(np
, nand_np
) {
2055 ret
= sunxi_nand_chip_init(dev
, nfc
, nand_np
);
2057 of_node_put(nand_np
);
2065 static void sunxi_nand_chips_cleanup(struct sunxi_nfc
*nfc
)
2067 struct sunxi_nand_chip
*sunxi_nand
;
2068 struct nand_chip
*chip
;
2071 while (!list_empty(&nfc
->chips
)) {
2072 sunxi_nand
= list_first_entry(&nfc
->chips
,
2073 struct sunxi_nand_chip
,
2075 chip
= &sunxi_nand
->nand
;
2076 ret
= mtd_device_unregister(nand_to_mtd(chip
));
2079 sunxi_nand_ecc_cleanup(sunxi_nand
);
2080 list_del(&sunxi_nand
->node
);
2084 static int sunxi_nfc_dma_init(struct sunxi_nfc
*nfc
, struct resource
*r
)
2088 if (nfc
->caps
->has_mdma
)
2091 nfc
->dmac
= dma_request_chan(nfc
->dev
, "rxtx");
2092 if (IS_ERR(nfc
->dmac
)) {
2093 ret
= PTR_ERR(nfc
->dmac
);
2094 if (ret
== -EPROBE_DEFER
)
2097 /* Ignore errors to fall back to PIO mode */
2098 dev_warn(nfc
->dev
, "failed to request rxtx DMA channel: %d\n", ret
);
2101 struct dma_slave_config dmac_cfg
= { };
2103 dmac_cfg
.src_addr
= r
->start
+ nfc
->caps
->reg_io_data
;
2104 dmac_cfg
.dst_addr
= dmac_cfg
.src_addr
;
2105 dmac_cfg
.src_addr_width
= DMA_SLAVE_BUSWIDTH_4_BYTES
;
2106 dmac_cfg
.dst_addr_width
= dmac_cfg
.src_addr_width
;
2107 dmac_cfg
.src_maxburst
= nfc
->caps
->dma_maxburst
;
2108 dmac_cfg
.dst_maxburst
= nfc
->caps
->dma_maxburst
;
2109 dmaengine_slave_config(nfc
->dmac
, &dmac_cfg
);
2114 static int sunxi_nfc_probe(struct platform_device
*pdev
)
2116 struct device
*dev
= &pdev
->dev
;
2118 struct sunxi_nfc
*nfc
;
2122 nfc
= devm_kzalloc(dev
, sizeof(*nfc
), GFP_KERNEL
);
2127 nand_controller_init(&nfc
->controller
);
2128 INIT_LIST_HEAD(&nfc
->chips
);
2130 r
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
2131 nfc
->regs
= devm_ioremap_resource(dev
, r
);
2132 if (IS_ERR(nfc
->regs
))
2133 return PTR_ERR(nfc
->regs
);
2135 irq
= platform_get_irq(pdev
, 0);
2139 nfc
->ahb_clk
= devm_clk_get(dev
, "ahb");
2140 if (IS_ERR(nfc
->ahb_clk
)) {
2141 dev_err(dev
, "failed to retrieve ahb clk\n");
2142 return PTR_ERR(nfc
->ahb_clk
);
2145 ret
= clk_prepare_enable(nfc
->ahb_clk
);
2149 nfc
->mod_clk
= devm_clk_get(dev
, "mod");
2150 if (IS_ERR(nfc
->mod_clk
)) {
2151 dev_err(dev
, "failed to retrieve mod clk\n");
2152 ret
= PTR_ERR(nfc
->mod_clk
);
2153 goto out_ahb_clk_unprepare
;
2156 ret
= clk_prepare_enable(nfc
->mod_clk
);
2158 goto out_ahb_clk_unprepare
;
2160 nfc
->reset
= devm_reset_control_get_optional_exclusive(dev
, "ahb");
2161 if (IS_ERR(nfc
->reset
)) {
2162 ret
= PTR_ERR(nfc
->reset
);
2163 goto out_mod_clk_unprepare
;
2166 ret
= reset_control_deassert(nfc
->reset
);
2168 dev_err(dev
, "reset err %d\n", ret
);
2169 goto out_mod_clk_unprepare
;
2172 nfc
->caps
= of_device_get_match_data(&pdev
->dev
);
2175 goto out_ahb_reset_reassert
;
2178 ret
= sunxi_nfc_rst(nfc
);
2180 goto out_ahb_reset_reassert
;
2182 writel(0, nfc
->regs
+ NFC_REG_INT
);
2183 ret
= devm_request_irq(dev
, irq
, sunxi_nfc_interrupt
,
2184 0, "sunxi-nand", nfc
);
2186 goto out_ahb_reset_reassert
;
2188 ret
= sunxi_nfc_dma_init(nfc
, r
);
2191 goto out_ahb_reset_reassert
;
2193 platform_set_drvdata(pdev
, nfc
);
2195 ret
= sunxi_nand_chips_init(dev
, nfc
);
2197 dev_err(dev
, "failed to init nand chips\n");
2198 goto out_release_dmac
;
2205 dma_release_channel(nfc
->dmac
);
2206 out_ahb_reset_reassert
:
2207 reset_control_assert(nfc
->reset
);
2208 out_mod_clk_unprepare
:
2209 clk_disable_unprepare(nfc
->mod_clk
);
2210 out_ahb_clk_unprepare
:
2211 clk_disable_unprepare(nfc
->ahb_clk
);
2216 static int sunxi_nfc_remove(struct platform_device
*pdev
)
2218 struct sunxi_nfc
*nfc
= platform_get_drvdata(pdev
);
2220 sunxi_nand_chips_cleanup(nfc
);
2222 reset_control_assert(nfc
->reset
);
2225 dma_release_channel(nfc
->dmac
);
2226 clk_disable_unprepare(nfc
->mod_clk
);
2227 clk_disable_unprepare(nfc
->ahb_clk
);
2232 static const struct sunxi_nfc_caps sunxi_nfc_a10_caps
= {
2233 .reg_io_data
= NFC_REG_A10_IO_DATA
,
2237 static const struct sunxi_nfc_caps sunxi_nfc_a23_caps
= {
2239 .reg_io_data
= NFC_REG_A23_IO_DATA
,
2243 static const struct of_device_id sunxi_nfc_ids
[] = {
2245 .compatible
= "allwinner,sun4i-a10-nand",
2246 .data
= &sunxi_nfc_a10_caps
,
2249 .compatible
= "allwinner,sun8i-a23-nand-controller",
2250 .data
= &sunxi_nfc_a23_caps
,
2254 MODULE_DEVICE_TABLE(of
, sunxi_nfc_ids
);
2256 static struct platform_driver sunxi_nfc_driver
= {
2258 .name
= "sunxi_nand",
2259 .of_match_table
= sunxi_nfc_ids
,
2261 .probe
= sunxi_nfc_probe
,
2262 .remove
= sunxi_nfc_remove
,
2264 module_platform_driver(sunxi_nfc_driver
);
2266 MODULE_LICENSE("GPL");
2267 MODULE_AUTHOR("Boris BREZILLON");
2268 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");
2269 MODULE_ALIAS("platform:sunxi_nand");