Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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