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
27
28
29
30
31
32#include <common.h>
33#include <asm/io.h>
34#include <nand.h>
35#include <asm/ti-common/davinci_nand.h>
36
37
38#define NAND_TIMEOUT 10240
39#define NAND_ECC_BUSY 0xC
40#define NAND_4BITECC_MASK 0x03FF03FF
41#define EMIF_NANDFSR_ECC_STATE_MASK 0x00000F00
42#define ECC_STATE_NO_ERR 0x0
43#define ECC_STATE_TOO_MANY_ERRS 0x1
44#define ECC_STATE_ERR_CORR_COMP_P 0x2
45#define ECC_STATE_ERR_CORR_COMP_N 0x3
46
47
48
49
50
51
52
53
54
55static void nand_davinci_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
56{
57 struct nand_chip *chip = mtd->priv;
58 const u32 *nand = chip->IO_ADDR_R;
59
60
61 if (((int)buf & 0x3) != 0) {
62 if (((int)buf & 0x1) != 0) {
63 if (len) {
64 *buf = readb(nand);
65 buf += 1;
66 len--;
67 }
68 }
69
70 if (((int)buf & 0x3) != 0) {
71 if (len >= 2) {
72 *(u16 *)buf = readw(nand);
73 buf += 2;
74 len -= 2;
75 }
76 }
77 }
78
79
80 while (len >= 4) {
81 *(u32 *)buf = __raw_readl(nand);
82 buf += 4;
83 len -= 4;
84 }
85
86
87 if (len) {
88 if (len >= 2) {
89 *(u16 *)buf = readw(nand);
90 buf += 2;
91 len -= 2;
92 }
93
94 if (len)
95 *buf = readb(nand);
96 }
97}
98
99static void nand_davinci_write_buf(struct mtd_info *mtd, const uint8_t *buf,
100 int len)
101{
102 struct nand_chip *chip = mtd->priv;
103 const u32 *nand = chip->IO_ADDR_W;
104
105
106 if (((int)buf & 0x3) != 0) {
107 if (((int)buf & 0x1) != 0) {
108 if (len) {
109 writeb(*buf, nand);
110 buf += 1;
111 len--;
112 }
113 }
114
115 if (((int)buf & 0x3) != 0) {
116 if (len >= 2) {
117 writew(*(u16 *)buf, nand);
118 buf += 2;
119 len -= 2;
120 }
121 }
122 }
123
124
125 while (len >= 4) {
126 __raw_writel(*(u32 *)buf, nand);
127 buf += 4;
128 len -= 4;
129 }
130
131
132 if (len) {
133 if (len >= 2) {
134 writew(*(u16 *)buf, nand);
135 buf += 2;
136 len -= 2;
137 }
138
139 if (len)
140 writeb(*buf, nand);
141 }
142}
143
144static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd,
145 unsigned int ctrl)
146{
147 struct nand_chip *this = mtd->priv;
148 u_int32_t IO_ADDR_W = (u_int32_t)this->IO_ADDR_W;
149
150 if (ctrl & NAND_CTRL_CHANGE) {
151 IO_ADDR_W &= ~(MASK_ALE|MASK_CLE);
152
153 if (ctrl & NAND_CLE)
154 IO_ADDR_W |= MASK_CLE;
155 if (ctrl & NAND_ALE)
156 IO_ADDR_W |= MASK_ALE;
157 this->IO_ADDR_W = (void __iomem *) IO_ADDR_W;
158 }
159
160 if (cmd != NAND_CMD_NONE)
161 writeb(cmd, IO_ADDR_W);
162}
163
164#ifdef CONFIG_SYS_NAND_HW_ECC
165
166static u_int32_t nand_davinci_readecc(struct mtd_info *mtd)
167{
168 u_int32_t ecc = 0;
169
170 ecc = __raw_readl(&(davinci_emif_regs->nandfecc[
171 CONFIG_SYS_NAND_CS - 2]));
172
173 return ecc;
174}
175
176static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
177{
178 u_int32_t val;
179
180
181 nand_davinci_readecc(mtd);
182
183 val = __raw_readl(&davinci_emif_regs->nandfcr);
184 val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS);
185 val |= DAVINCI_NANDFCR_1BIT_ECC_START(CONFIG_SYS_NAND_CS);
186 __raw_writel(val, &davinci_emif_regs->nandfcr);
187}
188
189static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
190 u_char *ecc_code)
191{
192 u_int32_t tmp;
193
194 tmp = nand_davinci_readecc(mtd);
195
196
197
198 tmp = (tmp & 0x00000fff) | ((tmp & 0x0fff0000) >> 4);
199
200
201 tmp = ~tmp;
202
203 *ecc_code++ = tmp;
204 *ecc_code++ = tmp >> 8;
205 *ecc_code++ = tmp >> 16;
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220 return 0;
221}
222
223static int nand_davinci_correct_data(struct mtd_info *mtd, u_char *dat,
224 u_char *read_ecc, u_char *calc_ecc)
225{
226 struct nand_chip *this = mtd->priv;
227 u_int32_t ecc_nand = read_ecc[0] | (read_ecc[1] << 8) |
228 (read_ecc[2] << 16);
229 u_int32_t ecc_calc = calc_ecc[0] | (calc_ecc[1] << 8) |
230 (calc_ecc[2] << 16);
231 u_int32_t diff = ecc_calc ^ ecc_nand;
232
233 if (diff) {
234 if ((((diff >> 12) ^ diff) & 0xfff) == 0xfff) {
235
236 if ((diff >> (12 + 3)) < this->ecc.size) {
237 uint8_t find_bit = 1 << ((diff >> 12) & 7);
238 uint32_t find_byte = diff >> (12 + 3);
239
240 dat[find_byte] ^= find_bit;
241 MTDDEBUG(MTD_DEBUG_LEVEL0, "Correcting single "
242 "bit ECC error at offset: %d, bit: "
243 "%d\n", find_byte, find_bit);
244 return 1;
245 } else {
246 return -1;
247 }
248 } else if (!(diff & (diff - 1))) {
249
250
251 MTDDEBUG(MTD_DEBUG_LEVEL0, "Single bit ECC error in "
252 "ECC.\n");
253 return 1;
254 } else {
255
256 MTDDEBUG(MTD_DEBUG_LEVEL0, "ECC UNCORRECTED_ERROR 1\n");
257 return -1;
258 }
259 }
260 return 0;
261}
262#endif
263
264#ifdef CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
265static struct nand_ecclayout nand_davinci_4bit_layout_oobfirst = {
266#if defined(CONFIG_SYS_NAND_PAGE_2K)
267 .eccbytes = 40,
268#ifdef CONFIG_NAND_6BYTES_OOB_FREE_10BYTES_ECC
269 .eccpos = {
270 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
271 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
272 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
273 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
274 },
275 .oobfree = {
276 {2, 4}, {16, 6}, {32, 6}, {48, 6},
277 },
278#else
279 .eccpos = {
280 24, 25, 26, 27, 28,
281 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
282 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
283 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
284 59, 60, 61, 62, 63,
285 },
286 .oobfree = {
287 {.offset = 2, .length = 22, },
288 },
289#endif
290#elif defined(CONFIG_SYS_NAND_PAGE_4K)
291 .eccbytes = 80,
292 .eccpos = {
293 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
294 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
295 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
296 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
297 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
298 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
299 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
300 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
301 },
302 .oobfree = {
303 {.offset = 2, .length = 46, },
304 },
305#endif
306};
307
308#if defined CONFIG_KEYSTONE_RBL_NAND
309static struct nand_ecclayout nand_keystone_rbl_4bit_layout_oobfirst = {
310#if defined(CONFIG_SYS_NAND_PAGE_2K)
311 .eccbytes = 40,
312 .eccpos = {
313 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
314 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
315 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
316 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
317 },
318 .oobfree = {
319 {.offset = 2, .length = 4, },
320 {.offset = 16, .length = 6, },
321 {.offset = 32, .length = 6, },
322 {.offset = 48, .length = 6, },
323 },
324#elif defined(CONFIG_SYS_NAND_PAGE_4K)
325 .eccbytes = 80,
326 .eccpos = {
327 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
328 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
329 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
330 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
331 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
332 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
333 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
334 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
335 },
336 .oobfree = {
337 {.offset = 2, .length = 4, },
338 {.offset = 16, .length = 6, },
339 {.offset = 32, .length = 6, },
340 {.offset = 48, .length = 6, },
341 {.offset = 64, .length = 6, },
342 {.offset = 80, .length = 6, },
343 {.offset = 96, .length = 6, },
344 {.offset = 112, .length = 6, },
345 },
346#endif
347};
348
349#ifdef CONFIG_SYS_NAND_PAGE_2K
350#define CONFIG_KEYSTONE_NAND_MAX_RBL_PAGE CONFIG_KEYSTONE_NAND_MAX_RBL_SIZE >> 11
351#elif defined(CONFIG_SYS_NAND_PAGE_4K)
352#define CONFIG_KEYSTONE_NAND_MAX_RBL_PAGE CONFIG_KEYSTONE_NAND_MAX_RBL_SIZE >> 12
353#endif
354
355
356
357
358
359
360
361
362
363
364
365static int nand_davinci_write_page(struct mtd_info *mtd, struct nand_chip *chip,
366 uint32_t offset, int data_len,
367 const uint8_t *buf, int oob_required,
368 int page, int cached, int raw)
369{
370 int status;
371 int ret = 0;
372 struct nand_ecclayout *saved_ecc_layout;
373
374
375 if (page < CONFIG_KEYSTONE_NAND_MAX_RBL_PAGE) {
376 saved_ecc_layout = chip->ecc.layout;
377 chip->ecc.layout = &nand_keystone_rbl_4bit_layout_oobfirst;
378 mtd->oobavail = chip->ecc.layout->oobavail;
379 }
380
381 chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);
382
383 if (unlikely(raw))
384 status = chip->ecc.write_page_raw(mtd, chip, buf, oob_required);
385 else
386 status = chip->ecc.write_page(mtd, chip, buf, oob_required);
387
388 if (status < 0) {
389 ret = status;
390 goto err;
391 }
392
393 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
394 status = chip->waitfunc(mtd, chip);
395
396
397
398
399
400 if ((status & NAND_STATUS_FAIL) && (chip->errstat))
401 status = chip->errstat(mtd, chip, FL_WRITING, status, page);
402
403 if (status & NAND_STATUS_FAIL) {
404 ret = -EIO;
405 goto err;
406 }
407
408err:
409
410 if (page < CONFIG_KEYSTONE_NAND_MAX_RBL_PAGE) {
411 chip->ecc.layout = saved_ecc_layout;
412 mtd->oobavail = saved_ecc_layout->oobavail;
413 }
414
415 return ret;
416}
417
418
419
420
421
422
423
424
425
426
427
428static int nand_davinci_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
429 uint8_t *buf, int oob_required, int page)
430{
431 int i, eccsize = chip->ecc.size;
432 int eccbytes = chip->ecc.bytes;
433 int eccsteps = chip->ecc.steps;
434 uint32_t *eccpos;
435 uint8_t *p = buf;
436 uint8_t *ecc_code = chip->buffers->ecccode;
437 uint8_t *ecc_calc = chip->buffers->ecccalc;
438 struct nand_ecclayout *saved_ecc_layout = chip->ecc.layout;
439
440
441 if (page < CONFIG_KEYSTONE_NAND_MAX_RBL_PAGE) {
442 chip->ecc.layout = &nand_keystone_rbl_4bit_layout_oobfirst;
443 mtd->oobavail = chip->ecc.layout->oobavail;
444 }
445
446 eccpos = chip->ecc.layout->eccpos;
447
448
449 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
450 chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
451 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
452
453 for (i = 0; i < chip->ecc.total; i++)
454 ecc_code[i] = chip->oob_poi[eccpos[i]];
455
456 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
457 int stat;
458
459 chip->ecc.hwctl(mtd, NAND_ECC_READ);
460 chip->read_buf(mtd, p, eccsize);
461 chip->ecc.calculate(mtd, p, &ecc_calc[i]);
462
463 stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL);
464 if (stat < 0)
465 mtd->ecc_stats.failed++;
466 else
467 mtd->ecc_stats.corrected += stat;
468 }
469
470
471 if (page < CONFIG_KEYSTONE_NAND_MAX_RBL_PAGE) {
472 chip->ecc.layout = saved_ecc_layout;
473 mtd->oobavail = saved_ecc_layout->oobavail;
474 }
475
476 return 0;
477}
478#endif
479
480static void nand_davinci_4bit_enable_hwecc(struct mtd_info *mtd, int mode)
481{
482 u32 val;
483
484 switch (mode) {
485 case NAND_ECC_WRITE:
486 case NAND_ECC_READ:
487
488
489
490
491 val = __raw_readl(&davinci_emif_regs->nandfcr);
492 val &= ~DAVINCI_NANDFCR_4BIT_ECC_SEL_MASK;
493 val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS);
494 val |= DAVINCI_NANDFCR_4BIT_ECC_SEL(CONFIG_SYS_NAND_CS);
495 val |= DAVINCI_NANDFCR_4BIT_ECC_START;
496 __raw_writel(val, &davinci_emif_regs->nandfcr);
497 break;
498 case NAND_ECC_READSYN:
499 val = __raw_readl(&davinci_emif_regs->nand4bitecc[0]);
500 break;
501 default:
502 break;
503 }
504}
505
506static u32 nand_davinci_4bit_readecc(struct mtd_info *mtd, unsigned int ecc[4])
507{
508 int i;
509
510 for (i = 0; i < 4; i++) {
511 ecc[i] = __raw_readl(&davinci_emif_regs->nand4bitecc[i]) &
512 NAND_4BITECC_MASK;
513 }
514
515 return 0;
516}
517
518static int nand_davinci_4bit_calculate_ecc(struct mtd_info *mtd,
519 const uint8_t *dat,
520 uint8_t *ecc_code)
521{
522 unsigned int hw_4ecc[4];
523 unsigned int i;
524
525 nand_davinci_4bit_readecc(mtd, hw_4ecc);
526
527
528 for (i = 0; i < 2; i++) {
529 unsigned int hw_ecc_low = hw_4ecc[i * 2];
530 unsigned int hw_ecc_hi = hw_4ecc[(i * 2) + 1];
531
532
533 *ecc_code++ = hw_ecc_low & 0xFF;
534
535
536
537
538
539
540 *ecc_code++ =
541 ((hw_ecc_low >> 8) & 0x3) | ((hw_ecc_low >> 14) & 0xFC);
542
543
544
545
546
547 *ecc_code++ =
548 ((hw_ecc_low >> 22) & 0xF) | ((hw_ecc_hi << 4) & 0xF0);
549
550
551
552
553
554 *ecc_code++ =
555 ((hw_ecc_hi >> 4) & 0x3F) | ((hw_ecc_hi >> 10) & 0xC0);
556
557
558 *ecc_code++ = (hw_ecc_hi >> 18) & 0xFF;
559 }
560
561 return 0;
562}
563
564static int nand_davinci_4bit_correct_data(struct mtd_info *mtd, uint8_t *dat,
565 uint8_t *read_ecc, uint8_t *calc_ecc)
566{
567 int i;
568 unsigned int hw_4ecc[4];
569 unsigned int iserror;
570 unsigned short *ecc16;
571 unsigned int numerrors, erroraddress, errorvalue;
572 u32 val;
573
574
575
576
577
578
579 for (i = 0; i < 10; i++) {
580 if (read_ecc[i] != 0xFF)
581 break;
582 }
583 if (i == 10)
584 return 0;
585
586
587 ecc16 = (unsigned short *)&read_ecc[0];
588
589
590
591
592
593
594
595
596 __raw_writel(((ecc16[4]) >> 6) & 0x3FF,
597 &davinci_emif_regs->nand4biteccload);
598
599
600 __raw_writel((((ecc16[3]) >> 12) & 0xF) | ((((ecc16[4])) << 4) & 0x3F0),
601 &davinci_emif_regs->nand4biteccload);
602
603
604 __raw_writel((ecc16[3] >> 2) & 0x3FF,
605 &davinci_emif_regs->nand4biteccload);
606
607
608 __raw_writel(((ecc16[2]) >> 8) | ((((ecc16[3])) << 8) & 0x300),
609 &davinci_emif_regs->nand4biteccload);
610
611
612 __raw_writel((((ecc16[1]) >> 14) & 0x3) | ((((ecc16[2])) << 2) & 0x3FC),
613 &davinci_emif_regs->nand4biteccload);
614
615
616 __raw_writel(((ecc16[1]) >> 4) & 0x3FF,
617 &davinci_emif_regs->nand4biteccload);
618
619
620 __raw_writel((((ecc16[0]) >> 10) & 0x3F) | (((ecc16[1]) << 6) & 0x3C0),
621 &davinci_emif_regs->nand4biteccload);
622
623
624 __raw_writel((ecc16[0]) & 0x3FF,
625 &davinci_emif_regs->nand4biteccload);
626
627
628
629
630
631
632
633 val = __raw_readl(&davinci_emif_regs->nandfsr);
634
635
636
637
638
639
640 nand_davinci_4bit_readecc(mtd, hw_4ecc);
641
642 if (!(hw_4ecc[0] | hw_4ecc[1] | hw_4ecc[2] | hw_4ecc[3]))
643 return 0;
644
645
646
647
648
649 val = __raw_readl(&davinci_emif_regs->nanderradd1);
650
651
652
653
654
655 __raw_writel(DAVINCI_NANDFCR_4BIT_CALC_START,
656 &davinci_emif_regs->nandfcr);
657
658
659
660
661
662
663
664 i = NAND_TIMEOUT;
665 do {
666 val = __raw_readl(&davinci_emif_regs->nandfsr);
667 val &= 0xc00;
668 i--;
669 } while ((i > 0) && !val);
670
671
672
673
674
675 i = NAND_TIMEOUT;
676 do {
677 val = __raw_readl(&davinci_emif_regs->nandfsr);
678 val &= 0xc00;
679 i--;
680 } while ((i > 0) && val);
681
682 iserror = __raw_readl(&davinci_emif_regs->nandfsr);
683 iserror &= EMIF_NANDFSR_ECC_STATE_MASK;
684 iserror = iserror >> 8;
685
686
687
688
689
690
691
692
693
694
695
696 if (iserror == ECC_STATE_NO_ERR) {
697 val = __raw_readl(&davinci_emif_regs->nanderrval1);
698 return 0;
699 } else if (iserror == ECC_STATE_TOO_MANY_ERRS) {
700 val = __raw_readl(&davinci_emif_regs->nanderrval1);
701 return -1;
702 }
703
704 numerrors = ((__raw_readl(&davinci_emif_regs->nandfsr) >> 16)
705 & 0x3) + 1;
706
707
708 for (i = 0; i < numerrors; i++) {
709 if (i > 1) {
710 erroraddress =
711 ((__raw_readl(&davinci_emif_regs->nanderradd2) >>
712 (16 * (i & 1))) & 0x3FF);
713 erroraddress = ((512 + 7) - erroraddress);
714 errorvalue =
715 ((__raw_readl(&davinci_emif_regs->nanderrval2) >>
716 (16 * (i & 1))) & 0xFF);
717 } else {
718 erroraddress =
719 ((__raw_readl(&davinci_emif_regs->nanderradd1) >>
720 (16 * (i & 1))) & 0x3FF);
721 erroraddress = ((512 + 7) - erroraddress);
722 errorvalue =
723 ((__raw_readl(&davinci_emif_regs->nanderrval1) >>
724 (16 * (i & 1))) & 0xFF);
725 }
726
727 if (erroraddress < 512)
728 dat[erroraddress] ^= errorvalue;
729 }
730
731 return numerrors;
732}
733#endif
734
735static int nand_davinci_dev_ready(struct mtd_info *mtd)
736{
737 return __raw_readl(&davinci_emif_regs->nandfsr) & 0x1;
738}
739
740static void nand_flash_init(void)
741{
742
743
744
745
746
747#ifdef CONFIG_SOC_DM644X
748 u_int32_t acfg1 = 0x3ffffffc;
749
750
751
752
753
754
755
756
757 acfg1 = 0
758 | (0 << 31)
759 | (0 << 30)
760 | (1 << 26)
761 | (3 << 20)
762 | (1 << 17)
763 | (1 << 13)
764 | (5 << 7)
765 | (1 << 4)
766 | (3 << 2)
767 | (0 << 0)
768 ;
769
770 __raw_writel(acfg1, &davinci_emif_regs->ab1cr);
771
772
773 __raw_writel(0x00000101, &davinci_emif_regs->nandfcr);
774#endif
775}
776
777void davinci_nand_init(struct nand_chip *nand)
778{
779#if defined CONFIG_KEYSTONE_RBL_NAND
780 int i;
781 struct nand_ecclayout *layout;
782
783 layout = &nand_keystone_rbl_4bit_layout_oobfirst;
784 layout->oobavail = 0;
785 for (i = 0; layout->oobfree[i].length &&
786 i < ARRAY_SIZE(layout->oobfree); i++)
787 layout->oobavail += layout->oobfree[i].length;
788
789 nand->write_page = nand_davinci_write_page;
790 nand->ecc.read_page = nand_davinci_read_page_hwecc;
791#endif
792 nand->chip_delay = 0;
793#ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
794 nand->bbt_options |= NAND_BBT_USE_FLASH;
795#endif
796#ifdef CONFIG_SYS_NAND_NO_SUBPAGE_WRITE
797 nand->options |= NAND_NO_SUBPAGE_WRITE;
798#endif
799#ifdef CONFIG_SYS_NAND_HW_ECC
800 nand->ecc.mode = NAND_ECC_HW;
801 nand->ecc.size = 512;
802 nand->ecc.bytes = 3;
803 nand->ecc.strength = 1;
804 nand->ecc.calculate = nand_davinci_calculate_ecc;
805 nand->ecc.correct = nand_davinci_correct_data;
806 nand->ecc.hwctl = nand_davinci_enable_hwecc;
807#else
808 nand->ecc.mode = NAND_ECC_SOFT;
809#endif
810#ifdef CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
811 nand->ecc.mode = NAND_ECC_HW_OOB_FIRST;
812 nand->ecc.size = 512;
813 nand->ecc.bytes = 10;
814 nand->ecc.strength = 4;
815 nand->ecc.calculate = nand_davinci_4bit_calculate_ecc;
816 nand->ecc.correct = nand_davinci_4bit_correct_data;
817 nand->ecc.hwctl = nand_davinci_4bit_enable_hwecc;
818 nand->ecc.layout = &nand_davinci_4bit_layout_oobfirst;
819#endif
820
821 nand->cmd_ctrl = nand_davinci_hwcontrol;
822
823 nand->read_buf = nand_davinci_read_buf;
824 nand->write_buf = nand_davinci_write_buf;
825
826 nand->dev_ready = nand_davinci_dev_ready;
827
828 nand_flash_init();
829}
830
831int board_nand_init(struct nand_chip *chip) __attribute__((weak));
832
833int board_nand_init(struct nand_chip *chip)
834{
835 davinci_nand_init(chip);
836 return 0;
837}
838