1 /* 2 * linux/drivers/mtd/onenand/onenand_base.c 3 * 4 * Copyright (C) 2005-2007 Samsung Electronics 5 * Kyungmin Park <kyungmin.park@samsung.com> 6 * 7 * Credits: 8 * Adrian Hunter <ext-adrian.hunter@nokia.com>: 9 * auto-placement support, read-while load support, various fixes 10 * Copyright (C) Nokia Corporation, 2007 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License version 2 as 14 * published by the Free Software Foundation. 15 */ 16 17 #include <common.h> 18 #include <linux/mtd/compat.h> 19 #include <linux/mtd/mtd.h> 20 #include <linux/mtd/onenand.h> 21 22 #include <asm/io.h> 23 #include <asm/errno.h> 24 #include <malloc.h> 25 26 /* It should access 16-bit instead of 8-bit */ 27 static inline void *memcpy_16(void *dst, const void *src, unsigned int len) 28 { 29 void *ret = dst; 30 short *d = dst; 31 const short *s = src; 32 33 len >>= 1; 34 while (len-- > 0) 35 *d++ = *s++; 36 return ret; 37 } 38 39 static const unsigned char ffchars[] = { 40 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 41 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 16 */ 42 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 43 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 32 */ 44 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 45 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 48 */ 46 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 47 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 64 */ 48 }; 49 50 /** 51 * onenand_readw - [OneNAND Interface] Read OneNAND register 52 * @param addr address to read 53 * 54 * Read OneNAND register 55 */ 56 static unsigned short onenand_readw(void __iomem * addr) 57 { 58 return readw(addr); 59 } 60 61 /** 62 * onenand_writew - [OneNAND Interface] Write OneNAND register with value 63 * @param value value to write 64 * @param addr address to write 65 * 66 * Write OneNAND register with value 67 */ 68 static void onenand_writew(unsigned short value, void __iomem * addr) 69 { 70 writew(value, addr); 71 } 72 73 /** 74 * onenand_block_address - [DEFAULT] Get block address 75 * @param device the device id 76 * @param block the block 77 * @return translated block address if DDP, otherwise same 78 * 79 * Setup Start Address 1 Register (F100h) 80 */ 81 static int onenand_block_address(struct onenand_chip *this, int block) 82 { 83 /* Device Flash Core select, NAND Flash Block Address */ 84 if (block & this->density_mask) 85 return ONENAND_DDP_CHIP1 | (block ^ this->density_mask); 86 87 return block; 88 } 89 90 /** 91 * onenand_bufferram_address - [DEFAULT] Get bufferram address 92 * @param device the device id 93 * @param block the block 94 * @return set DBS value if DDP, otherwise 0 95 * 96 * Setup Start Address 2 Register (F101h) for DDP 97 */ 98 static int onenand_bufferram_address(struct onenand_chip *this, int block) 99 { 100 /* Device BufferRAM Select */ 101 if (block & this->density_mask) 102 return ONENAND_DDP_CHIP1; 103 104 return ONENAND_DDP_CHIP0; 105 } 106 107 /** 108 * onenand_page_address - [DEFAULT] Get page address 109 * @param page the page address 110 * @param sector the sector address 111 * @return combined page and sector address 112 * 113 * Setup Start Address 8 Register (F107h) 114 */ 115 static int onenand_page_address(int page, int sector) 116 { 117 /* Flash Page Address, Flash Sector Address */ 118 int fpa, fsa; 119 120 fpa = page & ONENAND_FPA_MASK; 121 fsa = sector & ONENAND_FSA_MASK; 122 123 return ((fpa << ONENAND_FPA_SHIFT) | fsa); 124 } 125 126 /** 127 * onenand_buffer_address - [DEFAULT] Get buffer address 128 * @param dataram1 DataRAM index 129 * @param sectors the sector address 130 * @param count the number of sectors 131 * @return the start buffer value 132 * 133 * Setup Start Buffer Register (F200h) 134 */ 135 static int onenand_buffer_address(int dataram1, int sectors, int count) 136 { 137 int bsa, bsc; 138 139 /* BufferRAM Sector Address */ 140 bsa = sectors & ONENAND_BSA_MASK; 141 142 if (dataram1) 143 bsa |= ONENAND_BSA_DATARAM1; /* DataRAM1 */ 144 else 145 bsa |= ONENAND_BSA_DATARAM0; /* DataRAM0 */ 146 147 /* BufferRAM Sector Count */ 148 bsc = count & ONENAND_BSC_MASK; 149 150 return ((bsa << ONENAND_BSA_SHIFT) | bsc); 151 } 152 153 /** 154 * onenand_get_density - [DEFAULT] Get OneNAND density 155 * @param dev_id OneNAND device ID 156 * 157 * Get OneNAND density from device ID 158 */ 159 static inline int onenand_get_density(int dev_id) 160 { 161 int density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT; 162 return (density & ONENAND_DEVICE_DENSITY_MASK); 163 } 164 165 /** 166 * onenand_command - [DEFAULT] Send command to OneNAND device 167 * @param mtd MTD device structure 168 * @param cmd the command to be sent 169 * @param addr offset to read from or write to 170 * @param len number of bytes to read or write 171 * 172 * Send command to OneNAND device. This function is used for middle/large page 173 * devices (1KB/2KB Bytes per page) 174 */ 175 static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, 176 size_t len) 177 { 178 struct onenand_chip *this = mtd->priv; 179 int value, readcmd = 0; 180 int block, page; 181 /* Now we use page size operation */ 182 int sectors = 4, count = 4; 183 184 /* Address translation */ 185 switch (cmd) { 186 case ONENAND_CMD_UNLOCK: 187 case ONENAND_CMD_LOCK: 188 case ONENAND_CMD_LOCK_TIGHT: 189 case ONENAND_CMD_UNLOCK_ALL: 190 block = -1; 191 page = -1; 192 break; 193 194 case ONENAND_CMD_ERASE: 195 case ONENAND_CMD_BUFFERRAM: 196 block = (int)(addr >> this->erase_shift); 197 page = -1; 198 break; 199 200 default: 201 block = (int)(addr >> this->erase_shift); 202 page = (int)(addr >> this->page_shift); 203 page &= this->page_mask; 204 break; 205 } 206 207 /* NOTE: The setting order of the registers is very important! */ 208 if (cmd == ONENAND_CMD_BUFFERRAM) { 209 /* Select DataRAM for DDP */ 210 value = onenand_bufferram_address(this, block); 211 this->write_word(value, 212 this->base + ONENAND_REG_START_ADDRESS2); 213 214 /* Switch to the next data buffer */ 215 ONENAND_SET_NEXT_BUFFERRAM(this); 216 217 return 0; 218 } 219 220 if (block != -1) { 221 /* Write 'DFS, FBA' of Flash */ 222 value = onenand_block_address(this, block); 223 this->write_word(value, 224 this->base + ONENAND_REG_START_ADDRESS1); 225 226 /* Write 'DFS, FBA' of Flash */ 227 value = onenand_bufferram_address(this, block); 228 this->write_word(value, 229 this->base + ONENAND_REG_START_ADDRESS2); 230 } 231 232 if (page != -1) { 233 int dataram; 234 235 switch (cmd) { 236 case ONENAND_CMD_READ: 237 case ONENAND_CMD_READOOB: 238 dataram = ONENAND_SET_NEXT_BUFFERRAM(this); 239 readcmd = 1; 240 break; 241 242 default: 243 dataram = ONENAND_CURRENT_BUFFERRAM(this); 244 break; 245 } 246 247 /* Write 'FPA, FSA' of Flash */ 248 value = onenand_page_address(page, sectors); 249 this->write_word(value, 250 this->base + ONENAND_REG_START_ADDRESS8); 251 252 /* Write 'BSA, BSC' of DataRAM */ 253 value = onenand_buffer_address(dataram, sectors, count); 254 this->write_word(value, this->base + ONENAND_REG_START_BUFFER); 255 } 256 257 /* Interrupt clear */ 258 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT); 259 /* Write command */ 260 this->write_word(cmd, this->base + ONENAND_REG_COMMAND); 261 262 return 0; 263 } 264 265 /** 266 * onenand_wait - [DEFAULT] wait until the command is done 267 * @param mtd MTD device structure 268 * @param state state to select the max. timeout value 269 * 270 * Wait for command done. This applies to all OneNAND command 271 * Read can take up to 30us, erase up to 2ms and program up to 350us 272 * according to general OneNAND specs 273 */ 274 static int onenand_wait(struct mtd_info *mtd, int state) 275 { 276 struct onenand_chip *this = mtd->priv; 277 unsigned int flags = ONENAND_INT_MASTER; 278 unsigned int interrupt = 0; 279 unsigned int ctrl, ecc; 280 281 while (1) { 282 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); 283 if (interrupt & flags) 284 break; 285 } 286 287 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); 288 289 if (ctrl & ONENAND_CTRL_ERROR) { 290 printk("onenand_wait: controller error = 0x%04x\n", ctrl); 291 if (ctrl & ONENAND_CTRL_LOCK) 292 printk("onenand_wait: it's locked error = 0x%04x\n", 293 ctrl); 294 295 return -EIO; 296 } 297 298 if (interrupt & ONENAND_INT_READ) { 299 ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS); 300 if (ecc & ONENAND_ECC_2BIT_ALL) { 301 MTDDEBUG (MTD_DEBUG_LEVEL0, 302 "onenand_wait: ECC error = 0x%04x\n", ecc); 303 return -EBADMSG; 304 } 305 } 306 307 return 0; 308 } 309 310 /** 311 * onenand_bufferram_offset - [DEFAULT] BufferRAM offset 312 * @param mtd MTD data structure 313 * @param area BufferRAM area 314 * @return offset given area 315 * 316 * Return BufferRAM offset given area 317 */ 318 static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area) 319 { 320 struct onenand_chip *this = mtd->priv; 321 322 if (ONENAND_CURRENT_BUFFERRAM(this)) { 323 if (area == ONENAND_DATARAM) 324 return mtd->writesize; 325 if (area == ONENAND_SPARERAM) 326 return mtd->oobsize; 327 } 328 329 return 0; 330 } 331 332 /** 333 * onenand_read_bufferram - [OneNAND Interface] Read the bufferram area 334 * @param mtd MTD data structure 335 * @param area BufferRAM area 336 * @param buffer the databuffer to put/get data 337 * @param offset offset to read from or write to 338 * @param count number of bytes to read/write 339 * 340 * Read the BufferRAM area 341 */ 342 static int onenand_read_bufferram(struct mtd_info *mtd, loff_t addr, int area, 343 unsigned char *buffer, int offset, 344 size_t count) 345 { 346 struct onenand_chip *this = mtd->priv; 347 void __iomem *bufferram; 348 349 bufferram = this->base + area; 350 bufferram += onenand_bufferram_offset(mtd, area); 351 352 memcpy_16(buffer, bufferram + offset, count); 353 354 return 0; 355 } 356 357 /** 358 * onenand_sync_read_bufferram - [OneNAND Interface] Read the bufferram area with Sync. Burst mode 359 * @param mtd MTD data structure 360 * @param area BufferRAM area 361 * @param buffer the databuffer to put/get data 362 * @param offset offset to read from or write to 363 * @param count number of bytes to read/write 364 * 365 * Read the BufferRAM area with Sync. Burst Mode 366 */ 367 static int onenand_sync_read_bufferram(struct mtd_info *mtd, loff_t addr, int area, 368 unsigned char *buffer, int offset, 369 size_t count) 370 { 371 struct onenand_chip *this = mtd->priv; 372 void __iomem *bufferram; 373 374 bufferram = this->base + area; 375 bufferram += onenand_bufferram_offset(mtd, area); 376 377 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ); 378 379 memcpy_16(buffer, bufferram + offset, count); 380 381 this->mmcontrol(mtd, 0); 382 383 return 0; 384 } 385 386 /** 387 * onenand_write_bufferram - [OneNAND Interface] Write the bufferram area 388 * @param mtd MTD data structure 389 * @param area BufferRAM area 390 * @param buffer the databuffer to put/get data 391 * @param offset offset to read from or write to 392 * @param count number of bytes to read/write 393 * 394 * Write the BufferRAM area 395 */ 396 static int onenand_write_bufferram(struct mtd_info *mtd, loff_t addr, int area, 397 const unsigned char *buffer, int offset, 398 size_t count) 399 { 400 struct onenand_chip *this = mtd->priv; 401 void __iomem *bufferram; 402 403 bufferram = this->base + area; 404 bufferram += onenand_bufferram_offset(mtd, area); 405 406 memcpy_16(bufferram + offset, buffer, count); 407 408 return 0; 409 } 410 411 /** 412 * onenand_get_2x_blockpage - [GENERIC] Get blockpage at 2x program mode 413 * @param mtd MTD data structure 414 * @param addr address to check 415 * @return blockpage address 416 * 417 * Get blockpage address at 2x program mode 418 */ 419 static int onenand_get_2x_blockpage(struct mtd_info *mtd, loff_t addr) 420 { 421 struct onenand_chip *this = mtd->priv; 422 int blockpage, block, page; 423 424 /* Calculate the even block number */ 425 block = (int) (addr >> this->erase_shift) & ~1; 426 /* Is it the odd plane? */ 427 if (addr & this->writesize) 428 block++; 429 page = (int) (addr >> (this->page_shift + 1)) & this->page_mask; 430 blockpage = (block << 7) | page; 431 432 return blockpage; 433 } 434 435 /** 436 * onenand_check_bufferram - [GENERIC] Check BufferRAM information 437 * @param mtd MTD data structure 438 * @param addr address to check 439 * @return 1 if there are valid data, otherwise 0 440 * 441 * Check bufferram if there is data we required 442 */ 443 static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr) 444 { 445 struct onenand_chip *this = mtd->priv; 446 int blockpage, found = 0; 447 unsigned int i; 448 449 #ifdef CONFIG_S3C64XX 450 return 0; 451 #endif 452 453 if (ONENAND_IS_2PLANE(this)) 454 blockpage = onenand_get_2x_blockpage(mtd, addr); 455 else 456 blockpage = (int) (addr >> this->page_shift); 457 458 /* Is there valid data? */ 459 i = ONENAND_CURRENT_BUFFERRAM(this); 460 if (this->bufferram[i].blockpage == blockpage) 461 found = 1; 462 else { 463 /* Check another BufferRAM */ 464 i = ONENAND_NEXT_BUFFERRAM(this); 465 if (this->bufferram[i].blockpage == blockpage) { 466 ONENAND_SET_NEXT_BUFFERRAM(this); 467 found = 1; 468 } 469 } 470 471 if (found && ONENAND_IS_DDP(this)) { 472 /* Select DataRAM for DDP */ 473 int block = (int) (addr >> this->erase_shift); 474 int value = onenand_bufferram_address(this, block); 475 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); 476 } 477 478 return found; 479 } 480 481 /** 482 * onenand_update_bufferram - [GENERIC] Update BufferRAM information 483 * @param mtd MTD data structure 484 * @param addr address to update 485 * @param valid valid flag 486 * 487 * Update BufferRAM information 488 */ 489 static int onenand_update_bufferram(struct mtd_info *mtd, loff_t addr, 490 int valid) 491 { 492 struct onenand_chip *this = mtd->priv; 493 int blockpage; 494 unsigned int i; 495 496 if (ONENAND_IS_2PLANE(this)) 497 blockpage = onenand_get_2x_blockpage(mtd, addr); 498 else 499 blockpage = (int)(addr >> this->page_shift); 500 501 /* Invalidate another BufferRAM */ 502 i = ONENAND_NEXT_BUFFERRAM(this); 503 if (this->bufferram[i].blockpage == blockpage) 504 this->bufferram[i].blockpage = -1; 505 506 /* Update BufferRAM */ 507 i = ONENAND_CURRENT_BUFFERRAM(this); 508 if (valid) 509 this->bufferram[i].blockpage = blockpage; 510 else 511 this->bufferram[i].blockpage = -1; 512 513 return 0; 514 } 515 516 /** 517 * onenand_invalidate_bufferram - [GENERIC] Invalidate BufferRAM information 518 * @param mtd MTD data structure 519 * @param addr start address to invalidate 520 * @param len length to invalidate 521 * 522 * Invalidate BufferRAM information 523 */ 524 static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr, 525 unsigned int len) 526 { 527 struct onenand_chip *this = mtd->priv; 528 int i; 529 loff_t end_addr = addr + len; 530 531 /* Invalidate BufferRAM */ 532 for (i = 0; i < MAX_BUFFERRAM; i++) { 533 loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift; 534 535 if (buf_addr >= addr && buf_addr < end_addr) 536 this->bufferram[i].blockpage = -1; 537 } 538 } 539 540 /** 541 * onenand_get_device - [GENERIC] Get chip for selected access 542 * @param mtd MTD device structure 543 * @param new_state the state which is requested 544 * 545 * Get the device and lock it for exclusive access 546 */ 547 static void onenand_get_device(struct mtd_info *mtd, int new_state) 548 { 549 /* Do nothing */ 550 } 551 552 /** 553 * onenand_release_device - [GENERIC] release chip 554 * @param mtd MTD device structure 555 * 556 * Deselect, release chip lock and wake up anyone waiting on the device 557 */ 558 static void onenand_release_device(struct mtd_info *mtd) 559 { 560 /* Do nothing */ 561 } 562 563 /** 564 * onenand_transfer_auto_oob - [Internal] oob auto-placement transfer 565 * @param mtd MTD device structure 566 * @param buf destination address 567 * @param column oob offset to read from 568 * @param thislen oob length to read 569 */ 570 static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, 571 int column, int thislen) 572 { 573 struct onenand_chip *this = mtd->priv; 574 struct nand_oobfree *free; 575 int readcol = column; 576 int readend = column + thislen; 577 int lastgap = 0; 578 unsigned int i; 579 uint8_t *oob_buf = this->oob_buf; 580 581 free = this->ecclayout->oobfree; 582 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) { 583 if (readcol >= lastgap) 584 readcol += free->offset - lastgap; 585 if (readend >= lastgap) 586 readend += free->offset - lastgap; 587 lastgap = free->offset + free->length; 588 } 589 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); 590 free = this->ecclayout->oobfree; 591 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) { 592 int free_end = free->offset + free->length; 593 if (free->offset < readend && free_end > readcol) { 594 int st = max_t(int,free->offset,readcol); 595 int ed = min_t(int,free_end,readend); 596 int n = ed - st; 597 memcpy(buf, oob_buf + st, n); 598 buf += n; 599 } else if (column == 0) 600 break; 601 } 602 return 0; 603 } 604 605 /** 606 * onenand_read_ops_nolock - [OneNAND Interface] OneNAND read main and/or out-of-band 607 * @param mtd MTD device structure 608 * @param from offset to read from 609 * @param ops oob operation description structure 610 * 611 * OneNAND read main and/or out-of-band data 612 */ 613 static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from, 614 struct mtd_oob_ops *ops) 615 { 616 struct onenand_chip *this = mtd->priv; 617 struct mtd_ecc_stats stats; 618 size_t len = ops->len; 619 size_t ooblen = ops->ooblen; 620 u_char *buf = ops->datbuf; 621 u_char *oobbuf = ops->oobbuf; 622 int read = 0, column, thislen; 623 int oobread = 0, oobcolumn, thisooblen, oobsize; 624 int ret = 0, boundary = 0; 625 int writesize = this->writesize; 626 627 MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_read_ops_nolock: from = 0x%08x, len = %i\n", (unsigned int) from, (int) len); 628 629 if (ops->mode == MTD_OOB_AUTO) 630 oobsize = this->ecclayout->oobavail; 631 else 632 oobsize = mtd->oobsize; 633 634 oobcolumn = from & (mtd->oobsize - 1); 635 636 /* Do not allow reads past end of device */ 637 if ((from + len) > mtd->size) { 638 printk(KERN_ERR "onenand_read_ops_nolock: Attempt read beyond end of device\n"); 639 ops->retlen = 0; 640 ops->oobretlen = 0; 641 return -EINVAL; 642 } 643 644 stats = mtd->ecc_stats; 645 646 /* Read-while-load method */ 647 648 /* Do first load to bufferRAM */ 649 if (read < len) { 650 if (!onenand_check_bufferram(mtd, from)) { 651 this->main_buf = buf; 652 this->command(mtd, ONENAND_CMD_READ, from, writesize); 653 ret = this->wait(mtd, FL_READING); 654 onenand_update_bufferram(mtd, from, !ret); 655 if (ret == -EBADMSG) 656 ret = 0; 657 } 658 } 659 660 thislen = min_t(int, writesize, len - read); 661 column = from & (writesize - 1); 662 if (column + thislen > writesize) 663 thislen = writesize - column; 664 665 while (!ret) { 666 /* If there is more to load then start next load */ 667 from += thislen; 668 if (read + thislen < len) { 669 this->main_buf = buf + thislen; 670 this->command(mtd, ONENAND_CMD_READ, from, writesize); 671 /* 672 * Chip boundary handling in DDP 673 * Now we issued chip 1 read and pointed chip 1 674 * bufferam so we have to point chip 0 bufferam. 675 */ 676 if (ONENAND_IS_DDP(this) && 677 unlikely(from == (this->chipsize >> 1))) { 678 this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2); 679 boundary = 1; 680 } else 681 boundary = 0; 682 ONENAND_SET_PREV_BUFFERRAM(this); 683 } 684 685 /* While load is going, read from last bufferRAM */ 686 this->read_bufferram(mtd, from - thislen, ONENAND_DATARAM, buf, column, thislen); 687 688 /* Read oob area if needed */ 689 if (oobbuf) { 690 thisooblen = oobsize - oobcolumn; 691 thisooblen = min_t(int, thisooblen, ooblen - oobread); 692 693 if (ops->mode == MTD_OOB_AUTO) 694 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen); 695 else 696 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen); 697 oobread += thisooblen; 698 oobbuf += thisooblen; 699 oobcolumn = 0; 700 } 701 702 /* See if we are done */ 703 read += thislen; 704 if (read == len) 705 break; 706 /* Set up for next read from bufferRAM */ 707 if (unlikely(boundary)) 708 this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2); 709 ONENAND_SET_NEXT_BUFFERRAM(this); 710 buf += thislen; 711 thislen = min_t(int, writesize, len - read); 712 column = 0; 713 714 /* Now wait for load */ 715 ret = this->wait(mtd, FL_READING); 716 onenand_update_bufferram(mtd, from, !ret); 717 if (ret == -EBADMSG) 718 ret = 0; 719 } 720 721 /* 722 * Return success, if no ECC failures, else -EBADMSG 723 * fs driver will take care of that, because 724 * retlen == desired len and result == -EBADMSG 725 */ 726 ops->retlen = read; 727 ops->oobretlen = oobread; 728 729 if (ret) 730 return ret; 731 732 if (mtd->ecc_stats.failed - stats.failed) 733 return -EBADMSG; 734 735 return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0; 736 } 737 738 /** 739 * onenand_read_oob_nolock - [MTD Interface] OneNAND read out-of-band 740 * @param mtd MTD device structure 741 * @param from offset to read from 742 * @param ops oob operation description structure 743 * 744 * OneNAND read out-of-band data from the spare area 745 */ 746 static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, 747 struct mtd_oob_ops *ops) 748 { 749 struct onenand_chip *this = mtd->priv; 750 struct mtd_ecc_stats stats; 751 int read = 0, thislen, column, oobsize; 752 size_t len = ops->ooblen; 753 mtd_oob_mode_t mode = ops->mode; 754 u_char *buf = ops->oobbuf; 755 int ret = 0; 756 757 from += ops->ooboffs; 758 759 MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_read_oob_nolock: from = 0x%08x, len = %i\n", (unsigned int) from, (int) len); 760 761 /* Initialize return length value */ 762 ops->oobretlen = 0; 763 764 if (mode == MTD_OOB_AUTO) 765 oobsize = this->ecclayout->oobavail; 766 else 767 oobsize = mtd->oobsize; 768 769 column = from & (mtd->oobsize - 1); 770 771 if (unlikely(column >= oobsize)) { 772 printk(KERN_ERR "onenand_read_oob_nolock: Attempted to start read outside oob\n"); 773 return -EINVAL; 774 } 775 776 /* Do not allow reads past end of device */ 777 if (unlikely(from >= mtd->size || 778 column + len > ((mtd->size >> this->page_shift) - 779 (from >> this->page_shift)) * oobsize)) { 780 printk(KERN_ERR "onenand_read_oob_nolock: Attempted to read beyond end of device\n"); 781 return -EINVAL; 782 } 783 784 stats = mtd->ecc_stats; 785 786 while (read < len) { 787 thislen = oobsize - column; 788 thislen = min_t(int, thislen, len); 789 790 this->spare_buf = buf; 791 this->command(mtd, ONENAND_CMD_READOOB, from, mtd->oobsize); 792 793 onenand_update_bufferram(mtd, from, 0); 794 795 ret = this->wait(mtd, FL_READING); 796 if (ret && ret != -EBADMSG) { 797 printk(KERN_ERR "onenand_read_oob_nolock: read failed = 0x%x\n", ret); 798 break; 799 } 800 801 if (mode == MTD_OOB_AUTO) 802 onenand_transfer_auto_oob(mtd, buf, column, thislen); 803 else 804 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, buf, column, thislen); 805 806 read += thislen; 807 808 if (read == len) 809 break; 810 811 buf += thislen; 812 813 /* Read more? */ 814 if (read < len) { 815 /* Page size */ 816 from += mtd->writesize; 817 column = 0; 818 } 819 } 820 821 ops->oobretlen = read; 822 823 if (ret) 824 return ret; 825 826 if (mtd->ecc_stats.failed - stats.failed) 827 return -EBADMSG; 828 829 return 0; 830 } 831 832 /** 833 * onenand_read - [MTD Interface] MTD compability function for onenand_read_ecc 834 * @param mtd MTD device structure 835 * @param from offset to read from 836 * @param len number of bytes to read 837 * @param retlen pointer to variable to store the number of read bytes 838 * @param buf the databuffer to put data 839 * 840 * This function simply calls onenand_read_ecc with oob buffer and oobsel = NULL 841 */ 842 int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, 843 size_t * retlen, u_char * buf) 844 { 845 struct mtd_oob_ops ops = { 846 .len = len, 847 .ooblen = 0, 848 .datbuf = buf, 849 .oobbuf = NULL, 850 }; 851 int ret; 852 853 onenand_get_device(mtd, FL_READING); 854 ret = onenand_read_ops_nolock(mtd, from, &ops); 855 onenand_release_device(mtd); 856 857 *retlen = ops.retlen; 858 return ret; 859 } 860 861 /** 862 * onenand_read_oob - [MTD Interface] OneNAND read out-of-band 863 * @param mtd MTD device structure 864 * @param from offset to read from 865 * @param ops oob operations description structure 866 * 867 * OneNAND main and/or out-of-band 868 */ 869 int onenand_read_oob(struct mtd_info *mtd, loff_t from, 870 struct mtd_oob_ops *ops) 871 { 872 int ret; 873 874 switch (ops->mode) { 875 case MTD_OOB_PLACE: 876 case MTD_OOB_AUTO: 877 break; 878 case MTD_OOB_RAW: 879 /* Not implemented yet */ 880 default: 881 return -EINVAL; 882 } 883 884 onenand_get_device(mtd, FL_READING); 885 if (ops->datbuf) 886 ret = onenand_read_ops_nolock(mtd, from, ops); 887 else 888 ret = onenand_read_oob_nolock(mtd, from, ops); 889 onenand_release_device(mtd); 890 891 return ret; 892 } 893 894 /** 895 * onenand_bbt_wait - [DEFAULT] wait until the command is done 896 * @param mtd MTD device structure 897 * @param state state to select the max. timeout value 898 * 899 * Wait for command done. 900 */ 901 static int onenand_bbt_wait(struct mtd_info *mtd, int state) 902 { 903 struct onenand_chip *this = mtd->priv; 904 unsigned int flags = ONENAND_INT_MASTER; 905 unsigned int interrupt; 906 unsigned int ctrl; 907 908 while (1) { 909 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); 910 if (interrupt & flags) 911 break; 912 } 913 914 /* To get correct interrupt status in timeout case */ 915 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT); 916 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS); 917 918 if (interrupt & ONENAND_INT_READ) { 919 int ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS); 920 if (ecc & ONENAND_ECC_2BIT_ALL) 921 return ONENAND_BBT_READ_ERROR; 922 } else { 923 printk(KERN_ERR "onenand_bbt_wait: read timeout!" 924 "ctrl=0x%04x intr=0x%04x\n", ctrl, interrupt); 925 return ONENAND_BBT_READ_FATAL_ERROR; 926 } 927 928 /* Initial bad block case: 0x2400 or 0x0400 */ 929 if (ctrl & ONENAND_CTRL_ERROR) { 930 printk(KERN_DEBUG "onenand_bbt_wait: controller error = 0x%04x\n", ctrl); 931 return ONENAND_BBT_READ_ERROR; 932 } 933 934 return 0; 935 } 936 937 /** 938 * onenand_bbt_read_oob - [MTD Interface] OneNAND read out-of-band for bbt scan 939 * @param mtd MTD device structure 940 * @param from offset to read from 941 * @param ops oob operation description structure 942 * 943 * OneNAND read out-of-band data from the spare area for bbt scan 944 */ 945 int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, 946 struct mtd_oob_ops *ops) 947 { 948 struct onenand_chip *this = mtd->priv; 949 int read = 0, thislen, column; 950 int ret = 0; 951 size_t len = ops->ooblen; 952 u_char *buf = ops->oobbuf; 953 954 MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_bbt_read_oob: from = 0x%08x, len = %zi\n", (unsigned int) from, len); 955 956 /* Initialize return value */ 957 ops->oobretlen = 0; 958 959 /* Do not allow reads past end of device */ 960 if (unlikely((from + len) > mtd->size)) { 961 printk(KERN_ERR "onenand_bbt_read_oob: Attempt read beyond end of device\n"); 962 return ONENAND_BBT_READ_FATAL_ERROR; 963 } 964 965 /* Grab the lock and see if the device is available */ 966 onenand_get_device(mtd, FL_READING); 967 968 column = from & (mtd->oobsize - 1); 969 970 while (read < len) { 971 972 thislen = mtd->oobsize - column; 973 thislen = min_t(int, thislen, len); 974 975 this->spare_buf = buf; 976 this->command(mtd, ONENAND_CMD_READOOB, from, mtd->oobsize); 977 978 onenand_update_bufferram(mtd, from, 0); 979 980 ret = this->bbt_wait(mtd, FL_READING); 981 if (ret) 982 break; 983 984 this->read_spareram(mtd, 0, ONENAND_SPARERAM, buf, column, thislen); 985 read += thislen; 986 if (read == len) 987 break; 988 989 buf += thislen; 990 991 /* Read more? */ 992 if (read < len) { 993 /* Update Page size */ 994 from += this->writesize; 995 column = 0; 996 } 997 } 998 999 /* Deselect and wake up anyone waiting on the device */ 1000 onenand_release_device(mtd); 1001 1002 ops->oobretlen = read; 1003 return ret; 1004 } 1005 1006 1007 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE 1008 /** 1009 * onenand_verify_oob - [GENERIC] verify the oob contents after a write 1010 * @param mtd MTD device structure 1011 * @param buf the databuffer to verify 1012 * @param to offset to read from 1013 */ 1014 static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to) 1015 { 1016 struct onenand_chip *this = mtd->priv; 1017 u_char *oob_buf = this->oob_buf; 1018 int status, i; 1019 1020 this->command(mtd, ONENAND_CMD_READOOB, to, mtd->oobsize); 1021 onenand_update_bufferram(mtd, to, 0); 1022 status = this->wait(mtd, FL_READING); 1023 if (status) 1024 return status; 1025 1026 this->read_bufferram(mtd, 0, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); 1027 for (i = 0; i < mtd->oobsize; i++) 1028 if (buf[i] != 0xFF && buf[i] != oob_buf[i]) 1029 return -EBADMSG; 1030 1031 return 0; 1032 } 1033 1034 /** 1035 * onenand_verify - [GENERIC] verify the chip contents after a write 1036 * @param mtd MTD device structure 1037 * @param buf the databuffer to verify 1038 * @param addr offset to read from 1039 * @param len number of bytes to read and compare 1040 */ 1041 static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr, size_t len) 1042 { 1043 struct onenand_chip *this = mtd->priv; 1044 void __iomem *dataram; 1045 int ret = 0; 1046 int thislen, column; 1047 1048 while (len != 0) { 1049 thislen = min_t(int, this->writesize, len); 1050 column = addr & (this->writesize - 1); 1051 if (column + thislen > this->writesize) 1052 thislen = this->writesize - column; 1053 1054 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize); 1055 1056 onenand_update_bufferram(mtd, addr, 0); 1057 1058 ret = this->wait(mtd, FL_READING); 1059 if (ret) 1060 return ret; 1061 1062 onenand_update_bufferram(mtd, addr, 1); 1063 1064 dataram = this->base + ONENAND_DATARAM; 1065 dataram += onenand_bufferram_offset(mtd, ONENAND_DATARAM); 1066 1067 if (memcmp(buf, dataram + column, thislen)) 1068 return -EBADMSG; 1069 1070 len -= thislen; 1071 buf += thislen; 1072 addr += thislen; 1073 } 1074 1075 return 0; 1076 } 1077 #else 1078 #define onenand_verify(...) (0) 1079 #define onenand_verify_oob(...) (0) 1080 #endif 1081 1082 #define NOTALIGNED(x) ((x & (mtd->writesize - 1)) != 0) 1083 1084 /** 1085 * onenand_fill_auto_oob - [Internal] oob auto-placement transfer 1086 * @param mtd MTD device structure 1087 * @param oob_buf oob buffer 1088 * @param buf source address 1089 * @param column oob offset to write to 1090 * @param thislen oob length to write 1091 */ 1092 static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf, 1093 const u_char *buf, int column, int thislen) 1094 { 1095 struct onenand_chip *this = mtd->priv; 1096 struct nand_oobfree *free; 1097 int writecol = column; 1098 int writeend = column + thislen; 1099 int lastgap = 0; 1100 unsigned int i; 1101 1102 free = this->ecclayout->oobfree; 1103 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) { 1104 if (writecol >= lastgap) 1105 writecol += free->offset - lastgap; 1106 if (writeend >= lastgap) 1107 writeend += free->offset - lastgap; 1108 lastgap = free->offset + free->length; 1109 } 1110 free = this->ecclayout->oobfree; 1111 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) { 1112 int free_end = free->offset + free->length; 1113 if (free->offset < writeend && free_end > writecol) { 1114 int st = max_t(int,free->offset,writecol); 1115 int ed = min_t(int,free_end,writeend); 1116 int n = ed - st; 1117 memcpy(oob_buf + st, buf, n); 1118 buf += n; 1119 } else if (column == 0) 1120 break; 1121 } 1122 return 0; 1123 } 1124 1125 /** 1126 * onenand_write_ops_nolock - [OneNAND Interface] write main and/or out-of-band 1127 * @param mtd MTD device structure 1128 * @param to offset to write to 1129 * @param ops oob operation description structure 1130 * 1131 * Write main and/or oob with ECC 1132 */ 1133 static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to, 1134 struct mtd_oob_ops *ops) 1135 { 1136 struct onenand_chip *this = mtd->priv; 1137 int written = 0, column, thislen, subpage; 1138 int oobwritten = 0, oobcolumn, thisooblen, oobsize; 1139 size_t len = ops->len; 1140 size_t ooblen = ops->ooblen; 1141 const u_char *buf = ops->datbuf; 1142 const u_char *oob = ops->oobbuf; 1143 u_char *oobbuf; 1144 int ret = 0; 1145 1146 MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_write_ops_nolock: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); 1147 1148 /* Initialize retlen, in case of early exit */ 1149 ops->retlen = 0; 1150 ops->oobretlen = 0; 1151 1152 /* Do not allow writes past end of device */ 1153 if (unlikely((to + len) > mtd->size)) { 1154 printk(KERN_ERR "onenand_write_ops_nolock: Attempt write to past end of device\n"); 1155 return -EINVAL; 1156 } 1157 1158 /* Reject writes, which are not page aligned */ 1159 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) { 1160 printk(KERN_ERR "onenand_write_ops_nolock: Attempt to write not page aligned data\n"); 1161 return -EINVAL; 1162 } 1163 1164 if (ops->mode == MTD_OOB_AUTO) 1165 oobsize = this->ecclayout->oobavail; 1166 else 1167 oobsize = mtd->oobsize; 1168 1169 oobcolumn = to & (mtd->oobsize - 1); 1170 1171 column = to & (mtd->writesize - 1); 1172 1173 /* Loop until all data write */ 1174 while (written < len) { 1175 u_char *wbuf = (u_char *) buf; 1176 1177 thislen = min_t(int, mtd->writesize - column, len - written); 1178 thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten); 1179 1180 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen); 1181 1182 /* Partial page write */ 1183 subpage = thislen < mtd->writesize; 1184 if (subpage) { 1185 memset(this->page_buf, 0xff, mtd->writesize); 1186 memcpy(this->page_buf + column, buf, thislen); 1187 wbuf = this->page_buf; 1188 } 1189 1190 this->write_bufferram(mtd, to, ONENAND_DATARAM, wbuf, 0, mtd->writesize); 1191 1192 if (oob) { 1193 oobbuf = this->oob_buf; 1194 1195 /* We send data to spare ram with oobsize 1196 * * to prevent byte access */ 1197 memset(oobbuf, 0xff, mtd->oobsize); 1198 if (ops->mode == MTD_OOB_AUTO) 1199 onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen); 1200 else 1201 memcpy(oobbuf + oobcolumn, oob, thisooblen); 1202 1203 oobwritten += thisooblen; 1204 oob += thisooblen; 1205 oobcolumn = 0; 1206 } else 1207 oobbuf = (u_char *) ffchars; 1208 1209 this->write_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); 1210 1211 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize); 1212 1213 ret = this->wait(mtd, FL_WRITING); 1214 1215 /* In partial page write we don't update bufferram */ 1216 onenand_update_bufferram(mtd, to, !ret && !subpage); 1217 if (ONENAND_IS_2PLANE(this)) { 1218 ONENAND_SET_BUFFERRAM1(this); 1219 onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage); 1220 } 1221 1222 if (ret) { 1223 printk(KERN_ERR "onenand_write_ops_nolock: write filaed %d\n", ret); 1224 break; 1225 } 1226 1227 /* Only check verify write turn on */ 1228 ret = onenand_verify(mtd, buf, to, thislen); 1229 if (ret) { 1230 printk(KERN_ERR "onenand_write_ops_nolock: verify failed %d\n", ret); 1231 break; 1232 } 1233 1234 written += thislen; 1235 1236 if (written == len) 1237 break; 1238 1239 column = 0; 1240 to += thislen; 1241 buf += thislen; 1242 } 1243 1244 ops->retlen = written; 1245 1246 return ret; 1247 } 1248 1249 /** 1250 * onenand_write_oob_nolock - [Internal] OneNAND write out-of-band 1251 * @param mtd MTD device structure 1252 * @param to offset to write to 1253 * @param len number of bytes to write 1254 * @param retlen pointer to variable to store the number of written bytes 1255 * @param buf the data to write 1256 * @param mode operation mode 1257 * 1258 * OneNAND write out-of-band 1259 */ 1260 static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, 1261 struct mtd_oob_ops *ops) 1262 { 1263 struct onenand_chip *this = mtd->priv; 1264 int column, ret = 0, oobsize; 1265 int written = 0; 1266 u_char *oobbuf; 1267 size_t len = ops->ooblen; 1268 const u_char *buf = ops->oobbuf; 1269 mtd_oob_mode_t mode = ops->mode; 1270 1271 to += ops->ooboffs; 1272 1273 MTDDEBUG(MTD_DEBUG_LEVEL3, "onenand_write_oob_nolock: to = 0x%08x, len = %i\n", (unsigned int) to, (int) len); 1274 1275 /* Initialize retlen, in case of early exit */ 1276 ops->oobretlen = 0; 1277 1278 if (mode == MTD_OOB_AUTO) 1279 oobsize = this->ecclayout->oobavail; 1280 else 1281 oobsize = mtd->oobsize; 1282 1283 column = to & (mtd->oobsize - 1); 1284 1285 if (unlikely(column >= oobsize)) { 1286 printk(KERN_ERR "onenand_write_oob_nolock: Attempted to start write outside oob\n"); 1287 return -EINVAL; 1288 } 1289 1290 /* For compatibility with NAND: Do not allow write past end of page */ 1291 if (unlikely(column + len > oobsize)) { 1292 printk(KERN_ERR "onenand_write_oob_nolock: " 1293 "Attempt to write past end of page\n"); 1294 return -EINVAL; 1295 } 1296 1297 /* Do not allow reads past end of device */ 1298 if (unlikely(to >= mtd->size || 1299 column + len > ((mtd->size >> this->page_shift) - 1300 (to >> this->page_shift)) * oobsize)) { 1301 printk(KERN_ERR "onenand_write_oob_nolock: Attempted to write past end of device\n"); 1302 return -EINVAL; 1303 } 1304 1305 oobbuf = this->oob_buf; 1306 1307 /* Loop until all data write */ 1308 while (written < len) { 1309 int thislen = min_t(int, oobsize, len - written); 1310 1311 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize); 1312 1313 /* We send data to spare ram with oobsize 1314 * to prevent byte access */ 1315 memset(oobbuf, 0xff, mtd->oobsize); 1316 if (mode == MTD_OOB_AUTO) 1317 onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen); 1318 else 1319 memcpy(oobbuf + column, buf, thislen); 1320 this->write_bufferram(mtd, 0, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); 1321 1322 this->command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize); 1323 1324 onenand_update_bufferram(mtd, to, 0); 1325 if (ONENAND_IS_2PLANE(this)) { 1326 ONENAND_SET_BUFFERRAM1(this); 1327 onenand_update_bufferram(mtd, to + this->writesize, 0); 1328 } 1329 1330 ret = this->wait(mtd, FL_WRITING); 1331 if (ret) { 1332 printk(KERN_ERR "onenand_write_oob_nolock: write failed %d\n", ret); 1333 break; 1334 } 1335 1336 ret = onenand_verify_oob(mtd, oobbuf, to); 1337 if (ret) { 1338 printk(KERN_ERR "onenand_write_oob_nolock: verify failed %d\n", ret); 1339 break; 1340 } 1341 1342 written += thislen; 1343 if (written == len) 1344 break; 1345 1346 to += mtd->writesize; 1347 buf += thislen; 1348 column = 0; 1349 } 1350 1351 ops->oobretlen = written; 1352 1353 return ret; 1354 } 1355 1356 /** 1357 * onenand_write - [MTD Interface] compability function for onenand_write_ecc 1358 * @param mtd MTD device structure 1359 * @param to offset to write to 1360 * @param len number of bytes to write 1361 * @param retlen pointer to variable to store the number of written bytes 1362 * @param buf the data to write 1363 * 1364 * Write with ECC 1365 */ 1366 int onenand_write(struct mtd_info *mtd, loff_t to, size_t len, 1367 size_t * retlen, const u_char * buf) 1368 { 1369 struct mtd_oob_ops ops = { 1370 .len = len, 1371 .ooblen = 0, 1372 .datbuf = (u_char *) buf, 1373 .oobbuf = NULL, 1374 }; 1375 int ret; 1376 1377 onenand_get_device(mtd, FL_WRITING); 1378 ret = onenand_write_ops_nolock(mtd, to, &ops); 1379 onenand_release_device(mtd); 1380 1381 *retlen = ops.retlen; 1382 return ret; 1383 } 1384 1385 /** 1386 * onenand_write_oob - [MTD Interface] OneNAND write out-of-band 1387 * @param mtd MTD device structure 1388 * @param to offset to write to 1389 * @param ops oob operation description structure 1390 * 1391 * OneNAND write main and/or out-of-band 1392 */ 1393 int onenand_write_oob(struct mtd_info *mtd, loff_t to, 1394 struct mtd_oob_ops *ops) 1395 { 1396 int ret; 1397 1398 switch (ops->mode) { 1399 case MTD_OOB_PLACE: 1400 case MTD_OOB_AUTO: 1401 break; 1402 case MTD_OOB_RAW: 1403 /* Not implemented yet */ 1404 default: 1405 return -EINVAL; 1406 } 1407 1408 onenand_get_device(mtd, FL_WRITING); 1409 if (ops->datbuf) 1410 ret = onenand_write_ops_nolock(mtd, to, ops); 1411 else 1412 ret = onenand_write_oob_nolock(mtd, to, ops); 1413 onenand_release_device(mtd); 1414 1415 return ret; 1416 1417 } 1418 1419 /** 1420 * onenand_block_isbad_nolock - [GENERIC] Check if a block is marked bad 1421 * @param mtd MTD device structure 1422 * @param ofs offset from device start 1423 * @param allowbbt 1, if its allowed to access the bbt area 1424 * 1425 * Check, if the block is bad, Either by reading the bad block table or 1426 * calling of the scan function. 1427 */ 1428 static int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allowbbt) 1429 { 1430 struct onenand_chip *this = mtd->priv; 1431 struct bbm_info *bbm = this->bbm; 1432 1433 /* Return info from the table */ 1434 return bbm->isbad_bbt(mtd, ofs, allowbbt); 1435 } 1436 1437 1438 /** 1439 * onenand_erase - [MTD Interface] erase block(s) 1440 * @param mtd MTD device structure 1441 * @param instr erase instruction 1442 * 1443 * Erase one ore more blocks 1444 */ 1445 int onenand_erase(struct mtd_info *mtd, struct erase_info *instr) 1446 { 1447 struct onenand_chip *this = mtd->priv; 1448 unsigned int block_size; 1449 loff_t addr; 1450 int len; 1451 int ret = 0; 1452 1453 MTDDEBUG (MTD_DEBUG_LEVEL3, 1454 "onenand_erase: start = 0x%08x, len = %i\n", 1455 (unsigned int)instr->addr, (unsigned int)instr->len); 1456 1457 block_size = (1 << this->erase_shift); 1458 1459 /* Start address must align on block boundary */ 1460 if (unlikely(instr->addr & (block_size - 1))) { 1461 MTDDEBUG (MTD_DEBUG_LEVEL0, 1462 "onenand_erase: Unaligned address\n"); 1463 return -EINVAL; 1464 } 1465 1466 /* Length must align on block boundary */ 1467 if (unlikely(instr->len & (block_size - 1))) { 1468 MTDDEBUG (MTD_DEBUG_LEVEL0, 1469 "onenand_erase: Length not block aligned\n"); 1470 return -EINVAL; 1471 } 1472 1473 /* Do not allow erase past end of device */ 1474 if (unlikely((instr->len + instr->addr) > mtd->size)) { 1475 MTDDEBUG (MTD_DEBUG_LEVEL0, 1476 "onenand_erase: Erase past end of device\n"); 1477 return -EINVAL; 1478 } 1479 1480 instr->fail_addr = 0xffffffff; 1481 1482 /* Grab the lock and see if the device is available */ 1483 onenand_get_device(mtd, FL_ERASING); 1484 1485 /* Loop throught the pages */ 1486 len = instr->len; 1487 addr = instr->addr; 1488 1489 instr->state = MTD_ERASING; 1490 1491 while (len) { 1492 1493 /* Check if we have a bad block, we do not erase bad blocks */ 1494 if (instr->priv == 0 && onenand_block_isbad_nolock(mtd, addr, 0)) { 1495 printk(KERN_WARNING "onenand_erase: attempt to erase" 1496 " a bad block at addr 0x%08x\n", 1497 (unsigned int) addr); 1498 instr->state = MTD_ERASE_FAILED; 1499 goto erase_exit; 1500 } 1501 1502 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size); 1503 1504 onenand_invalidate_bufferram(mtd, addr, block_size); 1505 1506 ret = this->wait(mtd, FL_ERASING); 1507 /* Check, if it is write protected */ 1508 if (ret) { 1509 if (ret == -EPERM) 1510 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_erase: " 1511 "Device is write protected!!!\n"); 1512 else 1513 MTDDEBUG (MTD_DEBUG_LEVEL0, "onenand_erase: " 1514 "Failed erase, block %d\n", 1515 (unsigned)(addr >> this->erase_shift)); 1516 if (ret == -EPERM) 1517 printk("onenand_erase: " 1518 "Device is write protected!!!\n"); 1519 else 1520 printk("onenand_erase: " 1521 "Failed erase, block %d\n", 1522 (unsigned)(addr >> this->erase_shift)); 1523 instr->state = MTD_ERASE_FAILED; 1524 instr->fail_addr = addr; 1525 1526 goto erase_exit; 1527 } 1528 1529 len -= block_size; 1530 addr += block_size; 1531 } 1532 1533 instr->state = MTD_ERASE_DONE; 1534 1535 erase_exit: 1536 1537 ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO; 1538 /* Do call back function */ 1539 if (!ret) 1540 mtd_erase_callback(instr); 1541 1542 /* Deselect and wake up anyone waiting on the device */ 1543 onenand_release_device(mtd); 1544 1545 return ret; 1546 } 1547 1548 /** 1549 * onenand_sync - [MTD Interface] sync 1550 * @param mtd MTD device structure 1551 * 1552 * Sync is actually a wait for chip ready function 1553 */ 1554 void onenand_sync(struct mtd_info *mtd) 1555 { 1556 MTDDEBUG (MTD_DEBUG_LEVEL3, "onenand_sync: called\n"); 1557 1558 /* Grab the lock and see if the device is available */ 1559 onenand_get_device(mtd, FL_SYNCING); 1560 1561 /* Release it and go back */ 1562 onenand_release_device(mtd); 1563 } 1564 1565 /** 1566 * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad 1567 * @param mtd MTD device structure 1568 * @param ofs offset relative to mtd start 1569 * 1570 * Check whether the block is bad 1571 */ 1572 int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs) 1573 { 1574 int ret; 1575 1576 /* Check for invalid offset */ 1577 if (ofs > mtd->size) 1578 return -EINVAL; 1579 1580 onenand_get_device(mtd, FL_READING); 1581 ret = onenand_block_isbad_nolock(mtd,ofs, 0); 1582 onenand_release_device(mtd); 1583 return ret; 1584 } 1585 1586 /** 1587 * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad 1588 * @param mtd MTD device structure 1589 * @param ofs offset relative to mtd start 1590 * 1591 * Mark the block as bad 1592 */ 1593 int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs) 1594 { 1595 struct onenand_chip *this = mtd->priv; 1596 int ret; 1597 1598 ret = onenand_block_isbad(mtd, ofs); 1599 if (ret) { 1600 /* If it was bad already, return success and do nothing */ 1601 if (ret > 0) 1602 return 0; 1603 return ret; 1604 } 1605 1606 ret = this->block_markbad(mtd, ofs); 1607 return ret; 1608 } 1609 1610 /** 1611 * onenand_do_lock_cmd - [OneNAND Interface] Lock or unlock block(s) 1612 * @param mtd MTD device structure 1613 * @param ofs offset relative to mtd start 1614 * @param len number of bytes to lock or unlock 1615 * @param cmd lock or unlock command 1616 * 1617 * Lock or unlock one or more blocks 1618 */ 1619 static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int cmd) 1620 { 1621 struct onenand_chip *this = mtd->priv; 1622 int start, end, block, value, status; 1623 int wp_status_mask; 1624 1625 start = ofs >> this->erase_shift; 1626 end = len >> this->erase_shift; 1627 1628 if (cmd == ONENAND_CMD_LOCK) 1629 wp_status_mask = ONENAND_WP_LS; 1630 else 1631 wp_status_mask = ONENAND_WP_US; 1632 1633 /* Continuous lock scheme */ 1634 if (this->options & ONENAND_HAS_CONT_LOCK) { 1635 /* Set start block address */ 1636 this->write_word(start, 1637 this->base + ONENAND_REG_START_BLOCK_ADDRESS); 1638 /* Set end block address */ 1639 this->write_word(end - 1, 1640 this->base + ONENAND_REG_END_BLOCK_ADDRESS); 1641 /* Write unlock command */ 1642 this->command(mtd, cmd, 0, 0); 1643 1644 /* There's no return value */ 1645 this->wait(mtd, FL_UNLOCKING); 1646 1647 /* Sanity check */ 1648 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) 1649 & ONENAND_CTRL_ONGO) 1650 continue; 1651 1652 /* Check lock status */ 1653 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); 1654 if (!(status & ONENAND_WP_US)) 1655 printk(KERN_ERR "wp status = 0x%x\n", status); 1656 1657 return 0; 1658 } 1659 1660 /* Block lock scheme */ 1661 for (block = start; block < start + end; block++) { 1662 /* Set block address */ 1663 value = onenand_block_address(this, block); 1664 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); 1665 /* Select DataRAM for DDP */ 1666 value = onenand_bufferram_address(this, block); 1667 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); 1668 1669 /* Set start block address */ 1670 this->write_word(block, 1671 this->base + ONENAND_REG_START_BLOCK_ADDRESS); 1672 /* Write unlock command */ 1673 this->command(mtd, ONENAND_CMD_UNLOCK, 0, 0); 1674 1675 /* There's no return value */ 1676 this->wait(mtd, FL_UNLOCKING); 1677 1678 /* Sanity check */ 1679 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) 1680 & ONENAND_CTRL_ONGO) 1681 continue; 1682 1683 /* Check lock status */ 1684 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); 1685 if (!(status & ONENAND_WP_US)) 1686 printk(KERN_ERR "block = %d, wp status = 0x%x\n", 1687 block, status); 1688 } 1689 1690 return 0; 1691 } 1692 1693 #ifdef ONENAND_LINUX 1694 /** 1695 * onenand_lock - [MTD Interface] Lock block(s) 1696 * @param mtd MTD device structure 1697 * @param ofs offset relative to mtd start 1698 * @param len number of bytes to unlock 1699 * 1700 * Lock one or more blocks 1701 */ 1702 static int onenand_lock(struct mtd_info *mtd, loff_t ofs, size_t len) 1703 { 1704 int ret; 1705 1706 onenand_get_device(mtd, FL_LOCKING); 1707 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK); 1708 onenand_release_device(mtd); 1709 return ret; 1710 } 1711 1712 /** 1713 * onenand_unlock - [MTD Interface] Unlock block(s) 1714 * @param mtd MTD device structure 1715 * @param ofs offset relative to mtd start 1716 * @param len number of bytes to unlock 1717 * 1718 * Unlock one or more blocks 1719 */ 1720 static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, size_t len) 1721 { 1722 int ret; 1723 1724 onenand_get_device(mtd, FL_LOCKING); 1725 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK); 1726 onenand_release_device(mtd); 1727 return ret; 1728 } 1729 #endif 1730 1731 /** 1732 * onenand_check_lock_status - [OneNAND Interface] Check lock status 1733 * @param this onenand chip data structure 1734 * 1735 * Check lock status 1736 */ 1737 static int onenand_check_lock_status(struct onenand_chip *this) 1738 { 1739 unsigned int value, block, status; 1740 unsigned int end; 1741 1742 end = this->chipsize >> this->erase_shift; 1743 for (block = 0; block < end; block++) { 1744 /* Set block address */ 1745 value = onenand_block_address(this, block); 1746 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1); 1747 /* Select DataRAM for DDP */ 1748 value = onenand_bufferram_address(this, block); 1749 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); 1750 /* Set start block address */ 1751 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS); 1752 1753 /* Check lock status */ 1754 status = this->read_word(this->base + ONENAND_REG_WP_STATUS); 1755 if (!(status & ONENAND_WP_US)) { 1756 printk(KERN_ERR "block = %d, wp status = 0x%x\n", block, status); 1757 return 0; 1758 } 1759 } 1760 1761 return 1; 1762 } 1763 1764 /** 1765 * onenand_unlock_all - [OneNAND Interface] unlock all blocks 1766 * @param mtd MTD device structure 1767 * 1768 * Unlock all blocks 1769 */ 1770 static void onenand_unlock_all(struct mtd_info *mtd) 1771 { 1772 struct onenand_chip *this = mtd->priv; 1773 loff_t ofs = 0; 1774 size_t len = this->chipsize; 1775 1776 if (this->options & ONENAND_HAS_UNLOCK_ALL) { 1777 /* Set start block address */ 1778 this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS); 1779 /* Write unlock command */ 1780 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0); 1781 1782 /* There's no return value */ 1783 this->wait(mtd, FL_LOCKING); 1784 1785 /* Sanity check */ 1786 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS) 1787 & ONENAND_CTRL_ONGO) 1788 continue; 1789 1790 return; 1791 1792 /* Check lock status */ 1793 if (onenand_check_lock_status(this)) 1794 return; 1795 1796 /* Workaround for all block unlock in DDP */ 1797 if (ONENAND_IS_DDP(this)) { 1798 /* All blocks on another chip */ 1799 ofs = this->chipsize >> 1; 1800 len = this->chipsize >> 1; 1801 } 1802 } 1803 1804 onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK); 1805 } 1806 1807 1808 /** 1809 * onenand_check_features - Check and set OneNAND features 1810 * @param mtd MTD data structure 1811 * 1812 * Check and set OneNAND features 1813 * - lock scheme 1814 * - two plane 1815 */ 1816 static void onenand_check_features(struct mtd_info *mtd) 1817 { 1818 struct onenand_chip *this = mtd->priv; 1819 unsigned int density, process; 1820 1821 /* Lock scheme depends on density and process */ 1822 density = onenand_get_density(this->device_id); 1823 process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT; 1824 1825 /* Lock scheme */ 1826 switch (density) { 1827 case ONENAND_DEVICE_DENSITY_4Gb: 1828 this->options |= ONENAND_HAS_2PLANE; 1829 1830 case ONENAND_DEVICE_DENSITY_2Gb: 1831 /* 2Gb DDP don't have 2 plane */ 1832 if (!ONENAND_IS_DDP(this)) 1833 this->options |= ONENAND_HAS_2PLANE; 1834 this->options |= ONENAND_HAS_UNLOCK_ALL; 1835 1836 case ONENAND_DEVICE_DENSITY_1Gb: 1837 /* A-Die has all block unlock */ 1838 if (process) 1839 this->options |= ONENAND_HAS_UNLOCK_ALL; 1840 break; 1841 1842 default: 1843 /* Some OneNAND has continuous lock scheme */ 1844 if (!process) 1845 this->options |= ONENAND_HAS_CONT_LOCK; 1846 break; 1847 } 1848 1849 if (this->options & ONENAND_HAS_CONT_LOCK) 1850 printk(KERN_DEBUG "Lock scheme is Continuous Lock\n"); 1851 if (this->options & ONENAND_HAS_UNLOCK_ALL) 1852 printk(KERN_DEBUG "Chip support all block unlock\n"); 1853 if (this->options & ONENAND_HAS_2PLANE) 1854 printk(KERN_DEBUG "Chip has 2 plane\n"); 1855 } 1856 1857 /** 1858 * onenand_print_device_info - Print device ID 1859 * @param device device ID 1860 * 1861 * Print device ID 1862 */ 1863 char *onenand_print_device_info(int device, int version) 1864 { 1865 int vcc, demuxed, ddp, density; 1866 char *dev_info = malloc(80); 1867 char *p = dev_info; 1868 1869 vcc = device & ONENAND_DEVICE_VCC_MASK; 1870 demuxed = device & ONENAND_DEVICE_IS_DEMUX; 1871 ddp = device & ONENAND_DEVICE_IS_DDP; 1872 density = device >> ONENAND_DEVICE_DENSITY_SHIFT; 1873 p += sprintf(dev_info, "%sOneNAND%s %dMB %sV 16-bit (0x%02x)", 1874 demuxed ? "" : "Muxed ", 1875 ddp ? "(DDP)" : "", 1876 (16 << density), vcc ? "2.65/3.3" : "1.8", device); 1877 1878 sprintf(p, "\nOneNAND version = 0x%04x", version); 1879 printk("%s\n", dev_info); 1880 1881 return dev_info; 1882 } 1883 1884 static const struct onenand_manufacturers onenand_manuf_ids[] = { 1885 {ONENAND_MFR_SAMSUNG, "Samsung"}, 1886 }; 1887 1888 /** 1889 * onenand_check_maf - Check manufacturer ID 1890 * @param manuf manufacturer ID 1891 * 1892 * Check manufacturer ID 1893 */ 1894 static int onenand_check_maf(int manuf) 1895 { 1896 int size = ARRAY_SIZE(onenand_manuf_ids); 1897 char *name; 1898 int i; 1899 1900 for (i = 0; size; i++) 1901 if (manuf == onenand_manuf_ids[i].id) 1902 break; 1903 1904 if (i < size) 1905 name = onenand_manuf_ids[i].name; 1906 else 1907 name = "Unknown"; 1908 1909 #ifdef ONENAND_DEBUG 1910 printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n", name, manuf); 1911 #endif 1912 1913 return i == size; 1914 } 1915 1916 /** 1917 * onenand_probe - [OneNAND Interface] Probe the OneNAND device 1918 * @param mtd MTD device structure 1919 * 1920 * OneNAND detection method: 1921 * Compare the the values from command with ones from register 1922 */ 1923 static int onenand_probe(struct mtd_info *mtd) 1924 { 1925 struct onenand_chip *this = mtd->priv; 1926 int bram_maf_id, bram_dev_id, maf_id, dev_id, ver_id; 1927 int density; 1928 int syscfg; 1929 1930 /* Save system configuration 1 */ 1931 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1); 1932 /* Clear Sync. Burst Read mode to read BootRAM */ 1933 this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ), this->base + ONENAND_REG_SYS_CFG1); 1934 1935 /* Send the command for reading device ID from BootRAM */ 1936 this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM); 1937 1938 /* Read manufacturer and device IDs from BootRAM */ 1939 bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0); 1940 bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2); 1941 1942 /* Reset OneNAND to read default register values */ 1943 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM); 1944 1945 /* Wait reset */ 1946 this->wait(mtd, FL_RESETING); 1947 1948 /* Restore system configuration 1 */ 1949 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1); 1950 1951 /* Check manufacturer ID */ 1952 if (onenand_check_maf(bram_maf_id)) 1953 return -ENXIO; 1954 1955 /* Read manufacturer and device IDs from Register */ 1956 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID); 1957 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID); 1958 ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID); 1959 1960 /* Check OneNAND device */ 1961 if (maf_id != bram_maf_id || dev_id != bram_dev_id) 1962 return -ENXIO; 1963 1964 /* FIXME : Current OneNAND MTD doesn't support Flex-OneNAND */ 1965 if (dev_id & (1 << 9)) { 1966 printk("Not yet support Flex-OneNAND\n"); 1967 return -ENXIO; 1968 } 1969 1970 /* Flash device information */ 1971 mtd->name = onenand_print_device_info(dev_id, ver_id); 1972 this->device_id = dev_id; 1973 this->version_id = ver_id; 1974 1975 density = onenand_get_density(dev_id); 1976 this->chipsize = (16 << density) << 20; 1977 /* Set density mask. it is used for DDP */ 1978 if (ONENAND_IS_DDP(this)) 1979 this->density_mask = (1 << (density + 6)); 1980 else 1981 this->density_mask = 0; 1982 1983 /* OneNAND page size & block size */ 1984 /* The data buffer size is equal to page size */ 1985 mtd->writesize = 1986 this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); 1987 mtd->oobsize = mtd->writesize >> 5; 1988 /* Pagers per block is always 64 in OneNAND */ 1989 mtd->erasesize = mtd->writesize << 6; 1990 1991 this->erase_shift = ffs(mtd->erasesize) - 1; 1992 this->page_shift = ffs(mtd->writesize) - 1; 1993 this->ppb_shift = (this->erase_shift - this->page_shift); 1994 this->page_mask = (mtd->erasesize / mtd->writesize) - 1; 1995 /* It's real page size */ 1996 this->writesize = mtd->writesize; 1997 1998 /* REVIST: Multichip handling */ 1999 2000 mtd->size = this->chipsize; 2001 2002 /* Check OneNAND features */ 2003 onenand_check_features(mtd); 2004 2005 mtd->flags = MTD_CAP_NANDFLASH; 2006 mtd->erase = onenand_erase; 2007 mtd->read = onenand_read; 2008 mtd->write = onenand_write; 2009 mtd->read_oob = onenand_read_oob; 2010 mtd->write_oob = onenand_write_oob; 2011 mtd->sync = onenand_sync; 2012 mtd->block_isbad = onenand_block_isbad; 2013 mtd->block_markbad = onenand_block_markbad; 2014 2015 return 0; 2016 } 2017 2018 /** 2019 * onenand_scan - [OneNAND Interface] Scan for the OneNAND device 2020 * @param mtd MTD device structure 2021 * @param maxchips Number of chips to scan for 2022 * 2023 * This fills out all the not initialized function pointers 2024 * with the defaults. 2025 * The flash ID is read and the mtd/chip structures are 2026 * filled with the appropriate values. 2027 */ 2028 int onenand_scan(struct mtd_info *mtd, int maxchips) 2029 { 2030 struct onenand_chip *this = mtd->priv; 2031 2032 if (!this->read_word) 2033 this->read_word = onenand_readw; 2034 if (!this->write_word) 2035 this->write_word = onenand_writew; 2036 2037 if (!this->command) 2038 this->command = onenand_command; 2039 if (!this->wait) 2040 this->wait = onenand_wait; 2041 if (!this->bbt_wait) 2042 this->bbt_wait = onenand_bbt_wait; 2043 2044 if (!this->read_bufferram) 2045 this->read_bufferram = onenand_read_bufferram; 2046 if (!this->read_spareram) 2047 this->read_spareram = onenand_read_bufferram; 2048 if (!this->write_bufferram) 2049 this->write_bufferram = onenand_write_bufferram; 2050 2051 if (!this->scan_bbt) 2052 this->scan_bbt = onenand_default_bbt; 2053 2054 if (onenand_probe(mtd)) 2055 return -ENXIO; 2056 2057 /* Set Sync. Burst Read after probing */ 2058 if (this->mmcontrol) { 2059 printk(KERN_INFO "OneNAND Sync. Burst Read support\n"); 2060 this->read_bufferram = onenand_sync_read_bufferram; 2061 } 2062 2063 /* Allocate buffers, if necessary */ 2064 if (!this->page_buf) { 2065 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL); 2066 if (!this->page_buf) { 2067 printk(KERN_ERR "onenand_scan(): Can't allocate page_buf\n"); 2068 return -ENOMEM; 2069 } 2070 this->options |= ONENAND_PAGEBUF_ALLOC; 2071 } 2072 if (!this->oob_buf) { 2073 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL); 2074 if (!this->oob_buf) { 2075 printk(KERN_ERR "onenand_scan: Can't allocate oob_buf\n"); 2076 if (this->options & ONENAND_PAGEBUF_ALLOC) { 2077 this->options &= ~ONENAND_PAGEBUF_ALLOC; 2078 kfree(this->page_buf); 2079 } 2080 return -ENOMEM; 2081 } 2082 this->options |= ONENAND_OOBBUF_ALLOC; 2083 } 2084 2085 /* Unlock whole block */ 2086 onenand_unlock_all(mtd); 2087 2088 return this->scan_bbt(mtd); 2089 } 2090 2091 /** 2092 * onenand_release - [OneNAND Interface] Free resources held by the OneNAND device 2093 * @param mtd MTD device structure 2094 */ 2095 void onenand_release(struct mtd_info *mtd) 2096 { 2097 } 2098