uboot/drivers/mtd/nand/raw/arasan_nfc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Arasan NAND Flash Controller Driver
   4 *
   5 * Copyright (C) 2014 - 2015 Xilinx, Inc.
   6 */
   7
   8#include <common.h>
   9#include <malloc.h>
  10#include <asm/io.h>
  11#include <linux/errno.h>
  12#include <linux/mtd/mtd.h>
  13#include <linux/mtd/rawnand.h>
  14#include <linux/mtd/partitions.h>
  15#include <linux/mtd/nand_ecc.h>
  16#include <asm/arch/hardware.h>
  17#include <asm/arch/sys_proto.h>
  18#include <dm.h>
  19#include <nand.h>
  20
  21struct nand_config {
  22        u32 page;
  23        bool on_die_ecc_enabled;
  24};
  25
  26struct nand_drv {
  27        struct nand_regs *reg;
  28        struct nand_config config;
  29};
  30
  31struct arasan_nand_info {
  32        struct udevice *dev;
  33        struct nand_drv nand_ctrl;
  34        struct nand_chip nand_chip;
  35};
  36
  37struct nand_regs {
  38        u32 pkt_reg;
  39        u32 memadr_reg1;
  40        u32 memadr_reg2;
  41        u32 cmd_reg;
  42        u32 pgm_reg;
  43        u32 intsts_enr;
  44        u32 intsig_enr;
  45        u32 intsts_reg;
  46        u32 rdy_busy;
  47        u32 cms_sysadr_reg;
  48        u32 flash_sts_reg;
  49        u32 tmg_reg;
  50        u32 buf_dataport;
  51        u32 ecc_reg;
  52        u32 ecc_errcnt_reg;
  53        u32 ecc_sprcmd_reg;
  54        u32 errcnt_1bitreg;
  55        u32 errcnt_2bitreg;
  56        u32 errcnt_3bitreg;
  57        u32 errcnt_4bitreg;
  58        u32 dma_sysadr0_reg;
  59        u32 dma_bufbdry_reg;
  60        u32 cpu_rls_reg;
  61        u32 errcnt_5bitreg;
  62        u32 errcnt_6bitreg;
  63        u32 errcnt_7bitreg;
  64        u32 errcnt_8bitreg;
  65        u32 data_if_reg;
  66};
  67
  68struct arasan_nand_command_format {
  69        u8 cmd1;
  70        u8 cmd2;
  71        u8 addr_cycles;
  72        u32 pgm;
  73};
  74
  75#define ONDIE_ECC_FEATURE_ADDR                  0x90
  76#define ENABLE_ONDIE_ECC                        0x08
  77
  78#define ARASAN_PROG_RD_MASK                     0x00000001
  79#define ARASAN_PROG_BLK_ERS_MASK                0x00000004
  80#define ARASAN_PROG_RD_ID_MASK                  0x00000040
  81#define ARASAN_PROG_RD_STS_MASK                 0x00000008
  82#define ARASAN_PROG_PG_PROG_MASK                0x00000010
  83#define ARASAN_PROG_RD_PARAM_PG_MASK            0x00000080
  84#define ARASAN_PROG_RST_MASK                    0x00000100
  85#define ARASAN_PROG_GET_FTRS_MASK               0x00000200
  86#define ARASAN_PROG_SET_FTRS_MASK               0x00000400
  87#define ARASAN_PROG_CHNG_ROWADR_END_MASK        0x00400000
  88
  89#define ARASAN_NAND_CMD_ECC_ON_MASK             0x80000000
  90#define ARASAN_NAND_CMD_CMD12_MASK              0xFFFF
  91#define ARASAN_NAND_CMD_PG_SIZE_MASK            0x3800000
  92#define ARASAN_NAND_CMD_PG_SIZE_SHIFT           23
  93#define ARASAN_NAND_CMD_CMD2_SHIFT              8
  94#define ARASAN_NAND_CMD_ADDR_CYCL_MASK          0x70000000
  95#define ARASAN_NAND_CMD_ADDR_CYCL_SHIFT         28
  96
  97#define ARASAN_NAND_MEM_ADDR1_PAGE_MASK         0xFFFF0000
  98#define ARASAN_NAND_MEM_ADDR1_COL_MASK          0xFFFF
  99#define ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT        16
 100#define ARASAN_NAND_MEM_ADDR2_PAGE_MASK         0xFF
 101#define ARASAN_NAND_MEM_ADDR2_CS_MASK           0xC0000000
 102#define ARASAN_NAND_MEM_ADDR2_CS0_MASK         (0x3 << 30)
 103#define ARASAN_NAND_MEM_ADDR2_CS1_MASK         (0x1 << 30)
 104#define ARASAN_NAND_MEM_ADDR2_BCH_MASK          0xE000000
 105#define ARASAN_NAND_MEM_ADDR2_BCH_SHIFT         25
 106
 107#define ARASAN_NAND_INT_STS_ERR_EN_MASK         0x10
 108#define ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK    0x08
 109#define ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK     0x02
 110#define ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK     0x01
 111#define ARASAN_NAND_INT_STS_XFR_CMPLT_MASK      0x04
 112
 113#define ARASAN_NAND_PKT_REG_PKT_CNT_MASK        0xFFF000
 114#define ARASAN_NAND_PKT_REG_PKT_SIZE_MASK       0x7FF
 115#define ARASAN_NAND_PKT_REG_PKT_CNT_SHFT        12
 116
 117#define ARASAN_NAND_ROW_ADDR_CYCL_MASK          0x0F
 118#define ARASAN_NAND_COL_ADDR_CYCL_MASK          0xF0
 119#define ARASAN_NAND_COL_ADDR_CYCL_SHIFT         4
 120
 121#define ARASAN_NAND_ECC_SIZE_SHIFT              16
 122#define ARASAN_NAND_ECC_BCH_SHIFT               27
 123
 124#define ARASAN_NAND_PKTSIZE_1K                  1024
 125#define ARASAN_NAND_PKTSIZE_512                 512
 126
 127#define ARASAN_NAND_POLL_TIMEOUT                1000000
 128#define ARASAN_NAND_INVALID_ADDR_CYCL           0xFF
 129
 130#define ERR_ADDR_CYCLE                          -1
 131#define READ_BUFF_SIZE                          0x4000
 132
 133static struct arasan_nand_command_format *curr_cmd;
 134
 135enum addr_cycles {
 136        NAND_ADDR_CYCL_NONE,
 137        NAND_ADDR_CYCL_ONE,
 138        NAND_ADDR_CYCL_ROW,
 139        NAND_ADDR_CYCL_COL,
 140        NAND_ADDR_CYCL_BOTH,
 141};
 142
 143static struct arasan_nand_command_format arasan_nand_commands[] = {
 144        {NAND_CMD_READ0, NAND_CMD_READSTART, NAND_ADDR_CYCL_BOTH,
 145         ARASAN_PROG_RD_MASK},
 146        {NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, NAND_ADDR_CYCL_COL,
 147         ARASAN_PROG_RD_MASK},
 148        {NAND_CMD_READID, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
 149         ARASAN_PROG_RD_ID_MASK},
 150        {NAND_CMD_STATUS, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE,
 151         ARASAN_PROG_RD_STS_MASK},
 152        {NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, NAND_ADDR_CYCL_BOTH,
 153         ARASAN_PROG_PG_PROG_MASK},
 154        {NAND_CMD_RNDIN, NAND_CMD_NONE, NAND_ADDR_CYCL_COL,
 155         ARASAN_PROG_CHNG_ROWADR_END_MASK},
 156        {NAND_CMD_ERASE1, NAND_CMD_ERASE2, NAND_ADDR_CYCL_ROW,
 157         ARASAN_PROG_BLK_ERS_MASK},
 158        {NAND_CMD_RESET, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE,
 159         ARASAN_PROG_RST_MASK},
 160        {NAND_CMD_PARAM, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
 161         ARASAN_PROG_RD_PARAM_PG_MASK},
 162        {NAND_CMD_GET_FEATURES, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
 163         ARASAN_PROG_GET_FTRS_MASK},
 164        {NAND_CMD_SET_FEATURES, NAND_CMD_NONE, NAND_ADDR_CYCL_ONE,
 165         ARASAN_PROG_SET_FTRS_MASK},
 166        {NAND_CMD_NONE, NAND_CMD_NONE, NAND_ADDR_CYCL_NONE, 0},
 167};
 168
 169struct arasan_ecc_matrix {
 170        u32 pagesize;
 171        u32 ecc_codeword_size;
 172        u8 eccbits;
 173        u8 bch;
 174        u8 bchval;
 175        u16 eccaddr;
 176        u16 eccsize;
 177};
 178
 179static const struct arasan_ecc_matrix ecc_matrix[] = {
 180        {512, 512, 1, 0, 0, 0x20D, 0x3},
 181        {512, 512, 4, 1, 3, 0x209, 0x7},
 182        {512, 512, 8, 1, 2, 0x203, 0xD},
 183        /*
 184         * 2K byte page
 185         */
 186        {2048, 512, 1, 0, 0, 0x834, 0xC},
 187        {2048, 512, 4, 1, 3, 0x826, 0x1A},
 188        {2048, 512, 8, 1, 2, 0x80c, 0x34},
 189        {2048, 512, 12, 1, 1, 0x822, 0x4E},
 190        {2048, 512, 16, 1, 0, 0x808, 0x68},
 191        {2048, 1024, 24, 1, 4, 0x81c, 0x54},
 192        /*
 193         * 4K byte page
 194         */
 195        {4096, 512, 1, 0, 0, 0x1068, 0x18},
 196        {4096, 512, 4, 1, 3, 0x104c, 0x34},
 197        {4096, 512, 8, 1, 2, 0x1018, 0x68},
 198        {4096, 512, 12, 1, 1, 0x1044, 0x9C},
 199        {4096, 512, 16, 1, 0, 0x1010, 0xD0},
 200        {4096, 1024, 24, 1, 4, 0x1038, 0xA8},
 201        /*
 202         * 8K byte page
 203         */
 204        {8192, 512, 1, 0, 0, 0x20d0, 0x30},
 205        {8192, 512, 4, 1, 3, 0x2098, 0x68},
 206        {8192, 512, 8, 1, 2, 0x2030, 0xD0},
 207        {8192, 512, 12, 1, 1, 0x2088, 0x138},
 208        {8192, 512, 16, 1, 0, 0x2020, 0x1A0},
 209        {8192, 1024, 24, 1, 4, 0x2070, 0x150},
 210        /*
 211         * 16K byte page
 212         */
 213        {16384, 512, 1, 0, 0, 0x4460, 0x60},
 214        {16384, 512, 4, 1, 3, 0x43f0, 0xD0},
 215        {16384, 512, 8, 1, 2, 0x4320, 0x1A0},
 216        {16384, 512, 12, 1, 1, 0x4250, 0x270},
 217        {16384, 512, 16, 1, 0, 0x4180, 0x340},
 218        {16384, 1024, 24, 1, 4, 0x4220, 0x2A0}
 219};
 220
 221static struct nand_ecclayout ondie_nand_oob_64 = {
 222        .eccbytes = 32,
 223
 224        .eccpos = {
 225                8, 9, 10, 11, 12, 13, 14, 15,
 226                24, 25, 26, 27, 28, 29, 30, 31,
 227                40, 41, 42, 43, 44, 45, 46, 47,
 228                56, 57, 58, 59, 60, 61, 62, 63
 229        },
 230
 231        .oobfree = {
 232                { .offset = 4, .length = 4 },
 233                { .offset = 20, .length = 4 },
 234                { .offset = 36, .length = 4 },
 235                { .offset = 52, .length = 4 }
 236        }
 237};
 238
 239/*
 240 * bbt decriptors for chips with on-die ECC and
 241 * chips with 64-byte OOB
 242 */
 243static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
 244static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
 245
 246static struct nand_bbt_descr bbt_main_descr = {
 247        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
 248                NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
 249        .offs = 4,
 250        .len = 4,
 251        .veroffs = 20,
 252        .maxblocks = 4,
 253        .pattern = bbt_pattern
 254};
 255
 256static struct nand_bbt_descr bbt_mirror_descr = {
 257        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
 258                NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
 259        .offs = 4,
 260        .len = 4,
 261        .veroffs = 20,
 262        .maxblocks = 4,
 263        .pattern = mirror_pattern
 264};
 265
 266static u8 buf_data[READ_BUFF_SIZE];
 267static u32 buf_index;
 268
 269static struct nand_ecclayout nand_oob;
 270
 271static void arasan_nand_select_chip(struct mtd_info *mtd, int chip)
 272{
 273        struct nand_chip *nand_chip = mtd_to_nand(mtd);
 274        struct nand_drv *info = nand_get_controller_data(nand_chip);
 275        u32 reg_val;
 276
 277        reg_val = readl(&info->reg->memadr_reg2);
 278        if (chip == 0) {
 279                reg_val &= ~ARASAN_NAND_MEM_ADDR2_CS0_MASK;
 280                writel(reg_val, &info->reg->memadr_reg2);
 281        } else if (chip == 1) {
 282                reg_val |= ARASAN_NAND_MEM_ADDR2_CS1_MASK;
 283                writel(reg_val, &info->reg->memadr_reg2);
 284        }
 285}
 286
 287static void arasan_nand_enable_ecc(struct mtd_info *mtd)
 288{
 289        struct nand_chip *chip = mtd_to_nand(mtd);
 290        struct nand_drv *info = nand_get_controller_data(chip);
 291        u32 reg_val;
 292
 293        reg_val = readl(&info->reg->cmd_reg);
 294        reg_val |= ARASAN_NAND_CMD_ECC_ON_MASK;
 295
 296        writel(reg_val, &info->reg->cmd_reg);
 297}
 298
 299static u8 arasan_nand_get_addrcycle(struct mtd_info *mtd)
 300{
 301        u8 addrcycles;
 302        struct nand_chip *chip = mtd_to_nand(mtd);
 303
 304        switch (curr_cmd->addr_cycles) {
 305        case NAND_ADDR_CYCL_NONE:
 306                addrcycles = 0;
 307                break;
 308        case NAND_ADDR_CYCL_ONE:
 309                addrcycles = 1;
 310                break;
 311        case NAND_ADDR_CYCL_ROW:
 312                addrcycles = chip->onfi_params.addr_cycles &
 313                             ARASAN_NAND_ROW_ADDR_CYCL_MASK;
 314                break;
 315        case NAND_ADDR_CYCL_COL:
 316                addrcycles = (chip->onfi_params.addr_cycles &
 317                              ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
 318                              ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
 319                break;
 320        case NAND_ADDR_CYCL_BOTH:
 321                addrcycles = chip->onfi_params.addr_cycles &
 322                             ARASAN_NAND_ROW_ADDR_CYCL_MASK;
 323                addrcycles += (chip->onfi_params.addr_cycles &
 324                               ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
 325                               ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
 326                break;
 327        default:
 328                addrcycles = ARASAN_NAND_INVALID_ADDR_CYCL;
 329                break;
 330        }
 331        return addrcycles;
 332}
 333
 334static int arasan_nand_read_page(struct mtd_info *mtd, u8 *buf, u32 size)
 335{
 336        struct nand_chip *chip = mtd_to_nand(mtd);
 337        struct nand_drv *info = nand_get_controller_data(chip);
 338        struct nand_config *nand = &info->config;
 339        u32 reg_val, i, pktsize, pktnum;
 340        u32 *bufptr = (u32 *)buf;
 341        u32 timeout;
 342        u32  rdcount = 0;
 343        u8 addr_cycles;
 344
 345        if (chip->ecc_step_ds >= ARASAN_NAND_PKTSIZE_1K)
 346                pktsize = ARASAN_NAND_PKTSIZE_1K;
 347        else
 348                pktsize = ARASAN_NAND_PKTSIZE_512;
 349
 350        if (size % pktsize)
 351                pktnum = size/pktsize + 1;
 352        else
 353                pktnum = size/pktsize;
 354
 355        reg_val = readl(&info->reg->intsts_enr);
 356        reg_val |= ARASAN_NAND_INT_STS_ERR_EN_MASK |
 357                   ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK;
 358        writel(reg_val, &info->reg->intsts_enr);
 359
 360        reg_val = readl(&info->reg->pkt_reg);
 361        reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
 362                     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
 363        reg_val |= (pktnum << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) |
 364                    pktsize;
 365        writel(reg_val, &info->reg->pkt_reg);
 366
 367        if (!nand->on_die_ecc_enabled) {
 368                arasan_nand_enable_ecc(mtd);
 369                addr_cycles = arasan_nand_get_addrcycle(mtd);
 370                if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
 371                        return ERR_ADDR_CYCLE;
 372
 373                writel((NAND_CMD_RNDOUTSTART << ARASAN_NAND_CMD_CMD2_SHIFT) |
 374                       NAND_CMD_RNDOUT | (addr_cycles <<
 375                       ARASAN_NAND_CMD_ADDR_CYCL_SHIFT),
 376                       &info->reg->ecc_sprcmd_reg);
 377        }
 378        writel(curr_cmd->pgm, &info->reg->pgm_reg);
 379
 380        while (rdcount < pktnum) {
 381                timeout = ARASAN_NAND_POLL_TIMEOUT;
 382                while (!(readl(&info->reg->intsts_reg) &
 383                        ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK) && timeout) {
 384                        udelay(1);
 385                        timeout--;
 386                }
 387                if (!timeout) {
 388                        puts("arasan_read_page: timedout:Buff RDY\n");
 389                        return -ETIMEDOUT;
 390                }
 391
 392                rdcount++;
 393
 394                if (pktnum == rdcount) {
 395                        reg_val = readl(&info->reg->intsts_enr);
 396                        reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
 397                        writel(reg_val, &info->reg->intsts_enr);
 398                } else {
 399                        reg_val = readl(&info->reg->intsts_enr);
 400                        writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
 401                               &info->reg->intsts_enr);
 402                }
 403                reg_val = readl(&info->reg->intsts_reg);
 404                writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
 405                       &info->reg->intsts_reg);
 406
 407                for (i = 0; i < pktsize/4; i++)
 408                        bufptr[i] = readl(&info->reg->buf_dataport);
 409
 410
 411                bufptr += pktsize/4;
 412
 413                if (rdcount >= pktnum)
 414                        break;
 415
 416                writel(ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
 417                       &info->reg->intsts_enr);
 418        }
 419
 420        timeout = ARASAN_NAND_POLL_TIMEOUT;
 421
 422        while (!(readl(&info->reg->intsts_reg) &
 423                ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
 424                udelay(1);
 425                timeout--;
 426        }
 427        if (!timeout) {
 428                puts("arasan rd_page timedout:Xfer CMPLT\n");
 429                return -ETIMEDOUT;
 430        }
 431
 432        reg_val = readl(&info->reg->intsts_enr);
 433        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 434               &info->reg->intsts_enr);
 435        reg_val = readl(&info->reg->intsts_reg);
 436        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 437               &info->reg->intsts_reg);
 438
 439        if (!nand->on_die_ecc_enabled) {
 440                if (readl(&info->reg->intsts_reg) &
 441                    ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK) {
 442                        printf("arasan rd_page:sbiterror\n");
 443                        return -1;
 444                }
 445
 446                if (readl(&info->reg->intsts_reg) &
 447                    ARASAN_NAND_INT_STS_ERR_EN_MASK) {
 448                        mtd->ecc_stats.failed++;
 449                        printf("arasan rd_page:multibiterror\n");
 450                        return -1;
 451                }
 452        }
 453
 454        return 0;
 455}
 456
 457static int arasan_nand_read_page_hwecc(struct mtd_info *mtd,
 458                struct nand_chip *chip, u8 *buf, int oob_required, int page)
 459{
 460        int status;
 461
 462        status = arasan_nand_read_page(mtd, buf, (mtd->writesize));
 463
 464        if (oob_required)
 465                chip->ecc.read_oob(mtd, chip, page);
 466
 467        return status;
 468}
 469
 470static void arasan_nand_fill_tx(struct mtd_info *mtd, const u8 *buf, int len)
 471{
 472        struct nand_chip *chip = mtd_to_nand(mtd);
 473        struct nand_drv *info = nand_get_controller_data(chip);
 474        u32 __iomem *nand = &info->reg->buf_dataport;
 475
 476        if (((unsigned long)buf & 0x3) != 0) {
 477                if (((unsigned long)buf & 0x1) != 0) {
 478                        if (len) {
 479                                writeb(*buf, nand);
 480                                buf += 1;
 481                                len--;
 482                        }
 483                }
 484
 485                if (((unsigned long)buf & 0x3) != 0) {
 486                        if (len >= 2) {
 487                                writew(*(u16 *)buf, nand);
 488                                buf += 2;
 489                                len -= 2;
 490                        }
 491                }
 492        }
 493
 494        while (len >= 4) {
 495                writel(*(u32 *)buf, nand);
 496                buf += 4;
 497                len -= 4;
 498        }
 499
 500        if (len) {
 501                if (len >= 2) {
 502                        writew(*(u16 *)buf, nand);
 503                        buf += 2;
 504                        len -= 2;
 505                }
 506
 507                if (len)
 508                        writeb(*buf, nand);
 509        }
 510}
 511
 512static int arasan_nand_write_page_hwecc(struct mtd_info *mtd,
 513                struct nand_chip *chip, const u8 *buf, int oob_required,
 514                int page)
 515{
 516        struct nand_drv *info = nand_get_controller_data(chip);
 517        struct nand_config *nand = &info->config;
 518        u32 reg_val, i, pktsize, pktnum;
 519        const u32 *bufptr = (const u32 *)buf;
 520        u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
 521        u32 size = mtd->writesize;
 522        u32 rdcount = 0;
 523        u8 column_addr_cycles;
 524
 525        if (chip->ecc_step_ds >= ARASAN_NAND_PKTSIZE_1K)
 526                pktsize = ARASAN_NAND_PKTSIZE_1K;
 527        else
 528                pktsize = ARASAN_NAND_PKTSIZE_512;
 529
 530        if (size % pktsize)
 531                pktnum = size/pktsize + 1;
 532        else
 533                pktnum = size/pktsize;
 534
 535        reg_val = readl(&info->reg->pkt_reg);
 536        reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
 537                     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
 538        reg_val |= (pktnum << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | pktsize;
 539        writel(reg_val, &info->reg->pkt_reg);
 540
 541        if (!nand->on_die_ecc_enabled) {
 542                arasan_nand_enable_ecc(mtd);
 543                column_addr_cycles = (chip->onfi_params.addr_cycles &
 544                                      ARASAN_NAND_COL_ADDR_CYCL_MASK) >>
 545                                      ARASAN_NAND_COL_ADDR_CYCL_SHIFT;
 546                writel((NAND_CMD_RNDIN | (column_addr_cycles << 28)),
 547                       &info->reg->ecc_sprcmd_reg);
 548        }
 549        writel(curr_cmd->pgm, &info->reg->pgm_reg);
 550
 551        while (rdcount < pktnum) {
 552                timeout = ARASAN_NAND_POLL_TIMEOUT;
 553                while (!(readl(&info->reg->intsts_reg) &
 554                        ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK) && timeout) {
 555                        udelay(1);
 556                        timeout--;
 557                }
 558
 559                if (!timeout) {
 560                        puts("arasan_write_page: timedout:Buff RDY\n");
 561                        return -ETIMEDOUT;
 562                }
 563
 564                rdcount++;
 565
 566                if (pktnum == rdcount) {
 567                        reg_val = readl(&info->reg->intsts_enr);
 568                        reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
 569                        writel(reg_val, &info->reg->intsts_enr);
 570                } else {
 571                        reg_val = readl(&info->reg->intsts_enr);
 572                        writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
 573                               &info->reg->intsts_enr);
 574                }
 575
 576                reg_val = readl(&info->reg->intsts_reg);
 577                writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
 578                       &info->reg->intsts_reg);
 579
 580                for (i = 0; i < pktsize/4; i++)
 581                        writel(bufptr[i], &info->reg->buf_dataport);
 582
 583                bufptr += pktsize/4;
 584
 585                if (rdcount >= pktnum)
 586                        break;
 587
 588                writel(ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
 589                       &info->reg->intsts_enr);
 590        }
 591
 592        timeout = ARASAN_NAND_POLL_TIMEOUT;
 593
 594        while (!(readl(&info->reg->intsts_reg) &
 595                ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
 596                udelay(1);
 597                timeout--;
 598        }
 599        if (!timeout) {
 600                puts("arasan write_page timedout:Xfer CMPLT\n");
 601                return -ETIMEDOUT;
 602        }
 603
 604        reg_val = readl(&info->reg->intsts_enr);
 605        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 606               &info->reg->intsts_enr);
 607        reg_val = readl(&info->reg->intsts_reg);
 608        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 609               &info->reg->intsts_reg);
 610
 611        if (oob_required)
 612                chip->ecc.write_oob(mtd, chip, nand->page);
 613
 614        return 0;
 615}
 616
 617static int arasan_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
 618                                int page)
 619{
 620        chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
 621        chip->read_buf(mtd, chip->oob_poi, (mtd->oobsize));
 622
 623        return 0;
 624}
 625
 626static int arasan_nand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
 627                                 int page)
 628{
 629        int status = 0;
 630        const u8 *buf = chip->oob_poi;
 631
 632        chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
 633        chip->write_buf(mtd, buf, mtd->oobsize);
 634
 635        return status;
 636}
 637
 638static int arasan_nand_reset(struct mtd_info *mtd,
 639                             struct arasan_nand_command_format *curr_cmd)
 640{
 641        struct nand_chip *chip = mtd_to_nand(mtd);
 642        struct nand_drv *info = nand_get_controller_data(chip);
 643        u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
 644        u32 cmd_reg = 0;
 645
 646        writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 647               &info->reg->intsts_enr);
 648        cmd_reg = readl(&info->reg->cmd_reg);
 649        cmd_reg &= ~ARASAN_NAND_CMD_CMD12_MASK;
 650
 651        cmd_reg |= curr_cmd->cmd1 |
 652                  (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
 653        writel(cmd_reg, &info->reg->cmd_reg);
 654        writel(curr_cmd->pgm, &info->reg->pgm_reg);
 655
 656        while (!(readl(&info->reg->intsts_reg) &
 657                ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
 658                udelay(1);
 659                timeout--;
 660        }
 661        if (!timeout) {
 662                printf("ERROR:%s timedout\n", __func__);
 663                return -ETIMEDOUT;
 664        }
 665
 666        writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 667               &info->reg->intsts_enr);
 668
 669        writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 670               &info->reg->intsts_reg);
 671
 672        return 0;
 673}
 674
 675static u8 arasan_nand_page(struct mtd_info *mtd)
 676{
 677        u8 page_val = 0;
 678
 679        switch (mtd->writesize) {
 680        case 512:
 681                page_val = 0;
 682                break;
 683        case 2048:
 684                page_val = 1;
 685                break;
 686        case 4096:
 687                page_val = 2;
 688                break;
 689        case 8192:
 690                page_val = 3;
 691                break;
 692        case 16384:
 693                page_val = 4;
 694                break;
 695        case 1024:
 696                page_val = 5;
 697                break;
 698        default:
 699                printf("%s:Pagesize>16K\n", __func__);
 700                break;
 701        }
 702
 703        return page_val;
 704}
 705
 706static int arasan_nand_send_wrcmd(struct arasan_nand_command_format *curr_cmd,
 707                        int column, int page_addr, struct mtd_info *mtd)
 708{
 709        struct nand_chip *chip = mtd_to_nand(mtd);
 710        struct nand_drv *info = nand_get_controller_data(chip);
 711        u32 reg_val, page;
 712        u8 page_val, addr_cycles;
 713
 714        writel(ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
 715               &info->reg->intsts_enr);
 716        reg_val = readl(&info->reg->cmd_reg);
 717        reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
 718        reg_val |= curr_cmd->cmd1 |
 719                   (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
 720        if (curr_cmd->cmd1 == NAND_CMD_SEQIN) {
 721                reg_val &= ~ARASAN_NAND_CMD_PG_SIZE_MASK;
 722                page_val = arasan_nand_page(mtd);
 723                reg_val |= (page_val << ARASAN_NAND_CMD_PG_SIZE_SHIFT);
 724        }
 725
 726        reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
 727        addr_cycles = arasan_nand_get_addrcycle(mtd);
 728
 729        if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
 730                return ERR_ADDR_CYCLE;
 731
 732        reg_val |= (addr_cycles <<
 733                   ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
 734        writel(reg_val, &info->reg->cmd_reg);
 735
 736        if (page_addr == -1)
 737                page_addr = 0;
 738
 739        page = (page_addr << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
 740                ARASAN_NAND_MEM_ADDR1_PAGE_MASK;
 741        column &= ARASAN_NAND_MEM_ADDR1_COL_MASK;
 742        writel(page | column, &info->reg->memadr_reg1);
 743
 744        reg_val = readl(&info->reg->memadr_reg2);
 745        reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
 746        reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
 747        writel(reg_val, &info->reg->memadr_reg2);
 748
 749        return 0;
 750}
 751
 752static void arasan_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
 753{
 754        struct nand_chip *chip = mtd_to_nand(mtd);
 755        struct nand_drv *info = nand_get_controller_data(chip);
 756        u32 reg_val;
 757        u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
 758
 759        reg_val = readl(&info->reg->pkt_reg);
 760        reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
 761                     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
 762
 763        reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | len;
 764        writel(reg_val, &info->reg->pkt_reg);
 765        writel(curr_cmd->pgm, &info->reg->pgm_reg);
 766
 767        while (!(readl(&info->reg->intsts_reg) &
 768                ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK) && timeout) {
 769                udelay(1);
 770                timeout--;
 771        }
 772
 773        if (!timeout)
 774                puts("ERROR:arasan_nand_write_buf timedout:Buff RDY\n");
 775
 776        reg_val = readl(&info->reg->intsts_enr);
 777        reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
 778        writel(reg_val, &info->reg->intsts_enr);
 779        writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
 780               &info->reg->intsts_enr);
 781        reg_val = readl(&info->reg->intsts_reg);
 782        writel(reg_val | ARASAN_NAND_INT_STS_BUF_WR_RDY_MASK,
 783               &info->reg->intsts_reg);
 784
 785        arasan_nand_fill_tx(mtd, buf, len);
 786
 787        timeout = ARASAN_NAND_POLL_TIMEOUT;
 788        while (!(readl(&info->reg->intsts_reg) &
 789                ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
 790                udelay(1);
 791                timeout--;
 792        }
 793        if (!timeout)
 794                puts("ERROR:arasan_nand_write_buf timedout:Xfer CMPLT\n");
 795
 796        writel(readl(&info->reg->intsts_enr) |
 797               ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 798               &info->reg->intsts_enr);
 799        writel(readl(&info->reg->intsts_reg) |
 800               ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 801               &info->reg->intsts_reg);
 802}
 803
 804static int arasan_nand_erase(struct arasan_nand_command_format *curr_cmd,
 805                              int column, int page_addr, struct mtd_info *mtd)
 806{
 807        struct nand_chip *chip = mtd_to_nand(mtd);
 808        struct nand_drv *info = nand_get_controller_data(chip);
 809        u32 reg_val, page;
 810        u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
 811        u8 row_addr_cycles;
 812
 813        writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 814               &info->reg->intsts_enr);
 815        reg_val = readl(&info->reg->cmd_reg);
 816        reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
 817        reg_val |= curr_cmd->cmd1 |
 818                   (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
 819        row_addr_cycles = arasan_nand_get_addrcycle(mtd);
 820
 821        if (row_addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
 822                return ERR_ADDR_CYCLE;
 823
 824        reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
 825        reg_val |= (row_addr_cycles <<
 826                    ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
 827
 828        writel(reg_val, &info->reg->cmd_reg);
 829
 830        page = (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
 831                ARASAN_NAND_MEM_ADDR1_COL_MASK;
 832        column = page_addr & ARASAN_NAND_MEM_ADDR1_COL_MASK;
 833        writel(column | (page << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT),
 834               &info->reg->memadr_reg1);
 835
 836        reg_val = readl(&info->reg->memadr_reg2);
 837        reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
 838        reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
 839        writel(reg_val, &info->reg->memadr_reg2);
 840        writel(curr_cmd->pgm, &info->reg->pgm_reg);
 841
 842        while (!(readl(&info->reg->intsts_reg) &
 843                ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
 844                udelay(1);
 845                timeout--;
 846        }
 847        if (!timeout) {
 848                printf("ERROR:%s timedout:Xfer CMPLT\n", __func__);
 849                return -ETIMEDOUT;
 850        }
 851
 852        reg_val = readl(&info->reg->intsts_enr);
 853        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 854               &info->reg->intsts_enr);
 855        reg_val = readl(&info->reg->intsts_reg);
 856        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 857               &info->reg->intsts_reg);
 858
 859        return 0;
 860}
 861
 862static int arasan_nand_read_status(struct arasan_nand_command_format *curr_cmd,
 863                                int column, int page_addr, struct mtd_info *mtd)
 864{
 865        struct nand_chip *chip = mtd_to_nand(mtd);
 866        struct nand_drv *info = nand_get_controller_data(chip);
 867        u32 reg_val;
 868        u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
 869        u8 addr_cycles;
 870
 871        writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 872               &info->reg->intsts_enr);
 873        reg_val = readl(&info->reg->cmd_reg);
 874        reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
 875        reg_val |= curr_cmd->cmd1 |
 876                   (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
 877        addr_cycles = arasan_nand_get_addrcycle(mtd);
 878
 879        if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
 880                return ERR_ADDR_CYCLE;
 881
 882        reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
 883        reg_val |= (addr_cycles <<
 884                    ARASAN_NAND_CMD_ADDR_CYCL_SHIFT);
 885
 886        writel(reg_val, &info->reg->cmd_reg);
 887
 888        reg_val = readl(&info->reg->pkt_reg);
 889        reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
 890                     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
 891        reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | 1;
 892        writel(reg_val, &info->reg->pkt_reg);
 893
 894        writel(curr_cmd->pgm, &info->reg->pgm_reg);
 895        while (!(readl(&info->reg->intsts_reg) &
 896                ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
 897                udelay(1);
 898                timeout--;
 899        }
 900
 901        if (!timeout) {
 902                printf("ERROR:%s: timedout:Xfer CMPLT\n", __func__);
 903                return -ETIMEDOUT;
 904        }
 905
 906        reg_val = readl(&info->reg->intsts_enr);
 907        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 908               &info->reg->intsts_enr);
 909        reg_val = readl(&info->reg->intsts_reg);
 910        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
 911               &info->reg->intsts_reg);
 912
 913        return 0;
 914}
 915
 916static int arasan_nand_send_rdcmd(struct arasan_nand_command_format *curr_cmd,
 917                               int column, int page_addr, struct mtd_info *mtd)
 918{
 919        struct nand_chip *chip = mtd_to_nand(mtd);
 920        struct nand_drv *info = nand_get_controller_data(chip);
 921        u32 reg_val, addr_cycles, page;
 922        u8 page_val;
 923
 924        reg_val = readl(&info->reg->intsts_enr);
 925        writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
 926               &info->reg->intsts_enr);
 927
 928        reg_val = readl(&info->reg->cmd_reg);
 929        reg_val &= ~ARASAN_NAND_CMD_CMD12_MASK;
 930        reg_val |= curr_cmd->cmd1 |
 931                   (curr_cmd->cmd2 << ARASAN_NAND_CMD_CMD2_SHIFT);
 932
 933        if (curr_cmd->cmd1 == NAND_CMD_RNDOUT ||
 934            curr_cmd->cmd1 == NAND_CMD_READ0) {
 935                reg_val &= ~ARASAN_NAND_CMD_PG_SIZE_MASK;
 936                page_val = arasan_nand_page(mtd);
 937                reg_val |= (page_val << ARASAN_NAND_CMD_PG_SIZE_SHIFT);
 938        }
 939
 940        reg_val &= ~ARASAN_NAND_CMD_ECC_ON_MASK;
 941
 942        reg_val &= ~ARASAN_NAND_CMD_ADDR_CYCL_MASK;
 943
 944        addr_cycles = arasan_nand_get_addrcycle(mtd);
 945
 946        if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL)
 947                return ERR_ADDR_CYCLE;
 948
 949        reg_val |= (addr_cycles << 28);
 950        writel(reg_val, &info->reg->cmd_reg);
 951
 952        if (page_addr == -1)
 953                page_addr = 0;
 954
 955        page = (page_addr << ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT) &
 956                ARASAN_NAND_MEM_ADDR1_PAGE_MASK;
 957        column &= ARASAN_NAND_MEM_ADDR1_COL_MASK;
 958        writel(page | column, &info->reg->memadr_reg1);
 959
 960        reg_val = readl(&info->reg->memadr_reg2);
 961        reg_val &= ~ARASAN_NAND_MEM_ADDR2_PAGE_MASK;
 962        reg_val |= (page_addr >> ARASAN_NAND_MEM_ADDR1_PAGE_SHIFT);
 963        writel(reg_val, &info->reg->memadr_reg2);
 964
 965        buf_index = 0;
 966
 967        return 0;
 968}
 969
 970static void arasan_nand_read_buf(struct mtd_info *mtd, u8 *buf, int size)
 971{
 972        struct nand_chip *chip = mtd_to_nand(mtd);
 973        struct nand_drv *info = nand_get_controller_data(chip);
 974        u32 reg_val, i;
 975        u32 *bufptr = (u32 *)buf;
 976        u32 timeout = ARASAN_NAND_POLL_TIMEOUT;
 977
 978        reg_val = readl(&info->reg->pkt_reg);
 979        reg_val &= ~(ARASAN_NAND_PKT_REG_PKT_CNT_MASK |
 980                     ARASAN_NAND_PKT_REG_PKT_SIZE_MASK);
 981        reg_val |= (1 << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | size;
 982        writel(reg_val, &info->reg->pkt_reg);
 983
 984        writel(curr_cmd->pgm, &info->reg->pgm_reg);
 985
 986        while (!(readl(&info->reg->intsts_reg) &
 987                ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK) && timeout) {
 988                udelay(1);
 989                timeout--;
 990        }
 991
 992        if (!timeout)
 993                puts("ERROR:arasan_nand_read_buf timedout:Buff RDY\n");
 994
 995        reg_val = readl(&info->reg->intsts_enr);
 996        reg_val |= ARASAN_NAND_INT_STS_XFR_CMPLT_MASK;
 997        writel(reg_val, &info->reg->intsts_enr);
 998
 999        writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
1000               &info->reg->intsts_enr);
1001        reg_val = readl(&info->reg->intsts_reg);
1002        writel(reg_val | ARASAN_NAND_INT_STS_BUF_RD_RDY_MASK,
1003               &info->reg->intsts_reg);
1004
1005        buf_index = 0;
1006        for (i = 0; i < size / 4; i++)
1007                bufptr[i] = readl(&info->reg->buf_dataport);
1008
1009        if (size & 0x03)
1010                bufptr[i] = readl(&info->reg->buf_dataport);
1011
1012        timeout = ARASAN_NAND_POLL_TIMEOUT;
1013
1014        while (!(readl(&info->reg->intsts_reg) &
1015                ARASAN_NAND_INT_STS_XFR_CMPLT_MASK) && timeout) {
1016                udelay(1);
1017                timeout--;
1018        }
1019
1020        if (!timeout)
1021                puts("ERROR:arasan_nand_read_buf timedout:Xfer CMPLT\n");
1022
1023        reg_val = readl(&info->reg->intsts_enr);
1024        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
1025               &info->reg->intsts_enr);
1026        reg_val = readl(&info->reg->intsts_reg);
1027        writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
1028               &info->reg->intsts_reg);
1029}
1030
1031static u8 arasan_nand_read_byte(struct mtd_info *mtd)
1032{
1033        struct nand_chip *chip = mtd_to_nand(mtd);
1034        struct nand_drv *info = nand_get_controller_data(chip);
1035        u32 size;
1036        u8 val;
1037        struct nand_onfi_params *p;
1038
1039        if (buf_index == 0) {
1040                p = &chip->onfi_params;
1041                if (curr_cmd->cmd1 == NAND_CMD_READID)
1042                        size = 4;
1043                else if (curr_cmd->cmd1 == NAND_CMD_PARAM)
1044                        size = sizeof(struct nand_onfi_params);
1045                else if (curr_cmd->cmd1 == NAND_CMD_RNDOUT)
1046                        size = le16_to_cpu(p->ext_param_page_length) * 16;
1047                else if (curr_cmd->cmd1 == NAND_CMD_GET_FEATURES)
1048                        size = 4;
1049                else if (curr_cmd->cmd1 == NAND_CMD_STATUS)
1050                        return readb(&info->reg->flash_sts_reg);
1051                else
1052                        size = 8;
1053                chip->read_buf(mtd, &buf_data[0], size);
1054        }
1055
1056        val = *(&buf_data[0] + buf_index);
1057        buf_index++;
1058
1059        return val;
1060}
1061
1062static void arasan_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
1063                                     int column, int page_addr)
1064{
1065        struct nand_chip *chip = mtd_to_nand(mtd);
1066        struct nand_drv *info = nand_get_controller_data(chip);
1067        struct nand_config *nand = &info->config;
1068        u32 i, ret = 0;
1069
1070        curr_cmd = NULL;
1071        writel(ARASAN_NAND_INT_STS_XFR_CMPLT_MASK,
1072               &info->reg->intsts_enr);
1073
1074        if ((command == NAND_CMD_READOOB) &&
1075            (mtd->writesize > 512)) {
1076                column += mtd->writesize;
1077                command = NAND_CMD_READ0;
1078        }
1079
1080        /* Get the command format */
1081        for (i = 0; (arasan_nand_commands[i].cmd1 != NAND_CMD_NONE ||
1082                     arasan_nand_commands[i].cmd2 != NAND_CMD_NONE); i++) {
1083                if (command == arasan_nand_commands[i].cmd1) {
1084                        curr_cmd = &arasan_nand_commands[i];
1085                        break;
1086                }
1087        }
1088
1089        if (curr_cmd == NULL) {
1090                printf("Unsupported Command; 0x%x\n", command);
1091                return;
1092        }
1093
1094        if (curr_cmd->cmd1 == NAND_CMD_RESET)
1095                ret = arasan_nand_reset(mtd, curr_cmd);
1096
1097        if ((curr_cmd->cmd1 == NAND_CMD_READID) ||
1098            (curr_cmd->cmd1 == NAND_CMD_PARAM) ||
1099            (curr_cmd->cmd1 == NAND_CMD_RNDOUT) ||
1100            (curr_cmd->cmd1 == NAND_CMD_GET_FEATURES) ||
1101            (curr_cmd->cmd1 == NAND_CMD_READ0))
1102                ret = arasan_nand_send_rdcmd(curr_cmd, column, page_addr, mtd);
1103
1104        if ((curr_cmd->cmd1 == NAND_CMD_SET_FEATURES) ||
1105            (curr_cmd->cmd1 == NAND_CMD_SEQIN)) {
1106                nand->page = page_addr;
1107                ret = arasan_nand_send_wrcmd(curr_cmd, column, page_addr, mtd);
1108        }
1109
1110        if (curr_cmd->cmd1 == NAND_CMD_ERASE1)
1111                ret = arasan_nand_erase(curr_cmd, column, page_addr, mtd);
1112
1113        if (curr_cmd->cmd1 == NAND_CMD_STATUS)
1114                ret = arasan_nand_read_status(curr_cmd, column, page_addr, mtd);
1115
1116        if (ret != 0)
1117                printf("ERROR:%s:command:0x%x\n", __func__, curr_cmd->cmd1);
1118}
1119
1120static void arasan_check_ondie(struct mtd_info *mtd)
1121{
1122        struct nand_chip *nand_chip = mtd_to_nand(mtd);
1123        struct nand_drv *info = nand_get_controller_data(nand_chip);
1124        struct nand_config *nand = &info->config;
1125        u8 maf_id, dev_id;
1126        u8 get_feature[4];
1127        u8 set_feature[4] = {ENABLE_ONDIE_ECC, 0x00, 0x00, 0x00};
1128        u32 i;
1129
1130        nand_chip->select_chip(mtd, 0);
1131
1132        /* Send the command for reading device ID */
1133        nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1134        nand_chip->cmdfunc(mtd, NAND_CMD_READID, 0, -1);
1135
1136        /* Read manufacturer and device IDs */
1137        maf_id = nand_chip->read_byte(mtd);
1138        dev_id = nand_chip->read_byte(mtd);
1139
1140        if ((maf_id == NAND_MFR_MICRON) &&
1141            ((dev_id == 0xf1) || (dev_id == 0xa1) || (dev_id == 0xb1) ||
1142             (dev_id == 0xaa) || (dev_id == 0xba) || (dev_id == 0xda) ||
1143             (dev_id == 0xca) || (dev_id == 0xac) || (dev_id == 0xbc) ||
1144             (dev_id == 0xdc) || (dev_id == 0xcc) || (dev_id == 0xa3) ||
1145             (dev_id == 0xb3) || (dev_id == 0xd3) || (dev_id == 0xc3))) {
1146                nand_chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES,
1147                                   ONDIE_ECC_FEATURE_ADDR, -1);
1148
1149                nand_chip->write_buf(mtd, &set_feature[0], 4);
1150                nand_chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES,
1151                                   ONDIE_ECC_FEATURE_ADDR, -1);
1152
1153                for (i = 0; i < 4; i++)
1154                        get_feature[i] = nand_chip->read_byte(mtd);
1155
1156                if (get_feature[0] & ENABLE_ONDIE_ECC) {
1157                        nand->on_die_ecc_enabled = true;
1158                        printf("On-DIE ECC Enabled\n");
1159                } else {
1160                        printf("%s: Unable to enable OnDie ECC\n", __func__);
1161                }
1162
1163                /* Use the BBT pattern descriptors */
1164                nand_chip->bbt_td = &bbt_main_descr;
1165                nand_chip->bbt_md = &bbt_mirror_descr;
1166        }
1167}
1168
1169static int arasan_nand_ecc_init(struct mtd_info *mtd)
1170{
1171        struct nand_chip *nand_chip = mtd_to_nand(mtd);
1172        struct nand_drv *info = nand_get_controller_data(nand_chip);
1173        int found = -1;
1174        u32 regval, eccpos_start, i, eccaddr;
1175
1176        for (i = 0; i < ARRAY_SIZE(ecc_matrix); i++) {
1177                if ((ecc_matrix[i].pagesize == mtd->writesize) &&
1178                    (ecc_matrix[i].ecc_codeword_size >=
1179                     nand_chip->ecc_step_ds)) {
1180                        if (ecc_matrix[i].eccbits >=
1181                            nand_chip->ecc_strength_ds) {
1182                                found = i;
1183                                break;
1184                        }
1185                        found = i;
1186                }
1187        }
1188
1189        if (found < 0)
1190                return 1;
1191
1192        eccaddr = mtd->writesize + mtd->oobsize -
1193                  ecc_matrix[found].eccsize;
1194
1195        regval = eccaddr |
1196                 (ecc_matrix[found].eccsize << ARASAN_NAND_ECC_SIZE_SHIFT) |
1197                 (ecc_matrix[found].bch << ARASAN_NAND_ECC_BCH_SHIFT);
1198        writel(regval, &info->reg->ecc_reg);
1199
1200        if (ecc_matrix[found].bch) {
1201                regval = readl(&info->reg->memadr_reg2);
1202                regval &= ~ARASAN_NAND_MEM_ADDR2_BCH_MASK;
1203                regval |= (ecc_matrix[found].bchval <<
1204                           ARASAN_NAND_MEM_ADDR2_BCH_SHIFT);
1205                writel(regval, &info->reg->memadr_reg2);
1206        }
1207
1208        nand_oob.eccbytes = ecc_matrix[found].eccsize;
1209        eccpos_start = mtd->oobsize - nand_oob.eccbytes;
1210
1211        for (i = 0; i < nand_oob.eccbytes; i++)
1212                nand_oob.eccpos[i] = eccpos_start + i;
1213
1214        nand_oob.oobfree[0].offset = 2;
1215        nand_oob.oobfree[0].length = eccpos_start - 2;
1216
1217        nand_chip->ecc.size = ecc_matrix[found].ecc_codeword_size;
1218        nand_chip->ecc.strength = ecc_matrix[found].eccbits;
1219        nand_chip->ecc.bytes = ecc_matrix[found].eccsize;
1220        nand_chip->ecc.layout = &nand_oob;
1221
1222        return 0;
1223}
1224
1225static int arasan_probe(struct udevice *dev)
1226{
1227        struct arasan_nand_info *arasan = dev_get_priv(dev);
1228        struct nand_chip *nand_chip = &arasan->nand_chip;
1229        struct nand_drv *info = &arasan->nand_ctrl;
1230        struct nand_config *nand = &info->config;
1231        struct mtd_info *mtd;
1232        int err = -1;
1233
1234        info->reg = (struct nand_regs *)dev_read_addr(dev);
1235        mtd = nand_to_mtd(nand_chip);
1236        nand_set_controller_data(nand_chip, &arasan->nand_ctrl);
1237
1238#ifdef CONFIG_SYS_NAND_NO_SUBPAGE_WRITE
1239        nand_chip->options |= NAND_NO_SUBPAGE_WRITE;
1240#endif
1241
1242        /* Set the driver entry points for MTD */
1243        nand_chip->cmdfunc = arasan_nand_cmd_function;
1244        nand_chip->select_chip = arasan_nand_select_chip;
1245        nand_chip->read_byte = arasan_nand_read_byte;
1246
1247        /* Buffer read/write routines */
1248        nand_chip->read_buf = arasan_nand_read_buf;
1249        nand_chip->write_buf = arasan_nand_write_buf;
1250        nand_chip->bbt_options = NAND_BBT_USE_FLASH;
1251
1252        writel(0x0, &info->reg->cmd_reg);
1253        writel(0x0, &info->reg->pgm_reg);
1254
1255        /* first scan to find the device and get the page size */
1256        if (nand_scan_ident(mtd, CONFIG_SYS_NAND_MAX_CHIPS, NULL)) {
1257                printf("%s: nand_scan_ident failed\n", __func__);
1258                goto fail;
1259        }
1260
1261        nand_chip->ecc.mode = NAND_ECC_HW;
1262        nand_chip->ecc.hwctl = NULL;
1263        nand_chip->ecc.read_page = arasan_nand_read_page_hwecc;
1264        nand_chip->ecc.write_page = arasan_nand_write_page_hwecc;
1265        nand_chip->ecc.read_oob = arasan_nand_read_oob;
1266        nand_chip->ecc.write_oob = arasan_nand_write_oob;
1267
1268        arasan_check_ondie(mtd);
1269
1270        /*
1271         * If on die supported, then give priority to on-die ecc and use
1272         * it instead of controller ecc.
1273         */
1274        if (nand->on_die_ecc_enabled) {
1275                nand_chip->ecc.strength = 1;
1276                nand_chip->ecc.size = mtd->writesize;
1277                nand_chip->ecc.bytes = 0;
1278                nand_chip->ecc.layout = &ondie_nand_oob_64;
1279        } else {
1280                if (arasan_nand_ecc_init(mtd)) {
1281                        printf("%s: nand_ecc_init failed\n", __func__);
1282                        goto fail;
1283                }
1284        }
1285
1286        if (nand_scan_tail(mtd)) {
1287                printf("%s: nand_scan_tail failed\n", __func__);
1288                goto fail;
1289        }
1290
1291        if (nand_register(0, mtd)) {
1292                printf("Nand Register Fail\n");
1293                goto fail;
1294        }
1295
1296        return 0;
1297fail:
1298        free(nand);
1299        return err;
1300}
1301
1302static const struct udevice_id arasan_nand_dt_ids[] = {
1303        {.compatible = "arasan,nfc-v3p10",},
1304        { /* sentinel */ }
1305};
1306
1307U_BOOT_DRIVER(arasan_nand) = {
1308        .name = "arasan-nand",
1309        .id = UCLASS_MTD,
1310        .of_match = arasan_nand_dt_ids,
1311        .probe = arasan_probe,
1312        .priv_auto_alloc_size = sizeof(struct arasan_nand_info),
1313};
1314
1315void board_nand_init(void)
1316{
1317        struct udevice *dev;
1318        int ret;
1319
1320        ret = uclass_get_device_by_driver(UCLASS_MTD,
1321                                          DM_GET_DRIVER(arasan_nand), &dev);
1322        if (ret && ret != -ENODEV)
1323                pr_err("Failed to initialize %s. (error %d)\n", dev->name, ret);
1324}
1325