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