uboot/drivers/mtd/nand/raw/fsl_ifc_nand.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/* Integrated Flash Controller NAND Machine Driver
   3 *
   4 * Copyright (c) 2012 Freescale Semiconductor, Inc
   5 *
   6 * Authors: Dipen Dudhat <Dipen.Dudhat@freescale.com>
   7 */
   8
   9#include <common.h>
  10#include <malloc.h>
  11#include <nand.h>
  12
  13#include <linux/mtd/mtd.h>
  14#include <linux/mtd/rawnand.h>
  15#include <linux/mtd/nand_ecc.h>
  16
  17#include <asm/io.h>
  18#include <linux/errno.h>
  19#include <fsl_ifc.h>
  20
  21#ifndef CONFIG_SYS_FSL_IFC_BANK_COUNT
  22#define CONFIG_SYS_FSL_IFC_BANK_COUNT   4
  23#endif
  24
  25#define MAX_BANKS       CONFIG_SYS_FSL_IFC_BANK_COUNT
  26#define ERR_BYTE        0xFF /* Value returned for read bytes
  27                                when read failed */
  28
  29struct fsl_ifc_ctrl;
  30
  31/* mtd information per set */
  32struct fsl_ifc_mtd {
  33        struct nand_chip chip;
  34        struct fsl_ifc_ctrl *ctrl;
  35
  36        struct device *dev;
  37        int bank;               /* Chip select bank number                */
  38        unsigned int bufnum_mask; /* bufnum = page & bufnum_mask */
  39        u8 __iomem *vbase;      /* Chip select base virtual address       */
  40};
  41
  42/* overview of the fsl ifc controller */
  43struct fsl_ifc_ctrl {
  44        struct nand_hw_control controller;
  45        struct fsl_ifc_mtd *chips[MAX_BANKS];
  46
  47        /* device info */
  48        struct fsl_ifc regs;
  49        void __iomem *addr;      /* Address of assigned IFC buffer        */
  50        unsigned int page;       /* Last page written to / read from      */
  51        unsigned int read_bytes; /* Number of bytes read during command   */
  52        unsigned int column;     /* Saved column from SEQIN               */
  53        unsigned int index;      /* Pointer to next byte to 'read'        */
  54        unsigned int status;     /* status read from NEESR after last op  */
  55        unsigned int oob;        /* Non zero if operating on OOB data     */
  56        unsigned int eccread;    /* Non zero for a full-page ECC read     */
  57};
  58
  59static struct fsl_ifc_ctrl *ifc_ctrl;
  60
  61/* 512-byte page with 4-bit ECC, 8-bit */
  62static struct nand_ecclayout oob_512_8bit_ecc4 = {
  63        .eccbytes = 8,
  64        .eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
  65        .oobfree = { {0, 5}, {6, 2} },
  66};
  67
  68/* 512-byte page with 4-bit ECC, 16-bit */
  69static struct nand_ecclayout oob_512_16bit_ecc4 = {
  70        .eccbytes = 8,
  71        .eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
  72        .oobfree = { {2, 6}, },
  73};
  74
  75/* 2048-byte page size with 4-bit ECC */
  76static struct nand_ecclayout oob_2048_ecc4 = {
  77        .eccbytes = 32,
  78        .eccpos = {
  79                8, 9, 10, 11, 12, 13, 14, 15,
  80                16, 17, 18, 19, 20, 21, 22, 23,
  81                24, 25, 26, 27, 28, 29, 30, 31,
  82                32, 33, 34, 35, 36, 37, 38, 39,
  83        },
  84        .oobfree = { {2, 6}, {40, 24} },
  85};
  86
  87/* 4096-byte page size with 4-bit ECC */
  88static struct nand_ecclayout oob_4096_ecc4 = {
  89        .eccbytes = 64,
  90        .eccpos = {
  91                8, 9, 10, 11, 12, 13, 14, 15,
  92                16, 17, 18, 19, 20, 21, 22, 23,
  93                24, 25, 26, 27, 28, 29, 30, 31,
  94                32, 33, 34, 35, 36, 37, 38, 39,
  95                40, 41, 42, 43, 44, 45, 46, 47,
  96                48, 49, 50, 51, 52, 53, 54, 55,
  97                56, 57, 58, 59, 60, 61, 62, 63,
  98                64, 65, 66, 67, 68, 69, 70, 71,
  99        },
 100        .oobfree = { {2, 6}, {72, 56} },
 101};
 102
 103/* 4096-byte page size with 8-bit ECC -- requires 218-byte OOB */
 104static struct nand_ecclayout oob_4096_ecc8 = {
 105        .eccbytes = 128,
 106        .eccpos = {
 107                8, 9, 10, 11, 12, 13, 14, 15,
 108                16, 17, 18, 19, 20, 21, 22, 23,
 109                24, 25, 26, 27, 28, 29, 30, 31,
 110                32, 33, 34, 35, 36, 37, 38, 39,
 111                40, 41, 42, 43, 44, 45, 46, 47,
 112                48, 49, 50, 51, 52, 53, 54, 55,
 113                56, 57, 58, 59, 60, 61, 62, 63,
 114                64, 65, 66, 67, 68, 69, 70, 71,
 115                72, 73, 74, 75, 76, 77, 78, 79,
 116                80, 81, 82, 83, 84, 85, 86, 87,
 117                88, 89, 90, 91, 92, 93, 94, 95,
 118                96, 97, 98, 99, 100, 101, 102, 103,
 119                104, 105, 106, 107, 108, 109, 110, 111,
 120                112, 113, 114, 115, 116, 117, 118, 119,
 121                120, 121, 122, 123, 124, 125, 126, 127,
 122                128, 129, 130, 131, 132, 133, 134, 135,
 123        },
 124        .oobfree = { {2, 6}, {136, 82} },
 125};
 126
 127/* 8192-byte page size with 4-bit ECC */
 128static struct nand_ecclayout oob_8192_ecc4 = {
 129        .eccbytes = 128,
 130        .eccpos = {
 131                8, 9, 10, 11, 12, 13, 14, 15,
 132                16, 17, 18, 19, 20, 21, 22, 23,
 133                24, 25, 26, 27, 28, 29, 30, 31,
 134                32, 33, 34, 35, 36, 37, 38, 39,
 135                40, 41, 42, 43, 44, 45, 46, 47,
 136                48, 49, 50, 51, 52, 53, 54, 55,
 137                56, 57, 58, 59, 60, 61, 62, 63,
 138                64, 65, 66, 67, 68, 69, 70, 71,
 139                72, 73, 74, 75, 76, 77, 78, 79,
 140                80, 81, 82, 83, 84, 85, 86, 87,
 141                88, 89, 90, 91, 92, 93, 94, 95,
 142                96, 97, 98, 99, 100, 101, 102, 103,
 143                104, 105, 106, 107, 108, 109, 110, 111,
 144                112, 113, 114, 115, 116, 117, 118, 119,
 145                120, 121, 122, 123, 124, 125, 126, 127,
 146                128, 129, 130, 131, 132, 133, 134, 135,
 147        },
 148        .oobfree = { {2, 6}, {136, 208} },
 149};
 150
 151/* 8192-byte page size with 8-bit ECC -- requires 218-byte OOB */
 152static struct nand_ecclayout oob_8192_ecc8 = {
 153        .eccbytes = 256,
 154        .eccpos = {
 155                8, 9, 10, 11, 12, 13, 14, 15,
 156                16, 17, 18, 19, 20, 21, 22, 23,
 157                24, 25, 26, 27, 28, 29, 30, 31,
 158                32, 33, 34, 35, 36, 37, 38, 39,
 159                40, 41, 42, 43, 44, 45, 46, 47,
 160                48, 49, 50, 51, 52, 53, 54, 55,
 161                56, 57, 58, 59, 60, 61, 62, 63,
 162                64, 65, 66, 67, 68, 69, 70, 71,
 163                72, 73, 74, 75, 76, 77, 78, 79,
 164                80, 81, 82, 83, 84, 85, 86, 87,
 165                88, 89, 90, 91, 92, 93, 94, 95,
 166                96, 97, 98, 99, 100, 101, 102, 103,
 167                104, 105, 106, 107, 108, 109, 110, 111,
 168                112, 113, 114, 115, 116, 117, 118, 119,
 169                120, 121, 122, 123, 124, 125, 126, 127,
 170                128, 129, 130, 131, 132, 133, 134, 135,
 171                136, 137, 138, 139, 140, 141, 142, 143,
 172                144, 145, 146, 147, 148, 149, 150, 151,
 173                152, 153, 154, 155, 156, 157, 158, 159,
 174                160, 161, 162, 163, 164, 165, 166, 167,
 175                168, 169, 170, 171, 172, 173, 174, 175,
 176                176, 177, 178, 179, 180, 181, 182, 183,
 177                184, 185, 186, 187, 188, 189, 190, 191,
 178                192, 193, 194, 195, 196, 197, 198, 199,
 179                200, 201, 202, 203, 204, 205, 206, 207,
 180                208, 209, 210, 211, 212, 213, 214, 215,
 181                216, 217, 218, 219, 220, 221, 222, 223,
 182                224, 225, 226, 227, 228, 229, 230, 231,
 183                232, 233, 234, 235, 236, 237, 238, 239,
 184                240, 241, 242, 243, 244, 245, 246, 247,
 185                248, 249, 250, 251, 252, 253, 254, 255,
 186                256, 257, 258, 259, 260, 261, 262, 263,
 187        },
 188        .oobfree = { {2, 6}, {264, 80} },
 189};
 190
 191/*
 192 * Generic flash bbt descriptors
 193 */
 194static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
 195static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
 196
 197static struct nand_bbt_descr bbt_main_descr = {
 198        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
 199                   NAND_BBT_2BIT | NAND_BBT_VERSION,
 200        .offs = 2, /* 0 on 8-bit small page */
 201        .len = 4,
 202        .veroffs = 6,
 203        .maxblocks = 4,
 204        .pattern = bbt_pattern,
 205};
 206
 207static struct nand_bbt_descr bbt_mirror_descr = {
 208        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
 209                   NAND_BBT_2BIT | NAND_BBT_VERSION,
 210        .offs = 2, /* 0 on 8-bit small page */
 211        .len = 4,
 212        .veroffs = 6,
 213        .maxblocks = 4,
 214        .pattern = mirror_pattern,
 215};
 216
 217/*
 218 * Set up the IFC hardware block and page address fields, and the ifc nand
 219 * structure addr field to point to the correct IFC buffer in memory
 220 */
 221static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
 222{
 223        struct nand_chip *chip = mtd_to_nand(mtd);
 224        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 225        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 226        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 227        int buf_num;
 228
 229        ctrl->page = page_addr;
 230
 231        /* Program ROW0/COL0 */
 232        ifc_out32(&ifc->ifc_nand.row0, page_addr);
 233        ifc_out32(&ifc->ifc_nand.col0, (oob ? IFC_NAND_COL_MS : 0) | column);
 234
 235        buf_num = page_addr & priv->bufnum_mask;
 236
 237        ctrl->addr = priv->vbase + buf_num * (mtd->writesize * 2);
 238        ctrl->index = column;
 239
 240        /* for OOB data point to the second half of the buffer */
 241        if (oob)
 242                ctrl->index += mtd->writesize;
 243}
 244
 245/* returns nonzero if entire page is blank */
 246static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
 247                          u32 eccstat, unsigned int bufnum)
 248{
 249        return (eccstat >> ((3 - bufnum % 4) * 8)) & 15;
 250}
 251
 252/*
 253 * execute IFC NAND command and wait for it to complete
 254 */
 255static int fsl_ifc_run_command(struct mtd_info *mtd)
 256{
 257        struct nand_chip *chip = mtd_to_nand(mtd);
 258        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 259        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 260        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 261        u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
 262        u32 time_start;
 263        u32 eccstat;
 264        int i;
 265
 266        /* set the chip select for NAND Transaction */
 267        ifc_out32(&ifc->ifc_nand.nand_csel, priv->bank << IFC_NAND_CSEL_SHIFT);
 268
 269        /* start read/write seq */
 270        ifc_out32(&ifc->ifc_nand.nandseq_strt,
 271                  IFC_NAND_SEQ_STRT_FIR_STRT);
 272
 273        /* wait for NAND Machine complete flag or timeout */
 274        time_start = get_timer(0);
 275
 276        while (get_timer(time_start) < timeo) {
 277                ctrl->status = ifc_in32(&ifc->ifc_nand.nand_evter_stat);
 278
 279                if (ctrl->status & IFC_NAND_EVTER_STAT_OPC)
 280                        break;
 281        }
 282
 283        ifc_out32(&ifc->ifc_nand.nand_evter_stat, ctrl->status);
 284
 285        if (ctrl->status & IFC_NAND_EVTER_STAT_FTOER)
 286                printf("%s: Flash Time Out Error\n", __func__);
 287        if (ctrl->status & IFC_NAND_EVTER_STAT_WPER)
 288                printf("%s: Write Protect Error\n", __func__);
 289
 290        if (ctrl->eccread) {
 291                int errors;
 292                int bufnum = ctrl->page & priv->bufnum_mask;
 293                int sector_start = bufnum * chip->ecc.steps;
 294                int sector_end = sector_start + chip->ecc.steps - 1;
 295                u32 *eccstat_regs;
 296
 297                eccstat_regs = ifc->ifc_nand.nand_eccstat;
 298                eccstat = ifc_in32(&eccstat_regs[sector_start / 4]);
 299
 300                for (i = sector_start; i <= sector_end; i++) {
 301                        if ((i != sector_start) && !(i % 4))
 302                                eccstat = ifc_in32(&eccstat_regs[i / 4]);
 303
 304                        errors = check_read_ecc(mtd, ctrl, eccstat, i);
 305
 306                        if (errors == 15) {
 307                                /*
 308                                 * Uncorrectable error.
 309                                 * We'll check for blank pages later.
 310                                 *
 311                                 * We disable ECCER reporting due to erratum
 312                                 * IFC-A002770 -- so report it now if we
 313                                 * see an uncorrectable error in ECCSTAT.
 314                                 */
 315                                ctrl->status |= IFC_NAND_EVTER_STAT_ECCER;
 316                                continue;
 317                        }
 318
 319                        mtd->ecc_stats.corrected += errors;
 320                }
 321
 322                ctrl->eccread = 0;
 323        }
 324
 325        /* returns 0 on success otherwise non-zero) */
 326        return ctrl->status == IFC_NAND_EVTER_STAT_OPC ? 0 : -EIO;
 327}
 328
 329static void fsl_ifc_do_read(struct nand_chip *chip,
 330                            int oob,
 331                            struct mtd_info *mtd)
 332{
 333        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 334        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 335        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 336
 337        /* Program FIR/IFC_NAND_FCR0 for Small/Large page */
 338        if (mtd->writesize > 512) {
 339                ifc_out32(&ifc->ifc_nand.nand_fir0,
 340                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 341                          (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
 342                          (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
 343                          (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP3_SHIFT) |
 344                          (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP4_SHIFT));
 345                ifc_out32(&ifc->ifc_nand.nand_fir1, 0x0);
 346
 347                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 348                          (NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT) |
 349                          (NAND_CMD_READSTART << IFC_NAND_FCR0_CMD1_SHIFT));
 350        } else {
 351                ifc_out32(&ifc->ifc_nand.nand_fir0,
 352                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 353                          (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
 354                          (IFC_FIR_OP_RA0  << IFC_NAND_FIR0_OP2_SHIFT) |
 355                          (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP3_SHIFT));
 356
 357                if (oob)
 358                        ifc_out32(&ifc->ifc_nand.nand_fcr0,
 359                                  NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT);
 360                else
 361                        ifc_out32(&ifc->ifc_nand.nand_fcr0,
 362                                  NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT);
 363        }
 364}
 365
 366/* cmdfunc send commands to the IFC NAND Machine */
 367static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
 368                             int column, int page_addr)
 369{
 370        struct nand_chip *chip = mtd_to_nand(mtd);
 371        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 372        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 373        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 374
 375        /* clear the read buffer */
 376        ctrl->read_bytes = 0;
 377        if (command != NAND_CMD_PAGEPROG)
 378                ctrl->index = 0;
 379
 380        switch (command) {
 381        /* READ0 read the entire buffer to use hardware ECC. */
 382        case NAND_CMD_READ0: {
 383                ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
 384                set_addr(mtd, 0, page_addr, 0);
 385
 386                ctrl->read_bytes = mtd->writesize + mtd->oobsize;
 387                ctrl->index += column;
 388
 389                if (chip->ecc.mode == NAND_ECC_HW)
 390                        ctrl->eccread = 1;
 391
 392                fsl_ifc_do_read(chip, 0, mtd);
 393                fsl_ifc_run_command(mtd);
 394                return;
 395        }
 396
 397        /* READOOB reads only the OOB because no ECC is performed. */
 398        case NAND_CMD_READOOB:
 399                ifc_out32(&ifc->ifc_nand.nand_fbcr, mtd->oobsize - column);
 400                set_addr(mtd, column, page_addr, 1);
 401
 402                ctrl->read_bytes = mtd->writesize + mtd->oobsize;
 403
 404                fsl_ifc_do_read(chip, 1, mtd);
 405                fsl_ifc_run_command(mtd);
 406
 407                return;
 408
 409        /* READID must read all possible bytes while CEB is active */
 410        case NAND_CMD_READID:
 411        case NAND_CMD_PARAM: {
 412                int timing = IFC_FIR_OP_RB;
 413                if (command == NAND_CMD_PARAM)
 414                        timing = IFC_FIR_OP_RBCD;
 415
 416                ifc_out32(&ifc->ifc_nand.nand_fir0,
 417                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 418                          (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
 419                          (timing << IFC_NAND_FIR0_OP2_SHIFT));
 420                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 421                          command << IFC_NAND_FCR0_CMD0_SHIFT);
 422                ifc_out32(&ifc->ifc_nand.row3, column);
 423
 424                /*
 425                 * although currently it's 8 bytes for READID, we always read
 426                 * the maximum 256 bytes(for PARAM)
 427                 */
 428                ifc_out32(&ifc->ifc_nand.nand_fbcr, 256);
 429                ctrl->read_bytes = 256;
 430
 431                set_addr(mtd, 0, 0, 0);
 432                fsl_ifc_run_command(mtd);
 433                return;
 434        }
 435
 436        /* ERASE1 stores the block and page address */
 437        case NAND_CMD_ERASE1:
 438                set_addr(mtd, 0, page_addr, 0);
 439                return;
 440
 441        /* ERASE2 uses the block and page address from ERASE1 */
 442        case NAND_CMD_ERASE2:
 443                ifc_out32(&ifc->ifc_nand.nand_fir0,
 444                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 445                          (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP1_SHIFT) |
 446                          (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP2_SHIFT));
 447
 448                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 449                          (NAND_CMD_ERASE1 << IFC_NAND_FCR0_CMD0_SHIFT) |
 450                          (NAND_CMD_ERASE2 << IFC_NAND_FCR0_CMD1_SHIFT));
 451
 452                ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
 453                ctrl->read_bytes = 0;
 454                fsl_ifc_run_command(mtd);
 455                return;
 456
 457        /* SEQIN sets up the addr buffer and all registers except the length */
 458        case NAND_CMD_SEQIN: {
 459                u32 nand_fcr0;
 460                ctrl->column = column;
 461                ctrl->oob = 0;
 462
 463                if (mtd->writesize > 512) {
 464                        nand_fcr0 =
 465                                (NAND_CMD_SEQIN << IFC_NAND_FCR0_CMD0_SHIFT) |
 466                                (NAND_CMD_STATUS << IFC_NAND_FCR0_CMD1_SHIFT) |
 467                                (NAND_CMD_PAGEPROG << IFC_NAND_FCR0_CMD2_SHIFT);
 468
 469                        ifc_out32(&ifc->ifc_nand.nand_fir0,
 470                                  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 471                                  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
 472                                  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
 473                                  (IFC_FIR_OP_WBCD  <<
 474                                                IFC_NAND_FIR0_OP3_SHIFT) |
 475                                  (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP4_SHIFT));
 476                        ifc_out32(&ifc->ifc_nand.nand_fir1,
 477                                  (IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT) |
 478                                  (IFC_FIR_OP_RDSTAT <<
 479                                        IFC_NAND_FIR1_OP6_SHIFT) |
 480                                  (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP7_SHIFT));
 481                } else {
 482                        nand_fcr0 = ((NAND_CMD_PAGEPROG <<
 483                                        IFC_NAND_FCR0_CMD1_SHIFT) |
 484                                    (NAND_CMD_SEQIN <<
 485                                        IFC_NAND_FCR0_CMD2_SHIFT) |
 486                                    (NAND_CMD_STATUS <<
 487                                        IFC_NAND_FCR0_CMD3_SHIFT));
 488
 489                        ifc_out32(&ifc->ifc_nand.nand_fir0,
 490                                  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 491                                  (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP1_SHIFT) |
 492                                  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP2_SHIFT) |
 493                                  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP3_SHIFT) |
 494                                  (IFC_FIR_OP_WBCD << IFC_NAND_FIR0_OP4_SHIFT));
 495                        ifc_out32(&ifc->ifc_nand.nand_fir1,
 496                                  (IFC_FIR_OP_CMD1 << IFC_NAND_FIR1_OP5_SHIFT) |
 497                                  (IFC_FIR_OP_CW3 << IFC_NAND_FIR1_OP6_SHIFT) |
 498                                  (IFC_FIR_OP_RDSTAT <<
 499                                        IFC_NAND_FIR1_OP7_SHIFT) |
 500                                  (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP8_SHIFT));
 501
 502                        if (column >= mtd->writesize)
 503                                nand_fcr0 |=
 504                                NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT;
 505                        else
 506                                nand_fcr0 |=
 507                                NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
 508                }
 509
 510                if (column >= mtd->writesize) {
 511                        /* OOB area --> READOOB */
 512                        column -= mtd->writesize;
 513                        ctrl->oob = 1;
 514                }
 515                ifc_out32(&ifc->ifc_nand.nand_fcr0, nand_fcr0);
 516                set_addr(mtd, column, page_addr, ctrl->oob);
 517                return;
 518        }
 519
 520        /* PAGEPROG reuses all of the setup from SEQIN and adds the length */
 521        case NAND_CMD_PAGEPROG:
 522                if (ctrl->oob)
 523                        ifc_out32(&ifc->ifc_nand.nand_fbcr,
 524                                  ctrl->index - ctrl->column);
 525                else
 526                        ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
 527
 528                fsl_ifc_run_command(mtd);
 529                return;
 530
 531        case NAND_CMD_STATUS:
 532                ifc_out32(&ifc->ifc_nand.nand_fir0,
 533                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 534                          (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP1_SHIFT));
 535                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 536                          NAND_CMD_STATUS << IFC_NAND_FCR0_CMD0_SHIFT);
 537                ifc_out32(&ifc->ifc_nand.nand_fbcr, 1);
 538                set_addr(mtd, 0, 0, 0);
 539                ctrl->read_bytes = 1;
 540
 541                fsl_ifc_run_command(mtd);
 542
 543                /*
 544                 * The chip always seems to report that it is
 545                 * write-protected, even when it is not.
 546                 */
 547                if (chip->options & NAND_BUSWIDTH_16)
 548                        ifc_out16(ctrl->addr,
 549                                  ifc_in16(ctrl->addr) | NAND_STATUS_WP);
 550                else
 551                        out_8(ctrl->addr, in_8(ctrl->addr) | NAND_STATUS_WP);
 552                return;
 553
 554        case NAND_CMD_RESET:
 555                ifc_out32(&ifc->ifc_nand.nand_fir0,
 556                          IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT);
 557                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 558                          NAND_CMD_RESET << IFC_NAND_FCR0_CMD0_SHIFT);
 559                fsl_ifc_run_command(mtd);
 560                return;
 561
 562        default:
 563                printf("%s: error, unsupported command 0x%x.\n",
 564                        __func__, command);
 565        }
 566}
 567
 568/*
 569 * Write buf to the IFC NAND Controller Data Buffer
 570 */
 571static void fsl_ifc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
 572{
 573        struct nand_chip *chip = mtd_to_nand(mtd);
 574        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 575        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 576        unsigned int bufsize = mtd->writesize + mtd->oobsize;
 577
 578        if (len <= 0) {
 579                printf("%s of %d bytes", __func__, len);
 580                ctrl->status = 0;
 581                return;
 582        }
 583
 584        if ((unsigned int)len > bufsize - ctrl->index) {
 585                printf("%s beyond end of buffer "
 586                       "(%d requested, %u available)\n",
 587                        __func__, len, bufsize - ctrl->index);
 588                len = bufsize - ctrl->index;
 589        }
 590
 591        memcpy_toio(ctrl->addr + ctrl->index, buf, len);
 592        ctrl->index += len;
 593}
 594
 595/*
 596 * read a byte from either the IFC hardware buffer if it has any data left
 597 * otherwise issue a command to read a single byte.
 598 */
 599static u8 fsl_ifc_read_byte(struct mtd_info *mtd)
 600{
 601        struct nand_chip *chip = mtd_to_nand(mtd);
 602        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 603        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 604        unsigned int offset;
 605
 606        /*
 607         * If there are still bytes in the IFC buffer, then use the
 608         * next byte.
 609         */
 610        if (ctrl->index < ctrl->read_bytes) {
 611                offset = ctrl->index++;
 612                return in_8(ctrl->addr + offset);
 613        }
 614
 615        printf("%s beyond end of buffer\n", __func__);
 616        return ERR_BYTE;
 617}
 618
 619/*
 620 * Read two bytes from the IFC hardware buffer
 621 * read function for 16-bit buswith
 622 */
 623static uint8_t fsl_ifc_read_byte16(struct mtd_info *mtd)
 624{
 625        struct nand_chip *chip = mtd_to_nand(mtd);
 626        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 627        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 628        uint16_t data;
 629
 630        /*
 631         * If there are still bytes in the IFC buffer, then use the
 632         * next byte.
 633         */
 634        if (ctrl->index < ctrl->read_bytes) {
 635                data = ifc_in16(ctrl->addr + ctrl->index);
 636                ctrl->index += 2;
 637                return (uint8_t)data;
 638        }
 639
 640        printf("%s beyond end of buffer\n", __func__);
 641        return ERR_BYTE;
 642}
 643
 644/*
 645 * Read from the IFC Controller Data Buffer
 646 */
 647static void fsl_ifc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
 648{
 649        struct nand_chip *chip = mtd_to_nand(mtd);
 650        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 651        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 652        int avail;
 653
 654        if (len < 0)
 655                return;
 656
 657        avail = min((unsigned int)len, ctrl->read_bytes - ctrl->index);
 658        memcpy_fromio(buf, ctrl->addr + ctrl->index, avail);
 659        ctrl->index += avail;
 660
 661        if (len > avail)
 662                printf("%s beyond end of buffer "
 663                       "(%d requested, %d available)\n",
 664                       __func__, len, avail);
 665}
 666
 667/* This function is called after Program and Erase Operations to
 668 * check for success or failure.
 669 */
 670static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
 671{
 672        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 673        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 674        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 675        u32 nand_fsr;
 676        int status;
 677
 678        if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
 679                return NAND_STATUS_FAIL;
 680
 681        /* Use READ_STATUS command, but wait for the device to be ready */
 682        ifc_out32(&ifc->ifc_nand.nand_fir0,
 683                  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 684                  (IFC_FIR_OP_RDSTAT << IFC_NAND_FIR0_OP1_SHIFT));
 685        ifc_out32(&ifc->ifc_nand.nand_fcr0, NAND_CMD_STATUS <<
 686                  IFC_NAND_FCR0_CMD0_SHIFT);
 687        ifc_out32(&ifc->ifc_nand.nand_fbcr, 1);
 688        set_addr(mtd, 0, 0, 0);
 689        ctrl->read_bytes = 1;
 690
 691        fsl_ifc_run_command(mtd);
 692
 693        if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
 694                return NAND_STATUS_FAIL;
 695
 696        nand_fsr = ifc_in32(&ifc->ifc_nand.nand_fsr);
 697        status = nand_fsr >> 24;
 698
 699        /* Chip sometimes reporting write protect even when it's not */
 700        return status | NAND_STATUS_WP;
 701}
 702
 703/*
 704 * The controller does not check for bitflips in erased pages,
 705 * therefore software must check instead.
 706 */
 707static int
 708check_erased_page(struct nand_chip *chip, u8 *buf, struct mtd_info *mtd)
 709{
 710        u8 *ecc = chip->oob_poi;
 711        const int ecc_size = chip->ecc.bytes;
 712        const int pkt_size = chip->ecc.size;
 713        int i, res, bitflips;
 714
 715        /* IFC starts ecc bytes at offset 8 in the spare area. */
 716        ecc += 8;
 717        bitflips = 0;
 718        for (i = 0; i < chip->ecc.steps; i++) {
 719                res = nand_check_erased_ecc_chunk(buf, pkt_size, ecc, ecc_size,
 720                                                  NULL, 0, chip->ecc.strength);
 721
 722                if (res < 0) {
 723                        printf("fsl-ifc: NAND Flash ECC Uncorrectable Error\n");
 724                        mtd->ecc_stats.failed++;
 725                } else if (res > 0) {
 726                        mtd->ecc_stats.corrected += res;
 727                }
 728                bitflips = max(res, bitflips);
 729                buf += pkt_size;
 730                ecc += ecc_size;
 731        }
 732
 733        return bitflips;
 734}
 735
 736static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
 737                             uint8_t *buf, int oob_required, int page)
 738{
 739        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 740        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 741
 742        fsl_ifc_read_buf(mtd, buf, mtd->writesize);
 743        fsl_ifc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
 744
 745        if (ctrl->status & IFC_NAND_EVTER_STAT_ECCER)
 746                return check_erased_page(chip, buf, mtd);
 747
 748        if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
 749                mtd->ecc_stats.failed++;
 750
 751        return 0;
 752}
 753
 754/* ECC will be calculated automatically, and errors will be detected in
 755 * waitfunc.
 756 */
 757static int fsl_ifc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
 758                               const uint8_t *buf, int oob_required, int page)
 759{
 760        fsl_ifc_write_buf(mtd, buf, mtd->writesize);
 761        fsl_ifc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
 762
 763        return 0;
 764}
 765
 766static void fsl_ifc_ctrl_init(void)
 767{
 768        uint32_t ver = 0;
 769        ifc_ctrl = kzalloc(sizeof(*ifc_ctrl), GFP_KERNEL);
 770        if (!ifc_ctrl)
 771                return;
 772
 773        ifc_ctrl->regs.gregs = IFC_FCM_BASE_ADDR;
 774
 775        ver = ifc_in32(&ifc_ctrl->regs.gregs->ifc_rev);
 776        if (ver >= FSL_IFC_V2_0_0)
 777                ifc_ctrl->regs.rregs =
 778                        (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_64KOFFSET;
 779        else
 780                ifc_ctrl->regs.rregs =
 781                        (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_4KOFFSET;
 782
 783        /* clear event registers */
 784        ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_stat, ~0U);
 785        ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.pgrdcmpl_evt_stat, ~0U);
 786
 787        /* Enable error and event for any detected errors */
 788        ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_en,
 789                  IFC_NAND_EVTER_EN_OPC_EN |
 790                  IFC_NAND_EVTER_EN_PGRDCMPL_EN |
 791                  IFC_NAND_EVTER_EN_FTOER_EN |
 792                  IFC_NAND_EVTER_EN_WPER_EN);
 793
 794        ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.ncfgr, 0x0);
 795}
 796
 797static void fsl_ifc_select_chip(struct mtd_info *mtd, int chip)
 798{
 799}
 800
 801static int fsl_ifc_sram_init(struct fsl_ifc_mtd *priv, uint32_t ver)
 802{
 803        struct fsl_ifc_runtime *ifc = ifc_ctrl->regs.rregs;
 804        uint32_t cs = 0, csor = 0, csor_8k = 0, csor_ext = 0;
 805        uint32_t ncfgr = 0;
 806        u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
 807        u32 time_start;
 808
 809        if (ver > FSL_IFC_V1_1_0) {
 810                ncfgr = ifc_in32(&ifc->ifc_nand.ncfgr);
 811                ifc_out32(&ifc->ifc_nand.ncfgr, ncfgr | IFC_NAND_SRAM_INIT_EN);
 812
 813                /* wait for  SRAM_INIT bit to be clear or timeout */
 814                time_start = get_timer(0);
 815                while (get_timer(time_start) < timeo) {
 816                        ifc_ctrl->status =
 817                                ifc_in32(&ifc->ifc_nand.nand_evter_stat);
 818
 819                        if (!(ifc_ctrl->status & IFC_NAND_SRAM_INIT_EN))
 820                                return 0;
 821                }
 822                printf("fsl-ifc: Failed to Initialise SRAM\n");
 823                return 1;
 824        }
 825
 826        cs = priv->bank;
 827
 828        /* Save CSOR and CSOR_ext */
 829        csor = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor);
 830        csor_ext = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext);
 831
 832        /* chage PageSize 8K and SpareSize 1K*/
 833        csor_8k = (csor & ~(CSOR_NAND_PGS_MASK)) | 0x0018C000;
 834        ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor_8k);
 835        ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, 0x0000400);
 836
 837        /* READID */
 838        ifc_out32(&ifc->ifc_nand.nand_fir0,
 839                  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 840                  (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
 841                  (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT));
 842        ifc_out32(&ifc->ifc_nand.nand_fcr0,
 843                  NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT);
 844        ifc_out32(&ifc->ifc_nand.row3, 0x0);
 845
 846        ifc_out32(&ifc->ifc_nand.nand_fbcr, 0x0);
 847
 848        /* Program ROW0/COL0 */
 849        ifc_out32(&ifc->ifc_nand.row0, 0x0);
 850        ifc_out32(&ifc->ifc_nand.col0, 0x0);
 851
 852        /* set the chip select for NAND Transaction */
 853        ifc_out32(&ifc->ifc_nand.nand_csel, priv->bank << IFC_NAND_CSEL_SHIFT);
 854
 855        /* start read seq */
 856        ifc_out32(&ifc->ifc_nand.nandseq_strt, IFC_NAND_SEQ_STRT_FIR_STRT);
 857
 858        time_start = get_timer(0);
 859
 860        while (get_timer(time_start) < timeo) {
 861                ifc_ctrl->status = ifc_in32(&ifc->ifc_nand.nand_evter_stat);
 862
 863                if (ifc_ctrl->status & IFC_NAND_EVTER_STAT_OPC)
 864                        break;
 865        }
 866
 867        if (ifc_ctrl->status != IFC_NAND_EVTER_STAT_OPC) {
 868                printf("fsl-ifc: Failed to Initialise SRAM\n");
 869                return 1;
 870        }
 871
 872        ifc_out32(&ifc->ifc_nand.nand_evter_stat, ifc_ctrl->status);
 873
 874        /* Restore CSOR and CSOR_ext */
 875        ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor);
 876        ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, csor_ext);
 877
 878        return 0;
 879}
 880
 881static int fsl_ifc_chip_init(int devnum, u8 *addr)
 882{
 883        struct mtd_info *mtd;
 884        struct nand_chip *nand;
 885        struct fsl_ifc_mtd *priv;
 886        struct nand_ecclayout *layout;
 887        struct fsl_ifc_fcm *gregs = NULL;
 888        uint32_t cspr = 0, csor = 0, ver = 0;
 889        int ret = 0;
 890
 891        if (!ifc_ctrl) {
 892                fsl_ifc_ctrl_init();
 893                if (!ifc_ctrl)
 894                        return -1;
 895        }
 896
 897        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 898        if (!priv)
 899                return -ENOMEM;
 900
 901        priv->ctrl = ifc_ctrl;
 902        priv->vbase = addr;
 903        gregs = ifc_ctrl->regs.gregs;
 904
 905        /* Find which chip select it is connected to.
 906         */
 907        for (priv->bank = 0; priv->bank < MAX_BANKS; priv->bank++) {
 908                phys_addr_t phys_addr = virt_to_phys(addr);
 909
 910                cspr = ifc_in32(&gregs->cspr_cs[priv->bank].cspr);
 911                csor = ifc_in32(&gregs->csor_cs[priv->bank].csor);
 912
 913                if ((cspr & CSPR_V) && (cspr & CSPR_MSEL) == CSPR_MSEL_NAND &&
 914                    (cspr & CSPR_BA) == CSPR_PHYS_ADDR(phys_addr))
 915                        break;
 916        }
 917
 918        if (priv->bank >= MAX_BANKS) {
 919                printf("%s: address did not match any "
 920                       "chip selects\n", __func__);
 921                kfree(priv);
 922                return -ENODEV;
 923        }
 924
 925        nand = &priv->chip;
 926        mtd = nand_to_mtd(nand);
 927
 928        ifc_ctrl->chips[priv->bank] = priv;
 929
 930        /* fill in nand_chip structure */
 931        /* set up function call table */
 932
 933        nand->write_buf = fsl_ifc_write_buf;
 934        nand->read_buf = fsl_ifc_read_buf;
 935        nand->select_chip = fsl_ifc_select_chip;
 936        nand->cmdfunc = fsl_ifc_cmdfunc;
 937        nand->waitfunc = fsl_ifc_wait;
 938
 939        /* set up nand options */
 940        nand->bbt_td = &bbt_main_descr;
 941        nand->bbt_md = &bbt_mirror_descr;
 942
 943        /* set up nand options */
 944        nand->options = NAND_NO_SUBPAGE_WRITE;
 945        nand->bbt_options = NAND_BBT_USE_FLASH;
 946
 947        if (cspr & CSPR_PORT_SIZE_16) {
 948                nand->read_byte = fsl_ifc_read_byte16;
 949                nand->options |= NAND_BUSWIDTH_16;
 950        } else {
 951                nand->read_byte = fsl_ifc_read_byte;
 952        }
 953
 954        nand->controller = &ifc_ctrl->controller;
 955        nand_set_controller_data(nand, priv);
 956
 957        nand->ecc.read_page = fsl_ifc_read_page;
 958        nand->ecc.write_page = fsl_ifc_write_page;
 959
 960        /* Hardware generates ECC per 512 Bytes */
 961        nand->ecc.size = 512;
 962        nand->ecc.bytes = 8;
 963
 964        switch (csor & CSOR_NAND_PGS_MASK) {
 965        case CSOR_NAND_PGS_512:
 966                if (nand->options & NAND_BUSWIDTH_16) {
 967                        layout = &oob_512_16bit_ecc4;
 968                } else {
 969                        layout = &oob_512_8bit_ecc4;
 970
 971                        /* Avoid conflict with bad block marker */
 972                        bbt_main_descr.offs = 0;
 973                        bbt_mirror_descr.offs = 0;
 974                }
 975
 976                nand->ecc.strength = 4;
 977                priv->bufnum_mask = 15;
 978                break;
 979
 980        case CSOR_NAND_PGS_2K:
 981                layout = &oob_2048_ecc4;
 982                nand->ecc.strength = 4;
 983                priv->bufnum_mask = 3;
 984                break;
 985
 986        case CSOR_NAND_PGS_4K:
 987                if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
 988                    CSOR_NAND_ECC_MODE_4) {
 989                        layout = &oob_4096_ecc4;
 990                        nand->ecc.strength = 4;
 991                } else {
 992                        layout = &oob_4096_ecc8;
 993                        nand->ecc.strength = 8;
 994                        nand->ecc.bytes = 16;
 995                }
 996
 997                priv->bufnum_mask = 1;
 998                break;
 999
1000        case CSOR_NAND_PGS_8K:
1001                if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
1002                    CSOR_NAND_ECC_MODE_4) {
1003                        layout = &oob_8192_ecc4;
1004                        nand->ecc.strength = 4;
1005                } else {
1006                        layout = &oob_8192_ecc8;
1007                        nand->ecc.strength = 8;
1008                        nand->ecc.bytes = 16;
1009                }
1010
1011                priv->bufnum_mask = 0;
1012                break;
1013
1014
1015        default:
1016                printf("ifc nand: bad csor %#x: bad page size\n", csor);
1017                return -ENODEV;
1018        }
1019
1020        /* Must also set CSOR_NAND_ECC_ENC_EN if DEC_EN set */
1021        if (csor & CSOR_NAND_ECC_DEC_EN) {
1022                nand->ecc.mode = NAND_ECC_HW;
1023                nand->ecc.layout = layout;
1024        } else {
1025                nand->ecc.mode = NAND_ECC_SOFT;
1026        }
1027
1028        ver = ifc_in32(&gregs->ifc_rev);
1029        if (ver >= FSL_IFC_V1_1_0)
1030                ret = fsl_ifc_sram_init(priv, ver);
1031        if (ret)
1032                return ret;
1033
1034        if (ver >= FSL_IFC_V2_0_0)
1035                priv->bufnum_mask = (priv->bufnum_mask * 2) + 1;
1036
1037        ret = nand_scan_ident(mtd, 1, NULL);
1038        if (ret)
1039                return ret;
1040
1041        ret = nand_scan_tail(mtd);
1042        if (ret)
1043                return ret;
1044
1045        ret = nand_register(devnum, mtd);
1046        if (ret)
1047                return ret;
1048        return 0;
1049}
1050
1051#ifndef CONFIG_SYS_NAND_BASE_LIST
1052#define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }
1053#endif
1054
1055static unsigned long base_address[CONFIG_SYS_MAX_NAND_DEVICE] =
1056        CONFIG_SYS_NAND_BASE_LIST;
1057
1058void board_nand_init(void)
1059{
1060        int i;
1061
1062        for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
1063                fsl_ifc_chip_init(i, (u8 *)base_address[i]);
1064}
1065