fix a kmap leak in virtio_console
[linux/fpc-iii.git] / drivers / mtd / onenand / onenand_base.c
blob1de33b5d390358b58a2cbaaaf6991e08ebcc97db
1 /*
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>
9 * Credits:
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>
16 * OTP support
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/init.h>
28 #include <linux/sched.h>
29 #include <linux/delay.h>
30 #include <linux/interrupt.h>
31 #include <linux/jiffies.h>
32 #include <linux/mtd/mtd.h>
33 #include <linux/mtd/onenand.h>
34 #include <linux/mtd/partitions.h>
36 #include <asm/io.h>
39 * Multiblock erase if number of blocks to erase is 2 or more.
40 * Maximum number of blocks for simultaneous erase is 64.
42 #define MB_ERASE_MIN_BLK_COUNT 2
43 #define MB_ERASE_MAX_BLK_COUNT 64
45 /* Default Flex-OneNAND boundary and lock respectively */
46 static int flex_bdry[MAX_DIES * 2] = { -1, 0, -1, 0 };
48 module_param_array(flex_bdry, int, NULL, 0400);
49 MODULE_PARM_DESC(flex_bdry, "SLC Boundary information for Flex-OneNAND"
50 "Syntax:flex_bdry=DIE_BDRY,LOCK,..."
51 "DIE_BDRY: SLC boundary of the die"
52 "LOCK: Locking information for SLC boundary"
53 " : 0->Set boundary in unlocked status"
54 " : 1->Set boundary in locked status");
56 /* Default OneNAND/Flex-OneNAND OTP options*/
57 static int otp;
59 module_param(otp, int, 0400);
60 MODULE_PARM_DESC(otp, "Corresponding behaviour of OneNAND in OTP"
61 "Syntax : otp=LOCK_TYPE"
62 "LOCK_TYPE : Keys issued, for specific OTP Lock type"
63 " : 0 -> Default (No Blocks Locked)"
64 " : 1 -> OTP Block lock"
65 " : 2 -> 1st Block lock"
66 " : 3 -> BOTH OTP Block and 1st Block lock");
69 * flexonenand_oob_128 - oob info for Flex-Onenand with 4KB page
70 * For now, we expose only 64 out of 80 ecc bytes
72 static struct nand_ecclayout flexonenand_oob_128 = {
73 .eccbytes = 64,
74 .eccpos = {
75 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
76 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
77 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
78 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
79 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
81 102, 103, 104, 105
83 .oobfree = {
84 {2, 4}, {18, 4}, {34, 4}, {50, 4},
85 {66, 4}, {82, 4}, {98, 4}, {114, 4}
90 * onenand_oob_128 - oob info for OneNAND with 4KB page
92 * Based on specification:
93 * 4Gb M-die OneNAND Flash (KFM4G16Q4M, KFN8G16Q4M). Rev. 1.3, Apr. 2010
95 * For eccpos we expose only 64 bytes out of 72 (see struct nand_ecclayout)
97 * oobfree uses the spare area fields marked as
98 * "Managed by internal ECC logic for Logical Sector Number area"
100 static struct nand_ecclayout onenand_oob_128 = {
101 .eccbytes = 64,
102 .eccpos = {
103 7, 8, 9, 10, 11, 12, 13, 14, 15,
104 23, 24, 25, 26, 27, 28, 29, 30, 31,
105 39, 40, 41, 42, 43, 44, 45, 46, 47,
106 55, 56, 57, 58, 59, 60, 61, 62, 63,
107 71, 72, 73, 74, 75, 76, 77, 78, 79,
108 87, 88, 89, 90, 91, 92, 93, 94, 95,
109 103, 104, 105, 106, 107, 108, 109, 110, 111,
112 .oobfree = {
113 {2, 3}, {18, 3}, {34, 3}, {50, 3},
114 {66, 3}, {82, 3}, {98, 3}, {114, 3}
119 * onenand_oob_64 - oob info for large (2KB) page
121 static struct nand_ecclayout onenand_oob_64 = {
122 .eccbytes = 20,
123 .eccpos = {
124 8, 9, 10, 11, 12,
125 24, 25, 26, 27, 28,
126 40, 41, 42, 43, 44,
127 56, 57, 58, 59, 60,
129 .oobfree = {
130 {2, 3}, {14, 2}, {18, 3}, {30, 2},
131 {34, 3}, {46, 2}, {50, 3}, {62, 2}
136 * onenand_oob_32 - oob info for middle (1KB) page
138 static struct nand_ecclayout onenand_oob_32 = {
139 .eccbytes = 10,
140 .eccpos = {
141 8, 9, 10, 11, 12,
142 24, 25, 26, 27, 28,
144 .oobfree = { {2, 3}, {14, 2}, {18, 3}, {30, 2} }
147 static const unsigned char ffchars[] = {
148 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
149 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 16 */
150 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
151 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 32 */
152 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
153 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 48 */
154 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
155 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 64 */
156 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
157 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 80 */
158 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
159 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 96 */
160 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
161 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 112 */
162 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
163 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 128 */
167 * onenand_readw - [OneNAND Interface] Read OneNAND register
168 * @param addr address to read
170 * Read OneNAND register
172 static unsigned short onenand_readw(void __iomem *addr)
174 return readw(addr);
178 * onenand_writew - [OneNAND Interface] Write OneNAND register with value
179 * @param value value to write
180 * @param addr address to write
182 * Write OneNAND register with value
184 static void onenand_writew(unsigned short value, void __iomem *addr)
186 writew(value, addr);
190 * onenand_block_address - [DEFAULT] Get block address
191 * @param this onenand chip data structure
192 * @param block the block
193 * @return translated block address if DDP, otherwise same
195 * Setup Start Address 1 Register (F100h)
197 static int onenand_block_address(struct onenand_chip *this, int block)
199 /* Device Flash Core select, NAND Flash Block Address */
200 if (block & this->density_mask)
201 return ONENAND_DDP_CHIP1 | (block ^ this->density_mask);
203 return block;
207 * onenand_bufferram_address - [DEFAULT] Get bufferram address
208 * @param this onenand chip data structure
209 * @param block the block
210 * @return set DBS value if DDP, otherwise 0
212 * Setup Start Address 2 Register (F101h) for DDP
214 static int onenand_bufferram_address(struct onenand_chip *this, int block)
216 /* Device BufferRAM Select */
217 if (block & this->density_mask)
218 return ONENAND_DDP_CHIP1;
220 return ONENAND_DDP_CHIP0;
224 * onenand_page_address - [DEFAULT] Get page address
225 * @param page the page address
226 * @param sector the sector address
227 * @return combined page and sector address
229 * Setup Start Address 8 Register (F107h)
231 static int onenand_page_address(int page, int sector)
233 /* Flash Page Address, Flash Sector Address */
234 int fpa, fsa;
236 fpa = page & ONENAND_FPA_MASK;
237 fsa = sector & ONENAND_FSA_MASK;
239 return ((fpa << ONENAND_FPA_SHIFT) | fsa);
243 * onenand_buffer_address - [DEFAULT] Get buffer address
244 * @param dataram1 DataRAM index
245 * @param sectors the sector address
246 * @param count the number of sectors
247 * @return the start buffer value
249 * Setup Start Buffer Register (F200h)
251 static int onenand_buffer_address(int dataram1, int sectors, int count)
253 int bsa, bsc;
255 /* BufferRAM Sector Address */
256 bsa = sectors & ONENAND_BSA_MASK;
258 if (dataram1)
259 bsa |= ONENAND_BSA_DATARAM1; /* DataRAM1 */
260 else
261 bsa |= ONENAND_BSA_DATARAM0; /* DataRAM0 */
263 /* BufferRAM Sector Count */
264 bsc = count & ONENAND_BSC_MASK;
266 return ((bsa << ONENAND_BSA_SHIFT) | bsc);
270 * flexonenand_block- For given address return block number
271 * @param this - OneNAND device structure
272 * @param addr - Address for which block number is needed
274 static unsigned flexonenand_block(struct onenand_chip *this, loff_t addr)
276 unsigned boundary, blk, die = 0;
278 if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) {
279 die = 1;
280 addr -= this->diesize[0];
283 boundary = this->boundary[die];
285 blk = addr >> (this->erase_shift - 1);
286 if (blk > boundary)
287 blk = (blk + boundary + 1) >> 1;
289 blk += die ? this->density_mask : 0;
290 return blk;
293 inline unsigned onenand_block(struct onenand_chip *this, loff_t addr)
295 if (!FLEXONENAND(this))
296 return addr >> this->erase_shift;
297 return flexonenand_block(this, addr);
301 * flexonenand_addr - Return address of the block
302 * @this: OneNAND device structure
303 * @block: Block number on Flex-OneNAND
305 * Return address of the block
307 static loff_t flexonenand_addr(struct onenand_chip *this, int block)
309 loff_t ofs = 0;
310 int die = 0, boundary;
312 if (ONENAND_IS_DDP(this) && block >= this->density_mask) {
313 block -= this->density_mask;
314 die = 1;
315 ofs = this->diesize[0];
318 boundary = this->boundary[die];
319 ofs += (loff_t)block << (this->erase_shift - 1);
320 if (block > (boundary + 1))
321 ofs += (loff_t)(block - boundary - 1) << (this->erase_shift - 1);
322 return ofs;
325 loff_t onenand_addr(struct onenand_chip *this, int block)
327 if (!FLEXONENAND(this))
328 return (loff_t)block << this->erase_shift;
329 return flexonenand_addr(this, block);
331 EXPORT_SYMBOL(onenand_addr);
334 * onenand_get_density - [DEFAULT] Get OneNAND density
335 * @param dev_id OneNAND device ID
337 * Get OneNAND density from device ID
339 static inline int onenand_get_density(int dev_id)
341 int density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT;
342 return (density & ONENAND_DEVICE_DENSITY_MASK);
346 * flexonenand_region - [Flex-OneNAND] Return erase region of addr
347 * @param mtd MTD device structure
348 * @param addr address whose erase region needs to be identified
350 int flexonenand_region(struct mtd_info *mtd, loff_t addr)
352 int i;
354 for (i = 0; i < mtd->numeraseregions; i++)
355 if (addr < mtd->eraseregions[i].offset)
356 break;
357 return i - 1;
359 EXPORT_SYMBOL(flexonenand_region);
362 * onenand_command - [DEFAULT] Send command to OneNAND device
363 * @param mtd MTD device structure
364 * @param cmd the command to be sent
365 * @param addr offset to read from or write to
366 * @param len number of bytes to read or write
368 * Send command to OneNAND device. This function is used for middle/large page
369 * devices (1KB/2KB Bytes per page)
371 static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t len)
373 struct onenand_chip *this = mtd->priv;
374 int value, block, page;
376 /* Address translation */
377 switch (cmd) {
378 case ONENAND_CMD_UNLOCK:
379 case ONENAND_CMD_LOCK:
380 case ONENAND_CMD_LOCK_TIGHT:
381 case ONENAND_CMD_UNLOCK_ALL:
382 block = -1;
383 page = -1;
384 break;
386 case FLEXONENAND_CMD_PI_ACCESS:
387 /* addr contains die index */
388 block = addr * this->density_mask;
389 page = -1;
390 break;
392 case ONENAND_CMD_ERASE:
393 case ONENAND_CMD_MULTIBLOCK_ERASE:
394 case ONENAND_CMD_ERASE_VERIFY:
395 case ONENAND_CMD_BUFFERRAM:
396 case ONENAND_CMD_OTP_ACCESS:
397 block = onenand_block(this, addr);
398 page = -1;
399 break;
401 case FLEXONENAND_CMD_READ_PI:
402 cmd = ONENAND_CMD_READ;
403 block = addr * this->density_mask;
404 page = 0;
405 break;
407 default:
408 block = onenand_block(this, addr);
409 if (FLEXONENAND(this))
410 page = (int) (addr - onenand_addr(this, block))>>\
411 this->page_shift;
412 else
413 page = (int) (addr >> this->page_shift);
414 if (ONENAND_IS_2PLANE(this)) {
415 /* Make the even block number */
416 block &= ~1;
417 /* Is it the odd plane? */
418 if (addr & this->writesize)
419 block++;
420 page >>= 1;
422 page &= this->page_mask;
423 break;
426 /* NOTE: The setting order of the registers is very important! */
427 if (cmd == ONENAND_CMD_BUFFERRAM) {
428 /* Select DataRAM for DDP */
429 value = onenand_bufferram_address(this, block);
430 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
432 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this))
433 /* It is always BufferRAM0 */
434 ONENAND_SET_BUFFERRAM0(this);
435 else
436 /* Switch to the next data buffer */
437 ONENAND_SET_NEXT_BUFFERRAM(this);
439 return 0;
442 if (block != -1) {
443 /* Write 'DFS, FBA' of Flash */
444 value = onenand_block_address(this, block);
445 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
447 /* Select DataRAM for DDP */
448 value = onenand_bufferram_address(this, block);
449 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
452 if (page != -1) {
453 /* Now we use page size operation */
454 int sectors = 0, count = 0;
455 int dataram;
457 switch (cmd) {
458 case FLEXONENAND_CMD_RECOVER_LSB:
459 case ONENAND_CMD_READ:
460 case ONENAND_CMD_READOOB:
461 if (ONENAND_IS_4KB_PAGE(this))
462 /* It is always BufferRAM0 */
463 dataram = ONENAND_SET_BUFFERRAM0(this);
464 else
465 dataram = ONENAND_SET_NEXT_BUFFERRAM(this);
466 break;
468 default:
469 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
470 cmd = ONENAND_CMD_2X_PROG;
471 dataram = ONENAND_CURRENT_BUFFERRAM(this);
472 break;
475 /* Write 'FPA, FSA' of Flash */
476 value = onenand_page_address(page, sectors);
477 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS8);
479 /* Write 'BSA, BSC' of DataRAM */
480 value = onenand_buffer_address(dataram, sectors, count);
481 this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
484 /* Interrupt clear */
485 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
487 /* Write command */
488 this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
490 return 0;
494 * onenand_read_ecc - return ecc status
495 * @param this onenand chip structure
497 static inline int onenand_read_ecc(struct onenand_chip *this)
499 int ecc, i, result = 0;
501 if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this))
502 return this->read_word(this->base + ONENAND_REG_ECC_STATUS);
504 for (i = 0; i < 4; i++) {
505 ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS + i*2);
506 if (likely(!ecc))
507 continue;
508 if (ecc & FLEXONENAND_UNCORRECTABLE_ERROR)
509 return ONENAND_ECC_2BIT_ALL;
510 else
511 result = ONENAND_ECC_1BIT_ALL;
514 return result;
518 * onenand_wait - [DEFAULT] wait until the command is done
519 * @param mtd MTD device structure
520 * @param state state to select the max. timeout value
522 * Wait for command done. This applies to all OneNAND command
523 * Read can take up to 30us, erase up to 2ms and program up to 350us
524 * according to general OneNAND specs
526 static int onenand_wait(struct mtd_info *mtd, int state)
528 struct onenand_chip * this = mtd->priv;
529 unsigned long timeout;
530 unsigned int flags = ONENAND_INT_MASTER;
531 unsigned int interrupt = 0;
532 unsigned int ctrl;
534 /* The 20 msec is enough */
535 timeout = jiffies + msecs_to_jiffies(20);
536 while (time_before(jiffies, timeout)) {
537 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
539 if (interrupt & flags)
540 break;
542 if (state != FL_READING && state != FL_PREPARING_ERASE)
543 cond_resched();
545 /* To get correct interrupt status in timeout case */
546 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
548 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
551 * In the Spec. it checks the controller status first
552 * However if you get the correct information in case of
553 * power off recovery (POR) test, it should read ECC status first
555 if (interrupt & ONENAND_INT_READ) {
556 int ecc = onenand_read_ecc(this);
557 if (ecc) {
558 if (ecc & ONENAND_ECC_2BIT_ALL) {
559 printk(KERN_ERR "%s: ECC error = 0x%04x\n",
560 __func__, ecc);
561 mtd->ecc_stats.failed++;
562 return -EBADMSG;
563 } else if (ecc & ONENAND_ECC_1BIT_ALL) {
564 printk(KERN_DEBUG "%s: correctable ECC error = 0x%04x\n",
565 __func__, ecc);
566 mtd->ecc_stats.corrected++;
569 } else if (state == FL_READING) {
570 printk(KERN_ERR "%s: read timeout! ctrl=0x%04x intr=0x%04x\n",
571 __func__, ctrl, interrupt);
572 return -EIO;
575 if (state == FL_PREPARING_ERASE && !(interrupt & ONENAND_INT_ERASE)) {
576 printk(KERN_ERR "%s: mb erase timeout! ctrl=0x%04x intr=0x%04x\n",
577 __func__, ctrl, interrupt);
578 return -EIO;
581 if (!(interrupt & ONENAND_INT_MASTER)) {
582 printk(KERN_ERR "%s: timeout! ctrl=0x%04x intr=0x%04x\n",
583 __func__, ctrl, interrupt);
584 return -EIO;
587 /* If there's controller error, it's a real error */
588 if (ctrl & ONENAND_CTRL_ERROR) {
589 printk(KERN_ERR "%s: controller error = 0x%04x\n",
590 __func__, ctrl);
591 if (ctrl & ONENAND_CTRL_LOCK)
592 printk(KERN_ERR "%s: it's locked error.\n", __func__);
593 return -EIO;
596 return 0;
600 * onenand_interrupt - [DEFAULT] onenand interrupt handler
601 * @param irq onenand interrupt number
602 * @param dev_id interrupt data
604 * complete the work
606 static irqreturn_t onenand_interrupt(int irq, void *data)
608 struct onenand_chip *this = data;
610 /* To handle shared interrupt */
611 if (!this->complete.done)
612 complete(&this->complete);
614 return IRQ_HANDLED;
618 * onenand_interrupt_wait - [DEFAULT] wait until the command is done
619 * @param mtd MTD device structure
620 * @param state state to select the max. timeout value
622 * Wait for command done.
624 static int onenand_interrupt_wait(struct mtd_info *mtd, int state)
626 struct onenand_chip *this = mtd->priv;
628 wait_for_completion(&this->complete);
630 return onenand_wait(mtd, state);
634 * onenand_try_interrupt_wait - [DEFAULT] try interrupt wait
635 * @param mtd MTD device structure
636 * @param state state to select the max. timeout value
638 * Try interrupt based wait (It is used one-time)
640 static int onenand_try_interrupt_wait(struct mtd_info *mtd, int state)
642 struct onenand_chip *this = mtd->priv;
643 unsigned long remain, timeout;
645 /* We use interrupt wait first */
646 this->wait = onenand_interrupt_wait;
648 timeout = msecs_to_jiffies(100);
649 remain = wait_for_completion_timeout(&this->complete, timeout);
650 if (!remain) {
651 printk(KERN_INFO "OneNAND: There's no interrupt. "
652 "We use the normal wait\n");
654 /* Release the irq */
655 free_irq(this->irq, this);
657 this->wait = onenand_wait;
660 return onenand_wait(mtd, state);
664 * onenand_setup_wait - [OneNAND Interface] setup onenand wait method
665 * @param mtd MTD device structure
667 * There's two method to wait onenand work
668 * 1. polling - read interrupt status register
669 * 2. interrupt - use the kernel interrupt method
671 static void onenand_setup_wait(struct mtd_info *mtd)
673 struct onenand_chip *this = mtd->priv;
674 int syscfg;
676 init_completion(&this->complete);
678 if (this->irq <= 0) {
679 this->wait = onenand_wait;
680 return;
683 if (request_irq(this->irq, &onenand_interrupt,
684 IRQF_SHARED, "onenand", this)) {
685 /* If we can't get irq, use the normal wait */
686 this->wait = onenand_wait;
687 return;
690 /* Enable interrupt */
691 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
692 syscfg |= ONENAND_SYS_CFG1_IOBE;
693 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
695 this->wait = onenand_try_interrupt_wait;
699 * onenand_bufferram_offset - [DEFAULT] BufferRAM offset
700 * @param mtd MTD data structure
701 * @param area BufferRAM area
702 * @return offset given area
704 * Return BufferRAM offset given area
706 static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area)
708 struct onenand_chip *this = mtd->priv;
710 if (ONENAND_CURRENT_BUFFERRAM(this)) {
711 /* Note: the 'this->writesize' is a real page size */
712 if (area == ONENAND_DATARAM)
713 return this->writesize;
714 if (area == ONENAND_SPARERAM)
715 return mtd->oobsize;
718 return 0;
722 * onenand_read_bufferram - [OneNAND Interface] Read the bufferram area
723 * @param mtd MTD data structure
724 * @param area BufferRAM area
725 * @param buffer the databuffer to put/get data
726 * @param offset offset to read from or write to
727 * @param count number of bytes to read/write
729 * Read the BufferRAM area
731 static int onenand_read_bufferram(struct mtd_info *mtd, int area,
732 unsigned char *buffer, int offset, size_t count)
734 struct onenand_chip *this = mtd->priv;
735 void __iomem *bufferram;
737 bufferram = this->base + area;
739 bufferram += onenand_bufferram_offset(mtd, area);
741 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
742 unsigned short word;
744 /* Align with word(16-bit) size */
745 count--;
747 /* Read word and save byte */
748 word = this->read_word(bufferram + offset + count);
749 buffer[count] = (word & 0xff);
752 memcpy(buffer, bufferram + offset, count);
754 return 0;
758 * onenand_sync_read_bufferram - [OneNAND Interface] Read the bufferram area with Sync. Burst mode
759 * @param mtd MTD data structure
760 * @param area BufferRAM area
761 * @param buffer the databuffer to put/get data
762 * @param offset offset to read from or write to
763 * @param count number of bytes to read/write
765 * Read the BufferRAM area with Sync. Burst Mode
767 static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area,
768 unsigned char *buffer, int offset, size_t count)
770 struct onenand_chip *this = mtd->priv;
771 void __iomem *bufferram;
773 bufferram = this->base + area;
775 bufferram += onenand_bufferram_offset(mtd, area);
777 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
779 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
780 unsigned short word;
782 /* Align with word(16-bit) size */
783 count--;
785 /* Read word and save byte */
786 word = this->read_word(bufferram + offset + count);
787 buffer[count] = (word & 0xff);
790 memcpy(buffer, bufferram + offset, count);
792 this->mmcontrol(mtd, 0);
794 return 0;
798 * onenand_write_bufferram - [OneNAND Interface] Write the bufferram area
799 * @param mtd MTD data structure
800 * @param area BufferRAM area
801 * @param buffer the databuffer to put/get data
802 * @param offset offset to read from or write to
803 * @param count number of bytes to read/write
805 * Write the BufferRAM area
807 static int onenand_write_bufferram(struct mtd_info *mtd, int area,
808 const unsigned char *buffer, int offset, size_t count)
810 struct onenand_chip *this = mtd->priv;
811 void __iomem *bufferram;
813 bufferram = this->base + area;
815 bufferram += onenand_bufferram_offset(mtd, area);
817 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
818 unsigned short word;
819 int byte_offset;
821 /* Align with word(16-bit) size */
822 count--;
824 /* Calculate byte access offset */
825 byte_offset = offset + count;
827 /* Read word and save byte */
828 word = this->read_word(bufferram + byte_offset);
829 word = (word & ~0xff) | buffer[count];
830 this->write_word(word, bufferram + byte_offset);
833 memcpy(bufferram + offset, buffer, count);
835 return 0;
839 * onenand_get_2x_blockpage - [GENERIC] Get blockpage at 2x program mode
840 * @param mtd MTD data structure
841 * @param addr address to check
842 * @return blockpage address
844 * Get blockpage address at 2x program mode
846 static int onenand_get_2x_blockpage(struct mtd_info *mtd, loff_t addr)
848 struct onenand_chip *this = mtd->priv;
849 int blockpage, block, page;
851 /* Calculate the even block number */
852 block = (int) (addr >> this->erase_shift) & ~1;
853 /* Is it the odd plane? */
854 if (addr & this->writesize)
855 block++;
856 page = (int) (addr >> (this->page_shift + 1)) & this->page_mask;
857 blockpage = (block << 7) | page;
859 return blockpage;
863 * onenand_check_bufferram - [GENERIC] Check BufferRAM information
864 * @param mtd MTD data structure
865 * @param addr address to check
866 * @return 1 if there are valid data, otherwise 0
868 * Check bufferram if there is data we required
870 static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
872 struct onenand_chip *this = mtd->priv;
873 int blockpage, found = 0;
874 unsigned int i;
876 if (ONENAND_IS_2PLANE(this))
877 blockpage = onenand_get_2x_blockpage(mtd, addr);
878 else
879 blockpage = (int) (addr >> this->page_shift);
881 /* Is there valid data? */
882 i = ONENAND_CURRENT_BUFFERRAM(this);
883 if (this->bufferram[i].blockpage == blockpage)
884 found = 1;
885 else {
886 /* Check another BufferRAM */
887 i = ONENAND_NEXT_BUFFERRAM(this);
888 if (this->bufferram[i].blockpage == blockpage) {
889 ONENAND_SET_NEXT_BUFFERRAM(this);
890 found = 1;
894 if (found && ONENAND_IS_DDP(this)) {
895 /* Select DataRAM for DDP */
896 int block = onenand_block(this, addr);
897 int value = onenand_bufferram_address(this, block);
898 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
901 return found;
905 * onenand_update_bufferram - [GENERIC] Update BufferRAM information
906 * @param mtd MTD data structure
907 * @param addr address to update
908 * @param valid valid flag
910 * Update BufferRAM information
912 static void onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
913 int valid)
915 struct onenand_chip *this = mtd->priv;
916 int blockpage;
917 unsigned int i;
919 if (ONENAND_IS_2PLANE(this))
920 blockpage = onenand_get_2x_blockpage(mtd, addr);
921 else
922 blockpage = (int) (addr >> this->page_shift);
924 /* Invalidate another BufferRAM */
925 i = ONENAND_NEXT_BUFFERRAM(this);
926 if (this->bufferram[i].blockpage == blockpage)
927 this->bufferram[i].blockpage = -1;
929 /* Update BufferRAM */
930 i = ONENAND_CURRENT_BUFFERRAM(this);
931 if (valid)
932 this->bufferram[i].blockpage = blockpage;
933 else
934 this->bufferram[i].blockpage = -1;
938 * onenand_invalidate_bufferram - [GENERIC] Invalidate BufferRAM information
939 * @param mtd MTD data structure
940 * @param addr start address to invalidate
941 * @param len length to invalidate
943 * Invalidate BufferRAM information
945 static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr,
946 unsigned int len)
948 struct onenand_chip *this = mtd->priv;
949 int i;
950 loff_t end_addr = addr + len;
952 /* Invalidate BufferRAM */
953 for (i = 0; i < MAX_BUFFERRAM; i++) {
954 loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift;
955 if (buf_addr >= addr && buf_addr < end_addr)
956 this->bufferram[i].blockpage = -1;
961 * onenand_get_device - [GENERIC] Get chip for selected access
962 * @param mtd MTD device structure
963 * @param new_state the state which is requested
965 * Get the device and lock it for exclusive access
967 static int onenand_get_device(struct mtd_info *mtd, int new_state)
969 struct onenand_chip *this = mtd->priv;
970 DECLARE_WAITQUEUE(wait, current);
973 * Grab the lock and see if the device is available
975 while (1) {
976 spin_lock(&this->chip_lock);
977 if (this->state == FL_READY) {
978 this->state = new_state;
979 spin_unlock(&this->chip_lock);
980 if (new_state != FL_PM_SUSPENDED && this->enable)
981 this->enable(mtd);
982 break;
984 if (new_state == FL_PM_SUSPENDED) {
985 spin_unlock(&this->chip_lock);
986 return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
988 set_current_state(TASK_UNINTERRUPTIBLE);
989 add_wait_queue(&this->wq, &wait);
990 spin_unlock(&this->chip_lock);
991 schedule();
992 remove_wait_queue(&this->wq, &wait);
995 return 0;
999 * onenand_release_device - [GENERIC] release chip
1000 * @param mtd MTD device structure
1002 * Deselect, release chip lock and wake up anyone waiting on the device
1004 static void onenand_release_device(struct mtd_info *mtd)
1006 struct onenand_chip *this = mtd->priv;
1008 if (this->state != FL_PM_SUSPENDED && this->disable)
1009 this->disable(mtd);
1010 /* Release the chip */
1011 spin_lock(&this->chip_lock);
1012 this->state = FL_READY;
1013 wake_up(&this->wq);
1014 spin_unlock(&this->chip_lock);
1018 * onenand_transfer_auto_oob - [INTERN] oob auto-placement transfer
1019 * @param mtd MTD device structure
1020 * @param buf destination address
1021 * @param column oob offset to read from
1022 * @param thislen oob length to read
1024 static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int column,
1025 int thislen)
1027 struct onenand_chip *this = mtd->priv;
1028 struct nand_oobfree *free;
1029 int readcol = column;
1030 int readend = column + thislen;
1031 int lastgap = 0;
1032 unsigned int i;
1033 uint8_t *oob_buf = this->oob_buf;
1035 free = this->ecclayout->oobfree;
1036 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1037 if (readcol >= lastgap)
1038 readcol += free->offset - lastgap;
1039 if (readend >= lastgap)
1040 readend += free->offset - lastgap;
1041 lastgap = free->offset + free->length;
1043 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1044 free = this->ecclayout->oobfree;
1045 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1046 int free_end = free->offset + free->length;
1047 if (free->offset < readend && free_end > readcol) {
1048 int st = max_t(int,free->offset,readcol);
1049 int ed = min_t(int,free_end,readend);
1050 int n = ed - st;
1051 memcpy(buf, oob_buf + st, n);
1052 buf += n;
1053 } else if (column == 0)
1054 break;
1056 return 0;
1060 * onenand_recover_lsb - [Flex-OneNAND] Recover LSB page data
1061 * @param mtd MTD device structure
1062 * @param addr address to recover
1063 * @param status return value from onenand_wait / onenand_bbt_wait
1065 * MLC NAND Flash cell has paired pages - LSB page and MSB page. LSB page has
1066 * lower page address and MSB page has higher page address in paired pages.
1067 * If power off occurs during MSB page program, the paired LSB page data can
1068 * become corrupt. LSB page recovery read is a way to read LSB page though page
1069 * data are corrupted. When uncorrectable error occurs as a result of LSB page
1070 * read after power up, issue LSB page recovery read.
1072 static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status)
1074 struct onenand_chip *this = mtd->priv;
1075 int i;
1077 /* Recovery is only for Flex-OneNAND */
1078 if (!FLEXONENAND(this))
1079 return status;
1081 /* check if we failed due to uncorrectable error */
1082 if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR)
1083 return status;
1085 /* check if address lies in MLC region */
1086 i = flexonenand_region(mtd, addr);
1087 if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift))
1088 return status;
1090 /* We are attempting to reread, so decrement stats.failed
1091 * which was incremented by onenand_wait due to read failure
1093 printk(KERN_INFO "%s: Attempting to recover from uncorrectable read\n",
1094 __func__);
1095 mtd->ecc_stats.failed--;
1097 /* Issue the LSB page recovery command */
1098 this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize);
1099 return this->wait(mtd, FL_READING);
1103 * onenand_mlc_read_ops_nolock - MLC OneNAND read main and/or out-of-band
1104 * @param mtd MTD device structure
1105 * @param from offset to read from
1106 * @param ops: oob operation description structure
1108 * MLC OneNAND / Flex-OneNAND has 4KB page size and 4KB dataram.
1109 * So, read-while-load is not present.
1111 static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1112 struct mtd_oob_ops *ops)
1114 struct onenand_chip *this = mtd->priv;
1115 struct mtd_ecc_stats stats;
1116 size_t len = ops->len;
1117 size_t ooblen = ops->ooblen;
1118 u_char *buf = ops->datbuf;
1119 u_char *oobbuf = ops->oobbuf;
1120 int read = 0, column, thislen;
1121 int oobread = 0, oobcolumn, thisooblen, oobsize;
1122 int ret = 0;
1123 int writesize = this->writesize;
1125 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1126 (int)len);
1128 if (ops->mode == MTD_OPS_AUTO_OOB)
1129 oobsize = this->ecclayout->oobavail;
1130 else
1131 oobsize = mtd->oobsize;
1133 oobcolumn = from & (mtd->oobsize - 1);
1135 /* Do not allow reads past end of device */
1136 if (from + len > mtd->size) {
1137 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1138 __func__);
1139 ops->retlen = 0;
1140 ops->oobretlen = 0;
1141 return -EINVAL;
1144 stats = mtd->ecc_stats;
1146 while (read < len) {
1147 cond_resched();
1149 thislen = min_t(int, writesize, len - read);
1151 column = from & (writesize - 1);
1152 if (column + thislen > writesize)
1153 thislen = writesize - column;
1155 if (!onenand_check_bufferram(mtd, from)) {
1156 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1158 ret = this->wait(mtd, FL_READING);
1159 if (unlikely(ret))
1160 ret = onenand_recover_lsb(mtd, from, ret);
1161 onenand_update_bufferram(mtd, from, !ret);
1162 if (mtd_is_eccerr(ret))
1163 ret = 0;
1164 if (ret)
1165 break;
1168 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1169 if (oobbuf) {
1170 thisooblen = oobsize - oobcolumn;
1171 thisooblen = min_t(int, thisooblen, ooblen - oobread);
1173 if (ops->mode == MTD_OPS_AUTO_OOB)
1174 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1175 else
1176 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1177 oobread += thisooblen;
1178 oobbuf += thisooblen;
1179 oobcolumn = 0;
1182 read += thislen;
1183 if (read == len)
1184 break;
1186 from += thislen;
1187 buf += thislen;
1191 * Return success, if no ECC failures, else -EBADMSG
1192 * fs driver will take care of that, because
1193 * retlen == desired len and result == -EBADMSG
1195 ops->retlen = read;
1196 ops->oobretlen = oobread;
1198 if (ret)
1199 return ret;
1201 if (mtd->ecc_stats.failed - stats.failed)
1202 return -EBADMSG;
1204 /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1205 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1209 * onenand_read_ops_nolock - [OneNAND Interface] OneNAND read main and/or out-of-band
1210 * @param mtd MTD device structure
1211 * @param from offset to read from
1212 * @param ops: oob operation description structure
1214 * OneNAND read main and/or out-of-band data
1216 static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1217 struct mtd_oob_ops *ops)
1219 struct onenand_chip *this = mtd->priv;
1220 struct mtd_ecc_stats stats;
1221 size_t len = ops->len;
1222 size_t ooblen = ops->ooblen;
1223 u_char *buf = ops->datbuf;
1224 u_char *oobbuf = ops->oobbuf;
1225 int read = 0, column, thislen;
1226 int oobread = 0, oobcolumn, thisooblen, oobsize;
1227 int ret = 0, boundary = 0;
1228 int writesize = this->writesize;
1230 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1231 (int)len);
1233 if (ops->mode == MTD_OPS_AUTO_OOB)
1234 oobsize = this->ecclayout->oobavail;
1235 else
1236 oobsize = mtd->oobsize;
1238 oobcolumn = from & (mtd->oobsize - 1);
1240 /* Do not allow reads past end of device */
1241 if ((from + len) > mtd->size) {
1242 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1243 __func__);
1244 ops->retlen = 0;
1245 ops->oobretlen = 0;
1246 return -EINVAL;
1249 stats = mtd->ecc_stats;
1251 /* Read-while-load method */
1253 /* Do first load to bufferRAM */
1254 if (read < len) {
1255 if (!onenand_check_bufferram(mtd, from)) {
1256 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1257 ret = this->wait(mtd, FL_READING);
1258 onenand_update_bufferram(mtd, from, !ret);
1259 if (mtd_is_eccerr(ret))
1260 ret = 0;
1264 thislen = min_t(int, writesize, len - read);
1265 column = from & (writesize - 1);
1266 if (column + thislen > writesize)
1267 thislen = writesize - column;
1269 while (!ret) {
1270 /* If there is more to load then start next load */
1271 from += thislen;
1272 if (read + thislen < len) {
1273 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1275 * Chip boundary handling in DDP
1276 * Now we issued chip 1 read and pointed chip 1
1277 * bufferram so we have to point chip 0 bufferram.
1279 if (ONENAND_IS_DDP(this) &&
1280 unlikely(from == (this->chipsize >> 1))) {
1281 this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2);
1282 boundary = 1;
1283 } else
1284 boundary = 0;
1285 ONENAND_SET_PREV_BUFFERRAM(this);
1287 /* While load is going, read from last bufferRAM */
1288 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1290 /* Read oob area if needed */
1291 if (oobbuf) {
1292 thisooblen = oobsize - oobcolumn;
1293 thisooblen = min_t(int, thisooblen, ooblen - oobread);
1295 if (ops->mode == MTD_OPS_AUTO_OOB)
1296 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1297 else
1298 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1299 oobread += thisooblen;
1300 oobbuf += thisooblen;
1301 oobcolumn = 0;
1304 /* See if we are done */
1305 read += thislen;
1306 if (read == len)
1307 break;
1308 /* Set up for next read from bufferRAM */
1309 if (unlikely(boundary))
1310 this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2);
1311 ONENAND_SET_NEXT_BUFFERRAM(this);
1312 buf += thislen;
1313 thislen = min_t(int, writesize, len - read);
1314 column = 0;
1315 cond_resched();
1316 /* Now wait for load */
1317 ret = this->wait(mtd, FL_READING);
1318 onenand_update_bufferram(mtd, from, !ret);
1319 if (mtd_is_eccerr(ret))
1320 ret = 0;
1324 * Return success, if no ECC failures, else -EBADMSG
1325 * fs driver will take care of that, because
1326 * retlen == desired len and result == -EBADMSG
1328 ops->retlen = read;
1329 ops->oobretlen = oobread;
1331 if (ret)
1332 return ret;
1334 if (mtd->ecc_stats.failed - stats.failed)
1335 return -EBADMSG;
1337 /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1338 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1342 * onenand_read_oob_nolock - [MTD Interface] OneNAND read out-of-band
1343 * @param mtd MTD device structure
1344 * @param from offset to read from
1345 * @param ops: oob operation description structure
1347 * OneNAND read out-of-band data from the spare area
1349 static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
1350 struct mtd_oob_ops *ops)
1352 struct onenand_chip *this = mtd->priv;
1353 struct mtd_ecc_stats stats;
1354 int read = 0, thislen, column, oobsize;
1355 size_t len = ops->ooblen;
1356 unsigned int mode = ops->mode;
1357 u_char *buf = ops->oobbuf;
1358 int ret = 0, readcmd;
1360 from += ops->ooboffs;
1362 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1363 (int)len);
1365 /* Initialize return length value */
1366 ops->oobretlen = 0;
1368 if (mode == MTD_OPS_AUTO_OOB)
1369 oobsize = this->ecclayout->oobavail;
1370 else
1371 oobsize = mtd->oobsize;
1373 column = from & (mtd->oobsize - 1);
1375 if (unlikely(column >= oobsize)) {
1376 printk(KERN_ERR "%s: Attempted to start read outside oob\n",
1377 __func__);
1378 return -EINVAL;
1381 /* Do not allow reads past end of device */
1382 if (unlikely(from >= mtd->size ||
1383 column + len > ((mtd->size >> this->page_shift) -
1384 (from >> this->page_shift)) * oobsize)) {
1385 printk(KERN_ERR "%s: Attempted to read beyond end of device\n",
1386 __func__);
1387 return -EINVAL;
1390 stats = mtd->ecc_stats;
1392 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1394 while (read < len) {
1395 cond_resched();
1397 thislen = oobsize - column;
1398 thislen = min_t(int, thislen, len);
1400 this->command(mtd, readcmd, from, mtd->oobsize);
1402 onenand_update_bufferram(mtd, from, 0);
1404 ret = this->wait(mtd, FL_READING);
1405 if (unlikely(ret))
1406 ret = onenand_recover_lsb(mtd, from, ret);
1408 if (ret && !mtd_is_eccerr(ret)) {
1409 printk(KERN_ERR "%s: read failed = 0x%x\n",
1410 __func__, ret);
1411 break;
1414 if (mode == MTD_OPS_AUTO_OOB)
1415 onenand_transfer_auto_oob(mtd, buf, column, thislen);
1416 else
1417 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1419 read += thislen;
1421 if (read == len)
1422 break;
1424 buf += thislen;
1426 /* Read more? */
1427 if (read < len) {
1428 /* Page size */
1429 from += mtd->writesize;
1430 column = 0;
1434 ops->oobretlen = read;
1436 if (ret)
1437 return ret;
1439 if (mtd->ecc_stats.failed - stats.failed)
1440 return -EBADMSG;
1442 return 0;
1446 * onenand_read - [MTD Interface] Read data from flash
1447 * @param mtd MTD device structure
1448 * @param from offset to read from
1449 * @param len number of bytes to read
1450 * @param retlen pointer to variable to store the number of read bytes
1451 * @param buf the databuffer to put data
1453 * Read with ecc
1455 static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len,
1456 size_t *retlen, u_char *buf)
1458 struct onenand_chip *this = mtd->priv;
1459 struct mtd_oob_ops ops = {
1460 .len = len,
1461 .ooblen = 0,
1462 .datbuf = buf,
1463 .oobbuf = NULL,
1465 int ret;
1467 onenand_get_device(mtd, FL_READING);
1468 ret = ONENAND_IS_4KB_PAGE(this) ?
1469 onenand_mlc_read_ops_nolock(mtd, from, &ops) :
1470 onenand_read_ops_nolock(mtd, from, &ops);
1471 onenand_release_device(mtd);
1473 *retlen = ops.retlen;
1474 return ret;
1478 * onenand_read_oob - [MTD Interface] Read main and/or out-of-band
1479 * @param mtd: MTD device structure
1480 * @param from: offset to read from
1481 * @param ops: oob operation description structure
1483 * Read main and/or out-of-band
1485 static int onenand_read_oob(struct mtd_info *mtd, loff_t from,
1486 struct mtd_oob_ops *ops)
1488 struct onenand_chip *this = mtd->priv;
1489 int ret;
1491 switch (ops->mode) {
1492 case MTD_OPS_PLACE_OOB:
1493 case MTD_OPS_AUTO_OOB:
1494 break;
1495 case MTD_OPS_RAW:
1496 /* Not implemented yet */
1497 default:
1498 return -EINVAL;
1501 onenand_get_device(mtd, FL_READING);
1502 if (ops->datbuf)
1503 ret = ONENAND_IS_4KB_PAGE(this) ?
1504 onenand_mlc_read_ops_nolock(mtd, from, ops) :
1505 onenand_read_ops_nolock(mtd, from, ops);
1506 else
1507 ret = onenand_read_oob_nolock(mtd, from, ops);
1508 onenand_release_device(mtd);
1510 return ret;
1514 * onenand_bbt_wait - [DEFAULT] wait until the command is done
1515 * @param mtd MTD device structure
1516 * @param state state to select the max. timeout value
1518 * Wait for command done.
1520 static int onenand_bbt_wait(struct mtd_info *mtd, int state)
1522 struct onenand_chip *this = mtd->priv;
1523 unsigned long timeout;
1524 unsigned int interrupt, ctrl, ecc, addr1, addr8;
1526 /* The 20 msec is enough */
1527 timeout = jiffies + msecs_to_jiffies(20);
1528 while (time_before(jiffies, timeout)) {
1529 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1530 if (interrupt & ONENAND_INT_MASTER)
1531 break;
1533 /* To get correct interrupt status in timeout case */
1534 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1535 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
1536 addr1 = this->read_word(this->base + ONENAND_REG_START_ADDRESS1);
1537 addr8 = this->read_word(this->base + ONENAND_REG_START_ADDRESS8);
1539 if (interrupt & ONENAND_INT_READ) {
1540 ecc = onenand_read_ecc(this);
1541 if (ecc & ONENAND_ECC_2BIT_ALL) {
1542 printk(KERN_DEBUG "%s: ecc 0x%04x ctrl 0x%04x "
1543 "intr 0x%04x addr1 %#x addr8 %#x\n",
1544 __func__, ecc, ctrl, interrupt, addr1, addr8);
1545 return ONENAND_BBT_READ_ECC_ERROR;
1547 } else {
1548 printk(KERN_ERR "%s: read timeout! ctrl 0x%04x "
1549 "intr 0x%04x addr1 %#x addr8 %#x\n",
1550 __func__, ctrl, interrupt, addr1, addr8);
1551 return ONENAND_BBT_READ_FATAL_ERROR;
1554 /* Initial bad block case: 0x2400 or 0x0400 */
1555 if (ctrl & ONENAND_CTRL_ERROR) {
1556 printk(KERN_DEBUG "%s: ctrl 0x%04x intr 0x%04x addr1 %#x "
1557 "addr8 %#x\n", __func__, ctrl, interrupt, addr1, addr8);
1558 return ONENAND_BBT_READ_ERROR;
1561 return 0;
1565 * onenand_bbt_read_oob - [MTD Interface] OneNAND read out-of-band for bbt scan
1566 * @param mtd MTD device structure
1567 * @param from offset to read from
1568 * @param ops oob operation description structure
1570 * OneNAND read out-of-band data from the spare area for bbt scan
1572 int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
1573 struct mtd_oob_ops *ops)
1575 struct onenand_chip *this = mtd->priv;
1576 int read = 0, thislen, column;
1577 int ret = 0, readcmd;
1578 size_t len = ops->ooblen;
1579 u_char *buf = ops->oobbuf;
1581 pr_debug("%s: from = 0x%08x, len = %zi\n", __func__, (unsigned int)from,
1582 len);
1584 /* Initialize return value */
1585 ops->oobretlen = 0;
1587 /* Do not allow reads past end of device */
1588 if (unlikely((from + len) > mtd->size)) {
1589 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1590 __func__);
1591 return ONENAND_BBT_READ_FATAL_ERROR;
1594 /* Grab the lock and see if the device is available */
1595 onenand_get_device(mtd, FL_READING);
1597 column = from & (mtd->oobsize - 1);
1599 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1601 while (read < len) {
1602 cond_resched();
1604 thislen = mtd->oobsize - column;
1605 thislen = min_t(int, thislen, len);
1607 this->command(mtd, readcmd, from, mtd->oobsize);
1609 onenand_update_bufferram(mtd, from, 0);
1611 ret = this->bbt_wait(mtd, FL_READING);
1612 if (unlikely(ret))
1613 ret = onenand_recover_lsb(mtd, from, ret);
1615 if (ret)
1616 break;
1618 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1619 read += thislen;
1620 if (read == len)
1621 break;
1623 buf += thislen;
1625 /* Read more? */
1626 if (read < len) {
1627 /* Update Page size */
1628 from += this->writesize;
1629 column = 0;
1633 /* Deselect and wake up anyone waiting on the device */
1634 onenand_release_device(mtd);
1636 ops->oobretlen = read;
1637 return ret;
1640 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
1642 * onenand_verify_oob - [GENERIC] verify the oob contents after a write
1643 * @param mtd MTD device structure
1644 * @param buf the databuffer to verify
1645 * @param to offset to read from
1647 static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to)
1649 struct onenand_chip *this = mtd->priv;
1650 u_char *oob_buf = this->oob_buf;
1651 int status, i, readcmd;
1653 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1655 this->command(mtd, readcmd, to, mtd->oobsize);
1656 onenand_update_bufferram(mtd, to, 0);
1657 status = this->wait(mtd, FL_READING);
1658 if (status)
1659 return status;
1661 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1662 for (i = 0; i < mtd->oobsize; i++)
1663 if (buf[i] != 0xFF && buf[i] != oob_buf[i])
1664 return -EBADMSG;
1666 return 0;
1670 * onenand_verify - [GENERIC] verify the chip contents after a write
1671 * @param mtd MTD device structure
1672 * @param buf the databuffer to verify
1673 * @param addr offset to read from
1674 * @param len number of bytes to read and compare
1676 static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr, size_t len)
1678 struct onenand_chip *this = mtd->priv;
1679 int ret = 0;
1680 int thislen, column;
1682 column = addr & (this->writesize - 1);
1684 while (len != 0) {
1685 thislen = min_t(int, this->writesize - column, len);
1687 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize);
1689 onenand_update_bufferram(mtd, addr, 0);
1691 ret = this->wait(mtd, FL_READING);
1692 if (ret)
1693 return ret;
1695 onenand_update_bufferram(mtd, addr, 1);
1697 this->read_bufferram(mtd, ONENAND_DATARAM, this->verify_buf, 0, mtd->writesize);
1699 if (memcmp(buf, this->verify_buf + column, thislen))
1700 return -EBADMSG;
1702 len -= thislen;
1703 buf += thislen;
1704 addr += thislen;
1705 column = 0;
1708 return 0;
1710 #else
1711 #define onenand_verify(...) (0)
1712 #define onenand_verify_oob(...) (0)
1713 #endif
1715 #define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
1717 static void onenand_panic_wait(struct mtd_info *mtd)
1719 struct onenand_chip *this = mtd->priv;
1720 unsigned int interrupt;
1721 int i;
1723 for (i = 0; i < 2000; i++) {
1724 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1725 if (interrupt & ONENAND_INT_MASTER)
1726 break;
1727 udelay(10);
1732 * onenand_panic_write - [MTD Interface] write buffer to FLASH in a panic context
1733 * @param mtd MTD device structure
1734 * @param to offset to write to
1735 * @param len number of bytes to write
1736 * @param retlen pointer to variable to store the number of written bytes
1737 * @param buf the data to write
1739 * Write with ECC
1741 static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
1742 size_t *retlen, const u_char *buf)
1744 struct onenand_chip *this = mtd->priv;
1745 int column, subpage;
1746 int written = 0;
1747 int ret = 0;
1749 if (this->state == FL_PM_SUSPENDED)
1750 return -EBUSY;
1752 /* Wait for any existing operation to clear */
1753 onenand_panic_wait(mtd);
1755 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1756 (int)len);
1758 /* Reject writes, which are not page aligned */
1759 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1760 printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1761 __func__);
1762 return -EINVAL;
1765 column = to & (mtd->writesize - 1);
1767 /* Loop until all data write */
1768 while (written < len) {
1769 int thislen = min_t(int, mtd->writesize - column, len - written);
1770 u_char *wbuf = (u_char *) buf;
1772 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1774 /* Partial page write */
1775 subpage = thislen < mtd->writesize;
1776 if (subpage) {
1777 memset(this->page_buf, 0xff, mtd->writesize);
1778 memcpy(this->page_buf + column, buf, thislen);
1779 wbuf = this->page_buf;
1782 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1783 this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize);
1785 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);
1787 onenand_panic_wait(mtd);
1789 /* In partial page write we don't update bufferram */
1790 onenand_update_bufferram(mtd, to, !ret && !subpage);
1791 if (ONENAND_IS_2PLANE(this)) {
1792 ONENAND_SET_BUFFERRAM1(this);
1793 onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage);
1796 if (ret) {
1797 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
1798 break;
1801 written += thislen;
1803 if (written == len)
1804 break;
1806 column = 0;
1807 to += thislen;
1808 buf += thislen;
1811 *retlen = written;
1812 return ret;
1816 * onenand_fill_auto_oob - [INTERN] oob auto-placement transfer
1817 * @param mtd MTD device structure
1818 * @param oob_buf oob buffer
1819 * @param buf source address
1820 * @param column oob offset to write to
1821 * @param thislen oob length to write
1823 static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
1824 const u_char *buf, int column, int thislen)
1826 struct onenand_chip *this = mtd->priv;
1827 struct nand_oobfree *free;
1828 int writecol = column;
1829 int writeend = column + thislen;
1830 int lastgap = 0;
1831 unsigned int i;
1833 free = this->ecclayout->oobfree;
1834 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1835 if (writecol >= lastgap)
1836 writecol += free->offset - lastgap;
1837 if (writeend >= lastgap)
1838 writeend += free->offset - lastgap;
1839 lastgap = free->offset + free->length;
1841 free = this->ecclayout->oobfree;
1842 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1843 int free_end = free->offset + free->length;
1844 if (free->offset < writeend && free_end > writecol) {
1845 int st = max_t(int,free->offset,writecol);
1846 int ed = min_t(int,free_end,writeend);
1847 int n = ed - st;
1848 memcpy(oob_buf + st, buf, n);
1849 buf += n;
1850 } else if (column == 0)
1851 break;
1853 return 0;
1857 * onenand_write_ops_nolock - [OneNAND Interface] write main and/or out-of-band
1858 * @param mtd MTD device structure
1859 * @param to offset to write to
1860 * @param ops oob operation description structure
1862 * Write main and/or oob with ECC
1864 static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
1865 struct mtd_oob_ops *ops)
1867 struct onenand_chip *this = mtd->priv;
1868 int written = 0, column, thislen = 0, subpage = 0;
1869 int prev = 0, prevlen = 0, prev_subpage = 0, first = 1;
1870 int oobwritten = 0, oobcolumn, thisooblen, oobsize;
1871 size_t len = ops->len;
1872 size_t ooblen = ops->ooblen;
1873 const u_char *buf = ops->datbuf;
1874 const u_char *oob = ops->oobbuf;
1875 u_char *oobbuf;
1876 int ret = 0, cmd;
1878 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1879 (int)len);
1881 /* Initialize retlen, in case of early exit */
1882 ops->retlen = 0;
1883 ops->oobretlen = 0;
1885 /* Reject writes, which are not page aligned */
1886 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1887 printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1888 __func__);
1889 return -EINVAL;
1892 /* Check zero length */
1893 if (!len)
1894 return 0;
1896 if (ops->mode == MTD_OPS_AUTO_OOB)
1897 oobsize = this->ecclayout->oobavail;
1898 else
1899 oobsize = mtd->oobsize;
1901 oobcolumn = to & (mtd->oobsize - 1);
1903 column = to & (mtd->writesize - 1);
1905 /* Loop until all data write */
1906 while (1) {
1907 if (written < len) {
1908 u_char *wbuf = (u_char *) buf;
1910 thislen = min_t(int, mtd->writesize - column, len - written);
1911 thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten);
1913 cond_resched();
1915 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1917 /* Partial page write */
1918 subpage = thislen < mtd->writesize;
1919 if (subpage) {
1920 memset(this->page_buf, 0xff, mtd->writesize);
1921 memcpy(this->page_buf + column, buf, thislen);
1922 wbuf = this->page_buf;
1925 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1927 if (oob) {
1928 oobbuf = this->oob_buf;
1930 /* We send data to spare ram with oobsize
1931 * to prevent byte access */
1932 memset(oobbuf, 0xff, mtd->oobsize);
1933 if (ops->mode == MTD_OPS_AUTO_OOB)
1934 onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
1935 else
1936 memcpy(oobbuf + oobcolumn, oob, thisooblen);
1938 oobwritten += thisooblen;
1939 oob += thisooblen;
1940 oobcolumn = 0;
1941 } else
1942 oobbuf = (u_char *) ffchars;
1944 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
1945 } else
1946 ONENAND_SET_NEXT_BUFFERRAM(this);
1949 * 2 PLANE, MLC, and Flex-OneNAND do not support
1950 * write-while-program feature.
1952 if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first) {
1953 ONENAND_SET_PREV_BUFFERRAM(this);
1955 ret = this->wait(mtd, FL_WRITING);
1957 /* In partial page write we don't update bufferram */
1958 onenand_update_bufferram(mtd, prev, !ret && !prev_subpage);
1959 if (ret) {
1960 written -= prevlen;
1961 printk(KERN_ERR "%s: write failed %d\n",
1962 __func__, ret);
1963 break;
1966 if (written == len) {
1967 /* Only check verify write turn on */
1968 ret = onenand_verify(mtd, buf - len, to - len, len);
1969 if (ret)
1970 printk(KERN_ERR "%s: verify failed %d\n",
1971 __func__, ret);
1972 break;
1975 ONENAND_SET_NEXT_BUFFERRAM(this);
1978 this->ongoing = 0;
1979 cmd = ONENAND_CMD_PROG;
1981 /* Exclude 1st OTP and OTP blocks for cache program feature */
1982 if (ONENAND_IS_CACHE_PROGRAM(this) &&
1983 likely(onenand_block(this, to) != 0) &&
1984 ONENAND_IS_4KB_PAGE(this) &&
1985 ((written + thislen) < len)) {
1986 cmd = ONENAND_CMD_2X_CACHE_PROG;
1987 this->ongoing = 1;
1990 this->command(mtd, cmd, to, mtd->writesize);
1993 * 2 PLANE, MLC, and Flex-OneNAND wait here
1995 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) {
1996 ret = this->wait(mtd, FL_WRITING);
1998 /* In partial page write we don't update bufferram */
1999 onenand_update_bufferram(mtd, to, !ret && !subpage);
2000 if (ret) {
2001 printk(KERN_ERR "%s: write failed %d\n",
2002 __func__, ret);
2003 break;
2006 /* Only check verify write turn on */
2007 ret = onenand_verify(mtd, buf, to, thislen);
2008 if (ret) {
2009 printk(KERN_ERR "%s: verify failed %d\n",
2010 __func__, ret);
2011 break;
2014 written += thislen;
2016 if (written == len)
2017 break;
2019 } else
2020 written += thislen;
2022 column = 0;
2023 prev_subpage = subpage;
2024 prev = to;
2025 prevlen = thislen;
2026 to += thislen;
2027 buf += thislen;
2028 first = 0;
2031 /* In error case, clear all bufferrams */
2032 if (written != len)
2033 onenand_invalidate_bufferram(mtd, 0, -1);
2035 ops->retlen = written;
2036 ops->oobretlen = oobwritten;
2038 return ret;
2043 * onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band
2044 * @param mtd MTD device structure
2045 * @param to offset to write to
2046 * @param len number of bytes to write
2047 * @param retlen pointer to variable to store the number of written bytes
2048 * @param buf the data to write
2049 * @param mode operation mode
2051 * OneNAND write out-of-band
2053 static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2054 struct mtd_oob_ops *ops)
2056 struct onenand_chip *this = mtd->priv;
2057 int column, ret = 0, oobsize;
2058 int written = 0, oobcmd;
2059 u_char *oobbuf;
2060 size_t len = ops->ooblen;
2061 const u_char *buf = ops->oobbuf;
2062 unsigned int mode = ops->mode;
2064 to += ops->ooboffs;
2066 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
2067 (int)len);
2069 /* Initialize retlen, in case of early exit */
2070 ops->oobretlen = 0;
2072 if (mode == MTD_OPS_AUTO_OOB)
2073 oobsize = this->ecclayout->oobavail;
2074 else
2075 oobsize = mtd->oobsize;
2077 column = to & (mtd->oobsize - 1);
2079 if (unlikely(column >= oobsize)) {
2080 printk(KERN_ERR "%s: Attempted to start write outside oob\n",
2081 __func__);
2082 return -EINVAL;
2085 /* For compatibility with NAND: Do not allow write past end of page */
2086 if (unlikely(column + len > oobsize)) {
2087 printk(KERN_ERR "%s: Attempt to write past end of page\n",
2088 __func__);
2089 return -EINVAL;
2092 /* Do not allow reads past end of device */
2093 if (unlikely(to >= mtd->size ||
2094 column + len > ((mtd->size >> this->page_shift) -
2095 (to >> this->page_shift)) * oobsize)) {
2096 printk(KERN_ERR "%s: Attempted to write past end of device\n",
2097 __func__);
2098 return -EINVAL;
2101 oobbuf = this->oob_buf;
2103 oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB;
2105 /* Loop until all data write */
2106 while (written < len) {
2107 int thislen = min_t(int, oobsize, len - written);
2109 cond_resched();
2111 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize);
2113 /* We send data to spare ram with oobsize
2114 * to prevent byte access */
2115 memset(oobbuf, 0xff, mtd->oobsize);
2116 if (mode == MTD_OPS_AUTO_OOB)
2117 onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
2118 else
2119 memcpy(oobbuf + column, buf, thislen);
2120 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
2122 if (ONENAND_IS_4KB_PAGE(this)) {
2123 /* Set main area of DataRAM to 0xff*/
2124 memset(this->page_buf, 0xff, mtd->writesize);
2125 this->write_bufferram(mtd, ONENAND_DATARAM,
2126 this->page_buf, 0, mtd->writesize);
2129 this->command(mtd, oobcmd, to, mtd->oobsize);
2131 onenand_update_bufferram(mtd, to, 0);
2132 if (ONENAND_IS_2PLANE(this)) {
2133 ONENAND_SET_BUFFERRAM1(this);
2134 onenand_update_bufferram(mtd, to + this->writesize, 0);
2137 ret = this->wait(mtd, FL_WRITING);
2138 if (ret) {
2139 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2140 break;
2143 ret = onenand_verify_oob(mtd, oobbuf, to);
2144 if (ret) {
2145 printk(KERN_ERR "%s: verify failed %d\n",
2146 __func__, ret);
2147 break;
2150 written += thislen;
2151 if (written == len)
2152 break;
2154 to += mtd->writesize;
2155 buf += thislen;
2156 column = 0;
2159 ops->oobretlen = written;
2161 return ret;
2165 * onenand_write - [MTD Interface] write buffer to FLASH
2166 * @param mtd MTD device structure
2167 * @param to offset to write to
2168 * @param len number of bytes to write
2169 * @param retlen pointer to variable to store the number of written bytes
2170 * @param buf the data to write
2172 * Write with ECC
2174 static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len,
2175 size_t *retlen, const u_char *buf)
2177 struct mtd_oob_ops ops = {
2178 .len = len,
2179 .ooblen = 0,
2180 .datbuf = (u_char *) buf,
2181 .oobbuf = NULL,
2183 int ret;
2185 onenand_get_device(mtd, FL_WRITING);
2186 ret = onenand_write_ops_nolock(mtd, to, &ops);
2187 onenand_release_device(mtd);
2189 *retlen = ops.retlen;
2190 return ret;
2194 * onenand_write_oob - [MTD Interface] NAND write data and/or out-of-band
2195 * @param mtd: MTD device structure
2196 * @param to: offset to write
2197 * @param ops: oob operation description structure
2199 static int onenand_write_oob(struct mtd_info *mtd, loff_t to,
2200 struct mtd_oob_ops *ops)
2202 int ret;
2204 switch (ops->mode) {
2205 case MTD_OPS_PLACE_OOB:
2206 case MTD_OPS_AUTO_OOB:
2207 break;
2208 case MTD_OPS_RAW:
2209 /* Not implemented yet */
2210 default:
2211 return -EINVAL;
2214 onenand_get_device(mtd, FL_WRITING);
2215 if (ops->datbuf)
2216 ret = onenand_write_ops_nolock(mtd, to, ops);
2217 else
2218 ret = onenand_write_oob_nolock(mtd, to, ops);
2219 onenand_release_device(mtd);
2221 return ret;
2225 * onenand_block_isbad_nolock - [GENERIC] Check if a block is marked bad
2226 * @param mtd MTD device structure
2227 * @param ofs offset from device start
2228 * @param allowbbt 1, if its allowed to access the bbt area
2230 * Check, if the block is bad. Either by reading the bad block table or
2231 * calling of the scan function.
2233 static int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allowbbt)
2235 struct onenand_chip *this = mtd->priv;
2236 struct bbm_info *bbm = this->bbm;
2238 /* Return info from the table */
2239 return bbm->isbad_bbt(mtd, ofs, allowbbt);
2243 static int onenand_multiblock_erase_verify(struct mtd_info *mtd,
2244 struct erase_info *instr)
2246 struct onenand_chip *this = mtd->priv;
2247 loff_t addr = instr->addr;
2248 int len = instr->len;
2249 unsigned int block_size = (1 << this->erase_shift);
2250 int ret = 0;
2252 while (len) {
2253 this->command(mtd, ONENAND_CMD_ERASE_VERIFY, addr, block_size);
2254 ret = this->wait(mtd, FL_VERIFYING_ERASE);
2255 if (ret) {
2256 printk(KERN_ERR "%s: Failed verify, block %d\n",
2257 __func__, onenand_block(this, addr));
2258 instr->state = MTD_ERASE_FAILED;
2259 instr->fail_addr = addr;
2260 return -1;
2262 len -= block_size;
2263 addr += block_size;
2265 return 0;
2269 * onenand_multiblock_erase - [INTERN] erase block(s) using multiblock erase
2270 * @param mtd MTD device structure
2271 * @param instr erase instruction
2272 * @param region erase region
2274 * Erase one or more blocks up to 64 block at a time
2276 static int onenand_multiblock_erase(struct mtd_info *mtd,
2277 struct erase_info *instr,
2278 unsigned int block_size)
2280 struct onenand_chip *this = mtd->priv;
2281 loff_t addr = instr->addr;
2282 int len = instr->len;
2283 int eb_count = 0;
2284 int ret = 0;
2285 int bdry_block = 0;
2287 instr->state = MTD_ERASING;
2289 if (ONENAND_IS_DDP(this)) {
2290 loff_t bdry_addr = this->chipsize >> 1;
2291 if (addr < bdry_addr && (addr + len) > bdry_addr)
2292 bdry_block = bdry_addr >> this->erase_shift;
2295 /* Pre-check bbs */
2296 while (len) {
2297 /* Check if we have a bad block, we do not erase bad blocks */
2298 if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2299 printk(KERN_WARNING "%s: attempt to erase a bad block "
2300 "at addr 0x%012llx\n",
2301 __func__, (unsigned long long) addr);
2302 instr->state = MTD_ERASE_FAILED;
2303 return -EIO;
2305 len -= block_size;
2306 addr += block_size;
2309 len = instr->len;
2310 addr = instr->addr;
2312 /* loop over 64 eb batches */
2313 while (len) {
2314 struct erase_info verify_instr = *instr;
2315 int max_eb_count = MB_ERASE_MAX_BLK_COUNT;
2317 verify_instr.addr = addr;
2318 verify_instr.len = 0;
2320 /* do not cross chip boundary */
2321 if (bdry_block) {
2322 int this_block = (addr >> this->erase_shift);
2324 if (this_block < bdry_block) {
2325 max_eb_count = min(max_eb_count,
2326 (bdry_block - this_block));
2330 eb_count = 0;
2332 while (len > block_size && eb_count < (max_eb_count - 1)) {
2333 this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE,
2334 addr, block_size);
2335 onenand_invalidate_bufferram(mtd, addr, block_size);
2337 ret = this->wait(mtd, FL_PREPARING_ERASE);
2338 if (ret) {
2339 printk(KERN_ERR "%s: Failed multiblock erase, "
2340 "block %d\n", __func__,
2341 onenand_block(this, addr));
2342 instr->state = MTD_ERASE_FAILED;
2343 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2344 return -EIO;
2347 len -= block_size;
2348 addr += block_size;
2349 eb_count++;
2352 /* last block of 64-eb series */
2353 cond_resched();
2354 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2355 onenand_invalidate_bufferram(mtd, addr, block_size);
2357 ret = this->wait(mtd, FL_ERASING);
2358 /* Check if it is write protected */
2359 if (ret) {
2360 printk(KERN_ERR "%s: Failed erase, block %d\n",
2361 __func__, onenand_block(this, addr));
2362 instr->state = MTD_ERASE_FAILED;
2363 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2364 return -EIO;
2367 len -= block_size;
2368 addr += block_size;
2369 eb_count++;
2371 /* verify */
2372 verify_instr.len = eb_count * block_size;
2373 if (onenand_multiblock_erase_verify(mtd, &verify_instr)) {
2374 instr->state = verify_instr.state;
2375 instr->fail_addr = verify_instr.fail_addr;
2376 return -EIO;
2380 return 0;
2385 * onenand_block_by_block_erase - [INTERN] erase block(s) using regular erase
2386 * @param mtd MTD device structure
2387 * @param instr erase instruction
2388 * @param region erase region
2389 * @param block_size erase block size
2391 * Erase one or more blocks one block at a time
2393 static int onenand_block_by_block_erase(struct mtd_info *mtd,
2394 struct erase_info *instr,
2395 struct mtd_erase_region_info *region,
2396 unsigned int block_size)
2398 struct onenand_chip *this = mtd->priv;
2399 loff_t addr = instr->addr;
2400 int len = instr->len;
2401 loff_t region_end = 0;
2402 int ret = 0;
2404 if (region) {
2405 /* region is set for Flex-OneNAND */
2406 region_end = region->offset + region->erasesize * region->numblocks;
2409 instr->state = MTD_ERASING;
2411 /* Loop through the blocks */
2412 while (len) {
2413 cond_resched();
2415 /* Check if we have a bad block, we do not erase bad blocks */
2416 if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2417 printk(KERN_WARNING "%s: attempt to erase a bad block "
2418 "at addr 0x%012llx\n",
2419 __func__, (unsigned long long) addr);
2420 instr->state = MTD_ERASE_FAILED;
2421 return -EIO;
2424 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2426 onenand_invalidate_bufferram(mtd, addr, block_size);
2428 ret = this->wait(mtd, FL_ERASING);
2429 /* Check, if it is write protected */
2430 if (ret) {
2431 printk(KERN_ERR "%s: Failed erase, block %d\n",
2432 __func__, onenand_block(this, addr));
2433 instr->state = MTD_ERASE_FAILED;
2434 instr->fail_addr = addr;
2435 return -EIO;
2438 len -= block_size;
2439 addr += block_size;
2441 if (region && addr == region_end) {
2442 if (!len)
2443 break;
2444 region++;
2446 block_size = region->erasesize;
2447 region_end = region->offset + region->erasesize * region->numblocks;
2449 if (len & (block_size - 1)) {
2450 /* FIXME: This should be handled at MTD partitioning level. */
2451 printk(KERN_ERR "%s: Unaligned address\n",
2452 __func__);
2453 return -EIO;
2457 return 0;
2461 * onenand_erase - [MTD Interface] erase block(s)
2462 * @param mtd MTD device structure
2463 * @param instr erase instruction
2465 * Erase one or more blocks
2467 static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
2469 struct onenand_chip *this = mtd->priv;
2470 unsigned int block_size;
2471 loff_t addr = instr->addr;
2472 loff_t len = instr->len;
2473 int ret = 0;
2474 struct mtd_erase_region_info *region = NULL;
2475 loff_t region_offset = 0;
2477 pr_debug("%s: start=0x%012llx, len=%llu\n", __func__,
2478 (unsigned long long)instr->addr,
2479 (unsigned long long)instr->len);
2481 if (FLEXONENAND(this)) {
2482 /* Find the eraseregion of this address */
2483 int i = flexonenand_region(mtd, addr);
2485 region = &mtd->eraseregions[i];
2486 block_size = region->erasesize;
2488 /* Start address within region must align on block boundary.
2489 * Erase region's start offset is always block start address.
2491 region_offset = region->offset;
2492 } else
2493 block_size = 1 << this->erase_shift;
2495 /* Start address must align on block boundary */
2496 if (unlikely((addr - region_offset) & (block_size - 1))) {
2497 printk(KERN_ERR "%s: Unaligned address\n", __func__);
2498 return -EINVAL;
2501 /* Length must align on block boundary */
2502 if (unlikely(len & (block_size - 1))) {
2503 printk(KERN_ERR "%s: Length not block aligned\n", __func__);
2504 return -EINVAL;
2507 /* Grab the lock and see if the device is available */
2508 onenand_get_device(mtd, FL_ERASING);
2510 if (ONENAND_IS_4KB_PAGE(this) || region ||
2511 instr->len < MB_ERASE_MIN_BLK_COUNT * block_size) {
2512 /* region is set for Flex-OneNAND (no mb erase) */
2513 ret = onenand_block_by_block_erase(mtd, instr,
2514 region, block_size);
2515 } else {
2516 ret = onenand_multiblock_erase(mtd, instr, block_size);
2519 /* Deselect and wake up anyone waiting on the device */
2520 onenand_release_device(mtd);
2522 /* Do call back function */
2523 if (!ret) {
2524 instr->state = MTD_ERASE_DONE;
2525 mtd_erase_callback(instr);
2528 return ret;
2532 * onenand_sync - [MTD Interface] sync
2533 * @param mtd MTD device structure
2535 * Sync is actually a wait for chip ready function
2537 static void onenand_sync(struct mtd_info *mtd)
2539 pr_debug("%s: called\n", __func__);
2541 /* Grab the lock and see if the device is available */
2542 onenand_get_device(mtd, FL_SYNCING);
2544 /* Release it and go back */
2545 onenand_release_device(mtd);
2549 * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
2550 * @param mtd MTD device structure
2551 * @param ofs offset relative to mtd start
2553 * Check whether the block is bad
2555 static int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs)
2557 int ret;
2559 onenand_get_device(mtd, FL_READING);
2560 ret = onenand_block_isbad_nolock(mtd, ofs, 0);
2561 onenand_release_device(mtd);
2562 return ret;
2566 * onenand_default_block_markbad - [DEFAULT] mark a block bad
2567 * @param mtd MTD device structure
2568 * @param ofs offset from device start
2570 * This is the default implementation, which can be overridden by
2571 * a hardware specific driver.
2573 static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
2575 struct onenand_chip *this = mtd->priv;
2576 struct bbm_info *bbm = this->bbm;
2577 u_char buf[2] = {0, 0};
2578 struct mtd_oob_ops ops = {
2579 .mode = MTD_OPS_PLACE_OOB,
2580 .ooblen = 2,
2581 .oobbuf = buf,
2582 .ooboffs = 0,
2584 int block;
2586 /* Get block number */
2587 block = onenand_block(this, ofs);
2588 if (bbm->bbt)
2589 bbm->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
2591 /* We write two bytes, so we don't have to mess with 16-bit access */
2592 ofs += mtd->oobsize + (bbm->badblockpos & ~0x01);
2593 /* FIXME : What to do when marking SLC block in partition
2594 * with MLC erasesize? For now, it is not advisable to
2595 * create partitions containing both SLC and MLC regions.
2597 return onenand_write_oob_nolock(mtd, ofs, &ops);
2601 * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
2602 * @param mtd MTD device structure
2603 * @param ofs offset relative to mtd start
2605 * Mark the block as bad
2607 static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
2609 int ret;
2611 ret = onenand_block_isbad(mtd, ofs);
2612 if (ret) {
2613 /* If it was bad already, return success and do nothing */
2614 if (ret > 0)
2615 return 0;
2616 return ret;
2619 onenand_get_device(mtd, FL_WRITING);
2620 ret = mtd_block_markbad(mtd, ofs);
2621 onenand_release_device(mtd);
2622 return ret;
2626 * onenand_do_lock_cmd - [OneNAND Interface] Lock or unlock block(s)
2627 * @param mtd MTD device structure
2628 * @param ofs offset relative to mtd start
2629 * @param len number of bytes to lock or unlock
2630 * @param cmd lock or unlock command
2632 * Lock or unlock one or more blocks
2634 static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int cmd)
2636 struct onenand_chip *this = mtd->priv;
2637 int start, end, block, value, status;
2638 int wp_status_mask;
2640 start = onenand_block(this, ofs);
2641 end = onenand_block(this, ofs + len) - 1;
2643 if (cmd == ONENAND_CMD_LOCK)
2644 wp_status_mask = ONENAND_WP_LS;
2645 else
2646 wp_status_mask = ONENAND_WP_US;
2648 /* Continuous lock scheme */
2649 if (this->options & ONENAND_HAS_CONT_LOCK) {
2650 /* Set start block address */
2651 this->write_word(start, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2652 /* Set end block address */
2653 this->write_word(end, this->base + ONENAND_REG_END_BLOCK_ADDRESS);
2654 /* Write lock command */
2655 this->command(mtd, cmd, 0, 0);
2657 /* There's no return value */
2658 this->wait(mtd, FL_LOCKING);
2660 /* Sanity check */
2661 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2662 & ONENAND_CTRL_ONGO)
2663 continue;
2665 /* Check lock status */
2666 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2667 if (!(status & wp_status_mask))
2668 printk(KERN_ERR "%s: wp status = 0x%x\n",
2669 __func__, status);
2671 return 0;
2674 /* Block lock scheme */
2675 for (block = start; block < end + 1; block++) {
2676 /* Set block address */
2677 value = onenand_block_address(this, block);
2678 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2679 /* Select DataRAM for DDP */
2680 value = onenand_bufferram_address(this, block);
2681 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2682 /* Set start block address */
2683 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2684 /* Write lock command */
2685 this->command(mtd, cmd, 0, 0);
2687 /* There's no return value */
2688 this->wait(mtd, FL_LOCKING);
2690 /* Sanity check */
2691 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2692 & ONENAND_CTRL_ONGO)
2693 continue;
2695 /* Check lock status */
2696 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2697 if (!(status & wp_status_mask))
2698 printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2699 __func__, block, status);
2702 return 0;
2706 * onenand_lock - [MTD Interface] Lock block(s)
2707 * @param mtd MTD device structure
2708 * @param ofs offset relative to mtd start
2709 * @param len number of bytes to unlock
2711 * Lock one or more blocks
2713 static int onenand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2715 int ret;
2717 onenand_get_device(mtd, FL_LOCKING);
2718 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK);
2719 onenand_release_device(mtd);
2720 return ret;
2724 * onenand_unlock - [MTD Interface] Unlock block(s)
2725 * @param mtd MTD device structure
2726 * @param ofs offset relative to mtd start
2727 * @param len number of bytes to unlock
2729 * Unlock one or more blocks
2731 static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2733 int ret;
2735 onenand_get_device(mtd, FL_LOCKING);
2736 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2737 onenand_release_device(mtd);
2738 return ret;
2742 * onenand_check_lock_status - [OneNAND Interface] Check lock status
2743 * @param this onenand chip data structure
2745 * Check lock status
2747 static int onenand_check_lock_status(struct onenand_chip *this)
2749 unsigned int value, block, status;
2750 unsigned int end;
2752 end = this->chipsize >> this->erase_shift;
2753 for (block = 0; block < end; block++) {
2754 /* Set block address */
2755 value = onenand_block_address(this, block);
2756 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2757 /* Select DataRAM for DDP */
2758 value = onenand_bufferram_address(this, block);
2759 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2760 /* Set start block address */
2761 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2763 /* Check lock status */
2764 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2765 if (!(status & ONENAND_WP_US)) {
2766 printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2767 __func__, block, status);
2768 return 0;
2772 return 1;
2776 * onenand_unlock_all - [OneNAND Interface] unlock all blocks
2777 * @param mtd MTD device structure
2779 * Unlock all blocks
2781 static void onenand_unlock_all(struct mtd_info *mtd)
2783 struct onenand_chip *this = mtd->priv;
2784 loff_t ofs = 0;
2785 loff_t len = mtd->size;
2787 if (this->options & ONENAND_HAS_UNLOCK_ALL) {
2788 /* Set start block address */
2789 this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2790 /* Write unlock command */
2791 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0);
2793 /* There's no return value */
2794 this->wait(mtd, FL_LOCKING);
2796 /* Sanity check */
2797 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2798 & ONENAND_CTRL_ONGO)
2799 continue;
2801 /* Don't check lock status */
2802 if (this->options & ONENAND_SKIP_UNLOCK_CHECK)
2803 return;
2805 /* Check lock status */
2806 if (onenand_check_lock_status(this))
2807 return;
2809 /* Workaround for all block unlock in DDP */
2810 if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) {
2811 /* All blocks on another chip */
2812 ofs = this->chipsize >> 1;
2813 len = this->chipsize >> 1;
2817 onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2820 #ifdef CONFIG_MTD_ONENAND_OTP
2823 * onenand_otp_command - Send OTP specific command to OneNAND device
2824 * @param mtd MTD device structure
2825 * @param cmd the command to be sent
2826 * @param addr offset to read from or write to
2827 * @param len number of bytes to read or write
2829 static int onenand_otp_command(struct mtd_info *mtd, int cmd, loff_t addr,
2830 size_t len)
2832 struct onenand_chip *this = mtd->priv;
2833 int value, block, page;
2835 /* Address translation */
2836 switch (cmd) {
2837 case ONENAND_CMD_OTP_ACCESS:
2838 block = (int) (addr >> this->erase_shift);
2839 page = -1;
2840 break;
2842 default:
2843 block = (int) (addr >> this->erase_shift);
2844 page = (int) (addr >> this->page_shift);
2846 if (ONENAND_IS_2PLANE(this)) {
2847 /* Make the even block number */
2848 block &= ~1;
2849 /* Is it the odd plane? */
2850 if (addr & this->writesize)
2851 block++;
2852 page >>= 1;
2854 page &= this->page_mask;
2855 break;
2858 if (block != -1) {
2859 /* Write 'DFS, FBA' of Flash */
2860 value = onenand_block_address(this, block);
2861 this->write_word(value, this->base +
2862 ONENAND_REG_START_ADDRESS1);
2865 if (page != -1) {
2866 /* Now we use page size operation */
2867 int sectors = 4, count = 4;
2868 int dataram;
2870 switch (cmd) {
2871 default:
2872 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
2873 cmd = ONENAND_CMD_2X_PROG;
2874 dataram = ONENAND_CURRENT_BUFFERRAM(this);
2875 break;
2878 /* Write 'FPA, FSA' of Flash */
2879 value = onenand_page_address(page, sectors);
2880 this->write_word(value, this->base +
2881 ONENAND_REG_START_ADDRESS8);
2883 /* Write 'BSA, BSC' of DataRAM */
2884 value = onenand_buffer_address(dataram, sectors, count);
2885 this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
2888 /* Interrupt clear */
2889 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
2891 /* Write command */
2892 this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
2894 return 0;
2898 * onenand_otp_write_oob_nolock - [INTERN] OneNAND write out-of-band, specific to OTP
2899 * @param mtd MTD device structure
2900 * @param to offset to write to
2901 * @param len number of bytes to write
2902 * @param retlen pointer to variable to store the number of written bytes
2903 * @param buf the data to write
2905 * OneNAND write out-of-band only for OTP
2907 static int onenand_otp_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2908 struct mtd_oob_ops *ops)
2910 struct onenand_chip *this = mtd->priv;
2911 int column, ret = 0, oobsize;
2912 int written = 0;
2913 u_char *oobbuf;
2914 size_t len = ops->ooblen;
2915 const u_char *buf = ops->oobbuf;
2916 int block, value, status;
2918 to += ops->ooboffs;
2920 /* Initialize retlen, in case of early exit */
2921 ops->oobretlen = 0;
2923 oobsize = mtd->oobsize;
2925 column = to & (mtd->oobsize - 1);
2927 oobbuf = this->oob_buf;
2929 /* Loop until all data write */
2930 while (written < len) {
2931 int thislen = min_t(int, oobsize, len - written);
2933 cond_resched();
2935 block = (int) (to >> this->erase_shift);
2937 * Write 'DFS, FBA' of Flash
2938 * Add: F100h DQ=DFS, FBA
2941 value = onenand_block_address(this, block);
2942 this->write_word(value, this->base +
2943 ONENAND_REG_START_ADDRESS1);
2946 * Select DataRAM for DDP
2947 * Add: F101h DQ=DBS
2950 value = onenand_bufferram_address(this, block);
2951 this->write_word(value, this->base +
2952 ONENAND_REG_START_ADDRESS2);
2953 ONENAND_SET_NEXT_BUFFERRAM(this);
2956 * Enter OTP access mode
2958 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
2959 this->wait(mtd, FL_OTPING);
2961 /* We send data to spare ram with oobsize
2962 * to prevent byte access */
2963 memcpy(oobbuf + column, buf, thislen);
2966 * Write Data into DataRAM
2967 * Add: 8th Word
2968 * in sector0/spare/page0
2969 * DQ=XXFCh
2971 this->write_bufferram(mtd, ONENAND_SPARERAM,
2972 oobbuf, 0, mtd->oobsize);
2974 onenand_otp_command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize);
2975 onenand_update_bufferram(mtd, to, 0);
2976 if (ONENAND_IS_2PLANE(this)) {
2977 ONENAND_SET_BUFFERRAM1(this);
2978 onenand_update_bufferram(mtd, to + this->writesize, 0);
2981 ret = this->wait(mtd, FL_WRITING);
2982 if (ret) {
2983 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2984 break;
2987 /* Exit OTP access mode */
2988 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
2989 this->wait(mtd, FL_RESETING);
2991 status = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
2992 status &= 0x60;
2994 if (status == 0x60) {
2995 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2996 printk(KERN_DEBUG "1st Block\tLOCKED\n");
2997 printk(KERN_DEBUG "OTP Block\tLOCKED\n");
2998 } else if (status == 0x20) {
2999 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
3000 printk(KERN_DEBUG "1st Block\tLOCKED\n");
3001 printk(KERN_DEBUG "OTP Block\tUN-LOCKED\n");
3002 } else if (status == 0x40) {
3003 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
3004 printk(KERN_DEBUG "1st Block\tUN-LOCKED\n");
3005 printk(KERN_DEBUG "OTP Block\tLOCKED\n");
3006 } else {
3007 printk(KERN_DEBUG "Reboot to check\n");
3010 written += thislen;
3011 if (written == len)
3012 break;
3014 to += mtd->writesize;
3015 buf += thislen;
3016 column = 0;
3019 ops->oobretlen = written;
3021 return ret;
3024 /* Internal OTP operation */
3025 typedef int (*otp_op_t)(struct mtd_info *mtd, loff_t form, size_t len,
3026 size_t *retlen, u_char *buf);
3029 * do_otp_read - [DEFAULT] Read OTP block area
3030 * @param mtd MTD device structure
3031 * @param from The offset to read
3032 * @param len number of bytes to read
3033 * @param retlen pointer to variable to store the number of readbytes
3034 * @param buf the databuffer to put/get data
3036 * Read OTP block area.
3038 static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
3039 size_t *retlen, u_char *buf)
3041 struct onenand_chip *this = mtd->priv;
3042 struct mtd_oob_ops ops = {
3043 .len = len,
3044 .ooblen = 0,
3045 .datbuf = buf,
3046 .oobbuf = NULL,
3048 int ret;
3050 /* Enter OTP access mode */
3051 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3052 this->wait(mtd, FL_OTPING);
3054 ret = ONENAND_IS_4KB_PAGE(this) ?
3055 onenand_mlc_read_ops_nolock(mtd, from, &ops) :
3056 onenand_read_ops_nolock(mtd, from, &ops);
3058 /* Exit OTP access mode */
3059 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3060 this->wait(mtd, FL_RESETING);
3062 return ret;
3066 * do_otp_write - [DEFAULT] Write OTP block area
3067 * @param mtd MTD device structure
3068 * @param to The offset to write
3069 * @param len number of bytes to write
3070 * @param retlen pointer to variable to store the number of write bytes
3071 * @param buf the databuffer to put/get data
3073 * Write OTP block area.
3075 static int do_otp_write(struct mtd_info *mtd, loff_t to, size_t len,
3076 size_t *retlen, u_char *buf)
3078 struct onenand_chip *this = mtd->priv;
3079 unsigned char *pbuf = buf;
3080 int ret;
3081 struct mtd_oob_ops ops;
3083 /* Force buffer page aligned */
3084 if (len < mtd->writesize) {
3085 memcpy(this->page_buf, buf, len);
3086 memset(this->page_buf + len, 0xff, mtd->writesize - len);
3087 pbuf = this->page_buf;
3088 len = mtd->writesize;
3091 /* Enter OTP access mode */
3092 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3093 this->wait(mtd, FL_OTPING);
3095 ops.len = len;
3096 ops.ooblen = 0;
3097 ops.datbuf = pbuf;
3098 ops.oobbuf = NULL;
3099 ret = onenand_write_ops_nolock(mtd, to, &ops);
3100 *retlen = ops.retlen;
3102 /* Exit OTP access mode */
3103 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3104 this->wait(mtd, FL_RESETING);
3106 return ret;
3110 * do_otp_lock - [DEFAULT] Lock OTP block area
3111 * @param mtd MTD device structure
3112 * @param from The offset to lock
3113 * @param len number of bytes to lock
3114 * @param retlen pointer to variable to store the number of lock bytes
3115 * @param buf the databuffer to put/get data
3117 * Lock OTP block area.
3119 static int do_otp_lock(struct mtd_info *mtd, loff_t from, size_t len,
3120 size_t *retlen, u_char *buf)
3122 struct onenand_chip *this = mtd->priv;
3123 struct mtd_oob_ops ops;
3124 int ret;
3126 if (FLEXONENAND(this)) {
3128 /* Enter OTP access mode */
3129 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3130 this->wait(mtd, FL_OTPING);
3132 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3133 * main area of page 49.
3135 ops.len = mtd->writesize;
3136 ops.ooblen = 0;
3137 ops.datbuf = buf;
3138 ops.oobbuf = NULL;
3139 ret = onenand_write_ops_nolock(mtd, mtd->writesize * 49, &ops);
3140 *retlen = ops.retlen;
3142 /* Exit OTP access mode */
3143 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3144 this->wait(mtd, FL_RESETING);
3145 } else {
3146 ops.mode = MTD_OPS_PLACE_OOB;
3147 ops.ooblen = len;
3148 ops.oobbuf = buf;
3149 ops.ooboffs = 0;
3150 ret = onenand_otp_write_oob_nolock(mtd, from, &ops);
3151 *retlen = ops.oobretlen;
3154 return ret;
3158 * onenand_otp_walk - [DEFAULT] Handle OTP operation
3159 * @param mtd MTD device structure
3160 * @param from The offset to read/write
3161 * @param len number of bytes to read/write
3162 * @param retlen pointer to variable to store the number of read bytes
3163 * @param buf the databuffer to put/get data
3164 * @param action do given action
3165 * @param mode specify user and factory
3167 * Handle OTP operation.
3169 static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
3170 size_t *retlen, u_char *buf,
3171 otp_op_t action, int mode)
3173 struct onenand_chip *this = mtd->priv;
3174 int otp_pages;
3175 int density;
3176 int ret = 0;
3178 *retlen = 0;
3180 density = onenand_get_density(this->device_id);
3181 if (density < ONENAND_DEVICE_DENSITY_512Mb)
3182 otp_pages = 20;
3183 else
3184 otp_pages = 50;
3186 if (mode == MTD_OTP_FACTORY) {
3187 from += mtd->writesize * otp_pages;
3188 otp_pages = ONENAND_PAGES_PER_BLOCK - otp_pages;
3191 /* Check User/Factory boundary */
3192 if (mode == MTD_OTP_USER) {
3193 if (mtd->writesize * otp_pages < from + len)
3194 return 0;
3195 } else {
3196 if (mtd->writesize * otp_pages < len)
3197 return 0;
3200 onenand_get_device(mtd, FL_OTPING);
3201 while (len > 0 && otp_pages > 0) {
3202 if (!action) { /* OTP Info functions */
3203 struct otp_info *otpinfo;
3205 len -= sizeof(struct otp_info);
3206 if (len <= 0) {
3207 ret = -ENOSPC;
3208 break;
3211 otpinfo = (struct otp_info *) buf;
3212 otpinfo->start = from;
3213 otpinfo->length = mtd->writesize;
3214 otpinfo->locked = 0;
3216 from += mtd->writesize;
3217 buf += sizeof(struct otp_info);
3218 *retlen += sizeof(struct otp_info);
3219 } else {
3220 size_t tmp_retlen;
3222 ret = action(mtd, from, len, &tmp_retlen, buf);
3224 buf += tmp_retlen;
3225 len -= tmp_retlen;
3226 *retlen += tmp_retlen;
3228 if (ret)
3229 break;
3231 otp_pages--;
3233 onenand_release_device(mtd);
3235 return ret;
3239 * onenand_get_fact_prot_info - [MTD Interface] Read factory OTP info
3240 * @param mtd MTD device structure
3241 * @param buf the databuffer to put/get data
3242 * @param len number of bytes to read
3244 * Read factory OTP info.
3246 static int onenand_get_fact_prot_info(struct mtd_info *mtd,
3247 struct otp_info *buf, size_t len)
3249 size_t retlen;
3250 int ret;
3252 ret = onenand_otp_walk(mtd, 0, len, &retlen, (u_char *) buf, NULL, MTD_OTP_FACTORY);
3254 return ret ? : retlen;
3258 * onenand_read_fact_prot_reg - [MTD Interface] Read factory OTP area
3259 * @param mtd MTD device structure
3260 * @param from The offset to read
3261 * @param len number of bytes to read
3262 * @param retlen pointer to variable to store the number of read bytes
3263 * @param buf the databuffer to put/get data
3265 * Read factory OTP area.
3267 static int onenand_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
3268 size_t len, size_t *retlen, u_char *buf)
3270 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_FACTORY);
3274 * onenand_get_user_prot_info - [MTD Interface] Read user OTP info
3275 * @param mtd MTD device structure
3276 * @param buf the databuffer to put/get data
3277 * @param len number of bytes to read
3279 * Read user OTP info.
3281 static int onenand_get_user_prot_info(struct mtd_info *mtd,
3282 struct otp_info *buf, size_t len)
3284 size_t retlen;
3285 int ret;
3287 ret = onenand_otp_walk(mtd, 0, len, &retlen, (u_char *) buf, NULL, MTD_OTP_USER);
3289 return ret ? : retlen;
3293 * onenand_read_user_prot_reg - [MTD Interface] Read user OTP area
3294 * @param mtd MTD device structure
3295 * @param from The offset to read
3296 * @param len number of bytes to read
3297 * @param retlen pointer to variable to store the number of read bytes
3298 * @param buf the databuffer to put/get data
3300 * Read user OTP area.
3302 static int onenand_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
3303 size_t len, size_t *retlen, u_char *buf)
3305 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_USER);
3309 * onenand_write_user_prot_reg - [MTD Interface] Write user OTP area
3310 * @param mtd MTD device structure
3311 * @param from The offset to write
3312 * @param len number of bytes to write
3313 * @param retlen pointer to variable to store the number of write bytes
3314 * @param buf the databuffer to put/get data
3316 * Write user OTP area.
3318 static int onenand_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
3319 size_t len, size_t *retlen, u_char *buf)
3321 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_write, MTD_OTP_USER);
3325 * onenand_lock_user_prot_reg - [MTD Interface] Lock user OTP area
3326 * @param mtd MTD device structure
3327 * @param from The offset to lock
3328 * @param len number of bytes to unlock
3330 * Write lock mark on spare area in page 0 in OTP block
3332 static int onenand_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
3333 size_t len)
3335 struct onenand_chip *this = mtd->priv;
3336 u_char *buf = FLEXONENAND(this) ? this->page_buf : this->oob_buf;
3337 size_t retlen;
3338 int ret;
3339 unsigned int otp_lock_offset = ONENAND_OTP_LOCK_OFFSET;
3341 memset(buf, 0xff, FLEXONENAND(this) ? this->writesize
3342 : mtd->oobsize);
3344 * Write lock mark to 8th word of sector0 of page0 of the spare0.
3345 * We write 16 bytes spare area instead of 2 bytes.
3346 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3347 * main area of page 49.
3350 from = 0;
3351 len = FLEXONENAND(this) ? mtd->writesize : 16;
3354 * Note: OTP lock operation
3355 * OTP block : 0xXXFC XX 1111 1100
3356 * 1st block : 0xXXF3 (If chip support) XX 1111 0011
3357 * Both : 0xXXF0 (If chip support) XX 1111 0000
3359 if (FLEXONENAND(this))
3360 otp_lock_offset = FLEXONENAND_OTP_LOCK_OFFSET;
3362 /* ONENAND_OTP_AREA | ONENAND_OTP_BLOCK0 | ONENAND_OTP_AREA_BLOCK0 */
3363 if (otp == 1)
3364 buf[otp_lock_offset] = 0xFC;
3365 else if (otp == 2)
3366 buf[otp_lock_offset] = 0xF3;
3367 else if (otp == 3)
3368 buf[otp_lock_offset] = 0xF0;
3369 else if (otp != 0)
3370 printk(KERN_DEBUG "[OneNAND] Invalid option selected for OTP\n");
3372 ret = onenand_otp_walk(mtd, from, len, &retlen, buf, do_otp_lock, MTD_OTP_USER);
3374 return ret ? : retlen;
3377 #endif /* CONFIG_MTD_ONENAND_OTP */
3380 * onenand_check_features - Check and set OneNAND features
3381 * @param mtd MTD data structure
3383 * Check and set OneNAND features
3384 * - lock scheme
3385 * - two plane
3387 static void onenand_check_features(struct mtd_info *mtd)
3389 struct onenand_chip *this = mtd->priv;
3390 unsigned int density, process, numbufs;
3392 /* Lock scheme depends on density and process */
3393 density = onenand_get_density(this->device_id);
3394 process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT;
3395 numbufs = this->read_word(this->base + ONENAND_REG_NUM_BUFFERS) >> 8;
3397 /* Lock scheme */
3398 switch (density) {
3399 case ONENAND_DEVICE_DENSITY_4Gb:
3400 if (ONENAND_IS_DDP(this))
3401 this->options |= ONENAND_HAS_2PLANE;
3402 else if (numbufs == 1) {
3403 this->options |= ONENAND_HAS_4KB_PAGE;
3404 this->options |= ONENAND_HAS_CACHE_PROGRAM;
3406 * There are two different 4KiB pagesize chips
3407 * and no way to detect it by H/W config values.
3409 * To detect the correct NOP for each chips,
3410 * It should check the version ID as workaround.
3412 * Now it has as following
3413 * KFM4G16Q4M has NOP 4 with version ID 0x0131
3414 * KFM4G16Q5M has NOP 1 with versoin ID 0x013e
3416 if ((this->version_id & 0xf) == 0xe)
3417 this->options |= ONENAND_HAS_NOP_1;
3420 case ONENAND_DEVICE_DENSITY_2Gb:
3421 /* 2Gb DDP does not have 2 plane */
3422 if (!ONENAND_IS_DDP(this))
3423 this->options |= ONENAND_HAS_2PLANE;
3424 this->options |= ONENAND_HAS_UNLOCK_ALL;
3426 case ONENAND_DEVICE_DENSITY_1Gb:
3427 /* A-Die has all block unlock */
3428 if (process)
3429 this->options |= ONENAND_HAS_UNLOCK_ALL;
3430 break;
3432 default:
3433 /* Some OneNAND has continuous lock scheme */
3434 if (!process)
3435 this->options |= ONENAND_HAS_CONT_LOCK;
3436 break;
3439 /* The MLC has 4KiB pagesize. */
3440 if (ONENAND_IS_MLC(this))
3441 this->options |= ONENAND_HAS_4KB_PAGE;
3443 if (ONENAND_IS_4KB_PAGE(this))
3444 this->options &= ~ONENAND_HAS_2PLANE;
3446 if (FLEXONENAND(this)) {
3447 this->options &= ~ONENAND_HAS_CONT_LOCK;
3448 this->options |= ONENAND_HAS_UNLOCK_ALL;
3451 if (this->options & ONENAND_HAS_CONT_LOCK)
3452 printk(KERN_DEBUG "Lock scheme is Continuous Lock\n");
3453 if (this->options & ONENAND_HAS_UNLOCK_ALL)
3454 printk(KERN_DEBUG "Chip support all block unlock\n");
3455 if (this->options & ONENAND_HAS_2PLANE)
3456 printk(KERN_DEBUG "Chip has 2 plane\n");
3457 if (this->options & ONENAND_HAS_4KB_PAGE)
3458 printk(KERN_DEBUG "Chip has 4KiB pagesize\n");
3459 if (this->options & ONENAND_HAS_CACHE_PROGRAM)
3460 printk(KERN_DEBUG "Chip has cache program feature\n");
3464 * onenand_print_device_info - Print device & version ID
3465 * @param device device ID
3466 * @param version version ID
3468 * Print device & version ID
3470 static void onenand_print_device_info(int device, int version)
3472 int vcc, demuxed, ddp, density, flexonenand;
3474 vcc = device & ONENAND_DEVICE_VCC_MASK;
3475 demuxed = device & ONENAND_DEVICE_IS_DEMUX;
3476 ddp = device & ONENAND_DEVICE_IS_DDP;
3477 density = onenand_get_density(device);
3478 flexonenand = device & DEVICE_IS_FLEXONENAND;
3479 printk(KERN_INFO "%s%sOneNAND%s %dMB %sV 16-bit (0x%02x)\n",
3480 demuxed ? "" : "Muxed ",
3481 flexonenand ? "Flex-" : "",
3482 ddp ? "(DDP)" : "",
3483 (16 << density),
3484 vcc ? "2.65/3.3" : "1.8",
3485 device);
3486 printk(KERN_INFO "OneNAND version = 0x%04x\n", version);
3489 static const struct onenand_manufacturers onenand_manuf_ids[] = {
3490 {ONENAND_MFR_SAMSUNG, "Samsung"},
3491 {ONENAND_MFR_NUMONYX, "Numonyx"},
3495 * onenand_check_maf - Check manufacturer ID
3496 * @param manuf manufacturer ID
3498 * Check manufacturer ID
3500 static int onenand_check_maf(int manuf)
3502 int size = ARRAY_SIZE(onenand_manuf_ids);
3503 char *name;
3504 int i;
3506 for (i = 0; i < size; i++)
3507 if (manuf == onenand_manuf_ids[i].id)
3508 break;
3510 if (i < size)
3511 name = onenand_manuf_ids[i].name;
3512 else
3513 name = "Unknown";
3515 printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n", name, manuf);
3517 return (i == size);
3521 * flexonenand_get_boundary - Reads the SLC boundary
3522 * @param onenand_info - onenand info structure
3524 static int flexonenand_get_boundary(struct mtd_info *mtd)
3526 struct onenand_chip *this = mtd->priv;
3527 unsigned die, bdry;
3528 int syscfg, locked;
3530 /* Disable ECC */
3531 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3532 this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1);
3534 for (die = 0; die < this->dies; die++) {
3535 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3536 this->wait(mtd, FL_SYNCING);
3538 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3539 this->wait(mtd, FL_READING);
3541 bdry = this->read_word(this->base + ONENAND_DATARAM);
3542 if ((bdry >> FLEXONENAND_PI_UNLOCK_SHIFT) == 3)
3543 locked = 0;
3544 else
3545 locked = 1;
3546 this->boundary[die] = bdry & FLEXONENAND_PI_MASK;
3548 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3549 this->wait(mtd, FL_RESETING);
3551 printk(KERN_INFO "Die %d boundary: %d%s\n", die,
3552 this->boundary[die], locked ? "(Locked)" : "(Unlocked)");
3555 /* Enable ECC */
3556 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3557 return 0;
3561 * flexonenand_get_size - Fill up fields in onenand_chip and mtd_info
3562 * boundary[], diesize[], mtd->size, mtd->erasesize
3563 * @param mtd - MTD device structure
3565 static void flexonenand_get_size(struct mtd_info *mtd)
3567 struct onenand_chip *this = mtd->priv;
3568 int die, i, eraseshift, density;
3569 int blksperdie, maxbdry;
3570 loff_t ofs;
3572 density = onenand_get_density(this->device_id);
3573 blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift);
3574 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3575 maxbdry = blksperdie - 1;
3576 eraseshift = this->erase_shift - 1;
3578 mtd->numeraseregions = this->dies << 1;
3580 /* This fills up the device boundary */
3581 flexonenand_get_boundary(mtd);
3582 die = ofs = 0;
3583 i = -1;
3584 for (; die < this->dies; die++) {
3585 if (!die || this->boundary[die-1] != maxbdry) {
3586 i++;
3587 mtd->eraseregions[i].offset = ofs;
3588 mtd->eraseregions[i].erasesize = 1 << eraseshift;
3589 mtd->eraseregions[i].numblocks =
3590 this->boundary[die] + 1;
3591 ofs += mtd->eraseregions[i].numblocks << eraseshift;
3592 eraseshift++;
3593 } else {
3594 mtd->numeraseregions -= 1;
3595 mtd->eraseregions[i].numblocks +=
3596 this->boundary[die] + 1;
3597 ofs += (this->boundary[die] + 1) << (eraseshift - 1);
3599 if (this->boundary[die] != maxbdry) {
3600 i++;
3601 mtd->eraseregions[i].offset = ofs;
3602 mtd->eraseregions[i].erasesize = 1 << eraseshift;
3603 mtd->eraseregions[i].numblocks = maxbdry ^
3604 this->boundary[die];
3605 ofs += mtd->eraseregions[i].numblocks << eraseshift;
3606 eraseshift--;
3607 } else
3608 mtd->numeraseregions -= 1;
3611 /* Expose MLC erase size except when all blocks are SLC */
3612 mtd->erasesize = 1 << this->erase_shift;
3613 if (mtd->numeraseregions == 1)
3614 mtd->erasesize >>= 1;
3616 printk(KERN_INFO "Device has %d eraseregions\n", mtd->numeraseregions);
3617 for (i = 0; i < mtd->numeraseregions; i++)
3618 printk(KERN_INFO "[offset: 0x%08x, erasesize: 0x%05x,"
3619 " numblocks: %04u]\n",
3620 (unsigned int) mtd->eraseregions[i].offset,
3621 mtd->eraseregions[i].erasesize,
3622 mtd->eraseregions[i].numblocks);
3624 for (die = 0, mtd->size = 0; die < this->dies; die++) {
3625 this->diesize[die] = (loff_t)blksperdie << this->erase_shift;
3626 this->diesize[die] -= (loff_t)(this->boundary[die] + 1)
3627 << (this->erase_shift - 1);
3628 mtd->size += this->diesize[die];
3633 * flexonenand_check_blocks_erased - Check if blocks are erased
3634 * @param mtd_info - mtd info structure
3635 * @param start - first erase block to check
3636 * @param end - last erase block to check
3638 * Converting an unerased block from MLC to SLC
3639 * causes byte values to change. Since both data and its ECC
3640 * have changed, reads on the block give uncorrectable error.
3641 * This might lead to the block being detected as bad.
3643 * Avoid this by ensuring that the block to be converted is
3644 * erased.
3646 static int flexonenand_check_blocks_erased(struct mtd_info *mtd, int start, int end)
3648 struct onenand_chip *this = mtd->priv;
3649 int i, ret;
3650 int block;
3651 struct mtd_oob_ops ops = {
3652 .mode = MTD_OPS_PLACE_OOB,
3653 .ooboffs = 0,
3654 .ooblen = mtd->oobsize,
3655 .datbuf = NULL,
3656 .oobbuf = this->oob_buf,
3658 loff_t addr;
3660 printk(KERN_DEBUG "Check blocks from %d to %d\n", start, end);
3662 for (block = start; block <= end; block++) {
3663 addr = flexonenand_addr(this, block);
3664 if (onenand_block_isbad_nolock(mtd, addr, 0))
3665 continue;
3668 * Since main area write results in ECC write to spare,
3669 * it is sufficient to check only ECC bytes for change.
3671 ret = onenand_read_oob_nolock(mtd, addr, &ops);
3672 if (ret)
3673 return ret;
3675 for (i = 0; i < mtd->oobsize; i++)
3676 if (this->oob_buf[i] != 0xff)
3677 break;
3679 if (i != mtd->oobsize) {
3680 printk(KERN_WARNING "%s: Block %d not erased.\n",
3681 __func__, block);
3682 return 1;
3686 return 0;
3690 * flexonenand_set_boundary - Writes the SLC boundary
3691 * @param mtd - mtd info structure
3693 static int flexonenand_set_boundary(struct mtd_info *mtd, int die,
3694 int boundary, int lock)
3696 struct onenand_chip *this = mtd->priv;
3697 int ret, density, blksperdie, old, new, thisboundary;
3698 loff_t addr;
3700 /* Change only once for SDP Flex-OneNAND */
3701 if (die && (!ONENAND_IS_DDP(this)))
3702 return 0;
3704 /* boundary value of -1 indicates no required change */
3705 if (boundary < 0 || boundary == this->boundary[die])
3706 return 0;
3708 density = onenand_get_density(this->device_id);
3709 blksperdie = ((16 << density) << 20) >> this->erase_shift;
3710 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3712 if (boundary >= blksperdie) {
3713 printk(KERN_ERR "%s: Invalid boundary value. "
3714 "Boundary not changed.\n", __func__);
3715 return -EINVAL;
3718 /* Check if converting blocks are erased */
3719 old = this->boundary[die] + (die * this->density_mask);
3720 new = boundary + (die * this->density_mask);
3721 ret = flexonenand_check_blocks_erased(mtd, min(old, new) + 1, max(old, new));
3722 if (ret) {
3723 printk(KERN_ERR "%s: Please erase blocks "
3724 "before boundary change\n", __func__);
3725 return ret;
3728 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3729 this->wait(mtd, FL_SYNCING);
3731 /* Check is boundary is locked */
3732 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3733 this->wait(mtd, FL_READING);
3735 thisboundary = this->read_word(this->base + ONENAND_DATARAM);
3736 if ((thisboundary >> FLEXONENAND_PI_UNLOCK_SHIFT) != 3) {
3737 printk(KERN_ERR "%s: boundary locked\n", __func__);
3738 ret = 1;
3739 goto out;
3742 printk(KERN_INFO "Changing die %d boundary: %d%s\n",
3743 die, boundary, lock ? "(Locked)" : "(Unlocked)");
3745 addr = die ? this->diesize[0] : 0;
3747 boundary &= FLEXONENAND_PI_MASK;
3748 boundary |= lock ? 0 : (3 << FLEXONENAND_PI_UNLOCK_SHIFT);
3750 this->command(mtd, ONENAND_CMD_ERASE, addr, 0);
3751 ret = this->wait(mtd, FL_ERASING);
3752 if (ret) {
3753 printk(KERN_ERR "%s: Failed PI erase for Die %d\n",
3754 __func__, die);
3755 goto out;
3758 this->write_word(boundary, this->base + ONENAND_DATARAM);
3759 this->command(mtd, ONENAND_CMD_PROG, addr, 0);
3760 ret = this->wait(mtd, FL_WRITING);
3761 if (ret) {
3762 printk(KERN_ERR "%s: Failed PI write for Die %d\n",
3763 __func__, die);
3764 goto out;
3767 this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0);
3768 ret = this->wait(mtd, FL_WRITING);
3769 out:
3770 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND);
3771 this->wait(mtd, FL_RESETING);
3772 if (!ret)
3773 /* Recalculate device size on boundary change*/
3774 flexonenand_get_size(mtd);
3776 return ret;
3780 * onenand_chip_probe - [OneNAND Interface] The generic chip probe
3781 * @param mtd MTD device structure
3783 * OneNAND detection method:
3784 * Compare the values from command with ones from register
3786 static int onenand_chip_probe(struct mtd_info *mtd)
3788 struct onenand_chip *this = mtd->priv;
3789 int bram_maf_id, bram_dev_id, maf_id, dev_id;
3790 int syscfg;
3792 /* Save system configuration 1 */
3793 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3794 /* Clear Sync. Burst Read mode to read BootRAM */
3795 this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE), this->base + ONENAND_REG_SYS_CFG1);
3797 /* Send the command for reading device ID from BootRAM */
3798 this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
3800 /* Read manufacturer and device IDs from BootRAM */
3801 bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0);
3802 bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2);
3804 /* Reset OneNAND to read default register values */
3805 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM);
3806 /* Wait reset */
3807 this->wait(mtd, FL_RESETING);
3809 /* Restore system configuration 1 */
3810 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3812 /* Check manufacturer ID */
3813 if (onenand_check_maf(bram_maf_id))
3814 return -ENXIO;
3816 /* Read manufacturer and device IDs from Register */
3817 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
3818 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3820 /* Check OneNAND device */
3821 if (maf_id != bram_maf_id || dev_id != bram_dev_id)
3822 return -ENXIO;
3824 return 0;
3828 * onenand_probe - [OneNAND Interface] Probe the OneNAND device
3829 * @param mtd MTD device structure
3831 static int onenand_probe(struct mtd_info *mtd)
3833 struct onenand_chip *this = mtd->priv;
3834 int dev_id, ver_id;
3835 int density;
3836 int ret;
3838 ret = this->chip_probe(mtd);
3839 if (ret)
3840 return ret;
3842 /* Device and version IDs from Register */
3843 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3844 ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
3845 this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
3847 /* Flash device information */
3848 onenand_print_device_info(dev_id, ver_id);
3849 this->device_id = dev_id;
3850 this->version_id = ver_id;
3852 /* Check OneNAND features */
3853 onenand_check_features(mtd);
3855 density = onenand_get_density(dev_id);
3856 if (FLEXONENAND(this)) {
3857 this->dies = ONENAND_IS_DDP(this) ? 2 : 1;
3858 /* Maximum possible erase regions */
3859 mtd->numeraseregions = this->dies << 1;
3860 mtd->eraseregions = kzalloc(sizeof(struct mtd_erase_region_info)
3861 * (this->dies << 1), GFP_KERNEL);
3862 if (!mtd->eraseregions)
3863 return -ENOMEM;
3867 * For Flex-OneNAND, chipsize represents maximum possible device size.
3868 * mtd->size represents the actual device size.
3870 this->chipsize = (16 << density) << 20;
3872 /* OneNAND page size & block size */
3873 /* The data buffer size is equal to page size */
3874 mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE);
3875 /* We use the full BufferRAM */
3876 if (ONENAND_IS_4KB_PAGE(this))
3877 mtd->writesize <<= 1;
3879 mtd->oobsize = mtd->writesize >> 5;
3880 /* Pages per a block are always 64 in OneNAND */
3881 mtd->erasesize = mtd->writesize << 6;
3883 * Flex-OneNAND SLC area has 64 pages per block.
3884 * Flex-OneNAND MLC area has 128 pages per block.
3885 * Expose MLC erase size to find erase_shift and page_mask.
3887 if (FLEXONENAND(this))
3888 mtd->erasesize <<= 1;
3890 this->erase_shift = ffs(mtd->erasesize) - 1;
3891 this->page_shift = ffs(mtd->writesize) - 1;
3892 this->page_mask = (1 << (this->erase_shift - this->page_shift)) - 1;
3893 /* Set density mask. it is used for DDP */
3894 if (ONENAND_IS_DDP(this))
3895 this->density_mask = this->chipsize >> (this->erase_shift + 1);
3896 /* It's real page size */
3897 this->writesize = mtd->writesize;
3899 /* REVISIT: Multichip handling */
3901 if (FLEXONENAND(this))
3902 flexonenand_get_size(mtd);
3903 else
3904 mtd->size = this->chipsize;
3907 * We emulate the 4KiB page and 256KiB erase block size
3908 * But oobsize is still 64 bytes.
3909 * It is only valid if you turn on 2X program support,
3910 * Otherwise it will be ignored by compiler.
3912 if (ONENAND_IS_2PLANE(this)) {
3913 mtd->writesize <<= 1;
3914 mtd->erasesize <<= 1;
3917 return 0;
3921 * onenand_suspend - [MTD Interface] Suspend the OneNAND flash
3922 * @param mtd MTD device structure
3924 static int onenand_suspend(struct mtd_info *mtd)
3926 return onenand_get_device(mtd, FL_PM_SUSPENDED);
3930 * onenand_resume - [MTD Interface] Resume the OneNAND flash
3931 * @param mtd MTD device structure
3933 static void onenand_resume(struct mtd_info *mtd)
3935 struct onenand_chip *this = mtd->priv;
3937 if (this->state == FL_PM_SUSPENDED)
3938 onenand_release_device(mtd);
3939 else
3940 printk(KERN_ERR "%s: resume() called for the chip which is not "
3941 "in suspended state\n", __func__);
3945 * onenand_scan - [OneNAND Interface] Scan for the OneNAND device
3946 * @param mtd MTD device structure
3947 * @param maxchips Number of chips to scan for
3949 * This fills out all the not initialized function pointers
3950 * with the defaults.
3951 * The flash ID is read and the mtd/chip structures are
3952 * filled with the appropriate values.
3954 int onenand_scan(struct mtd_info *mtd, int maxchips)
3956 int i, ret;
3957 struct onenand_chip *this = mtd->priv;
3959 if (!this->read_word)
3960 this->read_word = onenand_readw;
3961 if (!this->write_word)
3962 this->write_word = onenand_writew;
3964 if (!this->command)
3965 this->command = onenand_command;
3966 if (!this->wait)
3967 onenand_setup_wait(mtd);
3968 if (!this->bbt_wait)
3969 this->bbt_wait = onenand_bbt_wait;
3970 if (!this->unlock_all)
3971 this->unlock_all = onenand_unlock_all;
3973 if (!this->chip_probe)
3974 this->chip_probe = onenand_chip_probe;
3976 if (!this->read_bufferram)
3977 this->read_bufferram = onenand_read_bufferram;
3978 if (!this->write_bufferram)
3979 this->write_bufferram = onenand_write_bufferram;
3981 if (!this->block_markbad)
3982 this->block_markbad = onenand_default_block_markbad;
3983 if (!this->scan_bbt)
3984 this->scan_bbt = onenand_default_bbt;
3986 if (onenand_probe(mtd))
3987 return -ENXIO;
3989 /* Set Sync. Burst Read after probing */
3990 if (this->mmcontrol) {
3991 printk(KERN_INFO "OneNAND Sync. Burst Read support\n");
3992 this->read_bufferram = onenand_sync_read_bufferram;
3995 /* Allocate buffers, if necessary */
3996 if (!this->page_buf) {
3997 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3998 if (!this->page_buf) {
3999 printk(KERN_ERR "%s: Can't allocate page_buf\n",
4000 __func__);
4001 return -ENOMEM;
4003 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4004 this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL);
4005 if (!this->verify_buf) {
4006 kfree(this->page_buf);
4007 return -ENOMEM;
4009 #endif
4010 this->options |= ONENAND_PAGEBUF_ALLOC;
4012 if (!this->oob_buf) {
4013 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL);
4014 if (!this->oob_buf) {
4015 printk(KERN_ERR "%s: Can't allocate oob_buf\n",
4016 __func__);
4017 if (this->options & ONENAND_PAGEBUF_ALLOC) {
4018 this->options &= ~ONENAND_PAGEBUF_ALLOC;
4019 kfree(this->page_buf);
4021 return -ENOMEM;
4023 this->options |= ONENAND_OOBBUF_ALLOC;
4026 this->state = FL_READY;
4027 init_waitqueue_head(&this->wq);
4028 spin_lock_init(&this->chip_lock);
4031 * Allow subpage writes up to oobsize.
4033 switch (mtd->oobsize) {
4034 case 128:
4035 if (FLEXONENAND(this)) {
4036 this->ecclayout = &flexonenand_oob_128;
4037 mtd->subpage_sft = 0;
4038 } else {
4039 this->ecclayout = &onenand_oob_128;
4040 mtd->subpage_sft = 2;
4042 if (ONENAND_IS_NOP_1(this))
4043 mtd->subpage_sft = 0;
4044 break;
4045 case 64:
4046 this->ecclayout = &onenand_oob_64;
4047 mtd->subpage_sft = 2;
4048 break;
4050 case 32:
4051 this->ecclayout = &onenand_oob_32;
4052 mtd->subpage_sft = 1;
4053 break;
4055 default:
4056 printk(KERN_WARNING "%s: No OOB scheme defined for oobsize %d\n",
4057 __func__, mtd->oobsize);
4058 mtd->subpage_sft = 0;
4059 /* To prevent kernel oops */
4060 this->ecclayout = &onenand_oob_32;
4061 break;
4064 this->subpagesize = mtd->writesize >> mtd->subpage_sft;
4067 * The number of bytes available for a client to place data into
4068 * the out of band area
4070 this->ecclayout->oobavail = 0;
4071 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES &&
4072 this->ecclayout->oobfree[i].length; i++)
4073 this->ecclayout->oobavail +=
4074 this->ecclayout->oobfree[i].length;
4075 mtd->oobavail = this->ecclayout->oobavail;
4077 mtd->ecclayout = this->ecclayout;
4078 mtd->ecc_strength = 1;
4080 /* Fill in remaining MTD driver data */
4081 mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH;
4082 mtd->flags = MTD_CAP_NANDFLASH;
4083 mtd->_erase = onenand_erase;
4084 mtd->_point = NULL;
4085 mtd->_unpoint = NULL;
4086 mtd->_read = onenand_read;
4087 mtd->_write = onenand_write;
4088 mtd->_read_oob = onenand_read_oob;
4089 mtd->_write_oob = onenand_write_oob;
4090 mtd->_panic_write = onenand_panic_write;
4091 #ifdef CONFIG_MTD_ONENAND_OTP
4092 mtd->_get_fact_prot_info = onenand_get_fact_prot_info;
4093 mtd->_read_fact_prot_reg = onenand_read_fact_prot_reg;
4094 mtd->_get_user_prot_info = onenand_get_user_prot_info;
4095 mtd->_read_user_prot_reg = onenand_read_user_prot_reg;
4096 mtd->_write_user_prot_reg = onenand_write_user_prot_reg;
4097 mtd->_lock_user_prot_reg = onenand_lock_user_prot_reg;
4098 #endif
4099 mtd->_sync = onenand_sync;
4100 mtd->_lock = onenand_lock;
4101 mtd->_unlock = onenand_unlock;
4102 mtd->_suspend = onenand_suspend;
4103 mtd->_resume = onenand_resume;
4104 mtd->_block_isbad = onenand_block_isbad;
4105 mtd->_block_markbad = onenand_block_markbad;
4106 mtd->owner = THIS_MODULE;
4107 mtd->writebufsize = mtd->writesize;
4109 /* Unlock whole block */
4110 if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING))
4111 this->unlock_all(mtd);
4113 ret = this->scan_bbt(mtd);
4114 if ((!FLEXONENAND(this)) || ret)
4115 return ret;
4117 /* Change Flex-OneNAND boundaries if required */
4118 for (i = 0; i < MAX_DIES; i++)
4119 flexonenand_set_boundary(mtd, i, flex_bdry[2 * i],
4120 flex_bdry[(2 * i) + 1]);
4122 return 0;
4126 * onenand_release - [OneNAND Interface] Free resources held by the OneNAND device
4127 * @param mtd MTD device structure
4129 void onenand_release(struct mtd_info *mtd)
4131 struct onenand_chip *this = mtd->priv;
4133 /* Deregister partitions */
4134 mtd_device_unregister(mtd);
4136 /* Free bad block table memory, if allocated */
4137 if (this->bbm) {
4138 struct bbm_info *bbm = this->bbm;
4139 kfree(bbm->bbt);
4140 kfree(this->bbm);
4142 /* Buffers allocated by onenand_scan */
4143 if (this->options & ONENAND_PAGEBUF_ALLOC) {
4144 kfree(this->page_buf);
4145 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4146 kfree(this->verify_buf);
4147 #endif
4149 if (this->options & ONENAND_OOBBUF_ALLOC)
4150 kfree(this->oob_buf);
4151 kfree(mtd->eraseregions);
4154 EXPORT_SYMBOL_GPL(onenand_scan);
4155 EXPORT_SYMBOL_GPL(onenand_release);
4157 MODULE_LICENSE("GPL");
4158 MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
4159 MODULE_DESCRIPTION("Generic OneNAND flash driver code");