linux/drivers/mtd/onenand/onenand_base.c
<<
>>
Prefs
   1/*
   2 *  linux/drivers/mtd/onenand/onenand_base.c
   3 *
   4 *  Copyright © 2005-2009 Samsung Electronics
   5 *  Copyright © 2007 Nokia Corporation
   6 *
   7 *  Kyungmin Park <kyungmin.park@samsung.com>
   8 *
   9 *  Credits:
  10 *      Adrian Hunter <ext-adrian.hunter@nokia.com>:
  11 *      auto-placement support, read-while load support, various fixes
  12 *
  13 *      Vishak G <vishak.g at samsung.com>, Rohit Hagargundgi <h.rohit at samsung.com>
  14 *      Flex-OneNAND support
  15 *      Amul Kumar Saha <amul.saha at samsung.com>
  16 *      OTP support
  17 *
  18 * This program is free software; you can redistribute it and/or modify
  19 * it under the terms of the GNU General Public License version 2 as
  20 * published by the Free Software Foundation.
  21 */
  22
  23#include <linux/kernel.h>
  24#include <linux/module.h>
  25#include <linux/moduleparam.h>
  26#include <linux/slab.h>
  27#include <linux/sched.h>
  28#include <linux/delay.h>
  29#include <linux/interrupt.h>
  30#include <linux/jiffies.h>
  31#include <linux/mtd/mtd.h>
  32#include <linux/mtd/onenand.h>
  33#include <linux/mtd/partitions.h>
  34
  35#include <asm/io.h>
  36
  37/*
  38 * Multiblock erase if number of blocks to erase is 2 or more.
  39 * Maximum number of blocks for simultaneous erase is 64.
  40 */
  41#define MB_ERASE_MIN_BLK_COUNT 2
  42#define MB_ERASE_MAX_BLK_COUNT 64
  43
  44/* Default Flex-OneNAND boundary and lock respectively */
  45static int flex_bdry[MAX_DIES * 2] = { -1, 0, -1, 0 };
  46
  47module_param_array(flex_bdry, int, NULL, 0400);
  48MODULE_PARM_DESC(flex_bdry,     "SLC Boundary information for Flex-OneNAND"
  49                                "Syntax:flex_bdry=DIE_BDRY,LOCK,..."
  50                                "DIE_BDRY: SLC boundary of the die"
  51                                "LOCK: Locking information for SLC boundary"
  52                                "    : 0->Set boundary in unlocked status"
  53                                "    : 1->Set boundary in locked status");
  54
  55/* Default OneNAND/Flex-OneNAND OTP options*/
  56static int otp;
  57
  58module_param(otp, int, 0400);
  59MODULE_PARM_DESC(otp,   "Corresponding behaviour of OneNAND in OTP"
  60                        "Syntax : otp=LOCK_TYPE"
  61                        "LOCK_TYPE : Keys issued, for specific OTP Lock type"
  62                        "          : 0 -> Default (No Blocks Locked)"
  63                        "          : 1 -> OTP Block lock"
  64                        "          : 2 -> 1st Block lock"
  65                        "          : 3 -> BOTH OTP Block and 1st Block lock");
  66
  67/*
  68 * flexonenand_oob_128 - oob info for Flex-Onenand with 4KB page
  69 * For now, we expose only 64 out of 80 ecc bytes
  70 */
  71static struct nand_ecclayout flexonenand_oob_128 = {
  72        .eccbytes       = 64,
  73        .eccpos         = {
  74                6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  75                22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  76                38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  77                54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  78                70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  79                86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  80                102, 103, 104, 105
  81                },
  82        .oobfree        = {
  83                {2, 4}, {18, 4}, {34, 4}, {50, 4},
  84                {66, 4}, {82, 4}, {98, 4}, {114, 4}
  85        }
  86};
  87
  88/*
  89 * onenand_oob_128 - oob info for OneNAND with 4KB page
  90 *
  91 * Based on specification:
  92 * 4Gb M-die OneNAND Flash (KFM4G16Q4M, KFN8G16Q4M). Rev. 1.3, Apr. 2010
  93 *
  94 * For eccpos we expose only 64 bytes out of 72 (see struct nand_ecclayout)
  95 *
  96 * oobfree uses the spare area fields marked as
  97 * "Managed by internal ECC logic for Logical Sector Number area"
  98 */
  99static struct nand_ecclayout onenand_oob_128 = {
 100        .eccbytes       = 64,
 101        .eccpos         = {
 102                7, 8, 9, 10, 11, 12, 13, 14, 15,
 103                23, 24, 25, 26, 27, 28, 29, 30, 31,
 104                39, 40, 41, 42, 43, 44, 45, 46, 47,
 105                55, 56, 57, 58, 59, 60, 61, 62, 63,
 106                71, 72, 73, 74, 75, 76, 77, 78, 79,
 107                87, 88, 89, 90, 91, 92, 93, 94, 95,
 108                103, 104, 105, 106, 107, 108, 109, 110, 111,
 109                119
 110        },
 111        .oobfree        = {
 112                {2, 3}, {18, 3}, {34, 3}, {50, 3},
 113                {66, 3}, {82, 3}, {98, 3}, {114, 3}
 114        }
 115};
 116
 117/**
 118 * onenand_oob_64 - oob info for large (2KB) page
 119 */
 120static struct nand_ecclayout onenand_oob_64 = {
 121        .eccbytes       = 20,
 122        .eccpos         = {
 123                8, 9, 10, 11, 12,
 124                24, 25, 26, 27, 28,
 125                40, 41, 42, 43, 44,
 126                56, 57, 58, 59, 60,
 127                },
 128        .oobfree        = {
 129                {2, 3}, {14, 2}, {18, 3}, {30, 2},
 130                {34, 3}, {46, 2}, {50, 3}, {62, 2}
 131        }
 132};
 133
 134/**
 135 * onenand_oob_32 - oob info for middle (1KB) page
 136 */
 137static struct nand_ecclayout onenand_oob_32 = {
 138        .eccbytes       = 10,
 139        .eccpos         = {
 140                8, 9, 10, 11, 12,
 141                24, 25, 26, 27, 28,
 142                },
 143        .oobfree        = { {2, 3}, {14, 2}, {18, 3}, {30, 2} }
 144};
 145
 146static const unsigned char ffchars[] = {
 147        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 148        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 16 */
 149        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 150        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 32 */
 151        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 152        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 48 */
 153        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 154        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 64 */
 155        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 156        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 80 */
 157        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 158        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 96 */
 159        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 160        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 112 */
 161        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
 162        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 128 */
 163};
 164
 165/**
 166 * onenand_readw - [OneNAND Interface] Read OneNAND register
 167 * @param addr          address to read
 168 *
 169 * Read OneNAND register
 170 */
 171static unsigned short onenand_readw(void __iomem *addr)
 172{
 173        return readw(addr);
 174}
 175
 176/**
 177 * onenand_writew - [OneNAND Interface] Write OneNAND register with value
 178 * @param value         value to write
 179 * @param addr          address to write
 180 *
 181 * Write OneNAND register with value
 182 */
 183static void onenand_writew(unsigned short value, void __iomem *addr)
 184{
 185        writew(value, addr);
 186}
 187
 188/**
 189 * onenand_block_address - [DEFAULT] Get block address
 190 * @param this          onenand chip data structure
 191 * @param block         the block
 192 * @return              translated block address if DDP, otherwise same
 193 *
 194 * Setup Start Address 1 Register (F100h)
 195 */
 196static int onenand_block_address(struct onenand_chip *this, int block)
 197{
 198        /* Device Flash Core select, NAND Flash Block Address */
 199        if (block & this->density_mask)
 200                return ONENAND_DDP_CHIP1 | (block ^ this->density_mask);
 201
 202        return block;
 203}
 204
 205/**
 206 * onenand_bufferram_address - [DEFAULT] Get bufferram address
 207 * @param this          onenand chip data structure
 208 * @param block         the block
 209 * @return              set DBS value if DDP, otherwise 0
 210 *
 211 * Setup Start Address 2 Register (F101h) for DDP
 212 */
 213static int onenand_bufferram_address(struct onenand_chip *this, int block)
 214{
 215        /* Device BufferRAM Select */
 216        if (block & this->density_mask)
 217                return ONENAND_DDP_CHIP1;
 218
 219        return ONENAND_DDP_CHIP0;
 220}
 221
 222/**
 223 * onenand_page_address - [DEFAULT] Get page address
 224 * @param page          the page address
 225 * @param sector        the sector address
 226 * @return              combined page and sector address
 227 *
 228 * Setup Start Address 8 Register (F107h)
 229 */
 230static int onenand_page_address(int page, int sector)
 231{
 232        /* Flash Page Address, Flash Sector Address */
 233        int fpa, fsa;
 234
 235        fpa = page & ONENAND_FPA_MASK;
 236        fsa = sector & ONENAND_FSA_MASK;
 237
 238        return ((fpa << ONENAND_FPA_SHIFT) | fsa);
 239}
 240
 241/**
 242 * onenand_buffer_address - [DEFAULT] Get buffer address
 243 * @param dataram1      DataRAM index
 244 * @param sectors       the sector address
 245 * @param count         the number of sectors
 246 * @return              the start buffer value
 247 *
 248 * Setup Start Buffer Register (F200h)
 249 */
 250static int onenand_buffer_address(int dataram1, int sectors, int count)
 251{
 252        int bsa, bsc;
 253
 254        /* BufferRAM Sector Address */
 255        bsa = sectors & ONENAND_BSA_MASK;
 256
 257        if (dataram1)
 258                bsa |= ONENAND_BSA_DATARAM1;    /* DataRAM1 */
 259        else
 260                bsa |= ONENAND_BSA_DATARAM0;    /* DataRAM0 */
 261
 262        /* BufferRAM Sector Count */
 263        bsc = count & ONENAND_BSC_MASK;
 264
 265        return ((bsa << ONENAND_BSA_SHIFT) | bsc);
 266}
 267
 268/**
 269 * flexonenand_block- For given address return block number
 270 * @param this         - OneNAND device structure
 271 * @param addr          - Address for which block number is needed
 272 */
 273static unsigned flexonenand_block(struct onenand_chip *this, loff_t addr)
 274{
 275        unsigned boundary, blk, die = 0;
 276
 277        if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) {
 278                die = 1;
 279                addr -= this->diesize[0];
 280        }
 281
 282        boundary = this->boundary[die];
 283
 284        blk = addr >> (this->erase_shift - 1);
 285        if (blk > boundary)
 286                blk = (blk + boundary + 1) >> 1;
 287
 288        blk += die ? this->density_mask : 0;
 289        return blk;
 290}
 291
 292inline unsigned onenand_block(struct onenand_chip *this, loff_t addr)
 293{
 294        if (!FLEXONENAND(this))
 295                return addr >> this->erase_shift;
 296        return flexonenand_block(this, addr);
 297}
 298
 299/**
 300 * flexonenand_addr - Return address of the block
 301 * @this:               OneNAND device structure
 302 * @block:              Block number on Flex-OneNAND
 303 *
 304 * Return address of the block
 305 */
 306static loff_t flexonenand_addr(struct onenand_chip *this, int block)
 307{
 308        loff_t ofs = 0;
 309        int die = 0, boundary;
 310
 311        if (ONENAND_IS_DDP(this) && block >= this->density_mask) {
 312                block -= this->density_mask;
 313                die = 1;
 314                ofs = this->diesize[0];
 315        }
 316
 317        boundary = this->boundary[die];
 318        ofs += (loff_t)block << (this->erase_shift - 1);
 319        if (block > (boundary + 1))
 320                ofs += (loff_t)(block - boundary - 1) << (this->erase_shift - 1);
 321        return ofs;
 322}
 323
 324loff_t onenand_addr(struct onenand_chip *this, int block)
 325{
 326        if (!FLEXONENAND(this))
 327                return (loff_t)block << this->erase_shift;
 328        return flexonenand_addr(this, block);
 329}
 330EXPORT_SYMBOL(onenand_addr);
 331
 332/**
 333 * onenand_get_density - [DEFAULT] Get OneNAND density
 334 * @param dev_id        OneNAND device ID
 335 *
 336 * Get OneNAND density from device ID
 337 */
 338static inline int onenand_get_density(int dev_id)
 339{
 340        int density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT;
 341        return (density & ONENAND_DEVICE_DENSITY_MASK);
 342}
 343
 344/**
 345 * flexonenand_region - [Flex-OneNAND] Return erase region of addr
 346 * @param mtd           MTD device structure
 347 * @param addr          address whose erase region needs to be identified
 348 */
 349int flexonenand_region(struct mtd_info *mtd, loff_t addr)
 350{
 351        int i;
 352
 353        for (i = 0; i < mtd->numeraseregions; i++)
 354                if (addr < mtd->eraseregions[i].offset)
 355                        break;
 356        return i - 1;
 357}
 358EXPORT_SYMBOL(flexonenand_region);
 359
 360/**
 361 * onenand_command - [DEFAULT] Send command to OneNAND device
 362 * @param mtd           MTD device structure
 363 * @param cmd           the command to be sent
 364 * @param addr          offset to read from or write to
 365 * @param len           number of bytes to read or write
 366 *
 367 * Send command to OneNAND device. This function is used for middle/large page
 368 * devices (1KB/2KB Bytes per page)
 369 */
 370static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t len)
 371{
 372        struct onenand_chip *this = mtd->priv;
 373        int value, block, page;
 374
 375        /* Address translation */
 376        switch (cmd) {
 377        case ONENAND_CMD_UNLOCK:
 378        case ONENAND_CMD_LOCK:
 379        case ONENAND_CMD_LOCK_TIGHT:
 380        case ONENAND_CMD_UNLOCK_ALL:
 381                block = -1;
 382                page = -1;
 383                break;
 384
 385        case FLEXONENAND_CMD_PI_ACCESS:
 386                /* addr contains die index */
 387                block = addr * this->density_mask;
 388                page = -1;
 389                break;
 390
 391        case ONENAND_CMD_ERASE:
 392        case ONENAND_CMD_MULTIBLOCK_ERASE:
 393        case ONENAND_CMD_ERASE_VERIFY:
 394        case ONENAND_CMD_BUFFERRAM:
 395        case ONENAND_CMD_OTP_ACCESS:
 396                block = onenand_block(this, addr);
 397                page = -1;
 398                break;
 399
 400        case FLEXONENAND_CMD_READ_PI:
 401                cmd = ONENAND_CMD_READ;
 402                block = addr * this->density_mask;
 403                page = 0;
 404                break;
 405
 406        default:
 407                block = onenand_block(this, addr);
 408                if (FLEXONENAND(this))
 409                        page = (int) (addr - onenand_addr(this, block))>>\
 410                                this->page_shift;
 411                else
 412                        page = (int) (addr >> this->page_shift);
 413                if (ONENAND_IS_2PLANE(this)) {
 414                        /* Make the even block number */
 415                        block &= ~1;
 416                        /* Is it the odd plane? */
 417                        if (addr & this->writesize)
 418                                block++;
 419                        page >>= 1;
 420                }
 421                page &= this->page_mask;
 422                break;
 423        }
 424
 425        /* NOTE: The setting order of the registers is very important! */
 426        if (cmd == ONENAND_CMD_BUFFERRAM) {
 427                /* Select DataRAM for DDP */
 428                value = onenand_bufferram_address(this, block);
 429                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
 430
 431                if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this))
 432                        /* It is always BufferRAM0 */
 433                        ONENAND_SET_BUFFERRAM0(this);
 434                else
 435                        /* Switch to the next data buffer */
 436                        ONENAND_SET_NEXT_BUFFERRAM(this);
 437
 438                return 0;
 439        }
 440
 441        if (block != -1) {
 442                /* Write 'DFS, FBA' of Flash */
 443                value = onenand_block_address(this, block);
 444                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
 445
 446                /* Select DataRAM for DDP */
 447                value = onenand_bufferram_address(this, block);
 448                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
 449        }
 450
 451        if (page != -1) {
 452                /* Now we use page size operation */
 453                int sectors = 0, count = 0;
 454                int dataram;
 455
 456                switch (cmd) {
 457                case FLEXONENAND_CMD_RECOVER_LSB:
 458                case ONENAND_CMD_READ:
 459                case ONENAND_CMD_READOOB:
 460                        if (ONENAND_IS_4KB_PAGE(this))
 461                                /* It is always BufferRAM0 */
 462                                dataram = ONENAND_SET_BUFFERRAM0(this);
 463                        else
 464                                dataram = ONENAND_SET_NEXT_BUFFERRAM(this);
 465                        break;
 466
 467                default:
 468                        if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
 469                                cmd = ONENAND_CMD_2X_PROG;
 470                        dataram = ONENAND_CURRENT_BUFFERRAM(this);
 471                        break;
 472                }
 473
 474                /* Write 'FPA, FSA' of Flash */
 475                value = onenand_page_address(page, sectors);
 476                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS8);
 477
 478                /* Write 'BSA, BSC' of DataRAM */
 479                value = onenand_buffer_address(dataram, sectors, count);
 480                this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
 481        }
 482
 483        /* Interrupt clear */
 484        this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
 485
 486        /* Write command */
 487        this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
 488
 489        return 0;
 490}
 491
 492/**
 493 * onenand_read_ecc - return ecc status
 494 * @param this          onenand chip structure
 495 */
 496static inline int onenand_read_ecc(struct onenand_chip *this)
 497{
 498        int ecc, i, result = 0;
 499
 500        if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this))
 501                return this->read_word(this->base + ONENAND_REG_ECC_STATUS);
 502
 503        for (i = 0; i < 4; i++) {
 504                ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS + i*2);
 505                if (likely(!ecc))
 506                        continue;
 507                if (ecc & FLEXONENAND_UNCORRECTABLE_ERROR)
 508                        return ONENAND_ECC_2BIT_ALL;
 509                else
 510                        result = ONENAND_ECC_1BIT_ALL;
 511        }
 512
 513        return result;
 514}
 515
 516/**
 517 * onenand_wait - [DEFAULT] wait until the command is done
 518 * @param mtd           MTD device structure
 519 * @param state         state to select the max. timeout value
 520 *
 521 * Wait for command done. This applies to all OneNAND command
 522 * Read can take up to 30us, erase up to 2ms and program up to 350us
 523 * according to general OneNAND specs
 524 */
 525static int onenand_wait(struct mtd_info *mtd, int state)
 526{
 527        struct onenand_chip * this = mtd->priv;
 528        unsigned long timeout;
 529        unsigned int flags = ONENAND_INT_MASTER;
 530        unsigned int interrupt = 0;
 531        unsigned int ctrl;
 532
 533        /* The 20 msec is enough */
 534        timeout = jiffies + msecs_to_jiffies(20);
 535        while (time_before(jiffies, timeout)) {
 536                interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
 537
 538                if (interrupt & flags)
 539                        break;
 540
 541                if (state != FL_READING && state != FL_PREPARING_ERASE)
 542                        cond_resched();
 543        }
 544        /* To get correct interrupt status in timeout case */
 545        interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
 546
 547        ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
 548
 549        /*
 550         * In the Spec. it checks the controller status first
 551         * However if you get the correct information in case of
 552         * power off recovery (POR) test, it should read ECC status first
 553         */
 554        if (interrupt & ONENAND_INT_READ) {
 555                int ecc = onenand_read_ecc(this);
 556                if (ecc) {
 557                        if (ecc & ONENAND_ECC_2BIT_ALL) {
 558                                printk(KERN_ERR "%s: ECC error = 0x%04x\n",
 559                                        __func__, ecc);
 560                                mtd->ecc_stats.failed++;
 561                                return -EBADMSG;
 562                        } else if (ecc & ONENAND_ECC_1BIT_ALL) {
 563                                printk(KERN_DEBUG "%s: correctable ECC error = 0x%04x\n",
 564                                        __func__, ecc);
 565                                mtd->ecc_stats.corrected++;
 566                        }
 567                }
 568        } else if (state == FL_READING) {
 569                printk(KERN_ERR "%s: read timeout! ctrl=0x%04x intr=0x%04x\n",
 570                        __func__, ctrl, interrupt);
 571                return -EIO;
 572        }
 573
 574        if (state == FL_PREPARING_ERASE && !(interrupt & ONENAND_INT_ERASE)) {
 575                printk(KERN_ERR "%s: mb erase timeout! ctrl=0x%04x intr=0x%04x\n",
 576                       __func__, ctrl, interrupt);
 577                return -EIO;
 578        }
 579
 580        if (!(interrupt & ONENAND_INT_MASTER)) {
 581                printk(KERN_ERR "%s: timeout! ctrl=0x%04x intr=0x%04x\n",
 582                       __func__, ctrl, interrupt);
 583                return -EIO;
 584        }
 585
 586        /* If there's controller error, it's a real error */
 587        if (ctrl & ONENAND_CTRL_ERROR) {
 588                printk(KERN_ERR "%s: controller error = 0x%04x\n",
 589                        __func__, ctrl);
 590                if (ctrl & ONENAND_CTRL_LOCK)
 591                        printk(KERN_ERR "%s: it's locked error.\n", __func__);
 592                return -EIO;
 593        }
 594
 595        return 0;
 596}
 597
 598/*
 599 * onenand_interrupt - [DEFAULT] onenand interrupt handler
 600 * @param irq           onenand interrupt number
 601 * @param dev_id        interrupt data
 602 *
 603 * complete the work
 604 */
 605static irqreturn_t onenand_interrupt(int irq, void *data)
 606{
 607        struct onenand_chip *this = data;
 608
 609        /* To handle shared interrupt */
 610        if (!this->complete.done)
 611                complete(&this->complete);
 612
 613        return IRQ_HANDLED;
 614}
 615
 616/*
 617 * onenand_interrupt_wait - [DEFAULT] wait until the command is done
 618 * @param mtd           MTD device structure
 619 * @param state         state to select the max. timeout value
 620 *
 621 * Wait for command done.
 622 */
 623static int onenand_interrupt_wait(struct mtd_info *mtd, int state)
 624{
 625        struct onenand_chip *this = mtd->priv;
 626
 627        wait_for_completion(&this->complete);
 628
 629        return onenand_wait(mtd, state);
 630}
 631
 632/*
 633 * onenand_try_interrupt_wait - [DEFAULT] try interrupt wait
 634 * @param mtd           MTD device structure
 635 * @param state         state to select the max. timeout value
 636 *
 637 * Try interrupt based wait (It is used one-time)
 638 */
 639static int onenand_try_interrupt_wait(struct mtd_info *mtd, int state)
 640{
 641        struct onenand_chip *this = mtd->priv;
 642        unsigned long remain, timeout;
 643
 644        /* We use interrupt wait first */
 645        this->wait = onenand_interrupt_wait;
 646
 647        timeout = msecs_to_jiffies(100);
 648        remain = wait_for_completion_timeout(&this->complete, timeout);
 649        if (!remain) {
 650                printk(KERN_INFO "OneNAND: There's no interrupt. "
 651                                "We use the normal wait\n");
 652
 653                /* Release the irq */
 654                free_irq(this->irq, this);
 655
 656                this->wait = onenand_wait;
 657        }
 658
 659        return onenand_wait(mtd, state);
 660}
 661
 662/*
 663 * onenand_setup_wait - [OneNAND Interface] setup onenand wait method
 664 * @param mtd           MTD device structure
 665 *
 666 * There's two method to wait onenand work
 667 * 1. polling - read interrupt status register
 668 * 2. interrupt - use the kernel interrupt method
 669 */
 670static void onenand_setup_wait(struct mtd_info *mtd)
 671{
 672        struct onenand_chip *this = mtd->priv;
 673        int syscfg;
 674
 675        init_completion(&this->complete);
 676
 677        if (this->irq <= 0) {
 678                this->wait = onenand_wait;
 679                return;
 680        }
 681
 682        if (request_irq(this->irq, &onenand_interrupt,
 683                                IRQF_SHARED, "onenand", this)) {
 684                /* If we can't get irq, use the normal wait */
 685                this->wait = onenand_wait;
 686                return;
 687        }
 688
 689        /* Enable interrupt */
 690        syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
 691        syscfg |= ONENAND_SYS_CFG1_IOBE;
 692        this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
 693
 694        this->wait = onenand_try_interrupt_wait;
 695}
 696
 697/**
 698 * onenand_bufferram_offset - [DEFAULT] BufferRAM offset
 699 * @param mtd           MTD data structure
 700 * @param area          BufferRAM area
 701 * @return              offset given area
 702 *
 703 * Return BufferRAM offset given area
 704 */
 705static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area)
 706{
 707        struct onenand_chip *this = mtd->priv;
 708
 709        if (ONENAND_CURRENT_BUFFERRAM(this)) {
 710                /* Note: the 'this->writesize' is a real page size */
 711                if (area == ONENAND_DATARAM)
 712                        return this->writesize;
 713                if (area == ONENAND_SPARERAM)
 714                        return mtd->oobsize;
 715        }
 716
 717        return 0;
 718}
 719
 720/**
 721 * onenand_read_bufferram - [OneNAND Interface] Read the bufferram area
 722 * @param mtd           MTD data structure
 723 * @param area          BufferRAM area
 724 * @param buffer        the databuffer to put/get data
 725 * @param offset        offset to read from or write to
 726 * @param count         number of bytes to read/write
 727 *
 728 * Read the BufferRAM area
 729 */
 730static int onenand_read_bufferram(struct mtd_info *mtd, int area,
 731                unsigned char *buffer, int offset, size_t count)
 732{
 733        struct onenand_chip *this = mtd->priv;
 734        void __iomem *bufferram;
 735
 736        bufferram = this->base + area;
 737
 738        bufferram += onenand_bufferram_offset(mtd, area);
 739
 740        if (ONENAND_CHECK_BYTE_ACCESS(count)) {
 741                unsigned short word;
 742
 743                /* Align with word(16-bit) size */
 744                count--;
 745
 746                /* Read word and save byte */
 747                word = this->read_word(bufferram + offset + count);
 748                buffer[count] = (word & 0xff);
 749        }
 750
 751        memcpy(buffer, bufferram + offset, count);
 752
 753        return 0;
 754}
 755
 756/**
 757 * onenand_sync_read_bufferram - [OneNAND Interface] Read the bufferram area with Sync. Burst mode
 758 * @param mtd           MTD data structure
 759 * @param area          BufferRAM area
 760 * @param buffer        the databuffer to put/get data
 761 * @param offset        offset to read from or write to
 762 * @param count         number of bytes to read/write
 763 *
 764 * Read the BufferRAM area with Sync. Burst Mode
 765 */
 766static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area,
 767                unsigned char *buffer, int offset, size_t count)
 768{
 769        struct onenand_chip *this = mtd->priv;
 770        void __iomem *bufferram;
 771
 772        bufferram = this->base + area;
 773
 774        bufferram += onenand_bufferram_offset(mtd, area);
 775
 776        this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
 777
 778        if (ONENAND_CHECK_BYTE_ACCESS(count)) {
 779                unsigned short word;
 780
 781                /* Align with word(16-bit) size */
 782                count--;
 783
 784                /* Read word and save byte */
 785                word = this->read_word(bufferram + offset + count);
 786                buffer[count] = (word & 0xff);
 787        }
 788
 789        memcpy(buffer, bufferram + offset, count);
 790
 791        this->mmcontrol(mtd, 0);
 792
 793        return 0;
 794}
 795
 796/**
 797 * onenand_write_bufferram - [OneNAND Interface] Write the bufferram area
 798 * @param mtd           MTD data structure
 799 * @param area          BufferRAM area
 800 * @param buffer        the databuffer to put/get data
 801 * @param offset        offset to read from or write to
 802 * @param count         number of bytes to read/write
 803 *
 804 * Write the BufferRAM area
 805 */
 806static int onenand_write_bufferram(struct mtd_info *mtd, int area,
 807                const unsigned char *buffer, int offset, size_t count)
 808{
 809        struct onenand_chip *this = mtd->priv;
 810        void __iomem *bufferram;
 811
 812        bufferram = this->base + area;
 813
 814        bufferram += onenand_bufferram_offset(mtd, area);
 815
 816        if (ONENAND_CHECK_BYTE_ACCESS(count)) {
 817                unsigned short word;
 818                int byte_offset;
 819
 820                /* Align with word(16-bit) size */
 821                count--;
 822
 823                /* Calculate byte access offset */
 824                byte_offset = offset + count;
 825
 826                /* Read word and save byte */
 827                word = this->read_word(bufferram + byte_offset);
 828                word = (word & ~0xff) | buffer[count];
 829                this->write_word(word, bufferram + byte_offset);
 830        }
 831
 832        memcpy(bufferram + offset, buffer, count);
 833
 834        return 0;
 835}
 836
 837/**
 838 * onenand_get_2x_blockpage - [GENERIC] Get blockpage at 2x program mode
 839 * @param mtd           MTD data structure
 840 * @param addr          address to check
 841 * @return              blockpage address
 842 *
 843 * Get blockpage address at 2x program mode
 844 */
 845static int onenand_get_2x_blockpage(struct mtd_info *mtd, loff_t addr)
 846{
 847        struct onenand_chip *this = mtd->priv;
 848        int blockpage, block, page;
 849
 850        /* Calculate the even block number */
 851        block = (int) (addr >> this->erase_shift) & ~1;
 852        /* Is it the odd plane? */
 853        if (addr & this->writesize)
 854                block++;
 855        page = (int) (addr >> (this->page_shift + 1)) & this->page_mask;
 856        blockpage = (block << 7) | page;
 857
 858        return blockpage;
 859}
 860
 861/**
 862 * onenand_check_bufferram - [GENERIC] Check BufferRAM information
 863 * @param mtd           MTD data structure
 864 * @param addr          address to check
 865 * @return              1 if there are valid data, otherwise 0
 866 *
 867 * Check bufferram if there is data we required
 868 */
 869static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
 870{
 871        struct onenand_chip *this = mtd->priv;
 872        int blockpage, found = 0;
 873        unsigned int i;
 874
 875        if (ONENAND_IS_2PLANE(this))
 876                blockpage = onenand_get_2x_blockpage(mtd, addr);
 877        else
 878                blockpage = (int) (addr >> this->page_shift);
 879
 880        /* Is there valid data? */
 881        i = ONENAND_CURRENT_BUFFERRAM(this);
 882        if (this->bufferram[i].blockpage == blockpage)
 883                found = 1;
 884        else {
 885                /* Check another BufferRAM */
 886                i = ONENAND_NEXT_BUFFERRAM(this);
 887                if (this->bufferram[i].blockpage == blockpage) {
 888                        ONENAND_SET_NEXT_BUFFERRAM(this);
 889                        found = 1;
 890                }
 891        }
 892
 893        if (found && ONENAND_IS_DDP(this)) {
 894                /* Select DataRAM for DDP */
 895                int block = onenand_block(this, addr);
 896                int value = onenand_bufferram_address(this, block);
 897                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
 898        }
 899
 900        return found;
 901}
 902
 903/**
 904 * onenand_update_bufferram - [GENERIC] Update BufferRAM information
 905 * @param mtd           MTD data structure
 906 * @param addr          address to update
 907 * @param valid         valid flag
 908 *
 909 * Update BufferRAM information
 910 */
 911static void onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
 912                int valid)
 913{
 914        struct onenand_chip *this = mtd->priv;
 915        int blockpage;
 916        unsigned int i;
 917
 918        if (ONENAND_IS_2PLANE(this))
 919                blockpage = onenand_get_2x_blockpage(mtd, addr);
 920        else
 921                blockpage = (int) (addr >> this->page_shift);
 922
 923        /* Invalidate another BufferRAM */
 924        i = ONENAND_NEXT_BUFFERRAM(this);
 925        if (this->bufferram[i].blockpage == blockpage)
 926                this->bufferram[i].blockpage = -1;
 927
 928        /* Update BufferRAM */
 929        i = ONENAND_CURRENT_BUFFERRAM(this);
 930        if (valid)
 931                this->bufferram[i].blockpage = blockpage;
 932        else
 933                this->bufferram[i].blockpage = -1;
 934}
 935
 936/**
 937 * onenand_invalidate_bufferram - [GENERIC] Invalidate BufferRAM information
 938 * @param mtd           MTD data structure
 939 * @param addr          start address to invalidate
 940 * @param len           length to invalidate
 941 *
 942 * Invalidate BufferRAM information
 943 */
 944static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr,
 945                unsigned int len)
 946{
 947        struct onenand_chip *this = mtd->priv;
 948        int i;
 949        loff_t end_addr = addr + len;
 950
 951        /* Invalidate BufferRAM */
 952        for (i = 0; i < MAX_BUFFERRAM; i++) {
 953                loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift;
 954                if (buf_addr >= addr && buf_addr < end_addr)
 955                        this->bufferram[i].blockpage = -1;
 956        }
 957}
 958
 959/**
 960 * onenand_get_device - [GENERIC] Get chip for selected access
 961 * @param mtd           MTD device structure
 962 * @param new_state     the state which is requested
 963 *
 964 * Get the device and lock it for exclusive access
 965 */
 966static int onenand_get_device(struct mtd_info *mtd, int new_state)
 967{
 968        struct onenand_chip *this = mtd->priv;
 969        DECLARE_WAITQUEUE(wait, current);
 970
 971        /*
 972         * Grab the lock and see if the device is available
 973         */
 974        while (1) {
 975                spin_lock(&this->chip_lock);
 976                if (this->state == FL_READY) {
 977                        this->state = new_state;
 978                        spin_unlock(&this->chip_lock);
 979                        if (new_state != FL_PM_SUSPENDED && this->enable)
 980                                this->enable(mtd);
 981                        break;
 982                }
 983                if (new_state == FL_PM_SUSPENDED) {
 984                        spin_unlock(&this->chip_lock);
 985                        return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
 986                }
 987                set_current_state(TASK_UNINTERRUPTIBLE);
 988                add_wait_queue(&this->wq, &wait);
 989                spin_unlock(&this->chip_lock);
 990                schedule();
 991                remove_wait_queue(&this->wq, &wait);
 992        }
 993
 994        return 0;
 995}
 996
 997/**
 998 * onenand_release_device - [GENERIC] release chip
 999 * @param mtd           MTD device structure
1000 *
1001 * Deselect, release chip lock and wake up anyone waiting on the device
1002 */
1003static void onenand_release_device(struct mtd_info *mtd)
1004{
1005        struct onenand_chip *this = mtd->priv;
1006
1007        if (this->state != FL_PM_SUSPENDED && this->disable)
1008                this->disable(mtd);
1009        /* Release the chip */
1010        spin_lock(&this->chip_lock);
1011        this->state = FL_READY;
1012        wake_up(&this->wq);
1013        spin_unlock(&this->chip_lock);
1014}
1015
1016/**
1017 * onenand_transfer_auto_oob - [INTERN] oob auto-placement transfer
1018 * @param mtd           MTD device structure
1019 * @param buf           destination address
1020 * @param column        oob offset to read from
1021 * @param thislen       oob length to read
1022 */
1023static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int column,
1024                                int thislen)
1025{
1026        struct onenand_chip *this = mtd->priv;
1027        struct nand_oobfree *free;
1028        int readcol = column;
1029        int readend = column + thislen;
1030        int lastgap = 0;
1031        unsigned int i;
1032        uint8_t *oob_buf = this->oob_buf;
1033
1034        free = this->ecclayout->oobfree;
1035        for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1036                if (readcol >= lastgap)
1037                        readcol += free->offset - lastgap;
1038                if (readend >= lastgap)
1039                        readend += free->offset - lastgap;
1040                lastgap = free->offset + free->length;
1041        }
1042        this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1043        free = this->ecclayout->oobfree;
1044        for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1045                int free_end = free->offset + free->length;
1046                if (free->offset < readend && free_end > readcol) {
1047                        int st = max_t(int,free->offset,readcol);
1048                        int ed = min_t(int,free_end,readend);
1049                        int n = ed - st;
1050                        memcpy(buf, oob_buf + st, n);
1051                        buf += n;
1052                } else if (column == 0)
1053                        break;
1054        }
1055        return 0;
1056}
1057
1058/**
1059 * onenand_recover_lsb - [Flex-OneNAND] Recover LSB page data
1060 * @param mtd           MTD device structure
1061 * @param addr          address to recover
1062 * @param status        return value from onenand_wait / onenand_bbt_wait
1063 *
1064 * MLC NAND Flash cell has paired pages - LSB page and MSB page. LSB page has
1065 * lower page address and MSB page has higher page address in paired pages.
1066 * If power off occurs during MSB page program, the paired LSB page data can
1067 * become corrupt. LSB page recovery read is a way to read LSB page though page
1068 * data are corrupted. When uncorrectable error occurs as a result of LSB page
1069 * read after power up, issue LSB page recovery read.
1070 */
1071static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status)
1072{
1073        struct onenand_chip *this = mtd->priv;
1074        int i;
1075
1076        /* Recovery is only for Flex-OneNAND */
1077        if (!FLEXONENAND(this))
1078                return status;
1079
1080        /* check if we failed due to uncorrectable error */
1081        if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR)
1082                return status;
1083
1084        /* check if address lies in MLC region */
1085        i = flexonenand_region(mtd, addr);
1086        if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift))
1087                return status;
1088
1089        /* We are attempting to reread, so decrement stats.failed
1090         * which was incremented by onenand_wait due to read failure
1091         */
1092        printk(KERN_INFO "%s: Attempting to recover from uncorrectable read\n",
1093                __func__);
1094        mtd->ecc_stats.failed--;
1095
1096        /* Issue the LSB page recovery command */
1097        this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize);
1098        return this->wait(mtd, FL_READING);
1099}
1100
1101/**
1102 * onenand_mlc_read_ops_nolock - MLC OneNAND read main and/or out-of-band
1103 * @param mtd           MTD device structure
1104 * @param from          offset to read from
1105 * @param ops:          oob operation description structure
1106 *
1107 * MLC OneNAND / Flex-OneNAND has 4KB page size and 4KB dataram.
1108 * So, read-while-load is not present.
1109 */
1110static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1111                                struct mtd_oob_ops *ops)
1112{
1113        struct onenand_chip *this = mtd->priv;
1114        struct mtd_ecc_stats stats;
1115        size_t len = ops->len;
1116        size_t ooblen = ops->ooblen;
1117        u_char *buf = ops->datbuf;
1118        u_char *oobbuf = ops->oobbuf;
1119        int read = 0, column, thislen;
1120        int oobread = 0, oobcolumn, thisooblen, oobsize;
1121        int ret = 0;
1122        int writesize = this->writesize;
1123
1124        pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1125                        (int)len);
1126
1127        if (ops->mode == MTD_OPS_AUTO_OOB)
1128                oobsize = this->ecclayout->oobavail;
1129        else
1130                oobsize = mtd->oobsize;
1131
1132        oobcolumn = from & (mtd->oobsize - 1);
1133
1134        /* Do not allow reads past end of device */
1135        if (from + len > mtd->size) {
1136                printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1137                        __func__);
1138                ops->retlen = 0;
1139                ops->oobretlen = 0;
1140                return -EINVAL;
1141        }
1142
1143        stats = mtd->ecc_stats;
1144
1145        while (read < len) {
1146                cond_resched();
1147
1148                thislen = min_t(int, writesize, len - read);
1149
1150                column = from & (writesize - 1);
1151                if (column + thislen > writesize)
1152                        thislen = writesize - column;
1153
1154                if (!onenand_check_bufferram(mtd, from)) {
1155                        this->command(mtd, ONENAND_CMD_READ, from, writesize);
1156
1157                        ret = this->wait(mtd, FL_READING);
1158                        if (unlikely(ret))
1159                                ret = onenand_recover_lsb(mtd, from, ret);
1160                        onenand_update_bufferram(mtd, from, !ret);
1161                        if (mtd_is_eccerr(ret))
1162                                ret = 0;
1163                        if (ret)
1164                                break;
1165                }
1166
1167                this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1168                if (oobbuf) {
1169                        thisooblen = oobsize - oobcolumn;
1170                        thisooblen = min_t(int, thisooblen, ooblen - oobread);
1171
1172                        if (ops->mode == MTD_OPS_AUTO_OOB)
1173                                onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1174                        else
1175                                this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1176                        oobread += thisooblen;
1177                        oobbuf += thisooblen;
1178                        oobcolumn = 0;
1179                }
1180
1181                read += thislen;
1182                if (read == len)
1183                        break;
1184
1185                from += thislen;
1186                buf += thislen;
1187        }
1188
1189        /*
1190         * Return success, if no ECC failures, else -EBADMSG
1191         * fs driver will take care of that, because
1192         * retlen == desired len and result == -EBADMSG
1193         */
1194        ops->retlen = read;
1195        ops->oobretlen = oobread;
1196
1197        if (ret)
1198                return ret;
1199
1200        if (mtd->ecc_stats.failed - stats.failed)
1201                return -EBADMSG;
1202
1203        /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1204        return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1205}
1206
1207/**
1208 * onenand_read_ops_nolock - [OneNAND Interface] OneNAND read main and/or out-of-band
1209 * @param mtd           MTD device structure
1210 * @param from          offset to read from
1211 * @param ops:          oob operation description structure
1212 *
1213 * OneNAND read main and/or out-of-band data
1214 */
1215static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1216                                struct mtd_oob_ops *ops)
1217{
1218        struct onenand_chip *this = mtd->priv;
1219        struct mtd_ecc_stats stats;
1220        size_t len = ops->len;
1221        size_t ooblen = ops->ooblen;
1222        u_char *buf = ops->datbuf;
1223        u_char *oobbuf = ops->oobbuf;
1224        int read = 0, column, thislen;
1225        int oobread = 0, oobcolumn, thisooblen, oobsize;
1226        int ret = 0, boundary = 0;
1227        int writesize = this->writesize;
1228
1229        pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1230                        (int)len);
1231
1232        if (ops->mode == MTD_OPS_AUTO_OOB)
1233                oobsize = this->ecclayout->oobavail;
1234        else
1235                oobsize = mtd->oobsize;
1236
1237        oobcolumn = from & (mtd->oobsize - 1);
1238
1239        /* Do not allow reads past end of device */
1240        if ((from + len) > mtd->size) {
1241                printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1242                        __func__);
1243                ops->retlen = 0;
1244                ops->oobretlen = 0;
1245                return -EINVAL;
1246        }
1247
1248        stats = mtd->ecc_stats;
1249
1250        /* Read-while-load method */
1251
1252        /* Do first load to bufferRAM */
1253        if (read < len) {
1254                if (!onenand_check_bufferram(mtd, from)) {
1255                        this->command(mtd, ONENAND_CMD_READ, from, writesize);
1256                        ret = this->wait(mtd, FL_READING);
1257                        onenand_update_bufferram(mtd, from, !ret);
1258                        if (mtd_is_eccerr(ret))
1259                                ret = 0;
1260                }
1261        }
1262
1263        thislen = min_t(int, writesize, len - read);
1264        column = from & (writesize - 1);
1265        if (column + thislen > writesize)
1266                thislen = writesize - column;
1267
1268        while (!ret) {
1269                /* If there is more to load then start next load */
1270                from += thislen;
1271                if (read + thislen < len) {
1272                        this->command(mtd, ONENAND_CMD_READ, from, writesize);
1273                        /*
1274                         * Chip boundary handling in DDP
1275                         * Now we issued chip 1 read and pointed chip 1
1276                         * bufferram so we have to point chip 0 bufferram.
1277                         */
1278                        if (ONENAND_IS_DDP(this) &&
1279                            unlikely(from == (this->chipsize >> 1))) {
1280                                this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2);
1281                                boundary = 1;
1282                        } else
1283                                boundary = 0;
1284                        ONENAND_SET_PREV_BUFFERRAM(this);
1285                }
1286                /* While load is going, read from last bufferRAM */
1287                this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1288
1289                /* Read oob area if needed */
1290                if (oobbuf) {
1291                        thisooblen = oobsize - oobcolumn;
1292                        thisooblen = min_t(int, thisooblen, ooblen - oobread);
1293
1294                        if (ops->mode == MTD_OPS_AUTO_OOB)
1295                                onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1296                        else
1297                                this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1298                        oobread += thisooblen;
1299                        oobbuf += thisooblen;
1300                        oobcolumn = 0;
1301                }
1302
1303                /* See if we are done */
1304                read += thislen;
1305                if (read == len)
1306                        break;
1307                /* Set up for next read from bufferRAM */
1308                if (unlikely(boundary))
1309                        this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2);
1310                ONENAND_SET_NEXT_BUFFERRAM(this);
1311                buf += thislen;
1312                thislen = min_t(int, writesize, len - read);
1313                column = 0;
1314                cond_resched();
1315                /* Now wait for load */
1316                ret = this->wait(mtd, FL_READING);
1317                onenand_update_bufferram(mtd, from, !ret);
1318                if (mtd_is_eccerr(ret))
1319                        ret = 0;
1320        }
1321
1322        /*
1323         * Return success, if no ECC failures, else -EBADMSG
1324         * fs driver will take care of that, because
1325         * retlen == desired len and result == -EBADMSG
1326         */
1327        ops->retlen = read;
1328        ops->oobretlen = oobread;
1329
1330        if (ret)
1331                return ret;
1332
1333        if (mtd->ecc_stats.failed - stats.failed)
1334                return -EBADMSG;
1335
1336        /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1337        return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1338}
1339
1340/**
1341 * onenand_read_oob_nolock - [MTD Interface] OneNAND read out-of-band
1342 * @param mtd           MTD device structure
1343 * @param from          offset to read from
1344 * @param ops:          oob operation description structure
1345 *
1346 * OneNAND read out-of-band data from the spare area
1347 */
1348static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
1349                        struct mtd_oob_ops *ops)
1350{
1351        struct onenand_chip *this = mtd->priv;
1352        struct mtd_ecc_stats stats;
1353        int read = 0, thislen, column, oobsize;
1354        size_t len = ops->ooblen;
1355        unsigned int mode = ops->mode;
1356        u_char *buf = ops->oobbuf;
1357        int ret = 0, readcmd;
1358
1359        from += ops->ooboffs;
1360
1361        pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1362                        (int)len);
1363
1364        /* Initialize return length value */
1365        ops->oobretlen = 0;
1366
1367        if (mode == MTD_OPS_AUTO_OOB)
1368                oobsize = this->ecclayout->oobavail;
1369        else
1370                oobsize = mtd->oobsize;
1371
1372        column = from & (mtd->oobsize - 1);
1373
1374        if (unlikely(column >= oobsize)) {
1375                printk(KERN_ERR "%s: Attempted to start read outside oob\n",
1376                        __func__);
1377                return -EINVAL;
1378        }
1379
1380        /* Do not allow reads past end of device */
1381        if (unlikely(from >= mtd->size ||
1382                     column + len > ((mtd->size >> this->page_shift) -
1383                                     (from >> this->page_shift)) * oobsize)) {
1384                printk(KERN_ERR "%s: Attempted to read beyond end of device\n",
1385                        __func__);
1386                return -EINVAL;
1387        }
1388
1389        stats = mtd->ecc_stats;
1390
1391        readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1392
1393        while (read < len) {
1394                cond_resched();
1395
1396                thislen = oobsize - column;
1397                thislen = min_t(int, thislen, len);
1398
1399                this->command(mtd, readcmd, from, mtd->oobsize);
1400
1401                onenand_update_bufferram(mtd, from, 0);
1402
1403                ret = this->wait(mtd, FL_READING);
1404                if (unlikely(ret))
1405                        ret = onenand_recover_lsb(mtd, from, ret);
1406
1407                if (ret && !mtd_is_eccerr(ret)) {
1408                        printk(KERN_ERR "%s: read failed = 0x%x\n",
1409                                __func__, ret);
1410                        break;
1411                }
1412
1413                if (mode == MTD_OPS_AUTO_OOB)
1414                        onenand_transfer_auto_oob(mtd, buf, column, thislen);
1415                else
1416                        this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1417
1418                read += thislen;
1419
1420                if (read == len)
1421                        break;
1422
1423                buf += thislen;
1424
1425                /* Read more? */
1426                if (read < len) {
1427                        /* Page size */
1428                        from += mtd->writesize;
1429                        column = 0;
1430                }
1431        }
1432
1433        ops->oobretlen = read;
1434
1435        if (ret)
1436                return ret;
1437
1438        if (mtd->ecc_stats.failed - stats.failed)
1439                return -EBADMSG;
1440
1441        return 0;
1442}
1443
1444/**
1445 * onenand_read - [MTD Interface] Read data from flash
1446 * @param mtd           MTD device structure
1447 * @param from          offset to read from
1448 * @param len           number of bytes to read
1449 * @param retlen        pointer to variable to store the number of read bytes
1450 * @param buf           the databuffer to put data
1451 *
1452 * Read with ecc
1453*/
1454static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len,
1455        size_t *retlen, u_char *buf)
1456{
1457        struct onenand_chip *this = mtd->priv;
1458        struct mtd_oob_ops ops = {
1459                .len    = len,
1460                .ooblen = 0,
1461                .datbuf = buf,
1462                .oobbuf = NULL,
1463        };
1464        int ret;
1465
1466        onenand_get_device(mtd, FL_READING);
1467        ret = ONENAND_IS_4KB_PAGE(this) ?
1468                onenand_mlc_read_ops_nolock(mtd, from, &ops) :
1469                onenand_read_ops_nolock(mtd, from, &ops);
1470        onenand_release_device(mtd);
1471
1472        *retlen = ops.retlen;
1473        return ret;
1474}
1475
1476/**
1477 * onenand_read_oob - [MTD Interface] Read main and/or out-of-band
1478 * @param mtd:          MTD device structure
1479 * @param from:         offset to read from
1480 * @param ops:          oob operation description structure
1481
1482 * Read main and/or out-of-band
1483 */
1484static int onenand_read_oob(struct mtd_info *mtd, loff_t from,
1485                            struct mtd_oob_ops *ops)
1486{
1487        struct onenand_chip *this = mtd->priv;
1488        int ret;
1489
1490        switch (ops->mode) {
1491        case MTD_OPS_PLACE_OOB:
1492        case MTD_OPS_AUTO_OOB:
1493                break;
1494        case MTD_OPS_RAW:
1495                /* Not implemented yet */
1496        default:
1497                return -EINVAL;
1498        }
1499
1500        onenand_get_device(mtd, FL_READING);
1501        if (ops->datbuf)
1502                ret = ONENAND_IS_4KB_PAGE(this) ?
1503                        onenand_mlc_read_ops_nolock(mtd, from, ops) :
1504                        onenand_read_ops_nolock(mtd, from, ops);
1505        else
1506                ret = onenand_read_oob_nolock(mtd, from, ops);
1507        onenand_release_device(mtd);
1508
1509        return ret;
1510}
1511
1512/**
1513 * onenand_bbt_wait - [DEFAULT] wait until the command is done
1514 * @param mtd           MTD device structure
1515 * @param state         state to select the max. timeout value
1516 *
1517 * Wait for command done.
1518 */
1519static int onenand_bbt_wait(struct mtd_info *mtd, int state)
1520{
1521        struct onenand_chip *this = mtd->priv;
1522        unsigned long timeout;
1523        unsigned int interrupt, ctrl, ecc, addr1, addr8;
1524
1525        /* The 20 msec is enough */
1526        timeout = jiffies + msecs_to_jiffies(20);
1527        while (time_before(jiffies, timeout)) {
1528                interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1529                if (interrupt & ONENAND_INT_MASTER)
1530                        break;
1531        }
1532        /* To get correct interrupt status in timeout case */
1533        interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1534        ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
1535        addr1 = this->read_word(this->base + ONENAND_REG_START_ADDRESS1);
1536        addr8 = this->read_word(this->base + ONENAND_REG_START_ADDRESS8);
1537
1538        if (interrupt & ONENAND_INT_READ) {
1539                ecc = onenand_read_ecc(this);
1540                if (ecc & ONENAND_ECC_2BIT_ALL) {
1541                        printk(KERN_DEBUG "%s: ecc 0x%04x ctrl 0x%04x "
1542                               "intr 0x%04x addr1 %#x addr8 %#x\n",
1543                               __func__, ecc, ctrl, interrupt, addr1, addr8);
1544                        return ONENAND_BBT_READ_ECC_ERROR;
1545                }
1546        } else {
1547                printk(KERN_ERR "%s: read timeout! ctrl 0x%04x "
1548                       "intr 0x%04x addr1 %#x addr8 %#x\n",
1549                       __func__, ctrl, interrupt, addr1, addr8);
1550                return ONENAND_BBT_READ_FATAL_ERROR;
1551        }
1552
1553        /* Initial bad block case: 0x2400 or 0x0400 */
1554        if (ctrl & ONENAND_CTRL_ERROR) {
1555                printk(KERN_DEBUG "%s: ctrl 0x%04x intr 0x%04x addr1 %#x "
1556                       "addr8 %#x\n", __func__, ctrl, interrupt, addr1, addr8);
1557                return ONENAND_BBT_READ_ERROR;
1558        }
1559
1560        return 0;
1561}
1562
1563/**
1564 * onenand_bbt_read_oob - [MTD Interface] OneNAND read out-of-band for bbt scan
1565 * @param mtd           MTD device structure
1566 * @param from          offset to read from
1567 * @param ops           oob operation description structure
1568 *
1569 * OneNAND read out-of-band data from the spare area for bbt scan
1570 */
1571int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, 
1572                            struct mtd_oob_ops *ops)
1573{
1574        struct onenand_chip *this = mtd->priv;
1575        int read = 0, thislen, column;
1576        int ret = 0, readcmd;
1577        size_t len = ops->ooblen;
1578        u_char *buf = ops->oobbuf;
1579
1580        pr_debug("%s: from = 0x%08x, len = %zi\n", __func__, (unsigned int)from,
1581                        len);
1582
1583        /* Initialize return value */
1584        ops->oobretlen = 0;
1585
1586        /* Do not allow reads past end of device */
1587        if (unlikely((from + len) > mtd->size)) {
1588                printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1589                        __func__);
1590                return ONENAND_BBT_READ_FATAL_ERROR;
1591        }
1592
1593        /* Grab the lock and see if the device is available */
1594        onenand_get_device(mtd, FL_READING);
1595
1596        column = from & (mtd->oobsize - 1);
1597
1598        readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1599
1600        while (read < len) {
1601                cond_resched();
1602
1603                thislen = mtd->oobsize - column;
1604                thislen = min_t(int, thislen, len);
1605
1606                this->command(mtd, readcmd, from, mtd->oobsize);
1607
1608                onenand_update_bufferram(mtd, from, 0);
1609
1610                ret = this->bbt_wait(mtd, FL_READING);
1611                if (unlikely(ret))
1612                        ret = onenand_recover_lsb(mtd, from, ret);
1613
1614                if (ret)
1615                        break;
1616
1617                this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1618                read += thislen;
1619                if (read == len)
1620                        break;
1621
1622                buf += thislen;
1623
1624                /* Read more? */
1625                if (read < len) {
1626                        /* Update Page size */
1627                        from += this->writesize;
1628                        column = 0;
1629                }
1630        }
1631
1632        /* Deselect and wake up anyone waiting on the device */
1633        onenand_release_device(mtd);
1634
1635        ops->oobretlen = read;
1636        return ret;
1637}
1638
1639#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
1640/**
1641 * onenand_verify_oob - [GENERIC] verify the oob contents after a write
1642 * @param mtd           MTD device structure
1643 * @param buf           the databuffer to verify
1644 * @param to            offset to read from
1645 */
1646static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to)
1647{
1648        struct onenand_chip *this = mtd->priv;
1649        u_char *oob_buf = this->oob_buf;
1650        int status, i, readcmd;
1651
1652        readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1653
1654        this->command(mtd, readcmd, to, mtd->oobsize);
1655        onenand_update_bufferram(mtd, to, 0);
1656        status = this->wait(mtd, FL_READING);
1657        if (status)
1658                return status;
1659
1660        this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1661        for (i = 0; i < mtd->oobsize; i++)
1662                if (buf[i] != 0xFF && buf[i] != oob_buf[i])
1663                        return -EBADMSG;
1664
1665        return 0;
1666}
1667
1668/**
1669 * onenand_verify - [GENERIC] verify the chip contents after a write
1670 * @param mtd          MTD device structure
1671 * @param buf          the databuffer to verify
1672 * @param addr         offset to read from
1673 * @param len          number of bytes to read and compare
1674 */
1675static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr, size_t len)
1676{
1677        struct onenand_chip *this = mtd->priv;
1678        int ret = 0;
1679        int thislen, column;
1680
1681        column = addr & (this->writesize - 1);
1682
1683        while (len != 0) {
1684                thislen = min_t(int, this->writesize - column, len);
1685
1686                this->command(mtd, ONENAND_CMD_READ, addr, this->writesize);
1687
1688                onenand_update_bufferram(mtd, addr, 0);
1689
1690                ret = this->wait(mtd, FL_READING);
1691                if (ret)
1692                        return ret;
1693
1694                onenand_update_bufferram(mtd, addr, 1);
1695
1696                this->read_bufferram(mtd, ONENAND_DATARAM, this->verify_buf, 0, mtd->writesize);
1697
1698                if (memcmp(buf, this->verify_buf + column, thislen))
1699                        return -EBADMSG;
1700
1701                len -= thislen;
1702                buf += thislen;
1703                addr += thislen;
1704                column = 0;
1705        }
1706
1707        return 0;
1708}
1709#else
1710#define onenand_verify(...)             (0)
1711#define onenand_verify_oob(...)         (0)
1712#endif
1713
1714#define NOTALIGNED(x)   ((x & (this->subpagesize - 1)) != 0)
1715
1716static void onenand_panic_wait(struct mtd_info *mtd)
1717{
1718        struct onenand_chip *this = mtd->priv;
1719        unsigned int interrupt;
1720        int i;
1721        
1722        for (i = 0; i < 2000; i++) {
1723                interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1724                if (interrupt & ONENAND_INT_MASTER)
1725                        break;
1726                udelay(10);
1727        }
1728}
1729
1730/**
1731 * onenand_panic_write - [MTD Interface] write buffer to FLASH in a panic context
1732 * @param mtd           MTD device structure
1733 * @param to            offset to write to
1734 * @param len           number of bytes to write
1735 * @param retlen        pointer to variable to store the number of written bytes
1736 * @param buf           the data to write
1737 *
1738 * Write with ECC
1739 */
1740static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
1741                         size_t *retlen, const u_char *buf)
1742{
1743        struct onenand_chip *this = mtd->priv;
1744        int column, subpage;
1745        int written = 0;
1746        int ret = 0;
1747
1748        if (this->state == FL_PM_SUSPENDED)
1749                return -EBUSY;
1750
1751        /* Wait for any existing operation to clear */
1752        onenand_panic_wait(mtd);
1753
1754        pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1755                        (int)len);
1756
1757        /* Reject writes, which are not page aligned */
1758        if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1759                printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1760                        __func__);
1761                return -EINVAL;
1762        }
1763
1764        column = to & (mtd->writesize - 1);
1765
1766        /* Loop until all data write */
1767        while (written < len) {
1768                int thislen = min_t(int, mtd->writesize - column, len - written);
1769                u_char *wbuf = (u_char *) buf;
1770
1771                this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1772
1773                /* Partial page write */
1774                subpage = thislen < mtd->writesize;
1775                if (subpage) {
1776                        memset(this->page_buf, 0xff, mtd->writesize);
1777                        memcpy(this->page_buf + column, buf, thislen);
1778                        wbuf = this->page_buf;
1779                }
1780
1781                this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1782                this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize);
1783
1784                this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);
1785
1786                onenand_panic_wait(mtd);
1787
1788                /* In partial page write we don't update bufferram */
1789                onenand_update_bufferram(mtd, to, !ret && !subpage);
1790                if (ONENAND_IS_2PLANE(this)) {
1791                        ONENAND_SET_BUFFERRAM1(this);
1792                        onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage);
1793                }
1794
1795                if (ret) {
1796                        printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
1797                        break;
1798                }
1799
1800                written += thislen;
1801
1802                if (written == len)
1803                        break;
1804
1805                column = 0;
1806                to += thislen;
1807                buf += thislen;
1808        }
1809
1810        *retlen = written;
1811        return ret;
1812}
1813
1814/**
1815 * onenand_fill_auto_oob - [INTERN] oob auto-placement transfer
1816 * @param mtd           MTD device structure
1817 * @param oob_buf       oob buffer
1818 * @param buf           source address
1819 * @param column        oob offset to write to
1820 * @param thislen       oob length to write
1821 */
1822static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
1823                                  const u_char *buf, int column, int thislen)
1824{
1825        struct onenand_chip *this = mtd->priv;
1826        struct nand_oobfree *free;
1827        int writecol = column;
1828        int writeend = column + thislen;
1829        int lastgap = 0;
1830        unsigned int i;
1831
1832        free = this->ecclayout->oobfree;
1833        for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1834                if (writecol >= lastgap)
1835                        writecol += free->offset - lastgap;
1836                if (writeend >= lastgap)
1837                        writeend += free->offset - lastgap;
1838                lastgap = free->offset + free->length;
1839        }
1840        free = this->ecclayout->oobfree;
1841        for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1842                int free_end = free->offset + free->length;
1843                if (free->offset < writeend && free_end > writecol) {
1844                        int st = max_t(int,free->offset,writecol);
1845                        int ed = min_t(int,free_end,writeend);
1846                        int n = ed - st;
1847                        memcpy(oob_buf + st, buf, n);
1848                        buf += n;
1849                } else if (column == 0)
1850                        break;
1851        }
1852        return 0;
1853}
1854
1855/**
1856 * onenand_write_ops_nolock - [OneNAND Interface] write main and/or out-of-band
1857 * @param mtd           MTD device structure
1858 * @param to            offset to write to
1859 * @param ops           oob operation description structure
1860 *
1861 * Write main and/or oob with ECC
1862 */
1863static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
1864                                struct mtd_oob_ops *ops)
1865{
1866        struct onenand_chip *this = mtd->priv;
1867        int written = 0, column, thislen = 0, subpage = 0;
1868        int prev = 0, prevlen = 0, prev_subpage = 0, first = 1;
1869        int oobwritten = 0, oobcolumn, thisooblen, oobsize;
1870        size_t len = ops->len;
1871        size_t ooblen = ops->ooblen;
1872        const u_char *buf = ops->datbuf;
1873        const u_char *oob = ops->oobbuf;
1874        u_char *oobbuf;
1875        int ret = 0, cmd;
1876
1877        pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1878                        (int)len);
1879
1880        /* Initialize retlen, in case of early exit */
1881        ops->retlen = 0;
1882        ops->oobretlen = 0;
1883
1884        /* Reject writes, which are not page aligned */
1885        if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1886                printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1887                        __func__);
1888                return -EINVAL;
1889        }
1890
1891        /* Check zero length */
1892        if (!len)
1893                return 0;
1894
1895        if (ops->mode == MTD_OPS_AUTO_OOB)
1896                oobsize = this->ecclayout->oobavail;
1897        else
1898                oobsize = mtd->oobsize;
1899
1900        oobcolumn = to & (mtd->oobsize - 1);
1901
1902        column = to & (mtd->writesize - 1);
1903
1904        /* Loop until all data write */
1905        while (1) {
1906                if (written < len) {
1907                        u_char *wbuf = (u_char *) buf;
1908
1909                        thislen = min_t(int, mtd->writesize - column, len - written);
1910                        thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten);
1911
1912                        cond_resched();
1913
1914                        this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1915
1916                        /* Partial page write */
1917                        subpage = thislen < mtd->writesize;
1918                        if (subpage) {
1919                                memset(this->page_buf, 0xff, mtd->writesize);
1920                                memcpy(this->page_buf + column, buf, thislen);
1921                                wbuf = this->page_buf;
1922                        }
1923
1924                        this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1925
1926                        if (oob) {
1927                                oobbuf = this->oob_buf;
1928
1929                                /* We send data to spare ram with oobsize
1930                                 * to prevent byte access */
1931                                memset(oobbuf, 0xff, mtd->oobsize);
1932                                if (ops->mode == MTD_OPS_AUTO_OOB)
1933                                        onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
1934                                else
1935                                        memcpy(oobbuf + oobcolumn, oob, thisooblen);
1936
1937                                oobwritten += thisooblen;
1938                                oob += thisooblen;
1939                                oobcolumn = 0;
1940                        } else
1941                                oobbuf = (u_char *) ffchars;
1942
1943                        this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
1944                } else
1945                        ONENAND_SET_NEXT_BUFFERRAM(this);
1946
1947                /*
1948                 * 2 PLANE, MLC, and Flex-OneNAND do not support
1949                 * write-while-program feature.
1950                 */
1951                if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first) {
1952                        ONENAND_SET_PREV_BUFFERRAM(this);
1953
1954                        ret = this->wait(mtd, FL_WRITING);
1955
1956                        /* In partial page write we don't update bufferram */
1957                        onenand_update_bufferram(mtd, prev, !ret && !prev_subpage);
1958                        if (ret) {
1959                                written -= prevlen;
1960                                printk(KERN_ERR "%s: write failed %d\n",
1961                                        __func__, ret);
1962                                break;
1963                        }
1964
1965                        if (written == len) {
1966                                /* Only check verify write turn on */
1967                                ret = onenand_verify(mtd, buf - len, to - len, len);
1968                                if (ret)
1969                                        printk(KERN_ERR "%s: verify failed %d\n",
1970                                                __func__, ret);
1971                                break;
1972                        }
1973
1974                        ONENAND_SET_NEXT_BUFFERRAM(this);
1975                }
1976
1977                this->ongoing = 0;
1978                cmd = ONENAND_CMD_PROG;
1979
1980                /* Exclude 1st OTP and OTP blocks for cache program feature */
1981                if (ONENAND_IS_CACHE_PROGRAM(this) &&
1982                    likely(onenand_block(this, to) != 0) &&
1983                    ONENAND_IS_4KB_PAGE(this) &&
1984                    ((written + thislen) < len)) {
1985                        cmd = ONENAND_CMD_2X_CACHE_PROG;
1986                        this->ongoing = 1;
1987                }
1988
1989                this->command(mtd, cmd, to, mtd->writesize);
1990
1991                /*
1992                 * 2 PLANE, MLC, and Flex-OneNAND wait here
1993                 */
1994                if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) {
1995                        ret = this->wait(mtd, FL_WRITING);
1996
1997                        /* In partial page write we don't update bufferram */
1998                        onenand_update_bufferram(mtd, to, !ret && !subpage);
1999                        if (ret) {
2000                                printk(KERN_ERR "%s: write failed %d\n",
2001                                        __func__, ret);
2002                                break;
2003                        }
2004
2005                        /* Only check verify write turn on */
2006                        ret = onenand_verify(mtd, buf, to, thislen);
2007                        if (ret) {
2008                                printk(KERN_ERR "%s: verify failed %d\n",
2009                                        __func__, ret);
2010                                break;
2011                        }
2012
2013                        written += thislen;
2014
2015                        if (written == len)
2016                                break;
2017
2018                } else
2019                        written += thislen;
2020
2021                column = 0;
2022                prev_subpage = subpage;
2023                prev = to;
2024                prevlen = thislen;
2025                to += thislen;
2026                buf += thislen;
2027                first = 0;
2028        }
2029
2030        /* In error case, clear all bufferrams */
2031        if (written != len)
2032                onenand_invalidate_bufferram(mtd, 0, -1);
2033
2034        ops->retlen = written;
2035        ops->oobretlen = oobwritten;
2036
2037        return ret;
2038}
2039
2040
2041/**
2042 * onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band
2043 * @param mtd           MTD device structure
2044 * @param to            offset to write to
2045 * @param len           number of bytes to write
2046 * @param retlen        pointer to variable to store the number of written bytes
2047 * @param buf           the data to write
2048 * @param mode          operation mode
2049 *
2050 * OneNAND write out-of-band
2051 */
2052static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2053                                    struct mtd_oob_ops *ops)
2054{
2055        struct onenand_chip *this = mtd->priv;
2056        int column, ret = 0, oobsize;
2057        int written = 0, oobcmd;
2058        u_char *oobbuf;
2059        size_t len = ops->ooblen;
2060        const u_char *buf = ops->oobbuf;
2061        unsigned int mode = ops->mode;
2062
2063        to += ops->ooboffs;
2064
2065        pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
2066                        (int)len);
2067
2068        /* Initialize retlen, in case of early exit */
2069        ops->oobretlen = 0;
2070
2071        if (mode == MTD_OPS_AUTO_OOB)
2072                oobsize = this->ecclayout->oobavail;
2073        else
2074                oobsize = mtd->oobsize;
2075
2076        column = to & (mtd->oobsize - 1);
2077
2078        if (unlikely(column >= oobsize)) {
2079                printk(KERN_ERR "%s: Attempted to start write outside oob\n",
2080                        __func__);
2081                return -EINVAL;
2082        }
2083
2084        /* For compatibility with NAND: Do not allow write past end of page */
2085        if (unlikely(column + len > oobsize)) {
2086                printk(KERN_ERR "%s: Attempt to write past end of page\n",
2087                        __func__);
2088                return -EINVAL;
2089        }
2090
2091        /* Do not allow reads past end of device */
2092        if (unlikely(to >= mtd->size ||
2093                     column + len > ((mtd->size >> this->page_shift) -
2094                                     (to >> this->page_shift)) * oobsize)) {
2095                printk(KERN_ERR "%s: Attempted to write past end of device\n",
2096                       __func__);
2097                return -EINVAL;
2098        }
2099
2100        oobbuf = this->oob_buf;
2101
2102        oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB;
2103
2104        /* Loop until all data write */
2105        while (written < len) {
2106                int thislen = min_t(int, oobsize, len - written);
2107
2108                cond_resched();
2109
2110                this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize);
2111
2112                /* We send data to spare ram with oobsize
2113                 * to prevent byte access */
2114                memset(oobbuf, 0xff, mtd->oobsize);
2115                if (mode == MTD_OPS_AUTO_OOB)
2116                        onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
2117                else
2118                        memcpy(oobbuf + column, buf, thislen);
2119                this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
2120
2121                if (ONENAND_IS_4KB_PAGE(this)) {
2122                        /* Set main area of DataRAM to 0xff*/
2123                        memset(this->page_buf, 0xff, mtd->writesize);
2124                        this->write_bufferram(mtd, ONENAND_DATARAM,
2125                                         this->page_buf, 0, mtd->writesize);
2126                }
2127
2128                this->command(mtd, oobcmd, to, mtd->oobsize);
2129
2130                onenand_update_bufferram(mtd, to, 0);
2131                if (ONENAND_IS_2PLANE(this)) {
2132                        ONENAND_SET_BUFFERRAM1(this);
2133                        onenand_update_bufferram(mtd, to + this->writesize, 0);
2134                }
2135
2136                ret = this->wait(mtd, FL_WRITING);
2137                if (ret) {
2138                        printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2139                        break;
2140                }
2141
2142                ret = onenand_verify_oob(mtd, oobbuf, to);
2143                if (ret) {
2144                        printk(KERN_ERR "%s: verify failed %d\n",
2145                                __func__, ret);
2146                        break;
2147                }
2148
2149                written += thislen;
2150                if (written == len)
2151                        break;
2152
2153                to += mtd->writesize;
2154                buf += thislen;
2155                column = 0;
2156        }
2157
2158        ops->oobretlen = written;
2159
2160        return ret;
2161}
2162
2163/**
2164 * onenand_write - [MTD Interface] write buffer to FLASH
2165 * @param mtd           MTD device structure
2166 * @param to            offset to write to
2167 * @param len           number of bytes to write
2168 * @param retlen        pointer to variable to store the number of written bytes
2169 * @param buf           the data to write
2170 *
2171 * Write with ECC
2172 */
2173static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len,
2174        size_t *retlen, const u_char *buf)
2175{
2176        struct mtd_oob_ops ops = {
2177                .len    = len,
2178                .ooblen = 0,
2179                .datbuf = (u_char *) buf,
2180                .oobbuf = NULL,
2181        };
2182        int ret;
2183
2184        onenand_get_device(mtd, FL_WRITING);
2185        ret = onenand_write_ops_nolock(mtd, to, &ops);
2186        onenand_release_device(mtd);
2187
2188        *retlen = ops.retlen;
2189        return ret;
2190}
2191
2192/**
2193 * onenand_write_oob - [MTD Interface] NAND write data and/or out-of-band
2194 * @param mtd:          MTD device structure
2195 * @param to:           offset to write
2196 * @param ops:          oob operation description structure
2197 */
2198static int onenand_write_oob(struct mtd_info *mtd, loff_t to,
2199                             struct mtd_oob_ops *ops)
2200{
2201        int ret;
2202
2203        switch (ops->mode) {
2204        case MTD_OPS_PLACE_OOB:
2205        case MTD_OPS_AUTO_OOB:
2206                break;
2207        case MTD_OPS_RAW:
2208                /* Not implemented yet */
2209        default:
2210                return -EINVAL;
2211        }
2212
2213        onenand_get_device(mtd, FL_WRITING);
2214        if (ops->datbuf)
2215                ret = onenand_write_ops_nolock(mtd, to, ops);
2216        else
2217                ret = onenand_write_oob_nolock(mtd, to, ops);
2218        onenand_release_device(mtd);
2219
2220        return ret;
2221}
2222
2223/**
2224 * onenand_block_isbad_nolock - [GENERIC] Check if a block is marked bad
2225 * @param mtd           MTD device structure
2226 * @param ofs           offset from device start
2227 * @param allowbbt      1, if its allowed to access the bbt area
2228 *
2229 * Check, if the block is bad. Either by reading the bad block table or
2230 * calling of the scan function.
2231 */
2232static int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allowbbt)
2233{
2234        struct onenand_chip *this = mtd->priv;
2235        struct bbm_info *bbm = this->bbm;
2236
2237        /* Return info from the table */
2238        return bbm->isbad_bbt(mtd, ofs, allowbbt);
2239}
2240
2241
2242static int onenand_multiblock_erase_verify(struct mtd_info *mtd,
2243                                           struct erase_info *instr)
2244{
2245        struct onenand_chip *this = mtd->priv;
2246        loff_t addr = instr->addr;
2247        int len = instr->len;
2248        unsigned int block_size = (1 << this->erase_shift);
2249        int ret = 0;
2250
2251        while (len) {
2252                this->command(mtd, ONENAND_CMD_ERASE_VERIFY, addr, block_size);
2253                ret = this->wait(mtd, FL_VERIFYING_ERASE);
2254                if (ret) {
2255                        printk(KERN_ERR "%s: Failed verify, block %d\n",
2256                               __func__, onenand_block(this, addr));
2257                        instr->state = MTD_ERASE_FAILED;
2258                        instr->fail_addr = addr;
2259                        return -1;
2260                }
2261                len -= block_size;
2262                addr += block_size;
2263        }
2264        return 0;
2265}
2266
2267/**
2268 * onenand_multiblock_erase - [INTERN] erase block(s) using multiblock erase
2269 * @param mtd           MTD device structure
2270 * @param instr         erase instruction
2271 * @param region        erase region
2272 *
2273 * Erase one or more blocks up to 64 block at a time
2274 */
2275static int onenand_multiblock_erase(struct mtd_info *mtd,
2276                                    struct erase_info *instr,
2277                                    unsigned int block_size)
2278{
2279        struct onenand_chip *this = mtd->priv;
2280        loff_t addr = instr->addr;
2281        int len = instr->len;
2282        int eb_count = 0;
2283        int ret = 0;
2284        int bdry_block = 0;
2285
2286        instr->state = MTD_ERASING;
2287
2288        if (ONENAND_IS_DDP(this)) {
2289                loff_t bdry_addr = this->chipsize >> 1;
2290                if (addr < bdry_addr && (addr + len) > bdry_addr)
2291                        bdry_block = bdry_addr >> this->erase_shift;
2292        }
2293
2294        /* Pre-check bbs */
2295        while (len) {
2296                /* Check if we have a bad block, we do not erase bad blocks */
2297                if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2298                        printk(KERN_WARNING "%s: attempt to erase a bad block "
2299                               "at addr 0x%012llx\n",
2300                               __func__, (unsigned long long) addr);
2301                        instr->state = MTD_ERASE_FAILED;
2302                        return -EIO;
2303                }
2304                len -= block_size;
2305                addr += block_size;
2306        }
2307
2308        len = instr->len;
2309        addr = instr->addr;
2310
2311        /* loop over 64 eb batches */
2312        while (len) {
2313                struct erase_info verify_instr = *instr;
2314                int max_eb_count = MB_ERASE_MAX_BLK_COUNT;
2315
2316                verify_instr.addr = addr;
2317                verify_instr.len = 0;
2318
2319                /* do not cross chip boundary */
2320                if (bdry_block) {
2321                        int this_block = (addr >> this->erase_shift);
2322
2323                        if (this_block < bdry_block) {
2324                                max_eb_count = min(max_eb_count,
2325                                                   (bdry_block - this_block));
2326                        }
2327                }
2328
2329                eb_count = 0;
2330
2331                while (len > block_size && eb_count < (max_eb_count - 1)) {
2332                        this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE,
2333                                      addr, block_size);
2334                        onenand_invalidate_bufferram(mtd, addr, block_size);
2335
2336                        ret = this->wait(mtd, FL_PREPARING_ERASE);
2337                        if (ret) {
2338                                printk(KERN_ERR "%s: Failed multiblock erase, "
2339                                       "block %d\n", __func__,
2340                                       onenand_block(this, addr));
2341                                instr->state = MTD_ERASE_FAILED;
2342                                instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2343                                return -EIO;
2344                        }
2345
2346                        len -= block_size;
2347                        addr += block_size;
2348                        eb_count++;
2349                }
2350
2351                /* last block of 64-eb series */
2352                cond_resched();
2353                this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2354                onenand_invalidate_bufferram(mtd, addr, block_size);
2355
2356                ret = this->wait(mtd, FL_ERASING);
2357                /* Check if it is write protected */
2358                if (ret) {
2359                        printk(KERN_ERR "%s: Failed erase, block %d\n",
2360                               __func__, onenand_block(this, addr));
2361                        instr->state = MTD_ERASE_FAILED;
2362                        instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2363                        return -EIO;
2364                }
2365
2366                len -= block_size;
2367                addr += block_size;
2368                eb_count++;
2369
2370                /* verify */
2371                verify_instr.len = eb_count * block_size;
2372                if (onenand_multiblock_erase_verify(mtd, &verify_instr)) {
2373                        instr->state = verify_instr.state;
2374                        instr->fail_addr = verify_instr.fail_addr;
2375                        return -EIO;
2376                }
2377
2378        }
2379        return 0;
2380}
2381
2382
2383/**
2384 * onenand_block_by_block_erase - [INTERN] erase block(s) using regular erase
2385 * @param mtd           MTD device structure
2386 * @param instr         erase instruction
2387 * @param region        erase region
2388 * @param block_size    erase block size
2389 *
2390 * Erase one or more blocks one block at a time
2391 */
2392static int onenand_block_by_block_erase(struct mtd_info *mtd,
2393                                        struct erase_info *instr,
2394                                        struct mtd_erase_region_info *region,
2395                                        unsigned int block_size)
2396{
2397        struct onenand_chip *this = mtd->priv;
2398        loff_t addr = instr->addr;
2399        int len = instr->len;
2400        loff_t region_end = 0;
2401        int ret = 0;
2402
2403        if (region) {
2404                /* region is set for Flex-OneNAND */
2405                region_end = region->offset + region->erasesize * region->numblocks;
2406        }
2407
2408        instr->state = MTD_ERASING;
2409
2410        /* Loop through the blocks */
2411        while (len) {
2412                cond_resched();
2413
2414                /* Check if we have a bad block, we do not erase bad blocks */
2415                if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2416                        printk(KERN_WARNING "%s: attempt to erase a bad block "
2417                                        "at addr 0x%012llx\n",
2418                                        __func__, (unsigned long long) addr);
2419                        instr->state = MTD_ERASE_FAILED;
2420                        return -EIO;
2421                }
2422
2423                this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2424
2425                onenand_invalidate_bufferram(mtd, addr, block_size);
2426
2427                ret = this->wait(mtd, FL_ERASING);
2428                /* Check, if it is write protected */
2429                if (ret) {
2430                        printk(KERN_ERR "%s: Failed erase, block %d\n",
2431                                __func__, onenand_block(this, addr));
2432                        instr->state = MTD_ERASE_FAILED;
2433                        instr->fail_addr = addr;
2434                        return -EIO;
2435                }
2436
2437                len -= block_size;
2438                addr += block_size;
2439
2440                if (region && addr == region_end) {
2441                        if (!len)
2442                                break;
2443                        region++;
2444
2445                        block_size = region->erasesize;
2446                        region_end = region->offset + region->erasesize * region->numblocks;
2447
2448                        if (len & (block_size - 1)) {
2449                                /* FIXME: This should be handled at MTD partitioning level. */
2450                                printk(KERN_ERR "%s: Unaligned address\n",
2451                                        __func__);
2452                                return -EIO;
2453                        }
2454                }
2455        }
2456        return 0;
2457}
2458
2459/**
2460 * onenand_erase - [MTD Interface] erase block(s)
2461 * @param mtd           MTD device structure
2462 * @param instr         erase instruction
2463 *
2464 * Erase one or more blocks
2465 */
2466static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
2467{
2468        struct onenand_chip *this = mtd->priv;
2469        unsigned int block_size;
2470        loff_t addr = instr->addr;
2471        loff_t len = instr->len;
2472        int ret = 0;
2473        struct mtd_erase_region_info *region = NULL;
2474        loff_t region_offset = 0;
2475
2476        pr_debug("%s: start=0x%012llx, len=%llu\n", __func__,
2477                        (unsigned long long)instr->addr,
2478                        (unsigned long long)instr->len);
2479
2480        if (FLEXONENAND(this)) {
2481                /* Find the eraseregion of this address */
2482                int i = flexonenand_region(mtd, addr);
2483
2484                region = &mtd->eraseregions[i];
2485                block_size = region->erasesize;
2486
2487                /* Start address within region must align on block boundary.
2488                 * Erase region's start offset is always block start address.
2489                 */
2490                region_offset = region->offset;
2491        } else
2492                block_size = 1 << this->erase_shift;
2493
2494        /* Start address must align on block boundary */
2495        if (unlikely((addr - region_offset) & (block_size - 1))) {
2496                printk(KERN_ERR "%s: Unaligned address\n", __func__);
2497                return -EINVAL;
2498        }
2499
2500        /* Length must align on block boundary */
2501        if (unlikely(len & (block_size - 1))) {
2502                printk(KERN_ERR "%s: Length not block aligned\n", __func__);
2503                return -EINVAL;
2504        }
2505
2506        /* Grab the lock and see if the device is available */
2507        onenand_get_device(mtd, FL_ERASING);
2508
2509        if (ONENAND_IS_4KB_PAGE(this) || region ||
2510            instr->len < MB_ERASE_MIN_BLK_COUNT * block_size) {
2511                /* region is set for Flex-OneNAND (no mb erase) */
2512                ret = onenand_block_by_block_erase(mtd, instr,
2513                                                   region, block_size);
2514        } else {
2515                ret = onenand_multiblock_erase(mtd, instr, block_size);
2516        }
2517
2518        /* Deselect and wake up anyone waiting on the device */
2519        onenand_release_device(mtd);
2520
2521        /* Do call back function */
2522        if (!ret) {
2523                instr->state = MTD_ERASE_DONE;
2524                mtd_erase_callback(instr);
2525        }
2526
2527        return ret;
2528}
2529
2530/**
2531 * onenand_sync - [MTD Interface] sync
2532 * @param mtd           MTD device structure
2533 *
2534 * Sync is actually a wait for chip ready function
2535 */
2536static void onenand_sync(struct mtd_info *mtd)
2537{
2538        pr_debug("%s: called\n", __func__);
2539
2540        /* Grab the lock and see if the device is available */
2541        onenand_get_device(mtd, FL_SYNCING);
2542
2543        /* Release it and go back */
2544        onenand_release_device(mtd);
2545}
2546
2547/**
2548 * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
2549 * @param mtd           MTD device structure
2550 * @param ofs           offset relative to mtd start
2551 *
2552 * Check whether the block is bad
2553 */
2554static int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs)
2555{
2556        int ret;
2557
2558        onenand_get_device(mtd, FL_READING);
2559        ret = onenand_block_isbad_nolock(mtd, ofs, 0);
2560        onenand_release_device(mtd);
2561        return ret;
2562}
2563
2564/**
2565 * onenand_default_block_markbad - [DEFAULT] mark a block bad
2566 * @param mtd           MTD device structure
2567 * @param ofs           offset from device start
2568 *
2569 * This is the default implementation, which can be overridden by
2570 * a hardware specific driver.
2571 */
2572static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
2573{
2574        struct onenand_chip *this = mtd->priv;
2575        struct bbm_info *bbm = this->bbm;
2576        u_char buf[2] = {0, 0};
2577        struct mtd_oob_ops ops = {
2578                .mode = MTD_OPS_PLACE_OOB,
2579                .ooblen = 2,
2580                .oobbuf = buf,
2581                .ooboffs = 0,
2582        };
2583        int block;
2584
2585        /* Get block number */
2586        block = onenand_block(this, ofs);
2587        if (bbm->bbt)
2588                bbm->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
2589
2590        /* We write two bytes, so we don't have to mess with 16-bit access */
2591        ofs += mtd->oobsize + (bbm->badblockpos & ~0x01);
2592        /* FIXME : What to do when marking SLC block in partition
2593         *         with MLC erasesize? For now, it is not advisable to
2594         *         create partitions containing both SLC and MLC regions.
2595         */
2596        return onenand_write_oob_nolock(mtd, ofs, &ops);
2597}
2598
2599/**
2600 * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
2601 * @param mtd           MTD device structure
2602 * @param ofs           offset relative to mtd start
2603 *
2604 * Mark the block as bad
2605 */
2606static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
2607{
2608        int ret;
2609
2610        ret = onenand_block_isbad(mtd, ofs);
2611        if (ret) {
2612                /* If it was bad already, return success and do nothing */
2613                if (ret > 0)
2614                        return 0;
2615                return ret;
2616        }
2617
2618        onenand_get_device(mtd, FL_WRITING);
2619        ret = mtd_block_markbad(mtd, ofs);
2620        onenand_release_device(mtd);
2621        return ret;
2622}
2623
2624/**
2625 * onenand_do_lock_cmd - [OneNAND Interface] Lock or unlock block(s)
2626 * @param mtd           MTD device structure
2627 * @param ofs           offset relative to mtd start
2628 * @param len           number of bytes to lock or unlock
2629 * @param cmd           lock or unlock command
2630 *
2631 * Lock or unlock one or more blocks
2632 */
2633static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int cmd)
2634{
2635        struct onenand_chip *this = mtd->priv;
2636        int start, end, block, value, status;
2637        int wp_status_mask;
2638
2639        start = onenand_block(this, ofs);
2640        end = onenand_block(this, ofs + len) - 1;
2641
2642        if (cmd == ONENAND_CMD_LOCK)
2643                wp_status_mask = ONENAND_WP_LS;
2644        else
2645                wp_status_mask = ONENAND_WP_US;
2646
2647        /* Continuous lock scheme */
2648        if (this->options & ONENAND_HAS_CONT_LOCK) {
2649                /* Set start block address */
2650                this->write_word(start, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2651                /* Set end block address */
2652                this->write_word(end, this->base +  ONENAND_REG_END_BLOCK_ADDRESS);
2653                /* Write lock command */
2654                this->command(mtd, cmd, 0, 0);
2655
2656                /* There's no return value */
2657                this->wait(mtd, FL_LOCKING);
2658
2659                /* Sanity check */
2660                while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2661                    & ONENAND_CTRL_ONGO)
2662                        continue;
2663
2664                /* Check lock status */
2665                status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2666                if (!(status & wp_status_mask))
2667                        printk(KERN_ERR "%s: wp status = 0x%x\n",
2668                                __func__, status);
2669
2670                return 0;
2671        }
2672
2673        /* Block lock scheme */
2674        for (block = start; block < end + 1; block++) {
2675                /* Set block address */
2676                value = onenand_block_address(this, block);
2677                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2678                /* Select DataRAM for DDP */
2679                value = onenand_bufferram_address(this, block);
2680                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2681                /* Set start block address */
2682                this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2683                /* Write lock command */
2684                this->command(mtd, cmd, 0, 0);
2685
2686                /* There's no return value */
2687                this->wait(mtd, FL_LOCKING);
2688
2689                /* Sanity check */
2690                while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2691                    & ONENAND_CTRL_ONGO)
2692                        continue;
2693
2694                /* Check lock status */
2695                status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2696                if (!(status & wp_status_mask))
2697                        printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2698                                __func__, block, status);
2699        }
2700
2701        return 0;
2702}
2703
2704/**
2705 * onenand_lock - [MTD Interface] Lock block(s)
2706 * @param mtd           MTD device structure
2707 * @param ofs           offset relative to mtd start
2708 * @param len           number of bytes to unlock
2709 *
2710 * Lock one or more blocks
2711 */
2712static int onenand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2713{
2714        int ret;
2715
2716        onenand_get_device(mtd, FL_LOCKING);
2717        ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK);
2718        onenand_release_device(mtd);
2719        return ret;
2720}
2721
2722/**
2723 * onenand_unlock - [MTD Interface] Unlock block(s)
2724 * @param mtd           MTD device structure
2725 * @param ofs           offset relative to mtd start
2726 * @param len           number of bytes to unlock
2727 *
2728 * Unlock one or more blocks
2729 */
2730static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2731{
2732        int ret;
2733
2734        onenand_get_device(mtd, FL_LOCKING);
2735        ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2736        onenand_release_device(mtd);
2737        return ret;
2738}
2739
2740/**
2741 * onenand_check_lock_status - [OneNAND Interface] Check lock status
2742 * @param this          onenand chip data structure
2743 *
2744 * Check lock status
2745 */
2746static int onenand_check_lock_status(struct onenand_chip *this)
2747{
2748        unsigned int value, block, status;
2749        unsigned int end;
2750
2751        end = this->chipsize >> this->erase_shift;
2752        for (block = 0; block < end; block++) {
2753                /* Set block address */
2754                value = onenand_block_address(this, block);
2755                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2756                /* Select DataRAM for DDP */
2757                value = onenand_bufferram_address(this, block);
2758                this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2759                /* Set start block address */
2760                this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2761
2762                /* Check lock status */
2763                status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2764                if (!(status & ONENAND_WP_US)) {
2765                        printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2766                                __func__, block, status);
2767                        return 0;
2768                }
2769        }
2770
2771        return 1;
2772}
2773
2774/**
2775 * onenand_unlock_all - [OneNAND Interface] unlock all blocks
2776 * @param mtd           MTD device structure
2777 *
2778 * Unlock all blocks
2779 */
2780static void onenand_unlock_all(struct mtd_info *mtd)
2781{
2782        struct onenand_chip *this = mtd->priv;
2783        loff_t ofs = 0;
2784        loff_t len = mtd->size;
2785
2786        if (this->options & ONENAND_HAS_UNLOCK_ALL) {
2787                /* Set start block address */
2788                this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2789                /* Write unlock command */
2790                this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0);
2791
2792                /* There's no return value */
2793                this->wait(mtd, FL_LOCKING);
2794
2795                /* Sanity check */
2796                while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2797                    & ONENAND_CTRL_ONGO)
2798                        continue;
2799
2800                /* Don't check lock status */
2801                if (this->options & ONENAND_SKIP_UNLOCK_CHECK)
2802                        return;
2803
2804                /* Check lock status */
2805                if (onenand_check_lock_status(this))
2806                        return;
2807
2808                /* Workaround for all block unlock in DDP */
2809                if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) {
2810                        /* All blocks on another chip */
2811                        ofs = this->chipsize >> 1;
2812                        len = this->chipsize >> 1;
2813                }
2814        }
2815
2816        onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2817}
2818
2819#ifdef CONFIG_MTD_ONENAND_OTP
2820
2821/**
2822 * onenand_otp_command - Send OTP specific command to OneNAND device
2823 * @param mtd    MTD device structure
2824 * @param cmd    the command to be sent
2825 * @param addr   offset to read from or write to
2826 * @param len    number of bytes to read or write
2827 */
2828static int onenand_otp_command(struct mtd_info *mtd, int cmd, loff_t addr,
2829                                size_t len)
2830{
2831        struct onenand_chip *this = mtd->priv;
2832        int value, block, page;
2833
2834        /* Address translation */
2835        switch (cmd) {
2836        case ONENAND_CMD_OTP_ACCESS:
2837                block = (int) (addr >> this->erase_shift);
2838                page = -1;
2839                break;
2840
2841        default:
2842                block = (int) (addr >> this->erase_shift);
2843                page = (int) (addr >> this->page_shift);
2844
2845                if (ONENAND_IS_2PLANE(this)) {
2846                        /* Make the even block number */
2847                        block &= ~1;
2848                        /* Is it the odd plane? */
2849                        if (addr & this->writesize)
2850                                block++;
2851                        page >>= 1;
2852                }
2853                page &= this->page_mask;
2854                break;
2855        }
2856
2857        if (block != -1) {
2858                /* Write 'DFS, FBA' of Flash */
2859                value = onenand_block_address(this, block);
2860                this->write_word(value, this->base +
2861                                ONENAND_REG_START_ADDRESS1);
2862        }
2863
2864        if (page != -1) {
2865                /* Now we use page size operation */
2866                int sectors = 4, count = 4;
2867                int dataram;
2868
2869                switch (cmd) {
2870                default:
2871                        if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
2872                                cmd = ONENAND_CMD_2X_PROG;
2873                        dataram = ONENAND_CURRENT_BUFFERRAM(this);
2874                        break;
2875                }
2876
2877                /* Write 'FPA, FSA' of Flash */
2878                value = onenand_page_address(page, sectors);
2879                this->write_word(value, this->base +
2880                                ONENAND_REG_START_ADDRESS8);
2881
2882                /* Write 'BSA, BSC' of DataRAM */
2883                value = onenand_buffer_address(dataram, sectors, count);
2884                this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
2885        }
2886
2887        /* Interrupt clear */
2888        this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
2889
2890        /* Write command */
2891        this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
2892
2893        return 0;
2894}
2895
2896/**
2897 * onenand_otp_write_oob_nolock - [INTERN] OneNAND write out-of-band, specific to OTP
2898 * @param mtd           MTD device structure
2899 * @param to            offset to write to
2900 * @param len           number of bytes to write
2901 * @param retlen        pointer to variable to store the number of written bytes
2902 * @param buf           the data to write
2903 *
2904 * OneNAND write out-of-band only for OTP
2905 */
2906static int onenand_otp_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2907                                    struct mtd_oob_ops *ops)
2908{
2909        struct onenand_chip *this = mtd->priv;
2910        int column, ret = 0, oobsize;
2911        int written = 0;
2912        u_char *oobbuf;
2913        size_t len = ops->ooblen;
2914        const u_char *buf = ops->oobbuf;
2915        int block, value, status;
2916
2917        to += ops->ooboffs;
2918
2919        /* Initialize retlen, in case of early exit */
2920        ops->oobretlen = 0;
2921
2922        oobsize = mtd->oobsize;
2923
2924        column = to & (mtd->oobsize - 1);
2925
2926        oobbuf = this->oob_buf;
2927
2928        /* Loop until all data write */
2929        while (written < len) {
2930                int thislen = min_t(int, oobsize, len - written);
2931
2932                cond_resched();
2933
2934                block = (int) (to >> this->erase_shift);
2935                /*
2936                 * Write 'DFS, FBA' of Flash
2937                 * Add: F100h DQ=DFS, FBA
2938                 */
2939
2940                value = onenand_block_address(this, block);
2941                this->write_word(value, this->base +
2942                                ONENAND_REG_START_ADDRESS1);
2943
2944                /*
2945                 * Select DataRAM for DDP
2946                 * Add: F101h DQ=DBS
2947                 */
2948
2949                value = onenand_bufferram_address(this, block);
2950                this->write_word(value, this->base +
2951                                ONENAND_REG_START_ADDRESS2);
2952                ONENAND_SET_NEXT_BUFFERRAM(this);
2953
2954                /*
2955                 * Enter OTP access mode
2956                 */
2957                this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
2958                this->wait(mtd, FL_OTPING);
2959
2960                /* We send data to spare ram with oobsize
2961                 * to prevent byte access */
2962                memcpy(oobbuf + column, buf, thislen);
2963
2964                /*
2965                 * Write Data into DataRAM
2966                 * Add: 8th Word
2967                 * in sector0/spare/page0
2968                 * DQ=XXFCh
2969                 */
2970                this->write_bufferram(mtd, ONENAND_SPARERAM,
2971                                        oobbuf, 0, mtd->oobsize);
2972
2973                onenand_otp_command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize);
2974                onenand_update_bufferram(mtd, to, 0);
2975                if (ONENAND_IS_2PLANE(this)) {
2976                        ONENAND_SET_BUFFERRAM1(this);
2977                        onenand_update_bufferram(mtd, to + this->writesize, 0);
2978                }
2979
2980                ret = this->wait(mtd, FL_WRITING);
2981                if (ret) {
2982                        printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2983                        break;
2984                }
2985
2986                /* Exit OTP access mode */
2987                this->command(mtd, ONENAND_CMD_RESET, 0, 0);
2988                this->wait(mtd, FL_RESETING);
2989
2990                status = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
2991                status &= 0x60;
2992
2993                if (status == 0x60) {
2994                        printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2995                        printk(KERN_DEBUG "1st Block\tLOCKED\n");
2996                        printk(KERN_DEBUG "OTP Block\tLOCKED\n");
2997                } else if (status == 0x20) {
2998                        printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2999                        printk(KERN_DEBUG "1st Block\tLOCKED\n");
3000                        printk(KERN_DEBUG "OTP Block\tUN-LOCKED\n");
3001                } else if (status == 0x40) {
3002                        printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
3003                        printk(KERN_DEBUG "1st Block\tUN-LOCKED\n");
3004                        printk(KERN_DEBUG "OTP Block\tLOCKED\n");
3005                } else {
3006                        printk(KERN_DEBUG "Reboot to check\n");
3007                }
3008
3009                written += thislen;
3010                if (written == len)
3011                        break;
3012
3013                to += mtd->writesize;
3014                buf += thislen;
3015                column = 0;
3016        }
3017
3018        ops->oobretlen = written;
3019
3020        return ret;
3021}
3022
3023/* Internal OTP operation */
3024typedef int (*otp_op_t)(struct mtd_info *mtd, loff_t form, size_t len,
3025                size_t *retlen, u_char *buf);
3026
3027/**
3028 * do_otp_read - [DEFAULT] Read OTP block area
3029 * @param mtd           MTD device structure
3030 * @param from          The offset to read
3031 * @param len           number of bytes to read
3032 * @param retlen        pointer to variable to store the number of readbytes
3033 * @param buf           the databuffer to put/get data
3034 *
3035 * Read OTP block area.
3036 */
3037static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
3038                size_t *retlen, u_char *buf)
3039{
3040        struct onenand_chip *this = mtd->priv;
3041        struct mtd_oob_ops ops = {
3042                .len    = len,
3043                .ooblen = 0,
3044                .datbuf = buf,
3045                .oobbuf = NULL,
3046        };
3047        int ret;
3048
3049        /* Enter OTP access mode */
3050        this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3051        this->wait(mtd, FL_OTPING);
3052
3053        ret = ONENAND_IS_4KB_PAGE(this) ?
3054                onenand_mlc_read_ops_nolock(mtd, from, &ops) :
3055                onenand_read_ops_nolock(mtd, from, &ops);
3056
3057        /* Exit OTP access mode */
3058        this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3059        this->wait(mtd, FL_RESETING);
3060
3061        return ret;
3062}
3063
3064/**
3065 * do_otp_write - [DEFAULT] Write OTP block area
3066 * @param mtd           MTD device structure
3067 * @param to            The offset to write
3068 * @param len           number of bytes to write
3069 * @param retlen        pointer to variable to store the number of write bytes
3070 * @param buf           the databuffer to put/get data
3071 *
3072 * Write OTP block area.
3073 */
3074static int do_otp_write(struct mtd_info *mtd, loff_t to, size_t len,
3075                size_t *retlen, u_char *buf)
3076{
3077        struct onenand_chip *this = mtd->priv;
3078        unsigned char *pbuf = buf;
3079        int ret;
3080        struct mtd_oob_ops ops;
3081
3082        /* Force buffer page aligned */
3083        if (len < mtd->writesize) {
3084                memcpy(this->page_buf, buf, len);
3085                memset(this->page_buf + len, 0xff, mtd->writesize - len);
3086                pbuf = this->page_buf;
3087                len = mtd->writesize;
3088        }
3089
3090        /* Enter OTP access mode */
3091        this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3092        this->wait(mtd, FL_OTPING);
3093
3094        ops.len = len;
3095        ops.ooblen = 0;
3096        ops.datbuf = pbuf;
3097        ops.oobbuf = NULL;
3098        ret = onenand_write_ops_nolock(mtd, to, &ops);
3099        *retlen = ops.retlen;
3100
3101        /* Exit OTP access mode */
3102        this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3103        this->wait(mtd, FL_RESETING);
3104
3105        return ret;
3106}
3107
3108/**
3109 * do_otp_lock - [DEFAULT] Lock OTP block area
3110 * @param mtd           MTD device structure
3111 * @param from          The offset to lock
3112 * @param len           number of bytes to lock
3113 * @param retlen        pointer to variable to store the number of lock bytes
3114 * @param buf           the databuffer to put/get data
3115 *
3116 * Lock OTP block area.
3117 */
3118static int do_otp_lock(struct mtd_info *mtd, loff_t from, size_t len,
3119                size_t *retlen, u_char *buf)
3120{
3121        struct onenand_chip *this = mtd->priv;
3122        struct mtd_oob_ops ops;
3123        int ret;
3124
3125        if (FLEXONENAND(this)) {
3126
3127                /* Enter OTP access mode */
3128                this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3129                this->wait(mtd, FL_OTPING);
3130                /*
3131                 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3132                 * main area of page 49.
3133                 */
3134                ops.len = mtd->writesize;
3135                ops.ooblen = 0;
3136                ops.datbuf = buf;
3137                ops.oobbuf = NULL;
3138                ret = onenand_write_ops_nolock(mtd, mtd->writesize * 49, &ops);
3139                *retlen = ops.retlen;
3140
3141                /* Exit OTP access mode */
3142                this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3143                this->wait(mtd, FL_RESETING);
3144        } else {
3145                ops.mode = MTD_OPS_PLACE_OOB;
3146                ops.ooblen = len;
3147                ops.oobbuf = buf;
3148                ops.ooboffs = 0;
3149                ret = onenand_otp_write_oob_nolock(mtd, from, &ops);
3150                *retlen = ops.oobretlen;
3151        }
3152
3153        return ret;
3154}
3155
3156/**
3157 * onenand_otp_walk - [DEFAULT] Handle OTP operation
3158 * @param mtd           MTD device structure
3159 * @param from          The offset to read/write
3160 * @param len           number of bytes to read/write
3161 * @param retlen        pointer to variable to store the number of read bytes
3162 * @param buf           the databuffer to put/get data
3163 * @param action        do given action
3164 * @param mode          specify user and factory
3165 *
3166 * Handle OTP operation.
3167 */
3168static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
3169                        size_t *retlen, u_char *buf,
3170                        otp_op_t action, int mode)
3171{
3172        struct onenand_chip *this = mtd->priv;
3173        int otp_pages;
3174        int density;
3175        int ret = 0;
3176
3177        *retlen = 0;
3178
3179        density = onenand_get_density(this->device_id);
3180        if (density < ONENAND_DEVICE_DENSITY_512Mb)
3181                otp_pages = 20;
3182        else
3183                otp_pages = 50;
3184
3185        if (mode == MTD_OTP_FACTORY) {
3186                from += mtd->writesize * otp_pages;
3187                otp_pages = ONENAND_PAGES_PER_BLOCK - otp_pages;
3188        }
3189
3190        /* Check User/Factory boundary */
3191        if (mode == MTD_OTP_USER) {
3192                if (mtd->writesize * otp_pages < from + len)
3193                        return 0;
3194        } else {
3195                if (mtd->writesize * otp_pages <  len)
3196                        return 0;
3197        }
3198
3199        onenand_get_device(mtd, FL_OTPING);
3200        while (len > 0 && otp_pages > 0) {
3201                if (!action) {  /* OTP Info functions */
3202                        struct otp_info *otpinfo;
3203
3204                        len -= sizeof(struct otp_info);
3205                        if (len <= 0) {
3206                                ret = -ENOSPC;
3207                                break;
3208                        }
3209
3210                        otpinfo = (struct otp_info *) buf;
3211                        otpinfo->start = from;
3212                        otpinfo->length = mtd->writesize;
3213                        otpinfo->locked = 0;
3214
3215                        from += mtd->writesize;
3216                        buf += sizeof(struct otp_info);
3217                        *retlen += sizeof(struct otp_info);
3218                } else {
3219                        size_t tmp_retlen;
3220
3221                        ret = action(mtd, from, len, &tmp_retlen, buf);
3222
3223                        buf += tmp_retlen;
3224                        len -= tmp_retlen;
3225                        *retlen += tmp_retlen;
3226
3227                        if (ret)
3228                                break;
3229                }
3230                otp_pages--;
3231        }
3232        onenand_release_device(mtd);
3233
3234        return ret;
3235}
3236
3237/**
3238 * onenand_get_fact_prot_info - [MTD Interface] Read factory OTP info
3239 * @param mtd           MTD device structure
3240 * @param len           number of bytes to read
3241 * @param retlen        pointer to variable to store the number of read bytes
3242 * @param buf           the databuffer to put/get data
3243 *
3244 * Read factory OTP info.
3245 */
3246static int onenand_get_fact_prot_info(struct mtd_info *mtd, size_t len,
3247                                      size_t *retlen, struct otp_info *buf)
3248{
3249        return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
3250                                MTD_OTP_FACTORY);
3251}
3252
3253/**
3254 * onenand_read_fact_prot_reg - [MTD Interface] Read factory OTP area
3255 * @param mtd           MTD device structure
3256 * @param from          The offset to read
3257 * @param len           number of bytes to read
3258 * @param retlen        pointer to variable to store the number of read bytes
3259 * @param buf           the databuffer to put/get data
3260 *
3261 * Read factory OTP area.
3262 */
3263static int onenand_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
3264                        size_t len, size_t *retlen, u_char *buf)
3265{
3266        return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_FACTORY);
3267}
3268
3269/**
3270 * onenand_get_user_prot_info - [MTD Interface] Read user OTP info
3271 * @param mtd           MTD device structure
3272 * @param retlen        pointer to variable to store the number of read bytes
3273 * @param len           number of bytes to read
3274 * @param buf           the databuffer to put/get data
3275 *
3276 * Read user OTP info.
3277 */
3278static int onenand_get_user_prot_info(struct mtd_info *mtd, size_t len,
3279                                      size_t *retlen, struct otp_info *buf)
3280{
3281        return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
3282                                MTD_OTP_USER);
3283}
3284
3285/**
3286 * onenand_read_user_prot_reg - [MTD Interface] Read user OTP area
3287 * @param mtd           MTD device structure
3288 * @param from          The offset to read
3289 * @param len           number of bytes to read
3290 * @param retlen        pointer to variable to store the number of read bytes
3291 * @param buf           the databuffer to put/get data
3292 *
3293 * Read user OTP area.
3294 */
3295static int onenand_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
3296                        size_t len, size_t *retlen, u_char *buf)
3297{
3298        return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_USER);
3299}
3300
3301/**
3302 * onenand_write_user_prot_reg - [MTD Interface] Write user OTP area
3303 * @param mtd           MTD device structure
3304 * @param from          The offset to write
3305 * @param len           number of bytes to write
3306 * @param retlen        pointer to variable to store the number of write bytes
3307 * @param buf           the databuffer to put/get data
3308 *
3309 * Write user OTP area.
3310 */
3311static int onenand_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
3312                        size_t len, size_t *retlen, u_char *buf)
3313{
3314        return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_write, MTD_OTP_USER);
3315}
3316
3317/**
3318 * onenand_lock_user_prot_reg - [MTD Interface] Lock user OTP area
3319 * @param mtd           MTD device structure
3320 * @param from          The offset to lock
3321 * @param len           number of bytes to unlock
3322 *
3323 * Write lock mark on spare area in page 0 in OTP block
3324 */
3325static int onenand_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
3326                        size_t len)
3327{
3328        struct onenand_chip *this = mtd->priv;
3329        u_char *buf = FLEXONENAND(this) ? this->page_buf : this->oob_buf;
3330        size_t retlen;
3331        int ret;
3332        unsigned int otp_lock_offset = ONENAND_OTP_LOCK_OFFSET;
3333
3334        memset(buf, 0xff, FLEXONENAND(this) ? this->writesize
3335                                                 : mtd->oobsize);
3336        /*
3337         * Write lock mark to 8th word of sector0 of page0 of the spare0.
3338         * We write 16 bytes spare area instead of 2 bytes.
3339         * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3340         * main area of page 49.
3341         */
3342
3343        from = 0;
3344        len = FLEXONENAND(this) ? mtd->writesize : 16;
3345
3346        /*
3347         * Note: OTP lock operation
3348         *       OTP block : 0xXXFC                     XX 1111 1100
3349         *       1st block : 0xXXF3 (If chip support)   XX 1111 0011
3350         *       Both      : 0xXXF0 (If chip support)   XX 1111 0000
3351         */
3352        if (FLEXONENAND(this))
3353                otp_lock_offset = FLEXONENAND_OTP_LOCK_OFFSET;
3354
3355        /* ONENAND_OTP_AREA | ONENAND_OTP_BLOCK0 | ONENAND_OTP_AREA_BLOCK0 */
3356        if (otp == 1)
3357                buf[otp_lock_offset] = 0xFC;
3358        else if (otp == 2)
3359                buf[otp_lock_offset] = 0xF3;
3360        else if (otp == 3)
3361                buf[otp_lock_offset] = 0xF0;
3362        else if (otp != 0)
3363                printk(KERN_DEBUG "[OneNAND] Invalid option selected for OTP\n");
3364
3365        ret = onenand_otp_walk(mtd, from, len, &retlen, buf, do_otp_lock, MTD_OTP_USER);
3366
3367        return ret ? : retlen;
3368}
3369
3370#endif  /* CONFIG_MTD_ONENAND_OTP */
3371
3372/**
3373 * onenand_check_features - Check and set OneNAND features
3374 * @param mtd           MTD data structure
3375 *
3376 * Check and set OneNAND features
3377 * - lock scheme
3378 * - two plane
3379 */
3380static void onenand_check_features(struct mtd_info *mtd)
3381{
3382        struct onenand_chip *this = mtd->priv;
3383        unsigned int density, process, numbufs;
3384
3385        /* Lock scheme depends on density and process */
3386        density = onenand_get_density(this->device_id);
3387        process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT;
3388        numbufs = this->read_word(this->base + ONENAND_REG_NUM_BUFFERS) >> 8;
3389
3390        /* Lock scheme */
3391        switch (density) {
3392        case ONENAND_DEVICE_DENSITY_4Gb:
3393                if (ONENAND_IS_DDP(this))
3394                        this->options |= ONENAND_HAS_2PLANE;
3395                else if (numbufs == 1) {
3396                        this->options |= ONENAND_HAS_4KB_PAGE;
3397                        this->options |= ONENAND_HAS_CACHE_PROGRAM;
3398                        /*
3399                         * There are two different 4KiB pagesize chips
3400                         * and no way to detect it by H/W config values.
3401                         *
3402                         * To detect the correct NOP for each chips,
3403                         * It should check the version ID as workaround.
3404                         *
3405                         * Now it has as following
3406                         * KFM4G16Q4M has NOP 4 with version ID 0x0131
3407                         * KFM4G16Q5M has NOP 1 with versoin ID 0x013e
3408                         */
3409                        if ((this->version_id & 0xf) == 0xe)
3410                                this->options |= ONENAND_HAS_NOP_1;
3411                }
3412
3413        case ONENAND_DEVICE_DENSITY_2Gb:
3414                /* 2Gb DDP does not have 2 plane */
3415                if (!ONENAND_IS_DDP(this))
3416                        this->options |= ONENAND_HAS_2PLANE;
3417                this->options |= ONENAND_HAS_UNLOCK_ALL;
3418
3419        case ONENAND_DEVICE_DENSITY_1Gb:
3420                /* A-Die has all block unlock */
3421                if (process)
3422                        this->options |= ONENAND_HAS_UNLOCK_ALL;
3423                break;
3424
3425        default:
3426                /* Some OneNAND has continuous lock scheme */
3427                if (!process)
3428                        this->options |= ONENAND_HAS_CONT_LOCK;
3429                break;
3430        }
3431
3432        /* The MLC has 4KiB pagesize. */
3433        if (ONENAND_IS_MLC(this))
3434                this->options |= ONENAND_HAS_4KB_PAGE;
3435
3436        if (ONENAND_IS_4KB_PAGE(this))
3437                this->options &= ~ONENAND_HAS_2PLANE;
3438
3439        if (FLEXONENAND(this)) {
3440                this->options &= ~ONENAND_HAS_CONT_LOCK;
3441                this->options |= ONENAND_HAS_UNLOCK_ALL;
3442        }
3443
3444        if (this->options & ONENAND_HAS_CONT_LOCK)
3445                printk(KERN_DEBUG "Lock scheme is Continuous Lock\n");
3446        if (this->options & ONENAND_HAS_UNLOCK_ALL)
3447                printk(KERN_DEBUG "Chip support all block unlock\n");
3448        if (this->options & ONENAND_HAS_2PLANE)
3449                printk(KERN_DEBUG "Chip has 2 plane\n");
3450        if (this->options & ONENAND_HAS_4KB_PAGE)
3451                printk(KERN_DEBUG "Chip has 4KiB pagesize\n");
3452        if (this->options & ONENAND_HAS_CACHE_PROGRAM)
3453                printk(KERN_DEBUG "Chip has cache program feature\n");
3454}
3455
3456/**
3457 * onenand_print_device_info - Print device & version ID
3458 * @param device        device ID
3459 * @param version       version ID
3460 *
3461 * Print device & version ID
3462 */
3463static void onenand_print_device_info(int device, int version)
3464{
3465        int vcc, demuxed, ddp, density, flexonenand;
3466
3467        vcc = device & ONENAND_DEVICE_VCC_MASK;
3468        demuxed = device & ONENAND_DEVICE_IS_DEMUX;
3469        ddp = device & ONENAND_DEVICE_IS_DDP;
3470        density = onenand_get_density(device);
3471        flexonenand = device & DEVICE_IS_FLEXONENAND;
3472        printk(KERN_INFO "%s%sOneNAND%s %dMB %sV 16-bit (0x%02x)\n",
3473                demuxed ? "" : "Muxed ",
3474                flexonenand ? "Flex-" : "",
3475                ddp ? "(DDP)" : "",
3476                (16 << density),
3477                vcc ? "2.65/3.3" : "1.8",
3478                device);
3479        printk(KERN_INFO "OneNAND version = 0x%04x\n", version);
3480}
3481
3482static const struct onenand_manufacturers onenand_manuf_ids[] = {
3483        {ONENAND_MFR_SAMSUNG, "Samsung"},
3484        {ONENAND_MFR_NUMONYX, "Numonyx"},
3485};
3486
3487/**
3488 * onenand_check_maf - Check manufacturer ID
3489 * @param manuf         manufacturer ID
3490 *
3491 * Check manufacturer ID
3492 */
3493static int onenand_check_maf(int manuf)
3494{
3495        int size = ARRAY_SIZE(onenand_manuf_ids);
3496        char *name;
3497        int i;
3498
3499        for (i = 0; i < size; i++)
3500                if (manuf == onenand_manuf_ids[i].id)
3501                        break;
3502
3503        if (i < size)
3504                name = onenand_manuf_ids[i].name;
3505        else
3506                name = "Unknown";
3507
3508        printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n", name, manuf);
3509
3510        return (i == size);
3511}
3512
3513/**
3514* flexonenand_get_boundary      - Reads the SLC boundary
3515* @param onenand_info           - onenand info structure
3516**/
3517static int flexonenand_get_boundary(struct mtd_info *mtd)
3518{
3519        struct onenand_chip *this = mtd->priv;
3520        unsigned die, bdry;
3521        int syscfg, locked;
3522
3523        /* Disable ECC */
3524        syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3525        this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1);
3526
3527        for (die = 0; die < this->dies; die++) {
3528                this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3529                this->wait(mtd, FL_SYNCING);
3530
3531                this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3532                this->wait(mtd, FL_READING);
3533
3534                bdry = this->read_word(this->base + ONENAND_DATARAM);
3535                if ((bdry >> FLEXONENAND_PI_UNLOCK_SHIFT) == 3)
3536                        locked = 0;
3537                else
3538                        locked = 1;
3539                this->boundary[die] = bdry & FLEXONENAND_PI_MASK;
3540
3541                this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3542                this->wait(mtd, FL_RESETING);
3543
3544                printk(KERN_INFO "Die %d boundary: %d%s\n", die,
3545                       this->boundary[die], locked ? "(Locked)" : "(Unlocked)");
3546        }
3547
3548        /* Enable ECC */
3549        this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3550        return 0;
3551}
3552
3553/**
3554 * flexonenand_get_size - Fill up fields in onenand_chip and mtd_info
3555 *                        boundary[], diesize[], mtd->size, mtd->erasesize
3556 * @param mtd           - MTD device structure
3557 */
3558static void flexonenand_get_size(struct mtd_info *mtd)
3559{
3560        struct onenand_chip *this = mtd->priv;
3561        int die, i, eraseshift, density;
3562        int blksperdie, maxbdry;
3563        loff_t ofs;
3564
3565        density = onenand_get_density(this->device_id);
3566        blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift);
3567        blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3568        maxbdry = blksperdie - 1;
3569        eraseshift = this->erase_shift - 1;
3570
3571        mtd->numeraseregions = this->dies << 1;
3572
3573        /* This fills up the device boundary */
3574        flexonenand_get_boundary(mtd);
3575        die = ofs = 0;
3576        i = -1;
3577        for (; die < this->dies; die++) {
3578                if (!die || this->boundary[die-1] != maxbdry) {
3579                        i++;
3580                        mtd->eraseregions[i].offset = ofs;
3581                        mtd->eraseregions[i].erasesize = 1 << eraseshift;
3582                        mtd->eraseregions[i].numblocks =
3583                                                        this->boundary[die] + 1;
3584                        ofs += mtd->eraseregions[i].numblocks << eraseshift;
3585                        eraseshift++;
3586                } else {
3587                        mtd->numeraseregions -= 1;
3588                        mtd->eraseregions[i].numblocks +=
3589                                                        this->boundary[die] + 1;
3590                        ofs += (this->boundary[die] + 1) << (eraseshift - 1);
3591                }
3592                if (this->boundary[die] != maxbdry) {
3593                        i++;
3594                        mtd->eraseregions[i].offset = ofs;
3595                        mtd->eraseregions[i].erasesize = 1 << eraseshift;
3596                        mtd->eraseregions[i].numblocks = maxbdry ^
3597                                                         this->boundary[die];
3598                        ofs += mtd->eraseregions[i].numblocks << eraseshift;
3599                        eraseshift--;
3600                } else
3601                        mtd->numeraseregions -= 1;
3602        }
3603
3604        /* Expose MLC erase size except when all blocks are SLC */
3605        mtd->erasesize = 1 << this->erase_shift;
3606        if (mtd->numeraseregions == 1)
3607                mtd->erasesize >>= 1;
3608
3609        printk(KERN_INFO "Device has %d eraseregions\n", mtd->numeraseregions);
3610        for (i = 0; i < mtd->numeraseregions; i++)
3611                printk(KERN_INFO "[offset: 0x%08x, erasesize: 0x%05x,"
3612                        " numblocks: %04u]\n",
3613                        (unsigned int) mtd->eraseregions[i].offset,
3614                        mtd->eraseregions[i].erasesize,
3615                        mtd->eraseregions[i].numblocks);
3616
3617        for (die = 0, mtd->size = 0; die < this->dies; die++) {
3618                this->diesize[die] = (loff_t)blksperdie << this->erase_shift;
3619                this->diesize[die] -= (loff_t)(this->boundary[die] + 1)
3620                                                 << (this->erase_shift - 1);
3621                mtd->size += this->diesize[die];
3622        }
3623}
3624
3625/**
3626 * flexonenand_check_blocks_erased - Check if blocks are erased
3627 * @param mtd_info      - mtd info structure
3628 * @param start         - first erase block to check
3629 * @param end           - last erase block to check
3630 *
3631 * Converting an unerased block from MLC to SLC
3632 * causes byte values to change. Since both data and its ECC
3633 * have changed, reads on the block give uncorrectable error.
3634 * This might lead to the block being detected as bad.
3635 *
3636 * Avoid this by ensuring that the block to be converted is
3637 * erased.
3638 */
3639static int flexonenand_check_blocks_erased(struct mtd_info *mtd, int start, int end)
3640{
3641        struct onenand_chip *this = mtd->priv;
3642        int i, ret;
3643        int block;
3644        struct mtd_oob_ops ops = {
3645                .mode = MTD_OPS_PLACE_OOB,
3646                .ooboffs = 0,
3647                .ooblen = mtd->oobsize,
3648                .datbuf = NULL,
3649                .oobbuf = this->oob_buf,
3650        };
3651        loff_t addr;
3652
3653        printk(KERN_DEBUG "Check blocks from %d to %d\n", start, end);
3654
3655        for (block = start; block <= end; block++) {
3656                addr = flexonenand_addr(this, block);
3657                if (onenand_block_isbad_nolock(mtd, addr, 0))
3658                        continue;
3659
3660                /*
3661                 * Since main area write results in ECC write to spare,
3662                 * it is sufficient to check only ECC bytes for change.
3663                 */
3664                ret = onenand_read_oob_nolock(mtd, addr, &ops);
3665                if (ret)
3666                        return ret;
3667
3668                for (i = 0; i < mtd->oobsize; i++)
3669                        if (this->oob_buf[i] != 0xff)
3670                                break;
3671
3672                if (i != mtd->oobsize) {
3673                        printk(KERN_WARNING "%s: Block %d not erased.\n",
3674                                __func__, block);
3675                        return 1;
3676                }
3677        }
3678
3679        return 0;
3680}
3681
3682/**
3683 * flexonenand_set_boundary     - Writes the SLC boundary
3684 * @param mtd                   - mtd info structure
3685 */
3686static int flexonenand_set_boundary(struct mtd_info *mtd, int die,
3687                                    int boundary, int lock)
3688{
3689        struct onenand_chip *this = mtd->priv;
3690        int ret, density, blksperdie, old, new, thisboundary;
3691        loff_t addr;
3692
3693        /* Change only once for SDP Flex-OneNAND */
3694        if (die && (!ONENAND_IS_DDP(this)))
3695                return 0;
3696
3697        /* boundary value of -1 indicates no required change */
3698        if (boundary < 0 || boundary == this->boundary[die])
3699                return 0;
3700
3701        density = onenand_get_density(this->device_id);
3702        blksperdie = ((16 << density) << 20) >> this->erase_shift;
3703        blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3704
3705        if (boundary >= blksperdie) {
3706                printk(KERN_ERR "%s: Invalid boundary value. "
3707                                "Boundary not changed.\n", __func__);
3708                return -EINVAL;
3709        }
3710
3711        /* Check if converting blocks are erased */
3712        old = this->boundary[die] + (die * this->density_mask);
3713        new = boundary + (die * this->density_mask);
3714        ret = flexonenand_check_blocks_erased(mtd, min(old, new) + 1, max(old, new));
3715        if (ret) {
3716                printk(KERN_ERR "%s: Please erase blocks "
3717                                "before boundary change\n", __func__);
3718                return ret;
3719        }
3720
3721        this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3722        this->wait(mtd, FL_SYNCING);
3723
3724        /* Check is boundary is locked */
3725        this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3726        this->wait(mtd, FL_READING);
3727
3728        thisboundary = this->read_word(this->base + ONENAND_DATARAM);
3729        if ((thisboundary >> FLEXONENAND_PI_UNLOCK_SHIFT) != 3) {
3730                printk(KERN_ERR "%s: boundary locked\n", __func__);
3731                ret = 1;
3732                goto out;
3733        }
3734
3735        printk(KERN_INFO "Changing die %d boundary: %d%s\n",
3736                        die, boundary, lock ? "(Locked)" : "(Unlocked)");
3737
3738        addr = die ? this->diesize[0] : 0;
3739
3740        boundary &= FLEXONENAND_PI_MASK;
3741        boundary |= lock ? 0 : (3 << FLEXONENAND_PI_UNLOCK_SHIFT);
3742
3743        this->command(mtd, ONENAND_CMD_ERASE, addr, 0);
3744        ret = this->wait(mtd, FL_ERASING);
3745        if (ret) {
3746                printk(KERN_ERR "%s: Failed PI erase for Die %d\n",
3747                       __func__, die);
3748                goto out;
3749        }
3750
3751        this->write_word(boundary, this->base + ONENAND_DATARAM);
3752        this->command(mtd, ONENAND_CMD_PROG, addr, 0);
3753        ret = this->wait(mtd, FL_WRITING);
3754        if (ret) {
3755                printk(KERN_ERR "%s: Failed PI write for Die %d\n",
3756                        __func__, die);
3757                goto out;
3758        }
3759
3760        this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0);
3761        ret = this->wait(mtd, FL_WRITING);
3762out:
3763        this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND);
3764        this->wait(mtd, FL_RESETING);
3765        if (!ret)
3766                /* Recalculate device size on boundary change*/
3767                flexonenand_get_size(mtd);
3768
3769        return ret;
3770}
3771
3772/**
3773 * onenand_chip_probe - [OneNAND Interface] The generic chip probe
3774 * @param mtd           MTD device structure
3775 *
3776 * OneNAND detection method:
3777 *   Compare the values from command with ones from register
3778 */
3779static int onenand_chip_probe(struct mtd_info *mtd)
3780{
3781        struct onenand_chip *this = mtd->priv;
3782        int bram_maf_id, bram_dev_id, maf_id, dev_id;
3783        int syscfg;
3784
3785        /* Save system configuration 1 */
3786        syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3787        /* Clear Sync. Burst Read mode to read BootRAM */
3788        this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE), this->base + ONENAND_REG_SYS_CFG1);
3789
3790        /* Send the command for reading device ID from BootRAM */
3791        this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
3792
3793        /* Read manufacturer and device IDs from BootRAM */
3794        bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0);
3795        bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2);
3796
3797        /* Reset OneNAND to read default register values */
3798        this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM);
3799        /* Wait reset */
3800        this->wait(mtd, FL_RESETING);
3801
3802        /* Restore system configuration 1 */
3803        this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3804
3805        /* Check manufacturer ID */
3806        if (onenand_check_maf(bram_maf_id))
3807                return -ENXIO;
3808
3809        /* Read manufacturer and device IDs from Register */
3810        maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
3811        dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3812
3813        /* Check OneNAND device */
3814        if (maf_id != bram_maf_id || dev_id != bram_dev_id)
3815                return -ENXIO;
3816
3817        return 0;
3818}
3819
3820/**
3821 * onenand_probe - [OneNAND Interface] Probe the OneNAND device
3822 * @param mtd           MTD device structure
3823 */
3824static int onenand_probe(struct mtd_info *mtd)
3825{
3826        struct onenand_chip *this = mtd->priv;
3827        int dev_id, ver_id;
3828        int density;
3829        int ret;
3830
3831        ret = this->chip_probe(mtd);
3832        if (ret)
3833                return ret;
3834
3835        /* Device and version IDs from Register */
3836        dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3837        ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
3838        this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
3839
3840        /* Flash device information */
3841        onenand_print_device_info(dev_id, ver_id);
3842        this->device_id = dev_id;
3843        this->version_id = ver_id;
3844
3845        /* Check OneNAND features */
3846        onenand_check_features(mtd);
3847
3848        density = onenand_get_density(dev_id);
3849        if (FLEXONENAND(this)) {
3850                this->dies = ONENAND_IS_DDP(this) ? 2 : 1;
3851                /* Maximum possible erase regions */
3852                mtd->numeraseregions = this->dies << 1;
3853                mtd->eraseregions = kzalloc(sizeof(struct mtd_erase_region_info)
3854                                        * (this->dies << 1), GFP_KERNEL);
3855                if (!mtd->eraseregions)
3856                        return -ENOMEM;
3857        }
3858
3859        /*
3860         * For Flex-OneNAND, chipsize represents maximum possible device size.
3861         * mtd->size represents the actual device size.
3862         */
3863        this->chipsize = (16 << density) << 20;
3864
3865        /* OneNAND page size & block size */
3866        /* The data buffer size is equal to page size */
3867        mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE);
3868        /* We use the full BufferRAM */
3869        if (ONENAND_IS_4KB_PAGE(this))
3870                mtd->writesize <<= 1;
3871
3872        mtd->oobsize = mtd->writesize >> 5;
3873        /* Pages per a block are always 64 in OneNAND */
3874        mtd->erasesize = mtd->writesize << 6;
3875        /*
3876         * Flex-OneNAND SLC area has 64 pages per block.
3877         * Flex-OneNAND MLC area has 128 pages per block.
3878         * Expose MLC erase size to find erase_shift and page_mask.
3879         */
3880        if (FLEXONENAND(this))
3881                mtd->erasesize <<= 1;
3882
3883        this->erase_shift = ffs(mtd->erasesize) - 1;
3884        this->page_shift = ffs(mtd->writesize) - 1;
3885        this->page_mask = (1 << (this->erase_shift - this->page_shift)) - 1;
3886        /* Set density mask. it is used for DDP */
3887        if (ONENAND_IS_DDP(this))
3888                this->density_mask = this->chipsize >> (this->erase_shift + 1);
3889        /* It's real page size */
3890        this->writesize = mtd->writesize;
3891
3892        /* REVISIT: Multichip handling */
3893
3894        if (FLEXONENAND(this))
3895                flexonenand_get_size(mtd);
3896        else
3897                mtd->size = this->chipsize;
3898
3899        /*
3900         * We emulate the 4KiB page and 256KiB erase block size
3901         * But oobsize is still 64 bytes.
3902         * It is only valid if you turn on 2X program support,
3903         * Otherwise it will be ignored by compiler.
3904         */
3905        if (ONENAND_IS_2PLANE(this)) {
3906                mtd->writesize <<= 1;
3907                mtd->erasesize <<= 1;
3908        }
3909
3910        return 0;
3911}
3912
3913/**
3914 * onenand_suspend - [MTD Interface] Suspend the OneNAND flash
3915 * @param mtd           MTD device structure
3916 */
3917static int onenand_suspend(struct mtd_info *mtd)
3918{
3919        return onenand_get_device(mtd, FL_PM_SUSPENDED);
3920}
3921
3922/**
3923 * onenand_resume - [MTD Interface] Resume the OneNAND flash
3924 * @param mtd           MTD device structure
3925 */
3926static void onenand_resume(struct mtd_info *mtd)
3927{
3928        struct onenand_chip *this = mtd->priv;
3929
3930        if (this->state == FL_PM_SUSPENDED)
3931                onenand_release_device(mtd);
3932        else
3933                printk(KERN_ERR "%s: resume() called for the chip which is not "
3934                                "in suspended state\n", __func__);
3935}
3936
3937/**
3938 * onenand_scan - [OneNAND Interface] Scan for the OneNAND device
3939 * @param mtd           MTD device structure
3940 * @param maxchips      Number of chips to scan for
3941 *
3942 * This fills out all the not initialized function pointers
3943 * with the defaults.
3944 * The flash ID is read and the mtd/chip structures are
3945 * filled with the appropriate values.
3946 */
3947int onenand_scan(struct mtd_info *mtd, int maxchips)
3948{
3949        int i, ret;
3950        struct onenand_chip *this = mtd->priv;
3951
3952        if (!this->read_word)
3953                this->read_word = onenand_readw;
3954        if (!this->write_word)
3955                this->write_word = onenand_writew;
3956
3957        if (!this->command)
3958                this->command = onenand_command;
3959        if (!this->wait)
3960                onenand_setup_wait(mtd);
3961        if (!this->bbt_wait)
3962                this->bbt_wait = onenand_bbt_wait;
3963        if (!this->unlock_all)
3964                this->unlock_all = onenand_unlock_all;
3965
3966        if (!this->chip_probe)
3967                this->chip_probe = onenand_chip_probe;
3968
3969        if (!this->read_bufferram)
3970                this->read_bufferram = onenand_read_bufferram;
3971        if (!this->write_bufferram)
3972                this->write_bufferram = onenand_write_bufferram;
3973
3974        if (!this->block_markbad)
3975                this->block_markbad = onenand_default_block_markbad;
3976        if (!this->scan_bbt)
3977                this->scan_bbt = onenand_default_bbt;
3978
3979        if (onenand_probe(mtd))
3980                return -ENXIO;
3981
3982        /* Set Sync. Burst Read after probing */
3983        if (this->mmcontrol) {
3984                printk(KERN_INFO "OneNAND Sync. Burst Read support\n");
3985                this->read_bufferram = onenand_sync_read_bufferram;
3986        }
3987
3988        /* Allocate buffers, if necessary */
3989        if (!this->page_buf) {
3990                this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3991                if (!this->page_buf)
3992                        return -ENOMEM;
3993#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
3994                this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3995                if (!this->verify_buf) {
3996                        kfree(this->page_buf);
3997                        return -ENOMEM;
3998                }
3999#endif
4000                this->options |= ONENAND_PAGEBUF_ALLOC;
4001        }
4002        if (!this->oob_buf) {
4003                this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL);
4004                if (!this->oob_buf) {
4005                        if (this->options & ONENAND_PAGEBUF_ALLOC) {
4006                                this->options &= ~ONENAND_PAGEBUF_ALLOC;
4007                                kfree(this->page_buf);
4008                        }
4009                        return -ENOMEM;
4010                }
4011                this->options |= ONENAND_OOBBUF_ALLOC;
4012        }
4013
4014        this->state = FL_READY;
4015        init_waitqueue_head(&this->wq);
4016        spin_lock_init(&this->chip_lock);
4017
4018        /*
4019         * Allow subpage writes up to oobsize.
4020         */
4021        switch (mtd->oobsize) {
4022        case 128:
4023                if (FLEXONENAND(this)) {
4024                        this->ecclayout = &flexonenand_oob_128;
4025                        mtd->subpage_sft = 0;
4026                } else {
4027                        this->ecclayout = &onenand_oob_128;
4028                        mtd->subpage_sft = 2;
4029                }
4030                if (ONENAND_IS_NOP_1(this))
4031                        mtd->subpage_sft = 0;
4032                break;
4033        case 64:
4034                this->ecclayout = &onenand_oob_64;
4035                mtd->subpage_sft = 2;
4036                break;
4037
4038        case 32:
4039                this->ecclayout = &onenand_oob_32;
4040                mtd->subpage_sft = 1;
4041                break;
4042
4043        default:
4044                printk(KERN_WARNING "%s: No OOB scheme defined for oobsize %d\n",
4045                        __func__, mtd->oobsize);
4046                mtd->subpage_sft = 0;
4047                /* To prevent kernel oops */
4048                this->ecclayout = &onenand_oob_32;
4049                break;
4050        }
4051
4052        this->subpagesize = mtd->writesize >> mtd->subpage_sft;
4053
4054        /*
4055         * The number of bytes available for a client to place data into
4056         * the out of band area
4057         */
4058        this->ecclayout->oobavail = 0;
4059        for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES &&
4060            this->ecclayout->oobfree[i].length; i++)
4061                this->ecclayout->oobavail +=
4062                        this->ecclayout->oobfree[i].length;
4063        mtd->oobavail = this->ecclayout->oobavail;
4064
4065        mtd->ecclayout = this->ecclayout;
4066        mtd->ecc_strength = 1;
4067
4068        /* Fill in remaining MTD driver data */
4069        mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH;
4070        mtd->flags = MTD_CAP_NANDFLASH;
4071        mtd->_erase = onenand_erase;
4072        mtd->_point = NULL;
4073        mtd->_unpoint = NULL;
4074        mtd->_read = onenand_read;
4075        mtd->_write = onenand_write;
4076        mtd->_read_oob = onenand_read_oob;
4077        mtd->_write_oob = onenand_write_oob;
4078        mtd->_panic_write = onenand_panic_write;
4079#ifdef CONFIG_MTD_ONENAND_OTP
4080        mtd->_get_fact_prot_info = onenand_get_fact_prot_info;
4081        mtd->_read_fact_prot_reg = onenand_read_fact_prot_reg;
4082        mtd->_get_user_prot_info = onenand_get_user_prot_info;
4083        mtd->_read_user_prot_reg = onenand_read_user_prot_reg;
4084        mtd->_write_user_prot_reg = onenand_write_user_prot_reg;
4085        mtd->_lock_user_prot_reg = onenand_lock_user_prot_reg;
4086#endif
4087        mtd->_sync = onenand_sync;
4088        mtd->_lock = onenand_lock;
4089        mtd->_unlock = onenand_unlock;
4090        mtd->_suspend = onenand_suspend;
4091        mtd->_resume = onenand_resume;
4092        mtd->_block_isbad = onenand_block_isbad;
4093        mtd->_block_markbad = onenand_block_markbad;
4094        mtd->owner = THIS_MODULE;
4095        mtd->writebufsize = mtd->writesize;
4096
4097        /* Unlock whole block */
4098        if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING))
4099                this->unlock_all(mtd);
4100
4101        ret = this->scan_bbt(mtd);
4102        if ((!FLEXONENAND(this)) || ret)
4103                return ret;
4104
4105        /* Change Flex-OneNAND boundaries if required */
4106        for (i = 0; i < MAX_DIES; i++)
4107                flexonenand_set_boundary(mtd, i, flex_bdry[2 * i],
4108                                                 flex_bdry[(2 * i) + 1]);
4109
4110        return 0;
4111}
4112
4113/**
4114 * onenand_release - [OneNAND Interface] Free resources held by the OneNAND device
4115 * @param mtd           MTD device structure
4116 */
4117void onenand_release(struct mtd_info *mtd)
4118{
4119        struct onenand_chip *this = mtd->priv;
4120
4121        /* Deregister partitions */
4122        mtd_device_unregister(mtd);
4123
4124        /* Free bad block table memory, if allocated */
4125        if (this->bbm) {
4126                struct bbm_info *bbm = this->bbm;
4127                kfree(bbm->bbt);
4128                kfree(this->bbm);
4129        }
4130        /* Buffers allocated by onenand_scan */
4131        if (this->options & ONENAND_PAGEBUF_ALLOC) {
4132                kfree(this->page_buf);
4133#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4134                kfree(this->verify_buf);
4135#endif
4136        }
4137        if (this->options & ONENAND_OOBBUF_ALLOC)
4138                kfree(this->oob_buf);
4139        kfree(mtd->eraseregions);
4140}
4141
4142EXPORT_SYMBOL_GPL(onenand_scan);
4143EXPORT_SYMBOL_GPL(onenand_release);
4144
4145MODULE_LICENSE("GPL");
4146MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
4147MODULE_DESCRIPTION("Generic OneNAND flash driver code");
4148