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