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