2 * linux/drivers/mtd/onenand/onenand_base.c
4 * Copyright © 2005-2009 Samsung Electronics
5 * Copyright © 2007 Nokia Corporation
7 * Kyungmin Park <kyungmin.park@samsung.com>
10 * Adrian Hunter <ext-adrian.hunter@nokia.com>:
11 * auto-placement support, read-while load support, various fixes
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>
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.
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>
38 * Multiblock erase if number of blocks to erase is 2 or more.
39 * Maximum number of blocks for simultaneous erase is 64.
41 #define MB_ERASE_MIN_BLK_COUNT 2
42 #define MB_ERASE_MAX_BLK_COUNT 64
44 /* Default Flex-OneNAND boundary and lock respectively */
45 static int flex_bdry[MAX_DIES * 2] = { -1, 0, -1, 0 };
47 module_param_array(flex_bdry, int, NULL, 0400);
48 MODULE_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");
55 /* Default OneNAND/Flex-OneNAND OTP options*/
58 module_param(otp, int, 0400);
59 MODULE_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");
68 * flexonenand_oob_128 - oob info for Flex-Onenand with 4KB page
69 * For now, we expose only 64 out of 80 ecc bytes
71 static struct nand_ecclayout flexonenand_oob_128 = {
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,
83 {2, 4}, {18, 4}, {34, 4}, {50, 4},
84 {66, 4}, {82, 4}, {98, 4}, {114, 4}
89 * onenand_oob_128 - oob info for OneNAND with 4KB page
91 * Based on specification:
92 * 4Gb M-die OneNAND Flash (KFM4G16Q4M, KFN8G16Q4M). Rev. 1.3, Apr. 2010
94 * For eccpos we expose only 64 bytes out of 72 (see struct nand_ecclayout)
96 * oobfree uses the spare area fields marked as
97 * "Managed by internal ECC logic for Logical Sector Number area"
99 static struct nand_ecclayout onenand_oob_128 = {
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,
112 {2, 3}, {18, 3}, {34, 3}, {50, 3},
113 {66, 3}, {82, 3}, {98, 3}, {114, 3}
118 * onenand_oob_64 - oob info for large (2KB) page
120 static struct nand_ecclayout onenand_oob_64 = {
129 {2, 3}, {14, 2}, {18, 3}, {30, 2},
130 {34, 3}, {46, 2}, {50, 3}, {62, 2}
135 * onenand_oob_32 - oob info for middle (1KB) page
137 static struct nand_ecclayout onenand_oob_32 = {
143 .oobfree = { {2, 3}, {14, 2}, {18, 3}, {30, 2} }
146 static 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 */
166 * onenand_readw - [OneNAND Interface] Read OneNAND register
167 * @param addr address to read
169 * Read OneNAND register
171 static unsigned short onenand_readw(void __iomem *addr)
177 * onenand_writew - [OneNAND Interface] Write OneNAND register with value
178 * @param value value to write
179 * @param addr address to write
181 * Write OneNAND register with value
183 static void onenand_writew(unsigned short value, void __iomem *addr)
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
194 * Setup Start Address 1 Register (F100h)
196 static int onenand_block_address(struct onenand_chip *this, int block)
198 /* Device Flash Core select, NAND Flash Block Address */
199 if (block & this->density_mask)
200 return ONENAND_DDP_CHIP1 | (block ^ this->density_mask);
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
211 * Setup Start Address 2 Register (F101h) for DDP
213 static int onenand_bufferram_address(struct onenand_chip *this, int block)
215 /* Device BufferRAM Select */
216 if (block & this->density_mask)
217 return ONENAND_DDP_CHIP1;
219 return ONENAND_DDP_CHIP0;
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
228 * Setup Start Address 8 Register (F107h)
230 static int onenand_page_address(int page, int sector)
232 /* Flash Page Address, Flash Sector Address */
235 fpa = page & ONENAND_FPA_MASK;
236 fsa = sector & ONENAND_FSA_MASK;
238 return ((fpa << ONENAND_FPA_SHIFT) | fsa);
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
248 * Setup Start Buffer Register (F200h)
250 static int onenand_buffer_address(int dataram1, int sectors, int count)
254 /* BufferRAM Sector Address */
255 bsa = sectors & ONENAND_BSA_MASK;
258 bsa |= ONENAND_BSA_DATARAM1; /* DataRAM1 */
260 bsa |= ONENAND_BSA_DATARAM0; /* DataRAM0 */
262 /* BufferRAM Sector Count */
263 bsc = count & ONENAND_BSC_MASK;
265 return ((bsa << ONENAND_BSA_SHIFT) | bsc);
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
273 static unsigned flexonenand_block(struct onenand_chip *this, loff_t addr)
275 unsigned boundary, blk, die = 0;
277 if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) {
279 addr -= this->diesize[0];
282 boundary = this->boundary[die];
284 blk = addr >> (this->erase_shift - 1);
286 blk = (blk + boundary + 1) >> 1;
288 blk += die ? this->density_mask : 0;
292 inline unsigned onenand_block(struct onenand_chip *this, loff_t addr)
294 if (!FLEXONENAND(this))
295 return addr >> this->erase_shift;
296 return flexonenand_block(this, addr);
300 * flexonenand_addr - Return address of the block
301 * @this: OneNAND device structure
302 * @block: Block number on Flex-OneNAND
304 * Return address of the block
306 static loff_t flexonenand_addr(struct onenand_chip *this, int block)
309 int die = 0, boundary;
311 if (ONENAND_IS_DDP(this) && block >= this->density_mask) {
312 block -= this->density_mask;
314 ofs = this->diesize[0];
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);
324 loff_t onenand_addr(struct onenand_chip *this, int block)
326 if (!FLEXONENAND(this))
327 return (loff_t)block << this->erase_shift;
328 return flexonenand_addr(this, block);
330 EXPORT_SYMBOL(onenand_addr);
333 * onenand_get_density - [DEFAULT] Get OneNAND density
334 * @param dev_id OneNAND device ID
336 * Get OneNAND density from device ID
338 static inline int onenand_get_density(int dev_id)
340 int density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT;
341 return (density & ONENAND_DEVICE_DENSITY_MASK);
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
349 int flexonenand_region(struct mtd_info *mtd, loff_t addr)
353 for (i = 0; i < mtd->numeraseregions; i++)
354 if (addr < mtd->eraseregions[i].offset)
358 EXPORT_SYMBOL(flexonenand_region);
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
367 * Send command to OneNAND device. This function is used for middle/large page
368 * devices (1KB/2KB Bytes per page)
370 static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t len)
372 struct onenand_chip *this = mtd->priv;
373 int value, block, page;
375 /* Address translation */
377 case ONENAND_CMD_UNLOCK:
378 case ONENAND_CMD_LOCK:
379 case ONENAND_CMD_LOCK_TIGHT:
380 case ONENAND_CMD_UNLOCK_ALL:
385 case FLEXONENAND_CMD_PI_ACCESS:
386 /* addr contains die index */
387 block = addr * this->density_mask;
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);
400 case FLEXONENAND_CMD_READ_PI:
401 cmd = ONENAND_CMD_READ;
402 block = addr * this->density_mask;
407 block = onenand_block(this, addr);
408 if (FLEXONENAND(this))
409 page = (int) (addr - onenand_addr(this, block))>>\
412 page = (int) (addr >> this->page_shift);
413 if (ONENAND_IS_2PLANE(this)) {
414 /* Make the even block number */
416 /* Is it the odd plane? */
417 if (addr & this->writesize)
421 page &= this->page_mask;
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);
431 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this))
432 /* It is always BufferRAM0 */
433 ONENAND_SET_BUFFERRAM0(this);
435 /* Switch to the next data buffer */
436 ONENAND_SET_NEXT_BUFFERRAM(this);
442 /* Write 'DFS, FBA' of Flash */
443 value = onenand_block_address(this, block);
444 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
446 /* Select DataRAM for DDP */
447 value = onenand_bufferram_address(this, block);
448 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
452 /* Now we use page size operation */
453 int sectors = 0, count = 0;
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);
464 dataram = ONENAND_SET_NEXT_BUFFERRAM(this);
468 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
469 cmd = ONENAND_CMD_2X_PROG;
470 dataram = ONENAND_CURRENT_BUFFERRAM(this);
474 /* Write 'FPA, FSA' of Flash */
475 value = onenand_page_address(page, sectors);
476 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS8);
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);
483 /* Interrupt clear */
484 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
487 this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
493 * onenand_read_ecc - return ecc status
494 * @param this onenand chip structure
496 static inline int onenand_read_ecc(struct onenand_chip *this)
498 int ecc, i, result = 0;
500 if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this))
501 return this->read_word(this->base + ONENAND_REG_ECC_STATUS);
503 for (i = 0; i < 4; i++) {
504 ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS + i*2);
507 if (ecc & FLEXONENAND_UNCORRECTABLE_ERROR)
508 return ONENAND_ECC_2BIT_ALL;
510 result = ONENAND_ECC_1BIT_ALL;
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
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
525 static int onenand_wait(struct mtd_info *mtd, int state)
527 struct onenand_chip * this = mtd->priv;
528 unsigned long timeout;
529 unsigned int flags = ONENAND_INT_MASTER;
530 unsigned int interrupt = 0;
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);
538 if (interrupt & flags)
541 if (state != FL_READING && state != FL_PREPARING_ERASE)
544 /* To get correct interrupt status in timeout case */
545 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
547 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
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
554 if (interrupt & ONENAND_INT_READ) {
555 int ecc = onenand_read_ecc(this);
557 if (ecc & ONENAND_ECC_2BIT_ALL) {
558 printk(KERN_ERR "%s: ECC error = 0x%04x\n",
560 mtd->ecc_stats.failed++;
562 } else if (ecc & ONENAND_ECC_1BIT_ALL) {
563 printk(KERN_DEBUG "%s: correctable ECC error = 0x%04x\n",
565 mtd->ecc_stats.corrected++;
568 } else if (state == FL_READING) {
569 printk(KERN_ERR "%s: read timeout! ctrl=0x%04x intr=0x%04x\n",
570 __func__, ctrl, interrupt);
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);
580 if (!(interrupt & ONENAND_INT_MASTER)) {
581 printk(KERN_ERR "%s: timeout! ctrl=0x%04x intr=0x%04x\n",
582 __func__, ctrl, interrupt);
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",
590 if (ctrl & ONENAND_CTRL_LOCK)
591 printk(KERN_ERR "%s: it's locked error.\n", __func__);
599 * onenand_interrupt - [DEFAULT] onenand interrupt handler
600 * @param irq onenand interrupt number
601 * @param dev_id interrupt data
605 static irqreturn_t onenand_interrupt(int irq, void *data)
607 struct onenand_chip *this = data;
609 /* To handle shared interrupt */
610 if (!this->complete.done)
611 complete(&this->complete);
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
621 * Wait for command done.
623 static int onenand_interrupt_wait(struct mtd_info *mtd, int state)
625 struct onenand_chip *this = mtd->priv;
627 wait_for_completion(&this->complete);
629 return onenand_wait(mtd, state);
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
637 * Try interrupt based wait (It is used one-time)
639 static int onenand_try_interrupt_wait(struct mtd_info *mtd, int state)
641 struct onenand_chip *this = mtd->priv;
642 unsigned long remain, timeout;
644 /* We use interrupt wait first */
645 this->wait = onenand_interrupt_wait;
647 timeout = msecs_to_jiffies(100);
648 remain = wait_for_completion_timeout(&this->complete, timeout);
650 printk(KERN_INFO "OneNAND: There's no interrupt. "
651 "We use the normal wait\n");
653 /* Release the irq */
654 free_irq(this->irq, this);
656 this->wait = onenand_wait;
659 return onenand_wait(mtd, state);
663 * onenand_setup_wait - [OneNAND Interface] setup onenand wait method
664 * @param mtd MTD device structure
666 * There's two method to wait onenand work
667 * 1. polling - read interrupt status register
668 * 2. interrupt - use the kernel interrupt method
670 static void onenand_setup_wait(struct mtd_info *mtd)
672 struct onenand_chip *this = mtd->priv;
675 init_completion(&this->complete);
677 if (this->irq <= 0) {
678 this->wait = onenand_wait;
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;
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);
694 this->wait = onenand_try_interrupt_wait;
698 * onenand_bufferram_offset - [DEFAULT] BufferRAM offset
699 * @param mtd MTD data structure
700 * @param area BufferRAM area
701 * @return offset given area
703 * Return BufferRAM offset given area
705 static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area)
707 struct onenand_chip *this = mtd->priv;
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)
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
728 * Read the BufferRAM area
730 static int onenand_read_bufferram(struct mtd_info *mtd, int area,
731 unsigned char *buffer, int offset, size_t count)
733 struct onenand_chip *this = mtd->priv;
734 void __iomem *bufferram;
736 bufferram = this->base + area;
738 bufferram += onenand_bufferram_offset(mtd, area);
740 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
743 /* Align with word(16-bit) size */
746 /* Read word and save byte */
747 word = this->read_word(bufferram + offset + count);
748 buffer[count] = (word & 0xff);
751 memcpy(buffer, bufferram + offset, count);
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
764 * Read the BufferRAM area with Sync. Burst Mode
766 static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area,
767 unsigned char *buffer, int offset, size_t count)
769 struct onenand_chip *this = mtd->priv;
770 void __iomem *bufferram;
772 bufferram = this->base + area;
774 bufferram += onenand_bufferram_offset(mtd, area);
776 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
778 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
781 /* Align with word(16-bit) size */
784 /* Read word and save byte */
785 word = this->read_word(bufferram + offset + count);
786 buffer[count] = (word & 0xff);
789 memcpy(buffer, bufferram + offset, count);
791 this->mmcontrol(mtd, 0);
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
804 * Write the BufferRAM area
806 static int onenand_write_bufferram(struct mtd_info *mtd, int area,
807 const unsigned char *buffer, int offset, size_t count)
809 struct onenand_chip *this = mtd->priv;
810 void __iomem *bufferram;
812 bufferram = this->base + area;
814 bufferram += onenand_bufferram_offset(mtd, area);
816 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
820 /* Align with word(16-bit) size */
823 /* Calculate byte access offset */
824 byte_offset = offset + count;
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);
832 memcpy(bufferram + offset, buffer, count);
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
843 * Get blockpage address at 2x program mode
845 static int onenand_get_2x_blockpage(struct mtd_info *mtd, loff_t addr)
847 struct onenand_chip *this = mtd->priv;
848 int blockpage, block, page;
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)
855 page = (int) (addr >> (this->page_shift + 1)) & this->page_mask;
856 blockpage = (block << 7) | page;
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
867 * Check bufferram if there is data we required
869 static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
871 struct onenand_chip *this = mtd->priv;
872 int blockpage, found = 0;
875 if (ONENAND_IS_2PLANE(this))
876 blockpage = onenand_get_2x_blockpage(mtd, addr);
878 blockpage = (int) (addr >> this->page_shift);
880 /* Is there valid data? */
881 i = ONENAND_CURRENT_BUFFERRAM(this);
882 if (this->bufferram[i].blockpage == blockpage)
885 /* Check another BufferRAM */
886 i = ONENAND_NEXT_BUFFERRAM(this);
887 if (this->bufferram[i].blockpage == blockpage) {
888 ONENAND_SET_NEXT_BUFFERRAM(this);
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);
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
909 * Update BufferRAM information
911 static void onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
914 struct onenand_chip *this = mtd->priv;
918 if (ONENAND_IS_2PLANE(this))
919 blockpage = onenand_get_2x_blockpage(mtd, addr);
921 blockpage = (int) (addr >> this->page_shift);
923 /* Invalidate another BufferRAM */
924 i = ONENAND_NEXT_BUFFERRAM(this);
925 if (this->bufferram[i].blockpage == blockpage)
926 this->bufferram[i].blockpage = -1;
928 /* Update BufferRAM */
929 i = ONENAND_CURRENT_BUFFERRAM(this);
931 this->bufferram[i].blockpage = blockpage;
933 this->bufferram[i].blockpage = -1;
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
942 * Invalidate BufferRAM information
944 static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr,
947 struct onenand_chip *this = mtd->priv;
949 loff_t end_addr = addr + len;
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;
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
964 * Get the device and lock it for exclusive access
966 static int onenand_get_device(struct mtd_info *mtd, int new_state)
968 struct onenand_chip *this = mtd->priv;
969 DECLARE_WAITQUEUE(wait, current);
972 * Grab the lock and see if the device is available
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)
983 if (new_state == FL_PM_SUSPENDED) {
984 spin_unlock(&this->chip_lock);
985 return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
987 set_current_state(TASK_UNINTERRUPTIBLE);
988 add_wait_queue(&this->wq, &wait);
989 spin_unlock(&this->chip_lock);
991 remove_wait_queue(&this->wq, &wait);
998 * onenand_release_device - [GENERIC] release chip
999 * @param mtd MTD device structure
1001 * Deselect, release chip lock and wake up anyone waiting on the device
1003 static void onenand_release_device(struct mtd_info *mtd)
1005 struct onenand_chip *this = mtd->priv;
1007 if (this->state != FL_PM_SUSPENDED && this->disable)
1009 /* Release the chip */
1010 spin_lock(&this->chip_lock);
1011 this->state = FL_READY;
1013 spin_unlock(&this->chip_lock);
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
1023 static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int column,
1026 struct onenand_chip *this = mtd->priv;
1029 this->read_bufferram(mtd, ONENAND_SPARERAM, this->oob_buf, 0,
1031 ret = mtd_ooblayout_get_databytes(mtd, buf, this->oob_buf,
1040 * onenand_recover_lsb - [Flex-OneNAND] Recover LSB page data
1041 * @param mtd MTD device structure
1042 * @param addr address to recover
1043 * @param status return value from onenand_wait / onenand_bbt_wait
1045 * MLC NAND Flash cell has paired pages - LSB page and MSB page. LSB page has
1046 * lower page address and MSB page has higher page address in paired pages.
1047 * If power off occurs during MSB page program, the paired LSB page data can
1048 * become corrupt. LSB page recovery read is a way to read LSB page though page
1049 * data are corrupted. When uncorrectable error occurs as a result of LSB page
1050 * read after power up, issue LSB page recovery read.
1052 static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status)
1054 struct onenand_chip *this = mtd->priv;
1057 /* Recovery is only for Flex-OneNAND */
1058 if (!FLEXONENAND(this))
1061 /* check if we failed due to uncorrectable error */
1062 if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR)
1065 /* check if address lies in MLC region */
1066 i = flexonenand_region(mtd, addr);
1067 if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift))
1070 /* We are attempting to reread, so decrement stats.failed
1071 * which was incremented by onenand_wait due to read failure
1073 printk(KERN_INFO "%s: Attempting to recover from uncorrectable read\n",
1075 mtd->ecc_stats.failed--;
1077 /* Issue the LSB page recovery command */
1078 this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize);
1079 return this->wait(mtd, FL_READING);
1083 * onenand_mlc_read_ops_nolock - MLC OneNAND read main and/or out-of-band
1084 * @param mtd MTD device structure
1085 * @param from offset to read from
1086 * @param ops: oob operation description structure
1088 * MLC OneNAND / Flex-OneNAND has 4KB page size and 4KB dataram.
1089 * So, read-while-load is not present.
1091 static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1092 struct mtd_oob_ops *ops)
1094 struct onenand_chip *this = mtd->priv;
1095 struct mtd_ecc_stats stats;
1096 size_t len = ops->len;
1097 size_t ooblen = ops->ooblen;
1098 u_char *buf = ops->datbuf;
1099 u_char *oobbuf = ops->oobbuf;
1100 int read = 0, column, thislen;
1101 int oobread = 0, oobcolumn, thisooblen, oobsize;
1103 int writesize = this->writesize;
1105 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1108 oobsize = mtd_oobavail(mtd, ops);
1109 oobcolumn = from & (mtd->oobsize - 1);
1111 /* Do not allow reads past end of device */
1112 if (from + len > mtd->size) {
1113 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1120 stats = mtd->ecc_stats;
1122 while (read < len) {
1125 thislen = min_t(int, writesize, len - read);
1127 column = from & (writesize - 1);
1128 if (column + thislen > writesize)
1129 thislen = writesize - column;
1131 if (!onenand_check_bufferram(mtd, from)) {
1132 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1134 ret = this->wait(mtd, FL_READING);
1136 ret = onenand_recover_lsb(mtd, from, ret);
1137 onenand_update_bufferram(mtd, from, !ret);
1138 if (mtd_is_eccerr(ret))
1144 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1146 thisooblen = oobsize - oobcolumn;
1147 thisooblen = min_t(int, thisooblen, ooblen - oobread);
1149 if (ops->mode == MTD_OPS_AUTO_OOB)
1150 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1152 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1153 oobread += thisooblen;
1154 oobbuf += thisooblen;
1167 * Return success, if no ECC failures, else -EBADMSG
1168 * fs driver will take care of that, because
1169 * retlen == desired len and result == -EBADMSG
1172 ops->oobretlen = oobread;
1177 if (mtd->ecc_stats.failed - stats.failed)
1180 /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1181 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1185 * onenand_read_ops_nolock - [OneNAND Interface] OneNAND read main and/or out-of-band
1186 * @param mtd MTD device structure
1187 * @param from offset to read from
1188 * @param ops: oob operation description structure
1190 * OneNAND read main and/or out-of-band data
1192 static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1193 struct mtd_oob_ops *ops)
1195 struct onenand_chip *this = mtd->priv;
1196 struct mtd_ecc_stats stats;
1197 size_t len = ops->len;
1198 size_t ooblen = ops->ooblen;
1199 u_char *buf = ops->datbuf;
1200 u_char *oobbuf = ops->oobbuf;
1201 int read = 0, column, thislen;
1202 int oobread = 0, oobcolumn, thisooblen, oobsize;
1203 int ret = 0, boundary = 0;
1204 int writesize = this->writesize;
1206 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1209 oobsize = mtd_oobavail(mtd, ops);
1210 oobcolumn = from & (mtd->oobsize - 1);
1212 /* Do not allow reads past end of device */
1213 if ((from + len) > mtd->size) {
1214 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1221 stats = mtd->ecc_stats;
1223 /* Read-while-load method */
1225 /* Do first load to bufferRAM */
1227 if (!onenand_check_bufferram(mtd, from)) {
1228 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1229 ret = this->wait(mtd, FL_READING);
1230 onenand_update_bufferram(mtd, from, !ret);
1231 if (mtd_is_eccerr(ret))
1236 thislen = min_t(int, writesize, len - read);
1237 column = from & (writesize - 1);
1238 if (column + thislen > writesize)
1239 thislen = writesize - column;
1242 /* If there is more to load then start next load */
1244 if (read + thislen < len) {
1245 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1247 * Chip boundary handling in DDP
1248 * Now we issued chip 1 read and pointed chip 1
1249 * bufferram so we have to point chip 0 bufferram.
1251 if (ONENAND_IS_DDP(this) &&
1252 unlikely(from == (this->chipsize >> 1))) {
1253 this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2);
1257 ONENAND_SET_PREV_BUFFERRAM(this);
1259 /* While load is going, read from last bufferRAM */
1260 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1262 /* Read oob area if needed */
1264 thisooblen = oobsize - oobcolumn;
1265 thisooblen = min_t(int, thisooblen, ooblen - oobread);
1267 if (ops->mode == MTD_OPS_AUTO_OOB)
1268 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1270 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1271 oobread += thisooblen;
1272 oobbuf += thisooblen;
1276 /* See if we are done */
1280 /* Set up for next read from bufferRAM */
1281 if (unlikely(boundary))
1282 this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2);
1283 ONENAND_SET_NEXT_BUFFERRAM(this);
1285 thislen = min_t(int, writesize, len - read);
1288 /* Now wait for load */
1289 ret = this->wait(mtd, FL_READING);
1290 onenand_update_bufferram(mtd, from, !ret);
1291 if (mtd_is_eccerr(ret))
1296 * Return success, if no ECC failures, else -EBADMSG
1297 * fs driver will take care of that, because
1298 * retlen == desired len and result == -EBADMSG
1301 ops->oobretlen = oobread;
1306 if (mtd->ecc_stats.failed - stats.failed)
1309 /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1310 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1314 * onenand_read_oob_nolock - [MTD Interface] OneNAND read out-of-band
1315 * @param mtd MTD device structure
1316 * @param from offset to read from
1317 * @param ops: oob operation description structure
1319 * OneNAND read out-of-band data from the spare area
1321 static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
1322 struct mtd_oob_ops *ops)
1324 struct onenand_chip *this = mtd->priv;
1325 struct mtd_ecc_stats stats;
1326 int read = 0, thislen, column, oobsize;
1327 size_t len = ops->ooblen;
1328 unsigned int mode = ops->mode;
1329 u_char *buf = ops->oobbuf;
1330 int ret = 0, readcmd;
1332 from += ops->ooboffs;
1334 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1337 /* Initialize return length value */
1340 if (mode == MTD_OPS_AUTO_OOB)
1341 oobsize = mtd->oobavail;
1343 oobsize = mtd->oobsize;
1345 column = from & (mtd->oobsize - 1);
1347 if (unlikely(column >= oobsize)) {
1348 printk(KERN_ERR "%s: Attempted to start read outside oob\n",
1353 /* Do not allow reads past end of device */
1354 if (unlikely(from >= mtd->size ||
1355 column + len > ((mtd->size >> this->page_shift) -
1356 (from >> this->page_shift)) * oobsize)) {
1357 printk(KERN_ERR "%s: Attempted to read beyond end of device\n",
1362 stats = mtd->ecc_stats;
1364 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1366 while (read < len) {
1369 thislen = oobsize - column;
1370 thislen = min_t(int, thislen, len);
1372 this->command(mtd, readcmd, from, mtd->oobsize);
1374 onenand_update_bufferram(mtd, from, 0);
1376 ret = this->wait(mtd, FL_READING);
1378 ret = onenand_recover_lsb(mtd, from, ret);
1380 if (ret && !mtd_is_eccerr(ret)) {
1381 printk(KERN_ERR "%s: read failed = 0x%x\n",
1386 if (mode == MTD_OPS_AUTO_OOB)
1387 onenand_transfer_auto_oob(mtd, buf, column, thislen);
1389 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1401 from += mtd->writesize;
1406 ops->oobretlen = read;
1411 if (mtd->ecc_stats.failed - stats.failed)
1418 * onenand_read - [MTD Interface] Read data from flash
1419 * @param mtd MTD device structure
1420 * @param from offset to read from
1421 * @param len number of bytes to read
1422 * @param retlen pointer to variable to store the number of read bytes
1423 * @param buf the databuffer to put data
1427 static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len,
1428 size_t *retlen, u_char *buf)
1430 struct onenand_chip *this = mtd->priv;
1431 struct mtd_oob_ops ops = {
1439 onenand_get_device(mtd, FL_READING);
1440 ret = ONENAND_IS_4KB_PAGE(this) ?
1441 onenand_mlc_read_ops_nolock(mtd, from, &ops) :
1442 onenand_read_ops_nolock(mtd, from, &ops);
1443 onenand_release_device(mtd);
1445 *retlen = ops.retlen;
1450 * onenand_read_oob - [MTD Interface] Read main and/or out-of-band
1451 * @param mtd: MTD device structure
1452 * @param from: offset to read from
1453 * @param ops: oob operation description structure
1455 * Read main and/or out-of-band
1457 static int onenand_read_oob(struct mtd_info *mtd, loff_t from,
1458 struct mtd_oob_ops *ops)
1460 struct onenand_chip *this = mtd->priv;
1463 switch (ops->mode) {
1464 case MTD_OPS_PLACE_OOB:
1465 case MTD_OPS_AUTO_OOB:
1468 /* Not implemented yet */
1473 onenand_get_device(mtd, FL_READING);
1475 ret = ONENAND_IS_4KB_PAGE(this) ?
1476 onenand_mlc_read_ops_nolock(mtd, from, ops) :
1477 onenand_read_ops_nolock(mtd, from, ops);
1479 ret = onenand_read_oob_nolock(mtd, from, ops);
1480 onenand_release_device(mtd);
1486 * onenand_bbt_wait - [DEFAULT] wait until the command is done
1487 * @param mtd MTD device structure
1488 * @param state state to select the max. timeout value
1490 * Wait for command done.
1492 static int onenand_bbt_wait(struct mtd_info *mtd, int state)
1494 struct onenand_chip *this = mtd->priv;
1495 unsigned long timeout;
1496 unsigned int interrupt, ctrl, ecc, addr1, addr8;
1498 /* The 20 msec is enough */
1499 timeout = jiffies + msecs_to_jiffies(20);
1500 while (time_before(jiffies, timeout)) {
1501 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1502 if (interrupt & ONENAND_INT_MASTER)
1505 /* To get correct interrupt status in timeout case */
1506 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1507 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
1508 addr1 = this->read_word(this->base + ONENAND_REG_START_ADDRESS1);
1509 addr8 = this->read_word(this->base + ONENAND_REG_START_ADDRESS8);
1511 if (interrupt & ONENAND_INT_READ) {
1512 ecc = onenand_read_ecc(this);
1513 if (ecc & ONENAND_ECC_2BIT_ALL) {
1514 printk(KERN_DEBUG "%s: ecc 0x%04x ctrl 0x%04x "
1515 "intr 0x%04x addr1 %#x addr8 %#x\n",
1516 __func__, ecc, ctrl, interrupt, addr1, addr8);
1517 return ONENAND_BBT_READ_ECC_ERROR;
1520 printk(KERN_ERR "%s: read timeout! ctrl 0x%04x "
1521 "intr 0x%04x addr1 %#x addr8 %#x\n",
1522 __func__, ctrl, interrupt, addr1, addr8);
1523 return ONENAND_BBT_READ_FATAL_ERROR;
1526 /* Initial bad block case: 0x2400 or 0x0400 */
1527 if (ctrl & ONENAND_CTRL_ERROR) {
1528 printk(KERN_DEBUG "%s: ctrl 0x%04x intr 0x%04x addr1 %#x "
1529 "addr8 %#x\n", __func__, ctrl, interrupt, addr1, addr8);
1530 return ONENAND_BBT_READ_ERROR;
1537 * onenand_bbt_read_oob - [MTD Interface] OneNAND read out-of-band for bbt scan
1538 * @param mtd MTD device structure
1539 * @param from offset to read from
1540 * @param ops oob operation description structure
1542 * OneNAND read out-of-band data from the spare area for bbt scan
1544 int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
1545 struct mtd_oob_ops *ops)
1547 struct onenand_chip *this = mtd->priv;
1548 int read = 0, thislen, column;
1549 int ret = 0, readcmd;
1550 size_t len = ops->ooblen;
1551 u_char *buf = ops->oobbuf;
1553 pr_debug("%s: from = 0x%08x, len = %zi\n", __func__, (unsigned int)from,
1556 /* Initialize return value */
1559 /* Do not allow reads past end of device */
1560 if (unlikely((from + len) > mtd->size)) {
1561 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1563 return ONENAND_BBT_READ_FATAL_ERROR;
1566 /* Grab the lock and see if the device is available */
1567 onenand_get_device(mtd, FL_READING);
1569 column = from & (mtd->oobsize - 1);
1571 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1573 while (read < len) {
1576 thislen = mtd->oobsize - column;
1577 thislen = min_t(int, thislen, len);
1579 this->command(mtd, readcmd, from, mtd->oobsize);
1581 onenand_update_bufferram(mtd, from, 0);
1583 ret = this->bbt_wait(mtd, FL_READING);
1585 ret = onenand_recover_lsb(mtd, from, ret);
1590 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1599 /* Update Page size */
1600 from += this->writesize;
1605 /* Deselect and wake up anyone waiting on the device */
1606 onenand_release_device(mtd);
1608 ops->oobretlen = read;
1612 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
1614 * onenand_verify_oob - [GENERIC] verify the oob contents after a write
1615 * @param mtd MTD device structure
1616 * @param buf the databuffer to verify
1617 * @param to offset to read from
1619 static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to)
1621 struct onenand_chip *this = mtd->priv;
1622 u_char *oob_buf = this->oob_buf;
1623 int status, i, readcmd;
1625 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1627 this->command(mtd, readcmd, to, mtd->oobsize);
1628 onenand_update_bufferram(mtd, to, 0);
1629 status = this->wait(mtd, FL_READING);
1633 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1634 for (i = 0; i < mtd->oobsize; i++)
1635 if (buf[i] != 0xFF && buf[i] != oob_buf[i])
1642 * onenand_verify - [GENERIC] verify the chip contents after a write
1643 * @param mtd MTD device structure
1644 * @param buf the databuffer to verify
1645 * @param addr offset to read from
1646 * @param len number of bytes to read and compare
1648 static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr, size_t len)
1650 struct onenand_chip *this = mtd->priv;
1652 int thislen, column;
1654 column = addr & (this->writesize - 1);
1657 thislen = min_t(int, this->writesize - column, len);
1659 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize);
1661 onenand_update_bufferram(mtd, addr, 0);
1663 ret = this->wait(mtd, FL_READING);
1667 onenand_update_bufferram(mtd, addr, 1);
1669 this->read_bufferram(mtd, ONENAND_DATARAM, this->verify_buf, 0, mtd->writesize);
1671 if (memcmp(buf, this->verify_buf + column, thislen))
1683 #define onenand_verify(...) (0)
1684 #define onenand_verify_oob(...) (0)
1687 #define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
1689 static void onenand_panic_wait(struct mtd_info *mtd)
1691 struct onenand_chip *this = mtd->priv;
1692 unsigned int interrupt;
1695 for (i = 0; i < 2000; i++) {
1696 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1697 if (interrupt & ONENAND_INT_MASTER)
1704 * onenand_panic_write - [MTD Interface] write buffer to FLASH in a panic context
1705 * @param mtd MTD device structure
1706 * @param to offset to write to
1707 * @param len number of bytes to write
1708 * @param retlen pointer to variable to store the number of written bytes
1709 * @param buf the data to write
1713 static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
1714 size_t *retlen, const u_char *buf)
1716 struct onenand_chip *this = mtd->priv;
1717 int column, subpage;
1720 if (this->state == FL_PM_SUSPENDED)
1723 /* Wait for any existing operation to clear */
1724 onenand_panic_wait(mtd);
1726 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1729 /* Reject writes, which are not page aligned */
1730 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1731 printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1736 column = to & (mtd->writesize - 1);
1738 /* Loop until all data write */
1739 while (written < len) {
1740 int thislen = min_t(int, mtd->writesize - column, len - written);
1741 u_char *wbuf = (u_char *) buf;
1743 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1745 /* Partial page write */
1746 subpage = thislen < mtd->writesize;
1748 memset(this->page_buf, 0xff, mtd->writesize);
1749 memcpy(this->page_buf + column, buf, thislen);
1750 wbuf = this->page_buf;
1753 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1754 this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize);
1756 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);
1758 onenand_panic_wait(mtd);
1760 /* In partial page write we don't update bufferram */
1761 onenand_update_bufferram(mtd, to, !subpage);
1762 if (ONENAND_IS_2PLANE(this)) {
1763 ONENAND_SET_BUFFERRAM1(this);
1764 onenand_update_bufferram(mtd, to + this->writesize, !subpage);
1782 * onenand_fill_auto_oob - [INTERN] oob auto-placement transfer
1783 * @param mtd MTD device structure
1784 * @param oob_buf oob buffer
1785 * @param buf source address
1786 * @param column oob offset to write to
1787 * @param thislen oob length to write
1789 static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
1790 const u_char *buf, int column, int thislen)
1792 return mtd_ooblayout_set_databytes(mtd, buf, oob_buf, column, thislen);
1796 * onenand_write_ops_nolock - [OneNAND Interface] write main and/or out-of-band
1797 * @param mtd MTD device structure
1798 * @param to offset to write to
1799 * @param ops oob operation description structure
1801 * Write main and/or oob with ECC
1803 static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
1804 struct mtd_oob_ops *ops)
1806 struct onenand_chip *this = mtd->priv;
1807 int written = 0, column, thislen = 0, subpage = 0;
1808 int prev = 0, prevlen = 0, prev_subpage = 0, first = 1;
1809 int oobwritten = 0, oobcolumn, thisooblen, oobsize;
1810 size_t len = ops->len;
1811 size_t ooblen = ops->ooblen;
1812 const u_char *buf = ops->datbuf;
1813 const u_char *oob = ops->oobbuf;
1817 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1820 /* Initialize retlen, in case of early exit */
1824 /* Reject writes, which are not page aligned */
1825 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1826 printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1831 /* Check zero length */
1834 oobsize = mtd_oobavail(mtd, ops);
1835 oobcolumn = to & (mtd->oobsize - 1);
1837 column = to & (mtd->writesize - 1);
1839 /* Loop until all data write */
1841 if (written < len) {
1842 u_char *wbuf = (u_char *) buf;
1844 thislen = min_t(int, mtd->writesize - column, len - written);
1845 thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten);
1849 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1851 /* Partial page write */
1852 subpage = thislen < mtd->writesize;
1854 memset(this->page_buf, 0xff, mtd->writesize);
1855 memcpy(this->page_buf + column, buf, thislen);
1856 wbuf = this->page_buf;
1859 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1862 oobbuf = this->oob_buf;
1864 /* We send data to spare ram with oobsize
1865 * to prevent byte access */
1866 memset(oobbuf, 0xff, mtd->oobsize);
1867 if (ops->mode == MTD_OPS_AUTO_OOB)
1868 onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
1870 memcpy(oobbuf + oobcolumn, oob, thisooblen);
1872 oobwritten += thisooblen;
1876 oobbuf = (u_char *) ffchars;
1878 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
1880 ONENAND_SET_NEXT_BUFFERRAM(this);
1883 * 2 PLANE, MLC, and Flex-OneNAND do not support
1884 * write-while-program feature.
1886 if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first) {
1887 ONENAND_SET_PREV_BUFFERRAM(this);
1889 ret = this->wait(mtd, FL_WRITING);
1891 /* In partial page write we don't update bufferram */
1892 onenand_update_bufferram(mtd, prev, !ret && !prev_subpage);
1895 printk(KERN_ERR "%s: write failed %d\n",
1900 if (written == len) {
1901 /* Only check verify write turn on */
1902 ret = onenand_verify(mtd, buf - len, to - len, len);
1904 printk(KERN_ERR "%s: verify failed %d\n",
1909 ONENAND_SET_NEXT_BUFFERRAM(this);
1913 cmd = ONENAND_CMD_PROG;
1915 /* Exclude 1st OTP and OTP blocks for cache program feature */
1916 if (ONENAND_IS_CACHE_PROGRAM(this) &&
1917 likely(onenand_block(this, to) != 0) &&
1918 ONENAND_IS_4KB_PAGE(this) &&
1919 ((written + thislen) < len)) {
1920 cmd = ONENAND_CMD_2X_CACHE_PROG;
1924 this->command(mtd, cmd, to, mtd->writesize);
1927 * 2 PLANE, MLC, and Flex-OneNAND wait here
1929 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) {
1930 ret = this->wait(mtd, FL_WRITING);
1932 /* In partial page write we don't update bufferram */
1933 onenand_update_bufferram(mtd, to, !ret && !subpage);
1935 printk(KERN_ERR "%s: write failed %d\n",
1940 /* Only check verify write turn on */
1941 ret = onenand_verify(mtd, buf, to, thislen);
1943 printk(KERN_ERR "%s: verify failed %d\n",
1957 prev_subpage = subpage;
1965 /* In error case, clear all bufferrams */
1967 onenand_invalidate_bufferram(mtd, 0, -1);
1969 ops->retlen = written;
1970 ops->oobretlen = oobwritten;
1977 * onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band
1978 * @param mtd MTD device structure
1979 * @param to offset to write to
1980 * @param len number of bytes to write
1981 * @param retlen pointer to variable to store the number of written bytes
1982 * @param buf the data to write
1983 * @param mode operation mode
1985 * OneNAND write out-of-band
1987 static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
1988 struct mtd_oob_ops *ops)
1990 struct onenand_chip *this = mtd->priv;
1991 int column, ret = 0, oobsize;
1992 int written = 0, oobcmd;
1994 size_t len = ops->ooblen;
1995 const u_char *buf = ops->oobbuf;
1996 unsigned int mode = ops->mode;
2000 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
2003 /* Initialize retlen, in case of early exit */
2006 if (mode == MTD_OPS_AUTO_OOB)
2007 oobsize = mtd->oobavail;
2009 oobsize = mtd->oobsize;
2011 column = to & (mtd->oobsize - 1);
2013 if (unlikely(column >= oobsize)) {
2014 printk(KERN_ERR "%s: Attempted to start write outside oob\n",
2019 /* For compatibility with NAND: Do not allow write past end of page */
2020 if (unlikely(column + len > oobsize)) {
2021 printk(KERN_ERR "%s: Attempt to write past end of page\n",
2026 /* Do not allow reads past end of device */
2027 if (unlikely(to >= mtd->size ||
2028 column + len > ((mtd->size >> this->page_shift) -
2029 (to >> this->page_shift)) * oobsize)) {
2030 printk(KERN_ERR "%s: Attempted to write past end of device\n",
2035 oobbuf = this->oob_buf;
2037 oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB;
2039 /* Loop until all data write */
2040 while (written < len) {
2041 int thislen = min_t(int, oobsize, len - written);
2045 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize);
2047 /* We send data to spare ram with oobsize
2048 * to prevent byte access */
2049 memset(oobbuf, 0xff, mtd->oobsize);
2050 if (mode == MTD_OPS_AUTO_OOB)
2051 onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
2053 memcpy(oobbuf + column, buf, thislen);
2054 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
2056 if (ONENAND_IS_4KB_PAGE(this)) {
2057 /* Set main area of DataRAM to 0xff*/
2058 memset(this->page_buf, 0xff, mtd->writesize);
2059 this->write_bufferram(mtd, ONENAND_DATARAM,
2060 this->page_buf, 0, mtd->writesize);
2063 this->command(mtd, oobcmd, to, mtd->oobsize);
2065 onenand_update_bufferram(mtd, to, 0);
2066 if (ONENAND_IS_2PLANE(this)) {
2067 ONENAND_SET_BUFFERRAM1(this);
2068 onenand_update_bufferram(mtd, to + this->writesize, 0);
2071 ret = this->wait(mtd, FL_WRITING);
2073 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2077 ret = onenand_verify_oob(mtd, oobbuf, to);
2079 printk(KERN_ERR "%s: verify failed %d\n",
2088 to += mtd->writesize;
2093 ops->oobretlen = written;
2099 * onenand_write - [MTD Interface] write buffer to FLASH
2100 * @param mtd MTD device structure
2101 * @param to offset to write to
2102 * @param len number of bytes to write
2103 * @param retlen pointer to variable to store the number of written bytes
2104 * @param buf the data to write
2108 static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len,
2109 size_t *retlen, const u_char *buf)
2111 struct mtd_oob_ops ops = {
2114 .datbuf = (u_char *) buf,
2119 onenand_get_device(mtd, FL_WRITING);
2120 ret = onenand_write_ops_nolock(mtd, to, &ops);
2121 onenand_release_device(mtd);
2123 *retlen = ops.retlen;
2128 * onenand_write_oob - [MTD Interface] NAND write data and/or out-of-band
2129 * @param mtd: MTD device structure
2130 * @param to: offset to write
2131 * @param ops: oob operation description structure
2133 static int onenand_write_oob(struct mtd_info *mtd, loff_t to,
2134 struct mtd_oob_ops *ops)
2138 switch (ops->mode) {
2139 case MTD_OPS_PLACE_OOB:
2140 case MTD_OPS_AUTO_OOB:
2143 /* Not implemented yet */
2148 onenand_get_device(mtd, FL_WRITING);
2150 ret = onenand_write_ops_nolock(mtd, to, ops);
2152 ret = onenand_write_oob_nolock(mtd, to, ops);
2153 onenand_release_device(mtd);
2159 * onenand_block_isbad_nolock - [GENERIC] Check if a block is marked bad
2160 * @param mtd MTD device structure
2161 * @param ofs offset from device start
2162 * @param allowbbt 1, if its allowed to access the bbt area
2164 * Check, if the block is bad. Either by reading the bad block table or
2165 * calling of the scan function.
2167 static int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allowbbt)
2169 struct onenand_chip *this = mtd->priv;
2170 struct bbm_info *bbm = this->bbm;
2172 /* Return info from the table */
2173 return bbm->isbad_bbt(mtd, ofs, allowbbt);
2177 static int onenand_multiblock_erase_verify(struct mtd_info *mtd,
2178 struct erase_info *instr)
2180 struct onenand_chip *this = mtd->priv;
2181 loff_t addr = instr->addr;
2182 int len = instr->len;
2183 unsigned int block_size = (1 << this->erase_shift);
2187 this->command(mtd, ONENAND_CMD_ERASE_VERIFY, addr, block_size);
2188 ret = this->wait(mtd, FL_VERIFYING_ERASE);
2190 printk(KERN_ERR "%s: Failed verify, block %d\n",
2191 __func__, onenand_block(this, addr));
2192 instr->state = MTD_ERASE_FAILED;
2193 instr->fail_addr = addr;
2203 * onenand_multiblock_erase - [INTERN] erase block(s) using multiblock erase
2204 * @param mtd MTD device structure
2205 * @param instr erase instruction
2206 * @param region erase region
2208 * Erase one or more blocks up to 64 block at a time
2210 static int onenand_multiblock_erase(struct mtd_info *mtd,
2211 struct erase_info *instr,
2212 unsigned int block_size)
2214 struct onenand_chip *this = mtd->priv;
2215 loff_t addr = instr->addr;
2216 int len = instr->len;
2221 instr->state = MTD_ERASING;
2223 if (ONENAND_IS_DDP(this)) {
2224 loff_t bdry_addr = this->chipsize >> 1;
2225 if (addr < bdry_addr && (addr + len) > bdry_addr)
2226 bdry_block = bdry_addr >> this->erase_shift;
2231 /* Check if we have a bad block, we do not erase bad blocks */
2232 if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2233 printk(KERN_WARNING "%s: attempt to erase a bad block "
2234 "at addr 0x%012llx\n",
2235 __func__, (unsigned long long) addr);
2236 instr->state = MTD_ERASE_FAILED;
2246 /* loop over 64 eb batches */
2248 struct erase_info verify_instr = *instr;
2249 int max_eb_count = MB_ERASE_MAX_BLK_COUNT;
2251 verify_instr.addr = addr;
2252 verify_instr.len = 0;
2254 /* do not cross chip boundary */
2256 int this_block = (addr >> this->erase_shift);
2258 if (this_block < bdry_block) {
2259 max_eb_count = min(max_eb_count,
2260 (bdry_block - this_block));
2266 while (len > block_size && eb_count < (max_eb_count - 1)) {
2267 this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE,
2269 onenand_invalidate_bufferram(mtd, addr, block_size);
2271 ret = this->wait(mtd, FL_PREPARING_ERASE);
2273 printk(KERN_ERR "%s: Failed multiblock erase, "
2274 "block %d\n", __func__,
2275 onenand_block(this, addr));
2276 instr->state = MTD_ERASE_FAILED;
2277 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2286 /* last block of 64-eb series */
2288 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2289 onenand_invalidate_bufferram(mtd, addr, block_size);
2291 ret = this->wait(mtd, FL_ERASING);
2292 /* Check if it is write protected */
2294 printk(KERN_ERR "%s: Failed erase, block %d\n",
2295 __func__, onenand_block(this, addr));
2296 instr->state = MTD_ERASE_FAILED;
2297 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2306 verify_instr.len = eb_count * block_size;
2307 if (onenand_multiblock_erase_verify(mtd, &verify_instr)) {
2308 instr->state = verify_instr.state;
2309 instr->fail_addr = verify_instr.fail_addr;
2319 * onenand_block_by_block_erase - [INTERN] erase block(s) using regular erase
2320 * @param mtd MTD device structure
2321 * @param instr erase instruction
2322 * @param region erase region
2323 * @param block_size erase block size
2325 * Erase one or more blocks one block at a time
2327 static int onenand_block_by_block_erase(struct mtd_info *mtd,
2328 struct erase_info *instr,
2329 struct mtd_erase_region_info *region,
2330 unsigned int block_size)
2332 struct onenand_chip *this = mtd->priv;
2333 loff_t addr = instr->addr;
2334 int len = instr->len;
2335 loff_t region_end = 0;
2339 /* region is set for Flex-OneNAND */
2340 region_end = region->offset + region->erasesize * region->numblocks;
2343 instr->state = MTD_ERASING;
2345 /* Loop through the blocks */
2349 /* Check if we have a bad block, we do not erase bad blocks */
2350 if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2351 printk(KERN_WARNING "%s: attempt to erase a bad block "
2352 "at addr 0x%012llx\n",
2353 __func__, (unsigned long long) addr);
2354 instr->state = MTD_ERASE_FAILED;
2358 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2360 onenand_invalidate_bufferram(mtd, addr, block_size);
2362 ret = this->wait(mtd, FL_ERASING);
2363 /* Check, if it is write protected */
2365 printk(KERN_ERR "%s: Failed erase, block %d\n",
2366 __func__, onenand_block(this, addr));
2367 instr->state = MTD_ERASE_FAILED;
2368 instr->fail_addr = addr;
2375 if (region && addr == region_end) {
2380 block_size = region->erasesize;
2381 region_end = region->offset + region->erasesize * region->numblocks;
2383 if (len & (block_size - 1)) {
2384 /* FIXME: This should be handled at MTD partitioning level. */
2385 printk(KERN_ERR "%s: Unaligned address\n",
2395 * onenand_erase - [MTD Interface] erase block(s)
2396 * @param mtd MTD device structure
2397 * @param instr erase instruction
2399 * Erase one or more blocks
2401 static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
2403 struct onenand_chip *this = mtd->priv;
2404 unsigned int block_size;
2405 loff_t addr = instr->addr;
2406 loff_t len = instr->len;
2408 struct mtd_erase_region_info *region = NULL;
2409 loff_t region_offset = 0;
2411 pr_debug("%s: start=0x%012llx, len=%llu\n", __func__,
2412 (unsigned long long)instr->addr,
2413 (unsigned long long)instr->len);
2415 if (FLEXONENAND(this)) {
2416 /* Find the eraseregion of this address */
2417 int i = flexonenand_region(mtd, addr);
2419 region = &mtd->eraseregions[i];
2420 block_size = region->erasesize;
2422 /* Start address within region must align on block boundary.
2423 * Erase region's start offset is always block start address.
2425 region_offset = region->offset;
2427 block_size = 1 << this->erase_shift;
2429 /* Start address must align on block boundary */
2430 if (unlikely((addr - region_offset) & (block_size - 1))) {
2431 printk(KERN_ERR "%s: Unaligned address\n", __func__);
2435 /* Length must align on block boundary */
2436 if (unlikely(len & (block_size - 1))) {
2437 printk(KERN_ERR "%s: Length not block aligned\n", __func__);
2441 /* Grab the lock and see if the device is available */
2442 onenand_get_device(mtd, FL_ERASING);
2444 if (ONENAND_IS_4KB_PAGE(this) || region ||
2445 instr->len < MB_ERASE_MIN_BLK_COUNT * block_size) {
2446 /* region is set for Flex-OneNAND (no mb erase) */
2447 ret = onenand_block_by_block_erase(mtd, instr,
2448 region, block_size);
2450 ret = onenand_multiblock_erase(mtd, instr, block_size);
2453 /* Deselect and wake up anyone waiting on the device */
2454 onenand_release_device(mtd);
2456 /* Do call back function */
2458 instr->state = MTD_ERASE_DONE;
2459 mtd_erase_callback(instr);
2466 * onenand_sync - [MTD Interface] sync
2467 * @param mtd MTD device structure
2469 * Sync is actually a wait for chip ready function
2471 static void onenand_sync(struct mtd_info *mtd)
2473 pr_debug("%s: called\n", __func__);
2475 /* Grab the lock and see if the device is available */
2476 onenand_get_device(mtd, FL_SYNCING);
2478 /* Release it and go back */
2479 onenand_release_device(mtd);
2483 * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
2484 * @param mtd MTD device structure
2485 * @param ofs offset relative to mtd start
2487 * Check whether the block is bad
2489 static int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs)
2493 onenand_get_device(mtd, FL_READING);
2494 ret = onenand_block_isbad_nolock(mtd, ofs, 0);
2495 onenand_release_device(mtd);
2500 * onenand_default_block_markbad - [DEFAULT] mark a block bad
2501 * @param mtd MTD device structure
2502 * @param ofs offset from device start
2504 * This is the default implementation, which can be overridden by
2505 * a hardware specific driver.
2507 static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
2509 struct onenand_chip *this = mtd->priv;
2510 struct bbm_info *bbm = this->bbm;
2511 u_char buf[2] = {0, 0};
2512 struct mtd_oob_ops ops = {
2513 .mode = MTD_OPS_PLACE_OOB,
2520 /* Get block number */
2521 block = onenand_block(this, ofs);
2523 bbm->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
2525 /* We write two bytes, so we don't have to mess with 16-bit access */
2526 ofs += mtd->oobsize + (bbm->badblockpos & ~0x01);
2527 /* FIXME : What to do when marking SLC block in partition
2528 * with MLC erasesize? For now, it is not advisable to
2529 * create partitions containing both SLC and MLC regions.
2531 return onenand_write_oob_nolock(mtd, ofs, &ops);
2535 * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
2536 * @param mtd MTD device structure
2537 * @param ofs offset relative to mtd start
2539 * Mark the block as bad
2541 static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
2543 struct onenand_chip *this = mtd->priv;
2546 ret = onenand_block_isbad(mtd, ofs);
2548 /* If it was bad already, return success and do nothing */
2554 onenand_get_device(mtd, FL_WRITING);
2555 ret = this->block_markbad(mtd, ofs);
2556 onenand_release_device(mtd);
2561 * onenand_do_lock_cmd - [OneNAND Interface] Lock or unlock block(s)
2562 * @param mtd MTD device structure
2563 * @param ofs offset relative to mtd start
2564 * @param len number of bytes to lock or unlock
2565 * @param cmd lock or unlock command
2567 * Lock or unlock one or more blocks
2569 static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int cmd)
2571 struct onenand_chip *this = mtd->priv;
2572 int start, end, block, value, status;
2575 start = onenand_block(this, ofs);
2576 end = onenand_block(this, ofs + len) - 1;
2578 if (cmd == ONENAND_CMD_LOCK)
2579 wp_status_mask = ONENAND_WP_LS;
2581 wp_status_mask = ONENAND_WP_US;
2583 /* Continuous lock scheme */
2584 if (this->options & ONENAND_HAS_CONT_LOCK) {
2585 /* Set start block address */
2586 this->write_word(start, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2587 /* Set end block address */
2588 this->write_word(end, this->base + ONENAND_REG_END_BLOCK_ADDRESS);
2589 /* Write lock command */
2590 this->command(mtd, cmd, 0, 0);
2592 /* There's no return value */
2593 this->wait(mtd, FL_LOCKING);
2596 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2597 & ONENAND_CTRL_ONGO)
2600 /* Check lock status */
2601 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2602 if (!(status & wp_status_mask))
2603 printk(KERN_ERR "%s: wp status = 0x%x\n",
2609 /* Block lock scheme */
2610 for (block = start; block < end + 1; block++) {
2611 /* Set block address */
2612 value = onenand_block_address(this, block);
2613 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2614 /* Select DataRAM for DDP */
2615 value = onenand_bufferram_address(this, block);
2616 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2617 /* Set start block address */
2618 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2619 /* Write lock command */
2620 this->command(mtd, cmd, 0, 0);
2622 /* There's no return value */
2623 this->wait(mtd, FL_LOCKING);
2626 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2627 & ONENAND_CTRL_ONGO)
2630 /* Check lock status */
2631 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2632 if (!(status & wp_status_mask))
2633 printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2634 __func__, block, status);
2641 * onenand_lock - [MTD Interface] Lock block(s)
2642 * @param mtd MTD device structure
2643 * @param ofs offset relative to mtd start
2644 * @param len number of bytes to unlock
2646 * Lock one or more blocks
2648 static int onenand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2652 onenand_get_device(mtd, FL_LOCKING);
2653 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK);
2654 onenand_release_device(mtd);
2659 * onenand_unlock - [MTD Interface] Unlock block(s)
2660 * @param mtd MTD device structure
2661 * @param ofs offset relative to mtd start
2662 * @param len number of bytes to unlock
2664 * Unlock one or more blocks
2666 static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2670 onenand_get_device(mtd, FL_LOCKING);
2671 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2672 onenand_release_device(mtd);
2677 * onenand_check_lock_status - [OneNAND Interface] Check lock status
2678 * @param this onenand chip data structure
2682 static int onenand_check_lock_status(struct onenand_chip *this)
2684 unsigned int value, block, status;
2687 end = this->chipsize >> this->erase_shift;
2688 for (block = 0; block < end; block++) {
2689 /* Set block address */
2690 value = onenand_block_address(this, block);
2691 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2692 /* Select DataRAM for DDP */
2693 value = onenand_bufferram_address(this, block);
2694 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2695 /* Set start block address */
2696 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2698 /* Check lock status */
2699 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2700 if (!(status & ONENAND_WP_US)) {
2701 printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2702 __func__, block, status);
2711 * onenand_unlock_all - [OneNAND Interface] unlock all blocks
2712 * @param mtd MTD device structure
2716 static void onenand_unlock_all(struct mtd_info *mtd)
2718 struct onenand_chip *this = mtd->priv;
2720 loff_t len = mtd->size;
2722 if (this->options & ONENAND_HAS_UNLOCK_ALL) {
2723 /* Set start block address */
2724 this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2725 /* Write unlock command */
2726 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0);
2728 /* There's no return value */
2729 this->wait(mtd, FL_LOCKING);
2732 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2733 & ONENAND_CTRL_ONGO)
2736 /* Don't check lock status */
2737 if (this->options & ONENAND_SKIP_UNLOCK_CHECK)
2740 /* Check lock status */
2741 if (onenand_check_lock_status(this))
2744 /* Workaround for all block unlock in DDP */
2745 if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) {
2746 /* All blocks on another chip */
2747 ofs = this->chipsize >> 1;
2748 len = this->chipsize >> 1;
2752 onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2755 #ifdef CONFIG_MTD_ONENAND_OTP
2758 * onenand_otp_command - Send OTP specific command to OneNAND device
2759 * @param mtd MTD device structure
2760 * @param cmd the command to be sent
2761 * @param addr offset to read from or write to
2762 * @param len number of bytes to read or write
2764 static int onenand_otp_command(struct mtd_info *mtd, int cmd, loff_t addr,
2767 struct onenand_chip *this = mtd->priv;
2768 int value, block, page;
2770 /* Address translation */
2772 case ONENAND_CMD_OTP_ACCESS:
2773 block = (int) (addr >> this->erase_shift);
2778 block = (int) (addr >> this->erase_shift);
2779 page = (int) (addr >> this->page_shift);
2781 if (ONENAND_IS_2PLANE(this)) {
2782 /* Make the even block number */
2784 /* Is it the odd plane? */
2785 if (addr & this->writesize)
2789 page &= this->page_mask;
2794 /* Write 'DFS, FBA' of Flash */
2795 value = onenand_block_address(this, block);
2796 this->write_word(value, this->base +
2797 ONENAND_REG_START_ADDRESS1);
2801 /* Now we use page size operation */
2802 int sectors = 4, count = 4;
2807 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
2808 cmd = ONENAND_CMD_2X_PROG;
2809 dataram = ONENAND_CURRENT_BUFFERRAM(this);
2813 /* Write 'FPA, FSA' of Flash */
2814 value = onenand_page_address(page, sectors);
2815 this->write_word(value, this->base +
2816 ONENAND_REG_START_ADDRESS8);
2818 /* Write 'BSA, BSC' of DataRAM */
2819 value = onenand_buffer_address(dataram, sectors, count);
2820 this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
2823 /* Interrupt clear */
2824 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
2827 this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
2833 * onenand_otp_write_oob_nolock - [INTERN] OneNAND write out-of-band, specific to OTP
2834 * @param mtd MTD device structure
2835 * @param to offset to write to
2836 * @param len number of bytes to write
2837 * @param retlen pointer to variable to store the number of written bytes
2838 * @param buf the data to write
2840 * OneNAND write out-of-band only for OTP
2842 static int onenand_otp_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2843 struct mtd_oob_ops *ops)
2845 struct onenand_chip *this = mtd->priv;
2846 int column, ret = 0, oobsize;
2849 size_t len = ops->ooblen;
2850 const u_char *buf = ops->oobbuf;
2851 int block, value, status;
2855 /* Initialize retlen, in case of early exit */
2858 oobsize = mtd->oobsize;
2860 column = to & (mtd->oobsize - 1);
2862 oobbuf = this->oob_buf;
2864 /* Loop until all data write */
2865 while (written < len) {
2866 int thislen = min_t(int, oobsize, len - written);
2870 block = (int) (to >> this->erase_shift);
2872 * Write 'DFS, FBA' of Flash
2873 * Add: F100h DQ=DFS, FBA
2876 value = onenand_block_address(this, block);
2877 this->write_word(value, this->base +
2878 ONENAND_REG_START_ADDRESS1);
2881 * Select DataRAM for DDP
2885 value = onenand_bufferram_address(this, block);
2886 this->write_word(value, this->base +
2887 ONENAND_REG_START_ADDRESS2);
2888 ONENAND_SET_NEXT_BUFFERRAM(this);
2891 * Enter OTP access mode
2893 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
2894 this->wait(mtd, FL_OTPING);
2896 /* We send data to spare ram with oobsize
2897 * to prevent byte access */
2898 memcpy(oobbuf + column, buf, thislen);
2901 * Write Data into DataRAM
2903 * in sector0/spare/page0
2906 this->write_bufferram(mtd, ONENAND_SPARERAM,
2907 oobbuf, 0, mtd->oobsize);
2909 onenand_otp_command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize);
2910 onenand_update_bufferram(mtd, to, 0);
2911 if (ONENAND_IS_2PLANE(this)) {
2912 ONENAND_SET_BUFFERRAM1(this);
2913 onenand_update_bufferram(mtd, to + this->writesize, 0);
2916 ret = this->wait(mtd, FL_WRITING);
2918 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2922 /* Exit OTP access mode */
2923 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
2924 this->wait(mtd, FL_RESETING);
2926 status = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
2929 if (status == 0x60) {
2930 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2931 printk(KERN_DEBUG "1st Block\tLOCKED\n");
2932 printk(KERN_DEBUG "OTP Block\tLOCKED\n");
2933 } else if (status == 0x20) {
2934 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2935 printk(KERN_DEBUG "1st Block\tLOCKED\n");
2936 printk(KERN_DEBUG "OTP Block\tUN-LOCKED\n");
2937 } else if (status == 0x40) {
2938 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2939 printk(KERN_DEBUG "1st Block\tUN-LOCKED\n");
2940 printk(KERN_DEBUG "OTP Block\tLOCKED\n");
2942 printk(KERN_DEBUG "Reboot to check\n");
2949 to += mtd->writesize;
2954 ops->oobretlen = written;
2959 /* Internal OTP operation */
2960 typedef int (*otp_op_t)(struct mtd_info *mtd, loff_t form, size_t len,
2961 size_t *retlen, u_char *buf);
2964 * do_otp_read - [DEFAULT] Read OTP block area
2965 * @param mtd MTD device structure
2966 * @param from The offset to read
2967 * @param len number of bytes to read
2968 * @param retlen pointer to variable to store the number of readbytes
2969 * @param buf the databuffer to put/get data
2971 * Read OTP block area.
2973 static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
2974 size_t *retlen, u_char *buf)
2976 struct onenand_chip *this = mtd->priv;
2977 struct mtd_oob_ops ops = {
2985 /* Enter OTP access mode */
2986 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
2987 this->wait(mtd, FL_OTPING);
2989 ret = ONENAND_IS_4KB_PAGE(this) ?
2990 onenand_mlc_read_ops_nolock(mtd, from, &ops) :
2991 onenand_read_ops_nolock(mtd, from, &ops);
2993 /* Exit OTP access mode */
2994 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
2995 this->wait(mtd, FL_RESETING);
3001 * do_otp_write - [DEFAULT] Write OTP block area
3002 * @param mtd MTD device structure
3003 * @param to The offset to write
3004 * @param len number of bytes to write
3005 * @param retlen pointer to variable to store the number of write bytes
3006 * @param buf the databuffer to put/get data
3008 * Write OTP block area.
3010 static int do_otp_write(struct mtd_info *mtd, loff_t to, size_t len,
3011 size_t *retlen, u_char *buf)
3013 struct onenand_chip *this = mtd->priv;
3014 unsigned char *pbuf = buf;
3016 struct mtd_oob_ops ops;
3018 /* Force buffer page aligned */
3019 if (len < mtd->writesize) {
3020 memcpy(this->page_buf, buf, len);
3021 memset(this->page_buf + len, 0xff, mtd->writesize - len);
3022 pbuf = this->page_buf;
3023 len = mtd->writesize;
3026 /* Enter OTP access mode */
3027 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3028 this->wait(mtd, FL_OTPING);
3034 ret = onenand_write_ops_nolock(mtd, to, &ops);
3035 *retlen = ops.retlen;
3037 /* Exit OTP access mode */
3038 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3039 this->wait(mtd, FL_RESETING);
3045 * do_otp_lock - [DEFAULT] Lock OTP block area
3046 * @param mtd MTD device structure
3047 * @param from The offset to lock
3048 * @param len number of bytes to lock
3049 * @param retlen pointer to variable to store the number of lock bytes
3050 * @param buf the databuffer to put/get data
3052 * Lock OTP block area.
3054 static int do_otp_lock(struct mtd_info *mtd, loff_t from, size_t len,
3055 size_t *retlen, u_char *buf)
3057 struct onenand_chip *this = mtd->priv;
3058 struct mtd_oob_ops ops;
3061 if (FLEXONENAND(this)) {
3063 /* Enter OTP access mode */
3064 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3065 this->wait(mtd, FL_OTPING);
3067 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3068 * main area of page 49.
3070 ops.len = mtd->writesize;
3074 ret = onenand_write_ops_nolock(mtd, mtd->writesize * 49, &ops);
3075 *retlen = ops.retlen;
3077 /* Exit OTP access mode */
3078 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3079 this->wait(mtd, FL_RESETING);
3081 ops.mode = MTD_OPS_PLACE_OOB;
3085 ret = onenand_otp_write_oob_nolock(mtd, from, &ops);
3086 *retlen = ops.oobretlen;
3093 * onenand_otp_walk - [DEFAULT] Handle OTP operation
3094 * @param mtd MTD device structure
3095 * @param from The offset to read/write
3096 * @param len number of bytes to read/write
3097 * @param retlen pointer to variable to store the number of read bytes
3098 * @param buf the databuffer to put/get data
3099 * @param action do given action
3100 * @param mode specify user and factory
3102 * Handle OTP operation.
3104 static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
3105 size_t *retlen, u_char *buf,
3106 otp_op_t action, int mode)
3108 struct onenand_chip *this = mtd->priv;
3115 density = onenand_get_density(this->device_id);
3116 if (density < ONENAND_DEVICE_DENSITY_512Mb)
3121 if (mode == MTD_OTP_FACTORY) {
3122 from += mtd->writesize * otp_pages;
3123 otp_pages = ONENAND_PAGES_PER_BLOCK - otp_pages;
3126 /* Check User/Factory boundary */
3127 if (mode == MTD_OTP_USER) {
3128 if (mtd->writesize * otp_pages < from + len)
3131 if (mtd->writesize * otp_pages < len)
3135 onenand_get_device(mtd, FL_OTPING);
3136 while (len > 0 && otp_pages > 0) {
3137 if (!action) { /* OTP Info functions */
3138 struct otp_info *otpinfo;
3140 len -= sizeof(struct otp_info);
3146 otpinfo = (struct otp_info *) buf;
3147 otpinfo->start = from;
3148 otpinfo->length = mtd->writesize;
3149 otpinfo->locked = 0;
3151 from += mtd->writesize;
3152 buf += sizeof(struct otp_info);
3153 *retlen += sizeof(struct otp_info);
3157 ret = action(mtd, from, len, &tmp_retlen, buf);
3161 *retlen += tmp_retlen;
3168 onenand_release_device(mtd);
3174 * onenand_get_fact_prot_info - [MTD Interface] Read factory OTP info
3175 * @param mtd MTD device structure
3176 * @param len number of bytes to read
3177 * @param retlen pointer to variable to store the number of read bytes
3178 * @param buf the databuffer to put/get data
3180 * Read factory OTP info.
3182 static int onenand_get_fact_prot_info(struct mtd_info *mtd, size_t len,
3183 size_t *retlen, struct otp_info *buf)
3185 return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
3190 * onenand_read_fact_prot_reg - [MTD Interface] Read factory OTP area
3191 * @param mtd MTD device structure
3192 * @param from The offset to read
3193 * @param len number of bytes to read
3194 * @param retlen pointer to variable to store the number of read bytes
3195 * @param buf the databuffer to put/get data
3197 * Read factory OTP area.
3199 static int onenand_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
3200 size_t len, size_t *retlen, u_char *buf)
3202 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_FACTORY);
3206 * onenand_get_user_prot_info - [MTD Interface] Read user OTP info
3207 * @param mtd MTD device structure
3208 * @param retlen pointer to variable to store the number of read bytes
3209 * @param len number of bytes to read
3210 * @param buf the databuffer to put/get data
3212 * Read user OTP info.
3214 static int onenand_get_user_prot_info(struct mtd_info *mtd, size_t len,
3215 size_t *retlen, struct otp_info *buf)
3217 return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
3222 * onenand_read_user_prot_reg - [MTD Interface] Read user OTP area
3223 * @param mtd MTD device structure
3224 * @param from The offset to read
3225 * @param len number of bytes to read
3226 * @param retlen pointer to variable to store the number of read bytes
3227 * @param buf the databuffer to put/get data
3229 * Read user OTP area.
3231 static int onenand_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
3232 size_t len, size_t *retlen, u_char *buf)
3234 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_USER);
3238 * onenand_write_user_prot_reg - [MTD Interface] Write user OTP area
3239 * @param mtd MTD device structure
3240 * @param from The offset to write
3241 * @param len number of bytes to write
3242 * @param retlen pointer to variable to store the number of write bytes
3243 * @param buf the databuffer to put/get data
3245 * Write user OTP area.
3247 static int onenand_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
3248 size_t len, size_t *retlen, u_char *buf)
3250 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_write, MTD_OTP_USER);
3254 * onenand_lock_user_prot_reg - [MTD Interface] Lock user OTP area
3255 * @param mtd MTD device structure
3256 * @param from The offset to lock
3257 * @param len number of bytes to unlock
3259 * Write lock mark on spare area in page 0 in OTP block
3261 static int onenand_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
3264 struct onenand_chip *this = mtd->priv;
3265 u_char *buf = FLEXONENAND(this) ? this->page_buf : this->oob_buf;
3268 unsigned int otp_lock_offset = ONENAND_OTP_LOCK_OFFSET;
3270 memset(buf, 0xff, FLEXONENAND(this) ? this->writesize
3273 * Write lock mark to 8th word of sector0 of page0 of the spare0.
3274 * We write 16 bytes spare area instead of 2 bytes.
3275 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3276 * main area of page 49.
3280 len = FLEXONENAND(this) ? mtd->writesize : 16;
3283 * Note: OTP lock operation
3284 * OTP block : 0xXXFC XX 1111 1100
3285 * 1st block : 0xXXF3 (If chip support) XX 1111 0011
3286 * Both : 0xXXF0 (If chip support) XX 1111 0000
3288 if (FLEXONENAND(this))
3289 otp_lock_offset = FLEXONENAND_OTP_LOCK_OFFSET;
3291 /* ONENAND_OTP_AREA | ONENAND_OTP_BLOCK0 | ONENAND_OTP_AREA_BLOCK0 */
3293 buf[otp_lock_offset] = 0xFC;
3295 buf[otp_lock_offset] = 0xF3;
3297 buf[otp_lock_offset] = 0xF0;
3299 printk(KERN_DEBUG "[OneNAND] Invalid option selected for OTP\n");
3301 ret = onenand_otp_walk(mtd, from, len, &retlen, buf, do_otp_lock, MTD_OTP_USER);
3303 return ret ? : retlen;
3306 #endif /* CONFIG_MTD_ONENAND_OTP */
3309 * onenand_check_features - Check and set OneNAND features
3310 * @param mtd MTD data structure
3312 * Check and set OneNAND features
3316 static void onenand_check_features(struct mtd_info *mtd)
3318 struct onenand_chip *this = mtd->priv;
3319 unsigned int density, process, numbufs;
3321 /* Lock scheme depends on density and process */
3322 density = onenand_get_density(this->device_id);
3323 process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT;
3324 numbufs = this->read_word(this->base + ONENAND_REG_NUM_BUFFERS) >> 8;
3328 case ONENAND_DEVICE_DENSITY_4Gb:
3329 if (ONENAND_IS_DDP(this))
3330 this->options |= ONENAND_HAS_2PLANE;
3331 else if (numbufs == 1) {
3332 this->options |= ONENAND_HAS_4KB_PAGE;
3333 this->options |= ONENAND_HAS_CACHE_PROGRAM;
3335 * There are two different 4KiB pagesize chips
3336 * and no way to detect it by H/W config values.
3338 * To detect the correct NOP for each chips,
3339 * It should check the version ID as workaround.
3341 * Now it has as following
3342 * KFM4G16Q4M has NOP 4 with version ID 0x0131
3343 * KFM4G16Q5M has NOP 1 with versoin ID 0x013e
3345 if ((this->version_id & 0xf) == 0xe)
3346 this->options |= ONENAND_HAS_NOP_1;
3349 case ONENAND_DEVICE_DENSITY_2Gb:
3350 /* 2Gb DDP does not have 2 plane */
3351 if (!ONENAND_IS_DDP(this))
3352 this->options |= ONENAND_HAS_2PLANE;
3353 this->options |= ONENAND_HAS_UNLOCK_ALL;
3355 case ONENAND_DEVICE_DENSITY_1Gb:
3356 /* A-Die has all block unlock */
3358 this->options |= ONENAND_HAS_UNLOCK_ALL;
3362 /* Some OneNAND has continuous lock scheme */
3364 this->options |= ONENAND_HAS_CONT_LOCK;
3368 /* The MLC has 4KiB pagesize. */
3369 if (ONENAND_IS_MLC(this))
3370 this->options |= ONENAND_HAS_4KB_PAGE;
3372 if (ONENAND_IS_4KB_PAGE(this))
3373 this->options &= ~ONENAND_HAS_2PLANE;
3375 if (FLEXONENAND(this)) {
3376 this->options &= ~ONENAND_HAS_CONT_LOCK;
3377 this->options |= ONENAND_HAS_UNLOCK_ALL;
3380 if (this->options & ONENAND_HAS_CONT_LOCK)
3381 printk(KERN_DEBUG "Lock scheme is Continuous Lock\n");
3382 if (this->options & ONENAND_HAS_UNLOCK_ALL)
3383 printk(KERN_DEBUG "Chip support all block unlock\n");
3384 if (this->options & ONENAND_HAS_2PLANE)
3385 printk(KERN_DEBUG "Chip has 2 plane\n");
3386 if (this->options & ONENAND_HAS_4KB_PAGE)
3387 printk(KERN_DEBUG "Chip has 4KiB pagesize\n");
3388 if (this->options & ONENAND_HAS_CACHE_PROGRAM)
3389 printk(KERN_DEBUG "Chip has cache program feature\n");
3393 * onenand_print_device_info - Print device & version ID
3394 * @param device device ID
3395 * @param version version ID
3397 * Print device & version ID
3399 static void onenand_print_device_info(int device, int version)
3401 int vcc, demuxed, ddp, density, flexonenand;
3403 vcc = device & ONENAND_DEVICE_VCC_MASK;
3404 demuxed = device & ONENAND_DEVICE_IS_DEMUX;
3405 ddp = device & ONENAND_DEVICE_IS_DDP;
3406 density = onenand_get_density(device);
3407 flexonenand = device & DEVICE_IS_FLEXONENAND;
3408 printk(KERN_INFO "%s%sOneNAND%s %dMB %sV 16-bit (0x%02x)\n",
3409 demuxed ? "" : "Muxed ",
3410 flexonenand ? "Flex-" : "",
3413 vcc ? "2.65/3.3" : "1.8",
3415 printk(KERN_INFO "OneNAND version = 0x%04x\n", version);
3418 static const struct onenand_manufacturers onenand_manuf_ids[] = {
3419 {ONENAND_MFR_SAMSUNG, "Samsung"},
3420 {ONENAND_MFR_NUMONYX, "Numonyx"},
3424 * onenand_check_maf - Check manufacturer ID
3425 * @param manuf manufacturer ID
3427 * Check manufacturer ID
3429 static int onenand_check_maf(int manuf)
3431 int size = ARRAY_SIZE(onenand_manuf_ids);
3435 for (i = 0; i < size; i++)
3436 if (manuf == onenand_manuf_ids[i].id)
3440 name = onenand_manuf_ids[i].name;
3444 printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n", name, manuf);
3450 * flexonenand_get_boundary - Reads the SLC boundary
3451 * @param onenand_info - onenand info structure
3453 static int flexonenand_get_boundary(struct mtd_info *mtd)
3455 struct onenand_chip *this = mtd->priv;
3460 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3461 this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1);
3463 for (die = 0; die < this->dies; die++) {
3464 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3465 this->wait(mtd, FL_SYNCING);
3467 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3468 this->wait(mtd, FL_READING);
3470 bdry = this->read_word(this->base + ONENAND_DATARAM);
3471 if ((bdry >> FLEXONENAND_PI_UNLOCK_SHIFT) == 3)
3475 this->boundary[die] = bdry & FLEXONENAND_PI_MASK;
3477 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3478 this->wait(mtd, FL_RESETING);
3480 printk(KERN_INFO "Die %d boundary: %d%s\n", die,
3481 this->boundary[die], locked ? "(Locked)" : "(Unlocked)");
3485 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3490 * flexonenand_get_size - Fill up fields in onenand_chip and mtd_info
3491 * boundary[], diesize[], mtd->size, mtd->erasesize
3492 * @param mtd - MTD device structure
3494 static void flexonenand_get_size(struct mtd_info *mtd)
3496 struct onenand_chip *this = mtd->priv;
3497 int die, i, eraseshift, density;
3498 int blksperdie, maxbdry;
3501 density = onenand_get_density(this->device_id);
3502 blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift);
3503 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3504 maxbdry = blksperdie - 1;
3505 eraseshift = this->erase_shift - 1;
3507 mtd->numeraseregions = this->dies << 1;
3509 /* This fills up the device boundary */
3510 flexonenand_get_boundary(mtd);
3513 for (; die < this->dies; die++) {
3514 if (!die || this->boundary[die-1] != maxbdry) {
3516 mtd->eraseregions[i].offset = ofs;
3517 mtd->eraseregions[i].erasesize = 1 << eraseshift;
3518 mtd->eraseregions[i].numblocks =
3519 this->boundary[die] + 1;
3520 ofs += mtd->eraseregions[i].numblocks << eraseshift;
3523 mtd->numeraseregions -= 1;
3524 mtd->eraseregions[i].numblocks +=
3525 this->boundary[die] + 1;
3526 ofs += (this->boundary[die] + 1) << (eraseshift - 1);
3528 if (this->boundary[die] != maxbdry) {
3530 mtd->eraseregions[i].offset = ofs;
3531 mtd->eraseregions[i].erasesize = 1 << eraseshift;
3532 mtd->eraseregions[i].numblocks = maxbdry ^
3533 this->boundary[die];
3534 ofs += mtd->eraseregions[i].numblocks << eraseshift;
3537 mtd->numeraseregions -= 1;
3540 /* Expose MLC erase size except when all blocks are SLC */
3541 mtd->erasesize = 1 << this->erase_shift;
3542 if (mtd->numeraseregions == 1)
3543 mtd->erasesize >>= 1;
3545 printk(KERN_INFO "Device has %d eraseregions\n", mtd->numeraseregions);
3546 for (i = 0; i < mtd->numeraseregions; i++)
3547 printk(KERN_INFO "[offset: 0x%08x, erasesize: 0x%05x,"
3548 " numblocks: %04u]\n",
3549 (unsigned int) mtd->eraseregions[i].offset,
3550 mtd->eraseregions[i].erasesize,
3551 mtd->eraseregions[i].numblocks);
3553 for (die = 0, mtd->size = 0; die < this->dies; die++) {
3554 this->diesize[die] = (loff_t)blksperdie << this->erase_shift;
3555 this->diesize[die] -= (loff_t)(this->boundary[die] + 1)
3556 << (this->erase_shift - 1);
3557 mtd->size += this->diesize[die];
3562 * flexonenand_check_blocks_erased - Check if blocks are erased
3563 * @param mtd_info - mtd info structure
3564 * @param start - first erase block to check
3565 * @param end - last erase block to check
3567 * Converting an unerased block from MLC to SLC
3568 * causes byte values to change. Since both data and its ECC
3569 * have changed, reads on the block give uncorrectable error.
3570 * This might lead to the block being detected as bad.
3572 * Avoid this by ensuring that the block to be converted is
3575 static int flexonenand_check_blocks_erased(struct mtd_info *mtd, int start, int end)
3577 struct onenand_chip *this = mtd->priv;
3580 struct mtd_oob_ops ops = {
3581 .mode = MTD_OPS_PLACE_OOB,
3583 .ooblen = mtd->oobsize,
3585 .oobbuf = this->oob_buf,
3589 printk(KERN_DEBUG "Check blocks from %d to %d\n", start, end);
3591 for (block = start; block <= end; block++) {
3592 addr = flexonenand_addr(this, block);
3593 if (onenand_block_isbad_nolock(mtd, addr, 0))
3597 * Since main area write results in ECC write to spare,
3598 * it is sufficient to check only ECC bytes for change.
3600 ret = onenand_read_oob_nolock(mtd, addr, &ops);
3604 for (i = 0; i < mtd->oobsize; i++)
3605 if (this->oob_buf[i] != 0xff)
3608 if (i != mtd->oobsize) {
3609 printk(KERN_WARNING "%s: Block %d not erased.\n",
3619 * flexonenand_set_boundary - Writes the SLC boundary
3620 * @param mtd - mtd info structure
3622 static int flexonenand_set_boundary(struct mtd_info *mtd, int die,
3623 int boundary, int lock)
3625 struct onenand_chip *this = mtd->priv;
3626 int ret, density, blksperdie, old, new, thisboundary;
3629 /* Change only once for SDP Flex-OneNAND */
3630 if (die && (!ONENAND_IS_DDP(this)))
3633 /* boundary value of -1 indicates no required change */
3634 if (boundary < 0 || boundary == this->boundary[die])
3637 density = onenand_get_density(this->device_id);
3638 blksperdie = ((16 << density) << 20) >> this->erase_shift;
3639 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3641 if (boundary >= blksperdie) {
3642 printk(KERN_ERR "%s: Invalid boundary value. "
3643 "Boundary not changed.\n", __func__);
3647 /* Check if converting blocks are erased */
3648 old = this->boundary[die] + (die * this->density_mask);
3649 new = boundary + (die * this->density_mask);
3650 ret = flexonenand_check_blocks_erased(mtd, min(old, new) + 1, max(old, new));
3652 printk(KERN_ERR "%s: Please erase blocks "
3653 "before boundary change\n", __func__);
3657 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3658 this->wait(mtd, FL_SYNCING);
3660 /* Check is boundary is locked */
3661 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3662 this->wait(mtd, FL_READING);
3664 thisboundary = this->read_word(this->base + ONENAND_DATARAM);
3665 if ((thisboundary >> FLEXONENAND_PI_UNLOCK_SHIFT) != 3) {
3666 printk(KERN_ERR "%s: boundary locked\n", __func__);
3671 printk(KERN_INFO "Changing die %d boundary: %d%s\n",
3672 die, boundary, lock ? "(Locked)" : "(Unlocked)");
3674 addr = die ? this->diesize[0] : 0;
3676 boundary &= FLEXONENAND_PI_MASK;
3677 boundary |= lock ? 0 : (3 << FLEXONENAND_PI_UNLOCK_SHIFT);
3679 this->command(mtd, ONENAND_CMD_ERASE, addr, 0);
3680 ret = this->wait(mtd, FL_ERASING);
3682 printk(KERN_ERR "%s: Failed PI erase for Die %d\n",
3687 this->write_word(boundary, this->base + ONENAND_DATARAM);
3688 this->command(mtd, ONENAND_CMD_PROG, addr, 0);
3689 ret = this->wait(mtd, FL_WRITING);
3691 printk(KERN_ERR "%s: Failed PI write for Die %d\n",
3696 this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0);
3697 ret = this->wait(mtd, FL_WRITING);
3699 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND);
3700 this->wait(mtd, FL_RESETING);
3702 /* Recalculate device size on boundary change*/
3703 flexonenand_get_size(mtd);
3709 * onenand_chip_probe - [OneNAND Interface] The generic chip probe
3710 * @param mtd MTD device structure
3712 * OneNAND detection method:
3713 * Compare the values from command with ones from register
3715 static int onenand_chip_probe(struct mtd_info *mtd)
3717 struct onenand_chip *this = mtd->priv;
3718 int bram_maf_id, bram_dev_id, maf_id, dev_id;
3721 /* Save system configuration 1 */
3722 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3723 /* Clear Sync. Burst Read mode to read BootRAM */
3724 this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE), this->base + ONENAND_REG_SYS_CFG1);
3726 /* Send the command for reading device ID from BootRAM */
3727 this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
3729 /* Read manufacturer and device IDs from BootRAM */
3730 bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0);
3731 bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2);
3733 /* Reset OneNAND to read default register values */
3734 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM);
3736 this->wait(mtd, FL_RESETING);
3738 /* Restore system configuration 1 */
3739 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3741 /* Check manufacturer ID */
3742 if (onenand_check_maf(bram_maf_id))
3745 /* Read manufacturer and device IDs from Register */
3746 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
3747 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3749 /* Check OneNAND device */
3750 if (maf_id != bram_maf_id || dev_id != bram_dev_id)
3757 * onenand_probe - [OneNAND Interface] Probe the OneNAND device
3758 * @param mtd MTD device structure
3760 static int onenand_probe(struct mtd_info *mtd)
3762 struct onenand_chip *this = mtd->priv;
3767 ret = this->chip_probe(mtd);
3771 /* Device and version IDs from Register */
3772 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3773 ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
3774 this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
3776 /* Flash device information */
3777 onenand_print_device_info(dev_id, ver_id);
3778 this->device_id = dev_id;
3779 this->version_id = ver_id;
3781 /* Check OneNAND features */
3782 onenand_check_features(mtd);
3784 density = onenand_get_density(dev_id);
3785 if (FLEXONENAND(this)) {
3786 this->dies = ONENAND_IS_DDP(this) ? 2 : 1;
3787 /* Maximum possible erase regions */
3788 mtd->numeraseregions = this->dies << 1;
3789 mtd->eraseregions = kzalloc(sizeof(struct mtd_erase_region_info)
3790 * (this->dies << 1), GFP_KERNEL);
3791 if (!mtd->eraseregions)
3796 * For Flex-OneNAND, chipsize represents maximum possible device size.
3797 * mtd->size represents the actual device size.
3799 this->chipsize = (16 << density) << 20;
3801 /* OneNAND page size & block size */
3802 /* The data buffer size is equal to page size */
3803 mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE);
3804 /* We use the full BufferRAM */
3805 if (ONENAND_IS_4KB_PAGE(this))
3806 mtd->writesize <<= 1;
3808 mtd->oobsize = mtd->writesize >> 5;
3809 /* Pages per a block are always 64 in OneNAND */
3810 mtd->erasesize = mtd->writesize << 6;
3812 * Flex-OneNAND SLC area has 64 pages per block.
3813 * Flex-OneNAND MLC area has 128 pages per block.
3814 * Expose MLC erase size to find erase_shift and page_mask.
3816 if (FLEXONENAND(this))
3817 mtd->erasesize <<= 1;
3819 this->erase_shift = ffs(mtd->erasesize) - 1;
3820 this->page_shift = ffs(mtd->writesize) - 1;
3821 this->page_mask = (1 << (this->erase_shift - this->page_shift)) - 1;
3822 /* Set density mask. it is used for DDP */
3823 if (ONENAND_IS_DDP(this))
3824 this->density_mask = this->chipsize >> (this->erase_shift + 1);
3825 /* It's real page size */
3826 this->writesize = mtd->writesize;
3828 /* REVISIT: Multichip handling */
3830 if (FLEXONENAND(this))
3831 flexonenand_get_size(mtd);
3833 mtd->size = this->chipsize;
3836 * We emulate the 4KiB page and 256KiB erase block size
3837 * But oobsize is still 64 bytes.
3838 * It is only valid if you turn on 2X program support,
3839 * Otherwise it will be ignored by compiler.
3841 if (ONENAND_IS_2PLANE(this)) {
3842 mtd->writesize <<= 1;
3843 mtd->erasesize <<= 1;
3850 * onenand_suspend - [MTD Interface] Suspend the OneNAND flash
3851 * @param mtd MTD device structure
3853 static int onenand_suspend(struct mtd_info *mtd)
3855 return onenand_get_device(mtd, FL_PM_SUSPENDED);
3859 * onenand_resume - [MTD Interface] Resume the OneNAND flash
3860 * @param mtd MTD device structure
3862 static void onenand_resume(struct mtd_info *mtd)
3864 struct onenand_chip *this = mtd->priv;
3866 if (this->state == FL_PM_SUSPENDED)
3867 onenand_release_device(mtd);
3869 printk(KERN_ERR "%s: resume() called for the chip which is not "
3870 "in suspended state\n", __func__);
3874 * onenand_scan - [OneNAND Interface] Scan for the OneNAND device
3875 * @param mtd MTD device structure
3876 * @param maxchips Number of chips to scan for
3878 * This fills out all the not initialized function pointers
3879 * with the defaults.
3880 * The flash ID is read and the mtd/chip structures are
3881 * filled with the appropriate values.
3883 int onenand_scan(struct mtd_info *mtd, int maxchips)
3886 struct onenand_chip *this = mtd->priv;
3888 if (!this->read_word)
3889 this->read_word = onenand_readw;
3890 if (!this->write_word)
3891 this->write_word = onenand_writew;
3894 this->command = onenand_command;
3896 onenand_setup_wait(mtd);
3897 if (!this->bbt_wait)
3898 this->bbt_wait = onenand_bbt_wait;
3899 if (!this->unlock_all)
3900 this->unlock_all = onenand_unlock_all;
3902 if (!this->chip_probe)
3903 this->chip_probe = onenand_chip_probe;
3905 if (!this->read_bufferram)
3906 this->read_bufferram = onenand_read_bufferram;
3907 if (!this->write_bufferram)
3908 this->write_bufferram = onenand_write_bufferram;
3910 if (!this->block_markbad)
3911 this->block_markbad = onenand_default_block_markbad;
3912 if (!this->scan_bbt)
3913 this->scan_bbt = onenand_default_bbt;
3915 if (onenand_probe(mtd))
3918 /* Set Sync. Burst Read after probing */
3919 if (this->mmcontrol) {
3920 printk(KERN_INFO "OneNAND Sync. Burst Read support\n");
3921 this->read_bufferram = onenand_sync_read_bufferram;
3924 /* Allocate buffers, if necessary */
3925 if (!this->page_buf) {
3926 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3927 if (!this->page_buf)
3929 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
3930 this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3931 if (!this->verify_buf) {
3932 kfree(this->page_buf);
3936 this->options |= ONENAND_PAGEBUF_ALLOC;
3938 if (!this->oob_buf) {
3939 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL);
3940 if (!this->oob_buf) {
3941 if (this->options & ONENAND_PAGEBUF_ALLOC) {
3942 this->options &= ~ONENAND_PAGEBUF_ALLOC;
3943 kfree(this->page_buf);
3947 this->options |= ONENAND_OOBBUF_ALLOC;
3950 this->state = FL_READY;
3951 init_waitqueue_head(&this->wq);
3952 spin_lock_init(&this->chip_lock);
3955 * Allow subpage writes up to oobsize.
3957 switch (mtd->oobsize) {
3959 if (FLEXONENAND(this)) {
3960 this->ecclayout = &flexonenand_oob_128;
3961 mtd->subpage_sft = 0;
3963 this->ecclayout = &onenand_oob_128;
3964 mtd->subpage_sft = 2;
3966 if (ONENAND_IS_NOP_1(this))
3967 mtd->subpage_sft = 0;
3970 this->ecclayout = &onenand_oob_64;
3971 mtd->subpage_sft = 2;
3975 this->ecclayout = &onenand_oob_32;
3976 mtd->subpage_sft = 1;
3980 printk(KERN_WARNING "%s: No OOB scheme defined for oobsize %d\n",
3981 __func__, mtd->oobsize);
3982 mtd->subpage_sft = 0;
3983 /* To prevent kernel oops */
3984 this->ecclayout = &onenand_oob_32;
3988 this->subpagesize = mtd->writesize >> mtd->subpage_sft;
3991 * The number of bytes available for a client to place data into
3992 * the out of band area
3994 ret = mtd_ooblayout_count_freebytes(mtd);
3998 mtd->oobavail = ret;
4000 mtd_set_ecclayout(mtd, this->ecclayout);
4001 mtd->ecc_strength = 1;
4003 /* Fill in remaining MTD driver data */
4004 mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH;
4005 mtd->flags = MTD_CAP_NANDFLASH;
4006 mtd->_erase = onenand_erase;
4008 mtd->_unpoint = NULL;
4009 mtd->_read = onenand_read;
4010 mtd->_write = onenand_write;
4011 mtd->_read_oob = onenand_read_oob;
4012 mtd->_write_oob = onenand_write_oob;
4013 mtd->_panic_write = onenand_panic_write;
4014 #ifdef CONFIG_MTD_ONENAND_OTP
4015 mtd->_get_fact_prot_info = onenand_get_fact_prot_info;
4016 mtd->_read_fact_prot_reg = onenand_read_fact_prot_reg;
4017 mtd->_get_user_prot_info = onenand_get_user_prot_info;
4018 mtd->_read_user_prot_reg = onenand_read_user_prot_reg;
4019 mtd->_write_user_prot_reg = onenand_write_user_prot_reg;
4020 mtd->_lock_user_prot_reg = onenand_lock_user_prot_reg;
4022 mtd->_sync = onenand_sync;
4023 mtd->_lock = onenand_lock;
4024 mtd->_unlock = onenand_unlock;
4025 mtd->_suspend = onenand_suspend;
4026 mtd->_resume = onenand_resume;
4027 mtd->_block_isbad = onenand_block_isbad;
4028 mtd->_block_markbad = onenand_block_markbad;
4029 mtd->owner = THIS_MODULE;
4030 mtd->writebufsize = mtd->writesize;
4032 /* Unlock whole block */
4033 if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING))
4034 this->unlock_all(mtd);
4036 ret = this->scan_bbt(mtd);
4037 if ((!FLEXONENAND(this)) || ret)
4040 /* Change Flex-OneNAND boundaries if required */
4041 for (i = 0; i < MAX_DIES; i++)
4042 flexonenand_set_boundary(mtd, i, flex_bdry[2 * i],
4043 flex_bdry[(2 * i) + 1]);
4049 * onenand_release - [OneNAND Interface] Free resources held by the OneNAND device
4050 * @param mtd MTD device structure
4052 void onenand_release(struct mtd_info *mtd)
4054 struct onenand_chip *this = mtd->priv;
4056 /* Deregister partitions */
4057 mtd_device_unregister(mtd);
4059 /* Free bad block table memory, if allocated */
4061 struct bbm_info *bbm = this->bbm;
4065 /* Buffers allocated by onenand_scan */
4066 if (this->options & ONENAND_PAGEBUF_ALLOC) {
4067 kfree(this->page_buf);
4068 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4069 kfree(this->verify_buf);
4072 if (this->options & ONENAND_OOBBUF_ALLOC)
4073 kfree(this->oob_buf);
4074 kfree(mtd->eraseregions);
4077 EXPORT_SYMBOL_GPL(onenand_scan);
4078 EXPORT_SYMBOL_GPL(onenand_release);
4080 MODULE_LICENSE("GPL");
4081 MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
4082 MODULE_DESCRIPTION("Generic OneNAND flash driver code");