uboot/drivers/mtd/nand/davinci_nand.c
<<
>>
Prefs
   1/*
   2 * NAND driver for TI DaVinci based boards.
   3 *
   4 * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
   5 *
   6 * Based on Linux DaVinci NAND driver by TI. Original copyright follows:
   7 */
   8
   9/*
  10 *
  11 * linux/drivers/mtd/nand/nand_davinci.c
  12 *
  13 * NAND Flash Driver
  14 *
  15 * Copyright (C) 2006 Texas Instruments.
  16 *
  17 * ----------------------------------------------------------------------------
  18 *
  19 * This program is free software; you can redistribute it and/or modify
  20 * it under the terms of the GNU General Public License as published by
  21 * the Free Software Foundation; either version 2 of the License, or
  22 * (at your option) any later version.
  23 *
  24 * This program is distributed in the hope that it will be useful,
  25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27 * GNU General Public License for more details.
  28 *
  29 *  You should have received a copy of the GNU General Public License
  30 *  along with this program; if not, write to the Free Software
  31 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  32 * ----------------------------------------------------------------------------
  33 *
  34 *  Overview:
  35 *   This is a device driver for the NAND flash device found on the
  36 *   DaVinci board which utilizes the Samsung k9k2g08 part.
  37 *
  38 Modifications:
  39 ver. 1.0: Feb 2005, Vinod/Sudhakar
  40 -
  41 *
  42 */
  43
  44#include <common.h>
  45#include <asm/io.h>
  46#include <nand.h>
  47#include <asm/arch/nand_defs.h>
  48#include <asm/arch/emif_defs.h>
  49
  50/* Definitions for 4-bit hardware ECC */
  51#define NAND_TIMEOUT                    10240
  52#define NAND_ECC_BUSY                   0xC
  53#define NAND_4BITECC_MASK               0x03FF03FF
  54#define EMIF_NANDFSR_ECC_STATE_MASK     0x00000F00
  55#define ECC_STATE_NO_ERR                0x0
  56#define ECC_STATE_TOO_MANY_ERRS         0x1
  57#define ECC_STATE_ERR_CORR_COMP_P       0x2
  58#define ECC_STATE_ERR_CORR_COMP_N       0x3
  59
  60/*
  61 * Exploit the little endianness of the ARM to do multi-byte transfers
  62 * per device read. This can perform over twice as quickly as individual
  63 * byte transfers when buffer alignment is conducive.
  64 *
  65 * NOTE: This only works if the NAND is not connected to the 2 LSBs of
  66 * the address bus. On Davinci EVM platforms this has always been true.
  67 */
  68static void nand_davinci_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
  69{
  70        struct nand_chip *chip = mtd->priv;
  71        const u32 *nand = chip->IO_ADDR_R;
  72
  73        /* Make sure that buf is 32 bit aligned */
  74        if (((int)buf & 0x3) != 0) {
  75                if (((int)buf & 0x1) != 0) {
  76                        if (len) {
  77                                *buf = readb(nand);
  78                                buf += 1;
  79                                len--;
  80                        }
  81                }
  82
  83                if (((int)buf & 0x3) != 0) {
  84                        if (len >= 2) {
  85                                *(u16 *)buf = readw(nand);
  86                                buf += 2;
  87                                len -= 2;
  88                        }
  89                }
  90        }
  91
  92        /* copy aligned data */
  93        while (len >= 4) {
  94                *(u32 *)buf = __raw_readl(nand);
  95                buf += 4;
  96                len -= 4;
  97        }
  98
  99        /* mop up any remaining bytes */
 100        if (len) {
 101                if (len >= 2) {
 102                        *(u16 *)buf = readw(nand);
 103                        buf += 2;
 104                        len -= 2;
 105                }
 106
 107                if (len)
 108                        *buf = readb(nand);
 109        }
 110}
 111
 112static void nand_davinci_write_buf(struct mtd_info *mtd, const uint8_t *buf,
 113                                   int len)
 114{
 115        struct nand_chip *chip = mtd->priv;
 116        const u32 *nand = chip->IO_ADDR_W;
 117
 118        /* Make sure that buf is 32 bit aligned */
 119        if (((int)buf & 0x3) != 0) {
 120                if (((int)buf & 0x1) != 0) {
 121                        if (len) {
 122                                writeb(*buf, nand);
 123                                buf += 1;
 124                                len--;
 125                        }
 126                }
 127
 128                if (((int)buf & 0x3) != 0) {
 129                        if (len >= 2) {
 130                                writew(*(u16 *)buf, nand);
 131                                buf += 2;
 132                                len -= 2;
 133                        }
 134                }
 135        }
 136
 137        /* copy aligned data */
 138        while (len >= 4) {
 139                __raw_writel(*(u32 *)buf, nand);
 140                buf += 4;
 141                len -= 4;
 142        }
 143
 144        /* mop up any remaining bytes */
 145        if (len) {
 146                if (len >= 2) {
 147                        writew(*(u16 *)buf, nand);
 148                        buf += 2;
 149                        len -= 2;
 150                }
 151
 152                if (len)
 153                        writeb(*buf, nand);
 154        }
 155}
 156
 157static void nand_davinci_hwcontrol(struct mtd_info *mtd, int cmd,
 158                unsigned int ctrl)
 159{
 160        struct          nand_chip *this = mtd->priv;
 161        u_int32_t       IO_ADDR_W = (u_int32_t)this->IO_ADDR_W;
 162
 163        if (ctrl & NAND_CTRL_CHANGE) {
 164                IO_ADDR_W &= ~(MASK_ALE|MASK_CLE);
 165
 166                if (ctrl & NAND_CLE)
 167                        IO_ADDR_W |= MASK_CLE;
 168                if (ctrl & NAND_ALE)
 169                        IO_ADDR_W |= MASK_ALE;
 170                this->IO_ADDR_W = (void __iomem *) IO_ADDR_W;
 171        }
 172
 173        if (cmd != NAND_CMD_NONE)
 174                writeb(cmd, IO_ADDR_W);
 175}
 176
 177#ifdef CONFIG_SYS_NAND_HW_ECC
 178
 179static void nand_davinci_enable_hwecc(struct mtd_info *mtd, int mode)
 180{
 181        u_int32_t       val;
 182
 183        (void)__raw_readl(&(davinci_emif_regs->nandfecc[
 184                                CONFIG_SYS_NAND_CS - 2]));
 185
 186        val = __raw_readl(&davinci_emif_regs->nandfcr);
 187        val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS);
 188        val |= DAVINCI_NANDFCR_1BIT_ECC_START(CONFIG_SYS_NAND_CS);
 189        __raw_writel(val, &davinci_emif_regs->nandfcr);
 190}
 191
 192static u_int32_t nand_davinci_readecc(struct mtd_info *mtd, u_int32_t region)
 193{
 194        u_int32_t       ecc = 0;
 195
 196        ecc = __raw_readl(&(davinci_emif_regs->nandfecc[region - 1]));
 197
 198        return ecc;
 199}
 200
 201static int nand_davinci_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
 202                u_char *ecc_code)
 203{
 204        u_int32_t               tmp;
 205        const int region = 1;
 206
 207        tmp = nand_davinci_readecc(mtd, region);
 208
 209        /* Squeeze 4 bytes ECC into 3 bytes by removing RESERVED bits
 210         * and shifting. RESERVED bits are 31 to 28 and 15 to 12. */
 211        tmp = (tmp & 0x00000fff) | ((tmp & 0x0fff0000) >> 4);
 212
 213        /* Invert so that erased block ECC is correct */
 214        tmp = ~tmp;
 215
 216        *ecc_code++ = tmp;
 217        *ecc_code++ = tmp >>  8;
 218        *ecc_code++ = tmp >> 16;
 219
 220        /* NOTE:  the above code matches mainline Linux:
 221         *      .PQR.stu ==> ~PQRstu
 222         *
 223         * MontaVista/TI kernels encode those bytes differently, use
 224         * complicated (and allegedly sometimes-wrong) correction code,
 225         * and usually shipped with U-Boot that uses software ECC:
 226         *      .PQR.stu ==> PsQRtu
 227         *
 228         * If you need MV/TI compatible NAND I/O in U-Boot, it should
 229         * be possible to (a) change the mangling above, (b) reverse
 230         * that mangling in nand_davinci_correct_data() below.
 231         */
 232
 233        return 0;
 234}
 235
 236static int nand_davinci_correct_data(struct mtd_info *mtd, u_char *dat,
 237                u_char *read_ecc, u_char *calc_ecc)
 238{
 239        struct nand_chip *this = mtd->priv;
 240        u_int32_t ecc_nand = read_ecc[0] | (read_ecc[1] << 8) |
 241                                          (read_ecc[2] << 16);
 242        u_int32_t ecc_calc = calc_ecc[0] | (calc_ecc[1] << 8) |
 243                                          (calc_ecc[2] << 16);
 244        u_int32_t diff = ecc_calc ^ ecc_nand;
 245
 246        if (diff) {
 247                if ((((diff >> 12) ^ diff) & 0xfff) == 0xfff) {
 248                        /* Correctable error */
 249                        if ((diff >> (12 + 3)) < this->ecc.size) {
 250                                uint8_t find_bit = 1 << ((diff >> 12) & 7);
 251                                uint32_t find_byte = diff >> (12 + 3);
 252
 253                                dat[find_byte] ^= find_bit;
 254                                MTDDEBUG(MTD_DEBUG_LEVEL0, "Correcting single "
 255                                         "bit ECC error at offset: %d, bit: "
 256                                         "%d\n", find_byte, find_bit);
 257                                return 1;
 258                        } else {
 259                                return -1;
 260                        }
 261                } else if (!(diff & (diff - 1))) {
 262                        /* Single bit ECC error in the ECC itself,
 263                           nothing to fix */
 264                        MTDDEBUG(MTD_DEBUG_LEVEL0, "Single bit ECC error in "
 265                                 "ECC.\n");
 266                        return 1;
 267                } else {
 268                        /* Uncorrectable error */
 269                        MTDDEBUG(MTD_DEBUG_LEVEL0, "ECC UNCORRECTED_ERROR 1\n");
 270                        return -1;
 271                }
 272        }
 273        return 0;
 274}
 275#endif /* CONFIG_SYS_NAND_HW_ECC */
 276
 277#ifdef CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
 278static struct nand_ecclayout nand_davinci_4bit_layout_oobfirst = {
 279#if defined(CONFIG_SYS_NAND_PAGE_2K)
 280        .eccbytes = 40,
 281        .eccpos = {
 282                24, 25, 26, 27, 28,
 283                29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
 284                39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
 285                49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
 286                59, 60, 61, 62, 63,
 287                },
 288        .oobfree = {
 289                {.offset = 2, .length = 22, },
 290        },
 291#elif defined(CONFIG_SYS_NAND_PAGE_4K)
 292        .eccbytes = 80,
 293        .eccpos = {
 294                48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
 295                58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
 296                68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
 297                78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
 298                88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
 299                98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
 300                108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
 301                118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
 302                },
 303        .oobfree = {
 304                {.offset = 2, .length = 46, },
 305        },
 306#endif
 307};
 308
 309static void nand_davinci_4bit_enable_hwecc(struct mtd_info *mtd, int mode)
 310{
 311        u32 val;
 312
 313        switch (mode) {
 314        case NAND_ECC_WRITE:
 315        case NAND_ECC_READ:
 316                /*
 317                 * Start a new ECC calculation for reading or writing 512 bytes
 318                 * of data.
 319                 */
 320                val = __raw_readl(&davinci_emif_regs->nandfcr);
 321                val &= ~DAVINCI_NANDFCR_4BIT_ECC_SEL_MASK;
 322                val |= DAVINCI_NANDFCR_NAND_ENABLE(CONFIG_SYS_NAND_CS);
 323                val |= DAVINCI_NANDFCR_4BIT_ECC_SEL(CONFIG_SYS_NAND_CS);
 324                val |= DAVINCI_NANDFCR_4BIT_ECC_START;
 325                __raw_writel(val, &davinci_emif_regs->nandfcr);
 326                break;
 327        case NAND_ECC_READSYN:
 328                val = __raw_readl(&davinci_emif_regs->nand4bitecc[0]);
 329                break;
 330        default:
 331                break;
 332        }
 333}
 334
 335static u32 nand_davinci_4bit_readecc(struct mtd_info *mtd, unsigned int ecc[4])
 336{
 337        int i;
 338
 339        for (i = 0; i < 4; i++) {
 340                ecc[i] = __raw_readl(&davinci_emif_regs->nand4bitecc[i]) &
 341                        NAND_4BITECC_MASK;
 342        }
 343
 344        return 0;
 345}
 346
 347static int nand_davinci_4bit_calculate_ecc(struct mtd_info *mtd,
 348                                           const uint8_t *dat,
 349                                           uint8_t *ecc_code)
 350{
 351        unsigned int hw_4ecc[4];
 352        unsigned int i;
 353
 354        nand_davinci_4bit_readecc(mtd, hw_4ecc);
 355
 356        /*Convert 10 bit ecc value to 8 bit */
 357        for (i = 0; i < 2; i++) {
 358                unsigned int hw_ecc_low = hw_4ecc[i * 2];
 359                unsigned int hw_ecc_hi = hw_4ecc[(i * 2) + 1];
 360
 361                /* Take first 8 bits from val1 (count1=0) or val5 (count1=1) */
 362                *ecc_code++ = hw_ecc_low & 0xFF;
 363
 364                /*
 365                 * Take 2 bits as LSB bits from val1 (count1=0) or val5
 366                 * (count1=1) and 6 bits from val2 (count1=0) or
 367                 * val5 (count1=1)
 368                 */
 369                *ecc_code++ =
 370                    ((hw_ecc_low >> 8) & 0x3) | ((hw_ecc_low >> 14) & 0xFC);
 371
 372                /*
 373                 * Take 4 bits from val2 (count1=0) or val5 (count1=1) and
 374                 * 4 bits from val3 (count1=0) or val6 (count1=1)
 375                 */
 376                *ecc_code++ =
 377                    ((hw_ecc_low >> 22) & 0xF) | ((hw_ecc_hi << 4) & 0xF0);
 378
 379                /*
 380                 * Take 6 bits from val3(count1=0) or val6 (count1=1) and
 381                 * 2 bits from val4 (count1=0) or  val7 (count1=1)
 382                 */
 383                *ecc_code++ =
 384                    ((hw_ecc_hi >> 4) & 0x3F) | ((hw_ecc_hi >> 10) & 0xC0);
 385
 386                /* Take 8 bits from val4 (count1=0) or val7 (count1=1) */
 387                *ecc_code++ = (hw_ecc_hi >> 18) & 0xFF;
 388        }
 389
 390        return 0;
 391}
 392
 393static int nand_davinci_4bit_correct_data(struct mtd_info *mtd, uint8_t *dat,
 394                                          uint8_t *read_ecc, uint8_t *calc_ecc)
 395{
 396        int i;
 397        unsigned int hw_4ecc[4];
 398        unsigned int iserror;
 399        unsigned short *ecc16;
 400        unsigned int numerrors, erroraddress, errorvalue;
 401        u32 val;
 402
 403        /*
 404         * Check for an ECC where all bytes are 0xFF.  If this is the case, we
 405         * will assume we are looking at an erased page and we should ignore
 406         * the ECC.
 407         */
 408        for (i = 0; i < 10; i++) {
 409                if (read_ecc[i] != 0xFF)
 410                        break;
 411        }
 412        if (i == 10)
 413                return 0;
 414
 415        /* Convert 8 bit in to 10 bit */
 416        ecc16 = (unsigned short *)&read_ecc[0];
 417
 418        /*
 419         * Write the parity values in the NAND Flash 4-bit ECC Load register.
 420         * Write each parity value one at a time starting from 4bit_ecc_val8
 421         * to 4bit_ecc_val1.
 422         */
 423
 424        /*Take 2 bits from 8th byte and 8 bits from 9th byte */
 425        __raw_writel(((ecc16[4]) >> 6) & 0x3FF,
 426                        &davinci_emif_regs->nand4biteccload);
 427
 428        /* Take 4 bits from 7th byte and 6 bits from 8th byte */
 429        __raw_writel((((ecc16[3]) >> 12) & 0xF) | ((((ecc16[4])) << 4) & 0x3F0),
 430                        &davinci_emif_regs->nand4biteccload);
 431
 432        /* Take 6 bits from 6th byte and 4 bits from 7th byte */
 433        __raw_writel((ecc16[3] >> 2) & 0x3FF,
 434                        &davinci_emif_regs->nand4biteccload);
 435
 436        /* Take 8 bits from 5th byte and 2 bits from 6th byte */
 437        __raw_writel(((ecc16[2]) >> 8) | ((((ecc16[3])) << 8) & 0x300),
 438                        &davinci_emif_regs->nand4biteccload);
 439
 440        /*Take 2 bits from 3rd byte and 8 bits from 4th byte */
 441        __raw_writel((((ecc16[1]) >> 14) & 0x3) | ((((ecc16[2])) << 2) & 0x3FC),
 442                        &davinci_emif_regs->nand4biteccload);
 443
 444        /* Take 4 bits form 2nd bytes and 6 bits from 3rd bytes */
 445        __raw_writel(((ecc16[1]) >> 4) & 0x3FF,
 446                        &davinci_emif_regs->nand4biteccload);
 447
 448        /* Take 6 bits from 1st byte and 4 bits from 2nd byte */
 449        __raw_writel((((ecc16[0]) >> 10) & 0x3F) | (((ecc16[1]) << 6) & 0x3C0),
 450                        &davinci_emif_regs->nand4biteccload);
 451
 452        /* Take 10 bits from 0th and 1st bytes */
 453        __raw_writel((ecc16[0]) & 0x3FF,
 454                        &davinci_emif_regs->nand4biteccload);
 455
 456        /*
 457         * Perform a dummy read to the EMIF Revision Code and Status register.
 458         * This is required to ensure time for syndrome calculation after
 459         * writing the ECC values in previous step.
 460         */
 461
 462        val = __raw_readl(&davinci_emif_regs->nandfsr);
 463
 464        /*
 465         * Read the syndrome from the NAND Flash 4-Bit ECC 1-4 registers.
 466         * A syndrome value of 0 means no bit errors. If the syndrome is
 467         * non-zero then go further otherwise return.
 468         */
 469        nand_davinci_4bit_readecc(mtd, hw_4ecc);
 470
 471        if (!(hw_4ecc[0] | hw_4ecc[1] | hw_4ecc[2] | hw_4ecc[3]))
 472                return 0;
 473
 474        /*
 475         * Clear any previous address calculation by doing a dummy read of an
 476         * error address register.
 477         */
 478        val = __raw_readl(&davinci_emif_regs->nanderradd1);
 479
 480        /*
 481         * Set the addr_calc_st bit(bit no 13) in the NAND Flash Control
 482         * register to 1.
 483         */
 484        __raw_writel(1 << 13, &davinci_emif_regs->nandfcr);
 485
 486        /*
 487         * Wait for the corr_state field (bits 8 to 11)in the
 488         * NAND Flash Status register to be equal to 0x0, 0x1, 0x2, or 0x3.
 489         */
 490        i = NAND_TIMEOUT;
 491        do {
 492                val = __raw_readl(&davinci_emif_regs->nandfsr);
 493                val &= 0xc00;
 494                i--;
 495        } while ((i > 0) && val);
 496
 497        iserror = __raw_readl(&davinci_emif_regs->nandfsr);
 498        iserror &= EMIF_NANDFSR_ECC_STATE_MASK;
 499        iserror = iserror >> 8;
 500
 501        /*
 502         * ECC_STATE_TOO_MANY_ERRS (0x1) means errors cannot be
 503         * corrected (five or more errors).  The number of errors
 504         * calculated (err_num field) differs from the number of errors
 505         * searched.  ECC_STATE_ERR_CORR_COMP_P (0x2) means error
 506         * correction complete (errors on bit 8 or 9).
 507         * ECC_STATE_ERR_CORR_COMP_N (0x3) means error correction
 508         * complete (error exists).
 509         */
 510
 511        if (iserror == ECC_STATE_NO_ERR) {
 512                val = __raw_readl(&davinci_emif_regs->nanderrval1);
 513                return 0;
 514        } else if (iserror == ECC_STATE_TOO_MANY_ERRS) {
 515                val = __raw_readl(&davinci_emif_regs->nanderrval1);
 516                return -1;
 517        }
 518
 519        numerrors = ((__raw_readl(&davinci_emif_regs->nandfsr) >> 16)
 520                        & 0x3) + 1;
 521
 522        /* Read the error address, error value and correct */
 523        for (i = 0; i < numerrors; i++) {
 524                if (i > 1) {
 525                        erroraddress =
 526                            ((__raw_readl(&davinci_emif_regs->nanderradd2) >>
 527                              (16 * (i & 1))) & 0x3FF);
 528                        erroraddress = ((512 + 7) - erroraddress);
 529                        errorvalue =
 530                            ((__raw_readl(&davinci_emif_regs->nanderrval2) >>
 531                              (16 * (i & 1))) & 0xFF);
 532                } else {
 533                        erroraddress =
 534                            ((__raw_readl(&davinci_emif_regs->nanderradd1) >>
 535                              (16 * (i & 1))) & 0x3FF);
 536                        erroraddress = ((512 + 7) - erroraddress);
 537                        errorvalue =
 538                            ((__raw_readl(&davinci_emif_regs->nanderrval1) >>
 539                              (16 * (i & 1))) & 0xFF);
 540                }
 541                /* xor the corrupt data with error value */
 542                if (erroraddress < 512)
 543                        dat[erroraddress] ^= errorvalue;
 544        }
 545
 546        return numerrors;
 547}
 548#endif /* CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST */
 549
 550static int nand_davinci_dev_ready(struct mtd_info *mtd)
 551{
 552        return __raw_readl(&davinci_emif_regs->nandfsr) & 0x1;
 553}
 554
 555static void nand_flash_init(void)
 556{
 557        /* This is for DM6446 EVM and *very* similar.  DO NOT GROW THIS!
 558         * Instead, have your board_init() set EMIF timings, based on its
 559         * knowledge of the clocks and what devices are hooked up ... and
 560         * don't even do that unless no UBL handled it.
 561         */
 562#ifdef CONFIG_SOC_DM644X
 563        u_int32_t       acfg1 = 0x3ffffffc;
 564
 565        /*------------------------------------------------------------------*
 566         *  NAND FLASH CHIP TIMEOUT @ 459 MHz                               *
 567         *                                                                  *
 568         *  AEMIF.CLK freq   = PLL1/6 = 459/6 = 76.5 MHz                    *
 569         *  AEMIF.CLK period = 1/76.5 MHz = 13.1 ns                         *
 570         *                                                                  *
 571         *------------------------------------------------------------------*/
 572         acfg1 = 0
 573                | (0 << 31)     /* selectStrobe */
 574                | (0 << 30)     /* extWait */
 575                | (1 << 26)     /* writeSetup   10 ns */
 576                | (3 << 20)     /* writeStrobe  40 ns */
 577                | (1 << 17)     /* writeHold    10 ns */
 578                | (1 << 13)     /* readSetup    10 ns */
 579                | (5 << 7)      /* readStrobe   60 ns */
 580                | (1 << 4)      /* readHold     10 ns */
 581                | (3 << 2)      /* turnAround   ?? ns */
 582                | (0 << 0)      /* asyncSize    8-bit bus */
 583                ;
 584
 585        __raw_writel(acfg1, &davinci_emif_regs->ab1cr); /* CS2 */
 586
 587        /* NAND flash on CS2 */
 588        __raw_writel(0x00000101, &davinci_emif_regs->nandfcr);
 589#endif
 590}
 591
 592void davinci_nand_init(struct nand_chip *nand)
 593{
 594        nand->chip_delay  = 0;
 595#ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
 596        nand->options     |= NAND_USE_FLASH_BBT;
 597#endif
 598#ifdef CONFIG_SYS_NAND_HW_ECC
 599        nand->ecc.mode = NAND_ECC_HW;
 600        nand->ecc.size = 512;
 601        nand->ecc.bytes = 3;
 602        nand->ecc.calculate = nand_davinci_calculate_ecc;
 603        nand->ecc.correct  = nand_davinci_correct_data;
 604        nand->ecc.hwctl  = nand_davinci_enable_hwecc;
 605#else
 606        nand->ecc.mode = NAND_ECC_SOFT;
 607#endif /* CONFIG_SYS_NAND_HW_ECC */
 608#ifdef CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST
 609        nand->ecc.mode = NAND_ECC_HW_OOB_FIRST;
 610        nand->ecc.size = 512;
 611        nand->ecc.bytes = 10;
 612        nand->ecc.calculate = nand_davinci_4bit_calculate_ecc;
 613        nand->ecc.correct = nand_davinci_4bit_correct_data;
 614        nand->ecc.hwctl = nand_davinci_4bit_enable_hwecc;
 615        nand->ecc.layout = &nand_davinci_4bit_layout_oobfirst;
 616#endif
 617        /* Set address of hardware control function */
 618        nand->cmd_ctrl = nand_davinci_hwcontrol;
 619
 620        nand->read_buf = nand_davinci_read_buf;
 621        nand->write_buf = nand_davinci_write_buf;
 622
 623        nand->dev_ready = nand_davinci_dev_ready;
 624
 625        nand_flash_init();
 626}
 627
 628int board_nand_init(struct nand_chip *chip) __attribute__((weak));
 629
 630int board_nand_init(struct nand_chip *chip)
 631{
 632        davinci_nand_init(chip);
 633        return 0;
 634}
 635