1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/module.h>
27#include <linux/bitops.h>
28#include <linux/clk.h>
29#include <linux/delay.h>
30#include <linux/init.h>
31#include <linux/interrupt.h>
32#include <linux/io.h>
33#include <linux/mtd/mtd.h>
34#include <linux/mtd/nand.h>
35#include <linux/mtd/partitions.h>
36#include <linux/of_mtd.h>
37#include <linux/of_device.h>
38#include <linux/pinctrl/consumer.h>
39#include <linux/platform_device.h>
40#include <linux/slab.h>
41
42#define DRV_NAME "vf610_nfc"
43
44
45#define NFC_FLASH_CMD1 0x3F00
46#define NFC_FLASH_CMD2 0x3F04
47#define NFC_COL_ADDR 0x3F08
48#define NFC_ROW_ADDR 0x3F0c
49#define NFC_ROW_ADDR_INC 0x3F14
50#define NFC_FLASH_STATUS1 0x3F18
51#define NFC_FLASH_STATUS2 0x3F1c
52#define NFC_CACHE_SWAP 0x3F28
53#define NFC_SECTOR_SIZE 0x3F2c
54#define NFC_FLASH_CONFIG 0x3F30
55#define NFC_IRQ_STATUS 0x3F38
56
57
58#define NFC_MAIN_AREA(n) ((n) * 0x1000)
59
60#define PAGE_2K 0x0800
61#define OOB_64 0x0040
62#define OOB_MAX 0x0100
63
64
65
66
67
68
69
70
71#define READ_PAGE_CMD_CODE 0x7EE0
72#define READ_ONFI_PARAM_CMD_CODE 0x4860
73#define PROGRAM_PAGE_CMD_CODE 0x7FC0
74#define ERASE_CMD_CODE 0x4EC0
75#define READ_ID_CMD_CODE 0x4804
76#define RESET_CMD_CODE 0x4040
77#define STATUS_READ_CMD_CODE 0x4068
78
79
80#define ECC_BYPASS 0
81#define ECC_45_BYTE 6
82#define ECC_60_BYTE 7
83
84
85
86
87#define CMD_BYTE2_MASK 0xFF000000
88#define CMD_BYTE2_SHIFT 24
89
90
91#define CMD_BYTE1_MASK 0xFF000000
92#define CMD_BYTE1_SHIFT 24
93#define CMD_CODE_MASK 0x00FFFF00
94#define CMD_CODE_SHIFT 8
95#define BUFNO_MASK 0x00000006
96#define BUFNO_SHIFT 1
97#define START_BIT BIT(0)
98
99
100#define COL_ADDR_MASK 0x0000FFFF
101#define COL_ADDR_SHIFT 0
102
103
104#define ROW_ADDR_MASK 0x00FFFFFF
105#define ROW_ADDR_SHIFT 0
106#define ROW_ADDR_CHIP_SEL_RB_MASK 0xF0000000
107#define ROW_ADDR_CHIP_SEL_RB_SHIFT 28
108#define ROW_ADDR_CHIP_SEL_MASK 0x0F000000
109#define ROW_ADDR_CHIP_SEL_SHIFT 24
110
111
112#define STATUS_BYTE1_MASK 0x000000FF
113
114
115#define CONFIG_ECC_SRAM_ADDR_MASK 0x7FC00000
116#define CONFIG_ECC_SRAM_ADDR_SHIFT 22
117#define CONFIG_ECC_SRAM_REQ_BIT BIT(21)
118#define CONFIG_DMA_REQ_BIT BIT(20)
119#define CONFIG_ECC_MODE_MASK 0x000E0000
120#define CONFIG_ECC_MODE_SHIFT 17
121#define CONFIG_FAST_FLASH_BIT BIT(16)
122#define CONFIG_16BIT BIT(7)
123#define CONFIG_BOOT_MODE_BIT BIT(6)
124#define CONFIG_ADDR_AUTO_INCR_BIT BIT(5)
125#define CONFIG_BUFNO_AUTO_INCR_BIT BIT(4)
126#define CONFIG_PAGE_CNT_MASK 0xF
127#define CONFIG_PAGE_CNT_SHIFT 0
128
129
130#define IDLE_IRQ_BIT BIT(29)
131#define IDLE_EN_BIT BIT(20)
132#define CMD_DONE_CLEAR_BIT BIT(18)
133#define IDLE_CLEAR_BIT BIT(17)
134
135
136
137
138
139
140
141#define ECC_SRAM_ADDR (PAGE_2K + OOB_MAX - 8)
142
143#define ECC_STATUS 0x4
144#define ECC_STATUS_MASK 0x80
145#define ECC_STATUS_ERR_COUNT 0x3F
146
147enum vf610_nfc_alt_buf {
148 ALT_BUF_DATA = 0,
149 ALT_BUF_ID = 1,
150 ALT_BUF_STAT = 2,
151 ALT_BUF_ONFI = 3,
152};
153
154enum vf610_nfc_variant {
155 NFC_VFC610 = 1,
156};
157
158struct vf610_nfc {
159 struct nand_chip chip;
160 struct device *dev;
161 void __iomem *regs;
162 struct completion cmd_done;
163 uint buf_offset;
164 int write_sz;
165
166 enum vf610_nfc_alt_buf alt_buf;
167 enum vf610_nfc_variant variant;
168 struct clk *clk;
169 bool use_hw_ecc;
170 u32 ecc_mode;
171};
172
173static inline struct vf610_nfc *mtd_to_nfc(struct mtd_info *mtd)
174{
175 return container_of(mtd_to_nand(mtd), struct vf610_nfc, chip);
176}
177
178static struct nand_ecclayout vf610_nfc_ecc45 = {
179 .eccbytes = 45,
180 .eccpos = {19, 20, 21, 22, 23,
181 24, 25, 26, 27, 28, 29, 30, 31,
182 32, 33, 34, 35, 36, 37, 38, 39,
183 40, 41, 42, 43, 44, 45, 46, 47,
184 48, 49, 50, 51, 52, 53, 54, 55,
185 56, 57, 58, 59, 60, 61, 62, 63},
186 .oobfree = {
187 {.offset = 2,
188 .length = 17} }
189};
190
191static struct nand_ecclayout vf610_nfc_ecc60 = {
192 .eccbytes = 60,
193 .eccpos = { 4, 5, 6, 7, 8, 9, 10, 11,
194 12, 13, 14, 15, 16, 17, 18, 19,
195 20, 21, 22, 23, 24, 25, 26, 27,
196 28, 29, 30, 31, 32, 33, 34, 35,
197 36, 37, 38, 39, 40, 41, 42, 43,
198 44, 45, 46, 47, 48, 49, 50, 51,
199 52, 53, 54, 55, 56, 57, 58, 59,
200 60, 61, 62, 63 },
201 .oobfree = {
202 {.offset = 2,
203 .length = 2} }
204};
205
206static inline u32 vf610_nfc_read(struct vf610_nfc *nfc, uint reg)
207{
208 return readl(nfc->regs + reg);
209}
210
211static inline void vf610_nfc_write(struct vf610_nfc *nfc, uint reg, u32 val)
212{
213 writel(val, nfc->regs + reg);
214}
215
216static inline void vf610_nfc_set(struct vf610_nfc *nfc, uint reg, u32 bits)
217{
218 vf610_nfc_write(nfc, reg, vf610_nfc_read(nfc, reg) | bits);
219}
220
221static inline void vf610_nfc_clear(struct vf610_nfc *nfc, uint reg, u32 bits)
222{
223 vf610_nfc_write(nfc, reg, vf610_nfc_read(nfc, reg) & ~bits);
224}
225
226static inline void vf610_nfc_set_field(struct vf610_nfc *nfc, u32 reg,
227 u32 mask, u32 shift, u32 val)
228{
229 vf610_nfc_write(nfc, reg,
230 (vf610_nfc_read(nfc, reg) & (~mask)) | val << shift);
231}
232
233static inline void vf610_nfc_memcpy(void *dst, const void __iomem *src,
234 size_t n)
235{
236
237
238
239
240
241
242
243
244 memcpy(dst, src, n);
245}
246
247
248static inline void vf610_nfc_clear_status(struct vf610_nfc *nfc)
249{
250 u32 tmp = vf610_nfc_read(nfc, NFC_IRQ_STATUS);
251
252 tmp |= CMD_DONE_CLEAR_BIT | IDLE_CLEAR_BIT;
253 vf610_nfc_write(nfc, NFC_IRQ_STATUS, tmp);
254}
255
256static void vf610_nfc_done(struct vf610_nfc *nfc)
257{
258 unsigned long timeout = msecs_to_jiffies(100);
259
260
261
262
263
264
265
266
267 vf610_nfc_set(nfc, NFC_IRQ_STATUS, IDLE_EN_BIT);
268 vf610_nfc_set(nfc, NFC_FLASH_CMD2, START_BIT);
269
270 if (!wait_for_completion_timeout(&nfc->cmd_done, timeout))
271 dev_warn(nfc->dev, "Timeout while waiting for BUSY.\n");
272
273 vf610_nfc_clear_status(nfc);
274}
275
276static u8 vf610_nfc_get_id(struct vf610_nfc *nfc, int col)
277{
278 u32 flash_id;
279
280 if (col < 4) {
281 flash_id = vf610_nfc_read(nfc, NFC_FLASH_STATUS1);
282 flash_id >>= (3 - col) * 8;
283 } else {
284 flash_id = vf610_nfc_read(nfc, NFC_FLASH_STATUS2);
285 flash_id >>= 24;
286 }
287
288 return flash_id & 0xff;
289}
290
291static u8 vf610_nfc_get_status(struct vf610_nfc *nfc)
292{
293 return vf610_nfc_read(nfc, NFC_FLASH_STATUS2) & STATUS_BYTE1_MASK;
294}
295
296static void vf610_nfc_send_command(struct vf610_nfc *nfc, u32 cmd_byte1,
297 u32 cmd_code)
298{
299 u32 tmp;
300
301 vf610_nfc_clear_status(nfc);
302
303 tmp = vf610_nfc_read(nfc, NFC_FLASH_CMD2);
304 tmp &= ~(CMD_BYTE1_MASK | CMD_CODE_MASK | BUFNO_MASK);
305 tmp |= cmd_byte1 << CMD_BYTE1_SHIFT;
306 tmp |= cmd_code << CMD_CODE_SHIFT;
307 vf610_nfc_write(nfc, NFC_FLASH_CMD2, tmp);
308}
309
310static void vf610_nfc_send_commands(struct vf610_nfc *nfc, u32 cmd_byte1,
311 u32 cmd_byte2, u32 cmd_code)
312{
313 u32 tmp;
314
315 vf610_nfc_send_command(nfc, cmd_byte1, cmd_code);
316
317 tmp = vf610_nfc_read(nfc, NFC_FLASH_CMD1);
318 tmp &= ~CMD_BYTE2_MASK;
319 tmp |= cmd_byte2 << CMD_BYTE2_SHIFT;
320 vf610_nfc_write(nfc, NFC_FLASH_CMD1, tmp);
321}
322
323static irqreturn_t vf610_nfc_irq(int irq, void *data)
324{
325 struct mtd_info *mtd = data;
326 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
327
328 vf610_nfc_clear(nfc, NFC_IRQ_STATUS, IDLE_EN_BIT);
329 complete(&nfc->cmd_done);
330
331 return IRQ_HANDLED;
332}
333
334static void vf610_nfc_addr_cycle(struct vf610_nfc *nfc, int column, int page)
335{
336 if (column != -1) {
337 if (nfc->chip.options & NAND_BUSWIDTH_16)
338 column = column / 2;
339 vf610_nfc_set_field(nfc, NFC_COL_ADDR, COL_ADDR_MASK,
340 COL_ADDR_SHIFT, column);
341 }
342 if (page != -1)
343 vf610_nfc_set_field(nfc, NFC_ROW_ADDR, ROW_ADDR_MASK,
344 ROW_ADDR_SHIFT, page);
345}
346
347static inline void vf610_nfc_ecc_mode(struct vf610_nfc *nfc, int ecc_mode)
348{
349 vf610_nfc_set_field(nfc, NFC_FLASH_CONFIG,
350 CONFIG_ECC_MODE_MASK,
351 CONFIG_ECC_MODE_SHIFT, ecc_mode);
352}
353
354static inline void vf610_nfc_transfer_size(struct vf610_nfc *nfc, int size)
355{
356 vf610_nfc_write(nfc, NFC_SECTOR_SIZE, size);
357}
358
359static void vf610_nfc_command(struct mtd_info *mtd, unsigned command,
360 int column, int page)
361{
362 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
363 int trfr_sz = nfc->chip.options & NAND_BUSWIDTH_16 ? 1 : 0;
364
365 nfc->buf_offset = max(column, 0);
366 nfc->alt_buf = ALT_BUF_DATA;
367
368 switch (command) {
369 case NAND_CMD_SEQIN:
370
371 vf610_nfc_addr_cycle(nfc, column, page);
372 nfc->buf_offset = 0;
373
374
375
376
377
378 return;
379 case NAND_CMD_PAGEPROG:
380 trfr_sz += nfc->write_sz;
381 vf610_nfc_transfer_size(nfc, trfr_sz);
382 vf610_nfc_send_commands(nfc, NAND_CMD_SEQIN,
383 command, PROGRAM_PAGE_CMD_CODE);
384 if (nfc->use_hw_ecc)
385 vf610_nfc_ecc_mode(nfc, nfc->ecc_mode);
386 else
387 vf610_nfc_ecc_mode(nfc, ECC_BYPASS);
388 break;
389
390 case NAND_CMD_RESET:
391 vf610_nfc_transfer_size(nfc, 0);
392 vf610_nfc_send_command(nfc, command, RESET_CMD_CODE);
393 break;
394
395 case NAND_CMD_READOOB:
396 trfr_sz += mtd->oobsize;
397 column = mtd->writesize;
398 vf610_nfc_transfer_size(nfc, trfr_sz);
399 vf610_nfc_send_commands(nfc, NAND_CMD_READ0,
400 NAND_CMD_READSTART, READ_PAGE_CMD_CODE);
401 vf610_nfc_addr_cycle(nfc, column, page);
402 vf610_nfc_ecc_mode(nfc, ECC_BYPASS);
403 break;
404
405 case NAND_CMD_READ0:
406 trfr_sz += mtd->writesize + mtd->oobsize;
407 vf610_nfc_transfer_size(nfc, trfr_sz);
408 vf610_nfc_send_commands(nfc, NAND_CMD_READ0,
409 NAND_CMD_READSTART, READ_PAGE_CMD_CODE);
410 vf610_nfc_addr_cycle(nfc, column, page);
411 vf610_nfc_ecc_mode(nfc, nfc->ecc_mode);
412 break;
413
414 case NAND_CMD_PARAM:
415 nfc->alt_buf = ALT_BUF_ONFI;
416 trfr_sz = 3 * sizeof(struct nand_onfi_params);
417 vf610_nfc_transfer_size(nfc, trfr_sz);
418 vf610_nfc_send_command(nfc, command, READ_ONFI_PARAM_CMD_CODE);
419 vf610_nfc_addr_cycle(nfc, -1, column);
420 vf610_nfc_ecc_mode(nfc, ECC_BYPASS);
421 break;
422
423 case NAND_CMD_ERASE1:
424 vf610_nfc_transfer_size(nfc, 0);
425 vf610_nfc_send_commands(nfc, command,
426 NAND_CMD_ERASE2, ERASE_CMD_CODE);
427 vf610_nfc_addr_cycle(nfc, column, page);
428 break;
429
430 case NAND_CMD_READID:
431 nfc->alt_buf = ALT_BUF_ID;
432 nfc->buf_offset = 0;
433 vf610_nfc_transfer_size(nfc, 0);
434 vf610_nfc_send_command(nfc, command, READ_ID_CMD_CODE);
435 vf610_nfc_addr_cycle(nfc, -1, column);
436 break;
437
438 case NAND_CMD_STATUS:
439 nfc->alt_buf = ALT_BUF_STAT;
440 vf610_nfc_transfer_size(nfc, 0);
441 vf610_nfc_send_command(nfc, command, STATUS_READ_CMD_CODE);
442 break;
443 default:
444 return;
445 }
446
447 vf610_nfc_done(nfc);
448
449 nfc->use_hw_ecc = false;
450 nfc->write_sz = 0;
451}
452
453static void vf610_nfc_read_buf(struct mtd_info *mtd, u_char *buf, int len)
454{
455 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
456 uint c = nfc->buf_offset;
457
458
459 WARN_ON(nfc->alt_buf);
460
461 vf610_nfc_memcpy(buf, nfc->regs + NFC_MAIN_AREA(0) + c, len);
462
463 nfc->buf_offset += len;
464}
465
466static void vf610_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
467 int len)
468{
469 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
470 uint c = nfc->buf_offset;
471 uint l;
472
473 l = min_t(uint, len, mtd->writesize + mtd->oobsize - c);
474 vf610_nfc_memcpy(nfc->regs + NFC_MAIN_AREA(0) + c, buf, l);
475
476 nfc->write_sz += l;
477 nfc->buf_offset += l;
478}
479
480static uint8_t vf610_nfc_read_byte(struct mtd_info *mtd)
481{
482 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
483 u8 tmp;
484 uint c = nfc->buf_offset;
485
486 switch (nfc->alt_buf) {
487 case ALT_BUF_ID:
488 tmp = vf610_nfc_get_id(nfc, c);
489 break;
490 case ALT_BUF_STAT:
491 tmp = vf610_nfc_get_status(nfc);
492 break;
493#ifdef __LITTLE_ENDIAN
494 case ALT_BUF_ONFI:
495
496 c = nfc->buf_offset ^ 0x3;
497
498#endif
499 default:
500 tmp = *((u8 *)(nfc->regs + NFC_MAIN_AREA(0) + c));
501 break;
502 }
503 nfc->buf_offset++;
504 return tmp;
505}
506
507static u16 vf610_nfc_read_word(struct mtd_info *mtd)
508{
509 u16 tmp;
510
511 vf610_nfc_read_buf(mtd, (u_char *)&tmp, sizeof(tmp));
512 return tmp;
513}
514
515
516static int vf610_nfc_dev_ready(struct mtd_info *mtd)
517{
518
519 return 1;
520}
521
522
523
524
525static void vf610_nfc_select_chip(struct mtd_info *mtd, int chip)
526{
527 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
528 u32 tmp = vf610_nfc_read(nfc, NFC_ROW_ADDR);
529
530
531 if (nfc->variant != NFC_VFC610)
532 return;
533
534 tmp &= ~(ROW_ADDR_CHIP_SEL_RB_MASK | ROW_ADDR_CHIP_SEL_MASK);
535
536 if (chip >= 0) {
537 tmp |= 1 << ROW_ADDR_CHIP_SEL_RB_SHIFT;
538 tmp |= BIT(chip) << ROW_ADDR_CHIP_SEL_SHIFT;
539 }
540
541 vf610_nfc_write(nfc, NFC_ROW_ADDR, tmp);
542}
543
544
545static inline int count_written_bits(uint8_t *buff, int size, int max_bits)
546{
547 uint32_t *buff32 = (uint32_t *)buff;
548 int k, written_bits = 0;
549
550 for (k = 0; k < (size / 4); k++) {
551 written_bits += hweight32(~buff32[k]);
552 if (unlikely(written_bits > max_bits))
553 break;
554 }
555
556 return written_bits;
557}
558
559static inline int vf610_nfc_correct_data(struct mtd_info *mtd, uint8_t *dat,
560 uint8_t *oob, int page)
561{
562 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
563 u32 ecc_status_off = NFC_MAIN_AREA(0) + ECC_SRAM_ADDR + ECC_STATUS;
564 u8 ecc_status;
565 u8 ecc_count;
566 int flips_threshold = nfc->chip.ecc.strength / 2;
567
568 ecc_status = vf610_nfc_read(nfc, ecc_status_off) & 0xff;
569 ecc_count = ecc_status & ECC_STATUS_ERR_COUNT;
570
571 if (!(ecc_status & ECC_STATUS_MASK))
572 return ecc_count;
573
574
575 vf610_nfc_command(mtd, NAND_CMD_READOOB, 0, page);
576 vf610_nfc_read_buf(mtd, oob, mtd->oobsize);
577
578
579
580
581
582 return nand_check_erased_ecc_chunk(dat, nfc->chip.ecc.size, oob,
583 mtd->oobsize, NULL, 0,
584 flips_threshold);
585}
586
587static int vf610_nfc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
588 uint8_t *buf, int oob_required, int page)
589{
590 int eccsize = chip->ecc.size;
591 int stat;
592
593 vf610_nfc_read_buf(mtd, buf, eccsize);
594 if (oob_required)
595 vf610_nfc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
596
597 stat = vf610_nfc_correct_data(mtd, buf, chip->oob_poi, page);
598
599 if (stat < 0) {
600 mtd->ecc_stats.failed++;
601 return 0;
602 } else {
603 mtd->ecc_stats.corrected += stat;
604 return stat;
605 }
606}
607
608static int vf610_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
609 const uint8_t *buf, int oob_required, int page)
610{
611 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
612
613 vf610_nfc_write_buf(mtd, buf, mtd->writesize);
614 if (oob_required)
615 vf610_nfc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
616
617
618 nfc->use_hw_ecc = true;
619 nfc->write_sz = mtd->writesize + mtd->oobsize;
620
621 return 0;
622}
623
624static const struct of_device_id vf610_nfc_dt_ids[] = {
625 { .compatible = "fsl,vf610-nfc", .data = (void *)NFC_VFC610 },
626 { }
627};
628MODULE_DEVICE_TABLE(of, vf610_nfc_dt_ids);
629
630static void vf610_nfc_preinit_controller(struct vf610_nfc *nfc)
631{
632 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_16BIT);
633 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_ADDR_AUTO_INCR_BIT);
634 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_BUFNO_AUTO_INCR_BIT);
635 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_BOOT_MODE_BIT);
636 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_DMA_REQ_BIT);
637 vf610_nfc_set(nfc, NFC_FLASH_CONFIG, CONFIG_FAST_FLASH_BIT);
638
639
640 vf610_nfc_set_field(nfc, NFC_FLASH_CONFIG, CONFIG_PAGE_CNT_MASK,
641 CONFIG_PAGE_CNT_SHIFT, 1);
642}
643
644static void vf610_nfc_init_controller(struct vf610_nfc *nfc)
645{
646 if (nfc->chip.options & NAND_BUSWIDTH_16)
647 vf610_nfc_set(nfc, NFC_FLASH_CONFIG, CONFIG_16BIT);
648 else
649 vf610_nfc_clear(nfc, NFC_FLASH_CONFIG, CONFIG_16BIT);
650
651 if (nfc->chip.ecc.mode == NAND_ECC_HW) {
652
653 vf610_nfc_set_field(nfc, NFC_FLASH_CONFIG,
654 CONFIG_ECC_SRAM_ADDR_MASK,
655 CONFIG_ECC_SRAM_ADDR_SHIFT,
656 ECC_SRAM_ADDR >> 3);
657
658
659 vf610_nfc_set(nfc, NFC_FLASH_CONFIG, CONFIG_ECC_SRAM_REQ_BIT);
660 }
661}
662
663static int vf610_nfc_probe(struct platform_device *pdev)
664{
665 struct vf610_nfc *nfc;
666 struct resource *res;
667 struct mtd_info *mtd;
668 struct nand_chip *chip;
669 struct device_node *child;
670 const struct of_device_id *of_id;
671 int err;
672 int irq;
673
674 nfc = devm_kzalloc(&pdev->dev, sizeof(*nfc), GFP_KERNEL);
675 if (!nfc)
676 return -ENOMEM;
677
678 nfc->dev = &pdev->dev;
679 chip = &nfc->chip;
680 mtd = nand_to_mtd(chip);
681
682 mtd->owner = THIS_MODULE;
683 mtd->dev.parent = nfc->dev;
684 mtd->name = DRV_NAME;
685
686 irq = platform_get_irq(pdev, 0);
687 if (irq <= 0)
688 return -EINVAL;
689
690 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
691 nfc->regs = devm_ioremap_resource(nfc->dev, res);
692 if (IS_ERR(nfc->regs))
693 return PTR_ERR(nfc->regs);
694
695 nfc->clk = devm_clk_get(&pdev->dev, NULL);
696 if (IS_ERR(nfc->clk))
697 return PTR_ERR(nfc->clk);
698
699 err = clk_prepare_enable(nfc->clk);
700 if (err) {
701 dev_err(nfc->dev, "Unable to enable clock!\n");
702 return err;
703 }
704
705 of_id = of_match_device(vf610_nfc_dt_ids, &pdev->dev);
706 nfc->variant = (enum vf610_nfc_variant)of_id->data;
707
708 for_each_available_child_of_node(nfc->dev->of_node, child) {
709 if (of_device_is_compatible(child, "fsl,vf610-nfc-nandcs")) {
710
711 if (nand_get_flash_node(chip)) {
712 dev_err(nfc->dev,
713 "Only one NAND chip supported!\n");
714 err = -EINVAL;
715 goto error;
716 }
717
718 nand_set_flash_node(chip, child);
719 }
720 }
721
722 if (!nand_get_flash_node(chip)) {
723 dev_err(nfc->dev, "NAND chip sub-node missing!\n");
724 err = -ENODEV;
725 goto err_clk;
726 }
727
728 chip->dev_ready = vf610_nfc_dev_ready;
729 chip->cmdfunc = vf610_nfc_command;
730 chip->read_byte = vf610_nfc_read_byte;
731 chip->read_word = vf610_nfc_read_word;
732 chip->read_buf = vf610_nfc_read_buf;
733 chip->write_buf = vf610_nfc_write_buf;
734 chip->select_chip = vf610_nfc_select_chip;
735
736 chip->options |= NAND_NO_SUBPAGE_WRITE;
737
738 init_completion(&nfc->cmd_done);
739
740 err = devm_request_irq(nfc->dev, irq, vf610_nfc_irq, 0, DRV_NAME, mtd);
741 if (err) {
742 dev_err(nfc->dev, "Error requesting IRQ!\n");
743 goto error;
744 }
745
746 vf610_nfc_preinit_controller(nfc);
747
748
749 if (nand_scan_ident(mtd, 1, NULL)) {
750 err = -ENXIO;
751 goto error;
752 }
753
754 vf610_nfc_init_controller(nfc);
755
756
757 if (chip->bbt_options & NAND_BBT_USE_FLASH)
758 chip->bbt_options |= NAND_BBT_NO_OOB;
759
760
761 if (mtd->writesize + mtd->oobsize > PAGE_2K + OOB_MAX - 8) {
762 dev_err(nfc->dev, "Unsupported flash page size\n");
763 err = -ENXIO;
764 goto error;
765 }
766
767 if (chip->ecc.mode == NAND_ECC_HW) {
768 if (mtd->writesize != PAGE_2K && mtd->oobsize < 64) {
769 dev_err(nfc->dev, "Unsupported flash with hwecc\n");
770 err = -ENXIO;
771 goto error;
772 }
773
774 if (chip->ecc.size != mtd->writesize) {
775 dev_err(nfc->dev, "Step size needs to be page size\n");
776 err = -ENXIO;
777 goto error;
778 }
779
780
781 if (mtd->oobsize > 64)
782 mtd->oobsize = 64;
783
784 if (chip->ecc.strength == 32) {
785 nfc->ecc_mode = ECC_60_BYTE;
786 chip->ecc.bytes = 60;
787 chip->ecc.layout = &vf610_nfc_ecc60;
788 } else if (chip->ecc.strength == 24) {
789 nfc->ecc_mode = ECC_45_BYTE;
790 chip->ecc.bytes = 45;
791 chip->ecc.layout = &vf610_nfc_ecc45;
792 } else {
793 dev_err(nfc->dev, "Unsupported ECC strength\n");
794 err = -ENXIO;
795 goto error;
796 }
797
798 chip->ecc.read_page = vf610_nfc_read_page;
799 chip->ecc.write_page = vf610_nfc_write_page;
800
801 chip->ecc.size = PAGE_2K;
802 }
803
804
805 if (nand_scan_tail(mtd)) {
806 err = -ENXIO;
807 goto error;
808 }
809
810 platform_set_drvdata(pdev, mtd);
811
812
813 return mtd_device_register(mtd, NULL, 0);
814
815error:
816 of_node_put(nand_get_flash_node(chip));
817err_clk:
818 clk_disable_unprepare(nfc->clk);
819 return err;
820}
821
822static int vf610_nfc_remove(struct platform_device *pdev)
823{
824 struct mtd_info *mtd = platform_get_drvdata(pdev);
825 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
826
827 nand_release(mtd);
828 clk_disable_unprepare(nfc->clk);
829 return 0;
830}
831
832#ifdef CONFIG_PM_SLEEP
833static int vf610_nfc_suspend(struct device *dev)
834{
835 struct mtd_info *mtd = dev_get_drvdata(dev);
836 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
837
838 clk_disable_unprepare(nfc->clk);
839 return 0;
840}
841
842static int vf610_nfc_resume(struct device *dev)
843{
844 struct mtd_info *mtd = dev_get_drvdata(dev);
845 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
846
847 pinctrl_pm_select_default_state(dev);
848
849 clk_prepare_enable(nfc->clk);
850
851 vf610_nfc_preinit_controller(nfc);
852 vf610_nfc_init_controller(nfc);
853 return 0;
854}
855#endif
856
857static SIMPLE_DEV_PM_OPS(vf610_nfc_pm_ops, vf610_nfc_suspend, vf610_nfc_resume);
858
859static struct platform_driver vf610_nfc_driver = {
860 .driver = {
861 .name = DRV_NAME,
862 .of_match_table = vf610_nfc_dt_ids,
863 .pm = &vf610_nfc_pm_ops,
864 },
865 .probe = vf610_nfc_probe,
866 .remove = vf610_nfc_remove,
867};
868
869module_platform_driver(vf610_nfc_driver);
870
871MODULE_AUTHOR("Stefan Agner <stefan.agner@toradex.com>");
872MODULE_DESCRIPTION("Freescale VF610/MPC5125 NFC MTD NAND driver");
873MODULE_LICENSE("GPL");
874