1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <common.h>
23#include <nand.h>
24#include <linux/delay.h>
25#include <linux/errno.h>
26#include <asm/io.h>
27#include <nand.h>
28#include <asm/arch/clk.h>
29#include <asm/arch/sys_proto.h>
30
31
32
33
34struct lpc32xx_nand_mlc_registers {
35 u8 buff[32768];
36 u8 data[32768];
37 u32 cmd;
38 u32 addr;
39 u32 ecc_enc_reg;
40 u32 ecc_dec_reg;
41 u32 ecc_auto_enc_reg;
42 u32 ecc_auto_dec_reg;
43 u32 rpr;
44 u32 wpr;
45 u32 rubp;
46 u32 robp;
47 u32 sw_wp_add_low;
48 u32 sw_wp_add_hig;
49 u32 icr;
50 u32 time_reg;
51 u32 irq_mr;
52 u32 irq_sr;
53 u32 lock_pr;
54 u32 isr;
55 u32 ceh;
56};
57
58
59#define LOCK_PR_UNLOCK_KEY 0x0000A25E
60
61
62#define ICR_LARGE_BLOCKS 0x00000004
63#define ICR_ADDR4 0x00000002
64
65
66#define CEH_NORMAL_CE 0x00000001
67
68
69#define ISR_NAND_READY 0x00000001
70#define ISR_CONTROLLER_READY 0x00000002
71#define ISR_ECC_READY 0x00000004
72#define ISR_DECODER_ERRORS(s) ((((s) >> 4) & 3)+1)
73#define ISR_DECODER_FAILURE 0x00000040
74#define ISR_DECODER_ERROR 0x00000008
75
76
77#define LPC32X_NAND_TIMEOUT 5000
78
79
80
81
82
83static struct lpc32xx_nand_mlc_registers __iomem *lpc32xx_nand_mlc_registers
84 = (struct lpc32xx_nand_mlc_registers __iomem *)MLC_NAND_BASE;
85
86#if !defined(CONFIG_SYS_MAX_NAND_CHIPS)
87#define CONFIG_SYS_MAX_NAND_CHIPS 1
88#endif
89
90#define clkdiv(v, w, o) (((1+(clk/v)) & w) << o)
91
92
93
94
95
96
97
98
99
100
101
102
103
104struct lpc32xx_oob {
105 struct {
106 uint8_t free_oob_bytes[6];
107 } free[4];
108 struct {
109 uint8_t ecc_oob_bytes[10];
110 } ecc[4];
111};
112
113
114
115
116
117static void lpc32xx_nand_init(void)
118{
119 unsigned int clk;
120
121
122
123
124
125 writel(LOCK_PR_UNLOCK_KEY,
126 &lpc32xx_nand_mlc_registers->lock_pr);
127
128
129 writel(ICR_LARGE_BLOCKS | ICR_ADDR4,
130 &lpc32xx_nand_mlc_registers->icr);
131
132
133 writel(0, &lpc32xx_nand_mlc_registers->irq_mr);
134
135
136 writel(CEH_NORMAL_CE,
137 &lpc32xx_nand_mlc_registers->ceh);
138
139
140 clk = get_hclk_clk_rate();
141
142 writel(
143 clkdiv(CONFIG_LPC32XX_NAND_MLC_TCEA_DELAY, 0x03, 24) |
144 clkdiv(CONFIG_LPC32XX_NAND_MLC_BUSY_DELAY, 0x1F, 19) |
145 clkdiv(CONFIG_LPC32XX_NAND_MLC_NAND_TA, 0x07, 16) |
146 clkdiv(CONFIG_LPC32XX_NAND_MLC_RD_HIGH, 0x0F, 12) |
147 clkdiv(CONFIG_LPC32XX_NAND_MLC_RD_LOW, 0x0F, 8) |
148 clkdiv(CONFIG_LPC32XX_NAND_MLC_WR_HIGH, 0x0F, 4) |
149 clkdiv(CONFIG_LPC32XX_NAND_MLC_WR_LOW, 0x0F, 0),
150 &lpc32xx_nand_mlc_registers->time_reg);
151}
152
153#if !defined(CONFIG_SPL_BUILD)
154
155
156
157
158
159static void lpc32xx_cmd_ctrl(struct mtd_info *mtd, int cmd,
160 unsigned int ctrl)
161{
162 if (cmd == NAND_CMD_NONE)
163 return;
164
165 if (ctrl & NAND_CLE)
166 writeb(cmd & 0Xff, &lpc32xx_nand_mlc_registers->cmd);
167 else if (ctrl & NAND_ALE)
168 writeb(cmd & 0Xff, &lpc32xx_nand_mlc_registers->addr);
169}
170
171
172
173
174
175
176static uint8_t lpc32xx_read_byte(struct mtd_info *mtd)
177{
178 return readb(&lpc32xx_nand_mlc_registers->data);
179}
180
181
182
183
184
185
186
187static int lpc32xx_dev_ready(struct mtd_info *mtd)
188{
189
190 int status = readl(&lpc32xx_nand_mlc_registers->isr);
191 return status & ISR_CONTROLLER_READY;
192}
193
194
195
196
197
198
199
200
201static struct nand_ecclayout lpc32xx_largepage_ecclayout = {
202 .eccbytes = 40,
203 .eccpos = {24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
204 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
205 44, 45, 46, 47, 48, 48, 50, 51, 52, 53,
206 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
207 },
208 .oobfree = {
209
210 {
211 .offset = 2,
212 .length = 22
213 },
214 }
215};
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234static int lpc32xx_read_page_hwecc(struct mtd_info *mtd,
235 struct nand_chip *chip, uint8_t *buf, int oob_required,
236 int page)
237{
238 unsigned int i, status, timeout, err, max_bitflips = 0;
239 struct lpc32xx_oob *oob = (struct lpc32xx_oob *)chip->oob_poi;
240
241
242 for (i = 0; i < 4; i++) {
243
244 writel(0, &lpc32xx_nand_mlc_registers->ecc_auto_dec_reg);
245
246 for (timeout = LPC32X_NAND_TIMEOUT; timeout; timeout--) {
247 status = readl(&lpc32xx_nand_mlc_registers->isr);
248 if (status & ISR_CONTROLLER_READY)
249 break;
250 udelay(1);
251 }
252
253 if (status & ISR_DECODER_FAILURE)
254 return -1;
255
256 if (status & ISR_DECODER_ERROR) {
257 err = ISR_DECODER_ERRORS(status);
258 if (err > max_bitflips)
259 max_bitflips = err;
260 }
261
262 memcpy(buf+512*i, lpc32xx_nand_mlc_registers->buff, 512);
263
264 memcpy(&oob->free[i], lpc32xx_nand_mlc_registers->buff, 6);
265
266 memcpy(&oob->ecc[i], lpc32xx_nand_mlc_registers->buff, 10);
267 }
268 return max_bitflips;
269}
270
271
272
273
274
275
276
277
278
279
280
281
282static int lpc32xx_read_page_raw(struct mtd_info *mtd,
283 struct nand_chip *chip, uint8_t *buf, int oob_required,
284 int page)
285{
286 unsigned int i, status, timeout;
287 struct lpc32xx_oob *oob = (struct lpc32xx_oob *)chip->oob_poi;
288
289
290
291
292 for (i = 0; i < 4; i++) {
293
294 for (timeout = LPC32X_NAND_TIMEOUT; timeout; timeout--) {
295 status = readl(&lpc32xx_nand_mlc_registers->isr);
296 if (status & ISR_NAND_READY)
297 break;
298 udelay(1);
299 }
300
301 if (!(status & ISR_NAND_READY))
302 return -1;
303
304 memcpy(buf+512*i, lpc32xx_nand_mlc_registers->data, 512);
305
306 memcpy(&oob->free[i], lpc32xx_nand_mlc_registers->data, 6);
307
308 memcpy(&oob->ecc[i], lpc32xx_nand_mlc_registers->data, 10);
309 }
310 return 0;
311}
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331static int lpc32xx_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
332 int page)
333{
334 unsigned int i, status, timeout, err, max_bitflips = 0;
335 struct lpc32xx_oob *oob = (struct lpc32xx_oob *)chip->oob_poi;
336
337
338
339 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
340
341
342 for (i = 0; i < 4; i++) {
343
344 writel(0, &lpc32xx_nand_mlc_registers->ecc_auto_dec_reg);
345
346 for (timeout = LPC32X_NAND_TIMEOUT; timeout; timeout--) {
347 status = readl(&lpc32xx_nand_mlc_registers->isr);
348 if (status & ISR_CONTROLLER_READY)
349 break;
350 udelay(1);
351 }
352
353 if (status & ISR_DECODER_FAILURE)
354 max_bitflips = 5;
355
356 if (status & ISR_DECODER_ERROR) {
357 err = ISR_DECODER_ERRORS(status);
358 if (err > max_bitflips)
359 max_bitflips = err;
360 }
361
362 writel(0, &lpc32xx_nand_mlc_registers->robp);
363
364 memcpy(&oob->free[i], lpc32xx_nand_mlc_registers->buff, 6);
365
366 memcpy(&oob->ecc[i], lpc32xx_nand_mlc_registers->buff, 10);
367 }
368 return max_bitflips;
369}
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384static int lpc32xx_write_page_hwecc(struct mtd_info *mtd,
385 struct nand_chip *chip, const uint8_t *buf, int oob_required,
386 int page)
387{
388 unsigned int i, status, timeout;
389 struct lpc32xx_oob *oob = (struct lpc32xx_oob *)chip->oob_poi;
390
391
392 for (i = 0; i < 4; i++) {
393
394 writel(0, &lpc32xx_nand_mlc_registers->ecc_enc_reg);
395
396 memcpy(&lpc32xx_nand_mlc_registers->buff, buf+512*i, 512);
397
398 memcpy(&lpc32xx_nand_mlc_registers->buff, &oob->free[i], 6);
399
400 for (timeout = LPC32X_NAND_TIMEOUT; timeout; timeout--) {
401 status = readl(&lpc32xx_nand_mlc_registers->isr);
402 if (status & ISR_ECC_READY)
403 break;
404 udelay(1);
405 }
406
407 if (!(status & ISR_ECC_READY))
408 return -1;
409
410 writel(0, &lpc32xx_nand_mlc_registers->ecc_auto_enc_reg);
411
412 for (timeout = LPC32X_NAND_TIMEOUT; timeout; timeout--) {
413 status = readl(&lpc32xx_nand_mlc_registers->isr);
414 if (status & ISR_CONTROLLER_READY)
415 break;
416 udelay(1);
417 }
418
419 if (!(status & ISR_CONTROLLER_READY))
420 return -1;
421 }
422 return 0;
423}
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442static int lpc32xx_write_page_raw(struct mtd_info *mtd,
443 struct nand_chip *chip, const uint8_t *buf, int oob_required,
444 int page)
445{
446 unsigned int i;
447 struct lpc32xx_oob *oob = (struct lpc32xx_oob *)chip->oob_poi;
448
449
450 for (i = 0; i < 4; i++) {
451
452 memcpy(lpc32xx_nand_mlc_registers->buff, buf+512*i, 512);
453
454 memcpy(lpc32xx_nand_mlc_registers->buff, &oob->free[i], 6);
455
456 memcpy(lpc32xx_nand_mlc_registers->buff, &oob->ecc[i], 10);
457 }
458 return 0;
459}
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478static int lpc32xx_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
479 int page)
480{
481
482 unsigned int i, status, timeout;
483 struct lpc32xx_oob *oob = (struct lpc32xx_oob *)chip->oob_poi;
484
485 for (i = 0; i < 4; i++) {
486
487 chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x200+0x210*i, page);
488
489 memcpy(lpc32xx_nand_mlc_registers->data, &oob->free[i], 6);
490
491 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
492
493 for (timeout = LPC32X_NAND_TIMEOUT; timeout; timeout--) {
494 status = readl(&lpc32xx_nand_mlc_registers->isr);
495 if (status & ISR_NAND_READY)
496 break;
497 udelay(1);
498 }
499
500 if (!(status & ISR_NAND_READY))
501 return -1;
502 }
503 return 0;
504}
505
506
507
508
509
510
511
512
513
514static int lpc32xx_waitfunc(struct mtd_info *mtd, struct nand_chip *chip)
515{
516 int status;
517 unsigned int timeout;
518
519 for (timeout = LPC32X_NAND_TIMEOUT; timeout; timeout--) {
520 status = readl(&lpc32xx_nand_mlc_registers->isr);
521 if ((status & (ISR_CONTROLLER_READY || ISR_NAND_READY))
522 == (ISR_CONTROLLER_READY || ISR_NAND_READY))
523 break;
524 udelay(1);
525 }
526
527 if ((status & (ISR_CONTROLLER_READY || ISR_NAND_READY))
528 != (ISR_CONTROLLER_READY || ISR_NAND_READY))
529 return -1;
530
531 writel(NAND_CMD_STATUS, &lpc32xx_nand_mlc_registers->cmd);
532
533 return readb(&lpc32xx_nand_mlc_registers->data);
534}
535
536
537
538
539
540static struct nand_chip lpc32xx_chip;
541
542
543
544
545
546void board_nand_init(void)
547{
548 struct mtd_info *mtd = nand_to_mtd(&lpc32xx_chip);
549 int ret;
550
551
552
553 lpc32xx_chip.IO_ADDR_R = &lpc32xx_nand_mlc_registers->buff;
554 lpc32xx_chip.IO_ADDR_W = &lpc32xx_nand_mlc_registers->buff;
555 lpc32xx_chip.cmd_ctrl = lpc32xx_cmd_ctrl;
556
557 lpc32xx_chip.dev_ready = lpc32xx_dev_ready;
558
559
560 lpc32xx_chip.options |= NAND_NO_SUBPAGE_WRITE;
561
562
563
564 lpc32xx_chip.ecc.mode = NAND_ECC_HW;
565 lpc32xx_chip.ecc.layout = &lpc32xx_largepage_ecclayout;
566 lpc32xx_chip.ecc.size = 512;
567 lpc32xx_chip.ecc.bytes = 10;
568 lpc32xx_chip.ecc.strength = 4;
569 lpc32xx_chip.ecc.read_page = lpc32xx_read_page_hwecc;
570 lpc32xx_chip.ecc.read_page_raw = lpc32xx_read_page_raw;
571 lpc32xx_chip.ecc.write_page = lpc32xx_write_page_hwecc;
572 lpc32xx_chip.ecc.write_page_raw = lpc32xx_write_page_raw;
573 lpc32xx_chip.ecc.read_oob = lpc32xx_read_oob;
574 lpc32xx_chip.ecc.write_oob = lpc32xx_write_oob;
575 lpc32xx_chip.waitfunc = lpc32xx_waitfunc;
576
577 lpc32xx_chip.read_byte = lpc32xx_read_byte;
578
579
580 lpc32xx_chip.bbt_options |= NAND_BBT_USE_FLASH | NAND_BBT_LASTBLOCK
581 | NAND_BBT_SCANLASTPAGE | NAND_BBT_SCAN2NDPAGE
582 | NAND_BBT_WRITE;
583
584
585 lpc32xx_nand_init();
586
587
588 ret = nand_scan_ident(mtd, CONFIG_SYS_MAX_NAND_CHIPS, NULL);
589 if (ret) {
590 pr_err("nand_scan_ident returned %i", ret);
591 return;
592 }
593
594
595 ret = nand_scan_tail(mtd);
596 if (ret) {
597 pr_err("nand_scan_tail returned %i", ret);
598 return;
599 }
600
601
602 ret = nand_register(0, mtd);
603 if (ret)
604 pr_err("nand_register returned %i", ret);
605}
606
607#else
608
609void nand_init(void)
610{
611
612 lpc32xx_mlc_nand_init();
613
614 lpc32xx_nand_init();
615}
616
617void nand_deselect(void)
618{
619
620}
621
622static int read_single_page(uint8_t *dest, int page,
623 struct lpc32xx_oob *oob)
624{
625 int status, i, timeout, err, max_bitflips = 0;
626
627
628 writel(NAND_CMD_READ0, &lpc32xx_nand_mlc_registers->cmd);
629
630 writel(0, &lpc32xx_nand_mlc_registers->addr);
631 writel(0, &lpc32xx_nand_mlc_registers->addr);
632 writel(page & 0xff, &lpc32xx_nand_mlc_registers->addr);
633 writel((page>>8) & 0xff, &lpc32xx_nand_mlc_registers->addr);
634 writel((page>>16) & 0xff, &lpc32xx_nand_mlc_registers->addr);
635
636 writel(NAND_CMD_READSTART, &lpc32xx_nand_mlc_registers->cmd);
637
638
639 for (i = 0; i < 4; i++) {
640
641 writel(0, &lpc32xx_nand_mlc_registers->ecc_auto_dec_reg);
642
643 for (timeout = LPC32X_NAND_TIMEOUT; timeout; timeout--) {
644 status = readl(&lpc32xx_nand_mlc_registers->isr);
645 if (status & ISR_CONTROLLER_READY)
646 break;
647 udelay(1);
648 }
649
650 if (!(status & ISR_CONTROLLER_READY))
651 return -1;
652
653 if (status & ISR_DECODER_FAILURE)
654 return -1;
655
656 if (status & ISR_DECODER_ERROR) {
657 err = ISR_DECODER_ERRORS(status);
658 if (err > max_bitflips)
659 max_bitflips = err;
660 }
661
662 memcpy(dest+i*512, lpc32xx_nand_mlc_registers->buff, 512);
663
664 memcpy(&oob->free[i], lpc32xx_nand_mlc_registers->buff, 6);
665 }
666 return max_bitflips;
667}
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690#define BYTES_PER_PAGE 2048
691#define PAGES_PER_BLOCK 64
692#define BYTES_PER_BLOCK (BYTES_PER_PAGE * PAGES_PER_BLOCK)
693#define PAGES_PER_CHIP_MAX 524288
694
695int nand_spl_load_image(uint32_t offs, unsigned int size, void *dst)
696{
697 int bytes_left = size;
698 int pages_left = DIV_ROUND_UP(size, BYTES_PER_PAGE);
699 int blocks_left = DIV_ROUND_UP(size, BYTES_PER_BLOCK);
700 int block = 0;
701 int page = offs / BYTES_PER_PAGE;
702
703 while (blocks_left) {
704
705 void *block_page_dst = dst;
706
707 int block_bytes_left = bytes_left;
708 if (block_bytes_left > BYTES_PER_BLOCK)
709 block_bytes_left = BYTES_PER_BLOCK;
710
711 int block_pages_good = 0;
712 int block_pages_bad = 0;
713 int block_pages_err = 0;
714
715 int block_pages_left = pages_left;
716 if (block_pages_left > PAGES_PER_BLOCK)
717 block_pages_left = PAGES_PER_BLOCK;
718 int block_pages = block_pages_left;
719 int block_page = page;
720
721 while ((block_pages > 0) && (block_pages_bad == 0)) {
722
723 struct lpc32xx_oob oob;
724
725 int res = read_single_page(block_page_dst, block_page,
726 &oob);
727
728 if (res >= 0) {
729
730 block_pages_good++;
731
732 if ((oob.free[0].free_oob_bytes[0] != 0xff)
733 | (oob.free[0].free_oob_bytes[1] != 0xff))
734 block_pages_bad++;
735 } else
736
737 block_pages_err++;
738
739 block_page++;
740 block_page_dst += BYTES_PER_PAGE;
741 if (block_pages)
742 block_pages--;
743 }
744
745 if (block_pages_good == 0)
746 block_pages_bad = block_pages_err;
747
748 if ((block_pages_err > 0) && (block_pages_bad == 0))
749 return -1;
750
751 if (block_pages_bad == 0) {
752 dst += block_bytes_left;
753 bytes_left -= block_bytes_left;
754 pages_left -= block_pages_left;
755 blocks_left--;
756 }
757
758 block++;
759 page += PAGES_PER_BLOCK;
760 }
761
762
763 return 0;
764}
765
766#endif
767