s390/ptrace: get rid of long longs in psw_bits
[linux/fpc-iii.git] / drivers / mtd / onenand / onenand_base.c
blob43b3392ffee7e255555d88948e4dbe2aa47867d2
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/sched.h>
28 #include <linux/delay.h>
29 #include <linux/interrupt.h>
30 #include <linux/jiffies.h>
31 #include <linux/mtd/mtd.h>
32 #include <linux/mtd/onenand.h>
33 #include <linux/mtd/partitions.h>
35 #include <asm/io.h>
38 * Multiblock erase if number of blocks to erase is 2 or more.
39 * Maximum number of blocks for simultaneous erase is 64.
41 #define MB_ERASE_MIN_BLK_COUNT 2
42 #define MB_ERASE_MAX_BLK_COUNT 64
44 /* Default Flex-OneNAND boundary and lock respectively */
45 static int flex_bdry[MAX_DIES * 2] = { -1, 0, -1, 0 };
47 module_param_array(flex_bdry, int, NULL, 0400);
48 MODULE_PARM_DESC(flex_bdry, "SLC Boundary information for Flex-OneNAND"
49 "Syntax:flex_bdry=DIE_BDRY,LOCK,..."
50 "DIE_BDRY: SLC boundary of the die"
51 "LOCK: Locking information for SLC boundary"
52 " : 0->Set boundary in unlocked status"
53 " : 1->Set boundary in locked status");
55 /* Default OneNAND/Flex-OneNAND OTP options*/
56 static int otp;
58 module_param(otp, int, 0400);
59 MODULE_PARM_DESC(otp, "Corresponding behaviour of OneNAND in OTP"
60 "Syntax : otp=LOCK_TYPE"
61 "LOCK_TYPE : Keys issued, for specific OTP Lock type"
62 " : 0 -> Default (No Blocks Locked)"
63 " : 1 -> OTP Block lock"
64 " : 2 -> 1st Block lock"
65 " : 3 -> BOTH OTP Block and 1st Block lock");
68 * flexonenand_oob_128 - oob info for Flex-Onenand with 4KB page
69 * For now, we expose only 64 out of 80 ecc bytes
71 static struct nand_ecclayout flexonenand_oob_128 = {
72 .eccbytes = 64,
73 .eccpos = {
74 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
75 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
76 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
77 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
78 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
79 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
80 102, 103, 104, 105
82 .oobfree = {
83 {2, 4}, {18, 4}, {34, 4}, {50, 4},
84 {66, 4}, {82, 4}, {98, 4}, {114, 4}
89 * onenand_oob_128 - oob info for OneNAND with 4KB page
91 * Based on specification:
92 * 4Gb M-die OneNAND Flash (KFM4G16Q4M, KFN8G16Q4M). Rev. 1.3, Apr. 2010
94 * For eccpos we expose only 64 bytes out of 72 (see struct nand_ecclayout)
96 * oobfree uses the spare area fields marked as
97 * "Managed by internal ECC logic for Logical Sector Number area"
99 static struct nand_ecclayout onenand_oob_128 = {
100 .eccbytes = 64,
101 .eccpos = {
102 7, 8, 9, 10, 11, 12, 13, 14, 15,
103 23, 24, 25, 26, 27, 28, 29, 30, 31,
104 39, 40, 41, 42, 43, 44, 45, 46, 47,
105 55, 56, 57, 58, 59, 60, 61, 62, 63,
106 71, 72, 73, 74, 75, 76, 77, 78, 79,
107 87, 88, 89, 90, 91, 92, 93, 94, 95,
108 103, 104, 105, 106, 107, 108, 109, 110, 111,
111 .oobfree = {
112 {2, 3}, {18, 3}, {34, 3}, {50, 3},
113 {66, 3}, {82, 3}, {98, 3}, {114, 3}
118 * onenand_oob_64 - oob info for large (2KB) page
120 static struct nand_ecclayout onenand_oob_64 = {
121 .eccbytes = 20,
122 .eccpos = {
123 8, 9, 10, 11, 12,
124 24, 25, 26, 27, 28,
125 40, 41, 42, 43, 44,
126 56, 57, 58, 59, 60,
128 .oobfree = {
129 {2, 3}, {14, 2}, {18, 3}, {30, 2},
130 {34, 3}, {46, 2}, {50, 3}, {62, 2}
135 * onenand_oob_32 - oob info for middle (1KB) page
137 static struct nand_ecclayout onenand_oob_32 = {
138 .eccbytes = 10,
139 .eccpos = {
140 8, 9, 10, 11, 12,
141 24, 25, 26, 27, 28,
143 .oobfree = { {2, 3}, {14, 2}, {18, 3}, {30, 2} }
146 static const unsigned char ffchars[] = {
147 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
148 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 16 */
149 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
150 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 32 */
151 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
152 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 48 */
153 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
154 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 64 */
155 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
156 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 80 */
157 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
158 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 96 */
159 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
160 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 112 */
161 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
162 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 128 */
166 * onenand_readw - [OneNAND Interface] Read OneNAND register
167 * @param addr address to read
169 * Read OneNAND register
171 static unsigned short onenand_readw(void __iomem *addr)
173 return readw(addr);
177 * onenand_writew - [OneNAND Interface] Write OneNAND register with value
178 * @param value value to write
179 * @param addr address to write
181 * Write OneNAND register with value
183 static void onenand_writew(unsigned short value, void __iomem *addr)
185 writew(value, addr);
189 * onenand_block_address - [DEFAULT] Get block address
190 * @param this onenand chip data structure
191 * @param block the block
192 * @return translated block address if DDP, otherwise same
194 * Setup Start Address 1 Register (F100h)
196 static int onenand_block_address(struct onenand_chip *this, int block)
198 /* Device Flash Core select, NAND Flash Block Address */
199 if (block & this->density_mask)
200 return ONENAND_DDP_CHIP1 | (block ^ this->density_mask);
202 return block;
206 * onenand_bufferram_address - [DEFAULT] Get bufferram address
207 * @param this onenand chip data structure
208 * @param block the block
209 * @return set DBS value if DDP, otherwise 0
211 * Setup Start Address 2 Register (F101h) for DDP
213 static int onenand_bufferram_address(struct onenand_chip *this, int block)
215 /* Device BufferRAM Select */
216 if (block & this->density_mask)
217 return ONENAND_DDP_CHIP1;
219 return ONENAND_DDP_CHIP0;
223 * onenand_page_address - [DEFAULT] Get page address
224 * @param page the page address
225 * @param sector the sector address
226 * @return combined page and sector address
228 * Setup Start Address 8 Register (F107h)
230 static int onenand_page_address(int page, int sector)
232 /* Flash Page Address, Flash Sector Address */
233 int fpa, fsa;
235 fpa = page & ONENAND_FPA_MASK;
236 fsa = sector & ONENAND_FSA_MASK;
238 return ((fpa << ONENAND_FPA_SHIFT) | fsa);
242 * onenand_buffer_address - [DEFAULT] Get buffer address
243 * @param dataram1 DataRAM index
244 * @param sectors the sector address
245 * @param count the number of sectors
246 * @return the start buffer value
248 * Setup Start Buffer Register (F200h)
250 static int onenand_buffer_address(int dataram1, int sectors, int count)
252 int bsa, bsc;
254 /* BufferRAM Sector Address */
255 bsa = sectors & ONENAND_BSA_MASK;
257 if (dataram1)
258 bsa |= ONENAND_BSA_DATARAM1; /* DataRAM1 */
259 else
260 bsa |= ONENAND_BSA_DATARAM0; /* DataRAM0 */
262 /* BufferRAM Sector Count */
263 bsc = count & ONENAND_BSC_MASK;
265 return ((bsa << ONENAND_BSA_SHIFT) | bsc);
269 * flexonenand_block- For given address return block number
270 * @param this - OneNAND device structure
271 * @param addr - Address for which block number is needed
273 static unsigned flexonenand_block(struct onenand_chip *this, loff_t addr)
275 unsigned boundary, blk, die = 0;
277 if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) {
278 die = 1;
279 addr -= this->diesize[0];
282 boundary = this->boundary[die];
284 blk = addr >> (this->erase_shift - 1);
285 if (blk > boundary)
286 blk = (blk + boundary + 1) >> 1;
288 blk += die ? this->density_mask : 0;
289 return blk;
292 inline unsigned onenand_block(struct onenand_chip *this, loff_t addr)
294 if (!FLEXONENAND(this))
295 return addr >> this->erase_shift;
296 return flexonenand_block(this, addr);
300 * flexonenand_addr - Return address of the block
301 * @this: OneNAND device structure
302 * @block: Block number on Flex-OneNAND
304 * Return address of the block
306 static loff_t flexonenand_addr(struct onenand_chip *this, int block)
308 loff_t ofs = 0;
309 int die = 0, boundary;
311 if (ONENAND_IS_DDP(this) && block >= this->density_mask) {
312 block -= this->density_mask;
313 die = 1;
314 ofs = this->diesize[0];
317 boundary = this->boundary[die];
318 ofs += (loff_t)block << (this->erase_shift - 1);
319 if (block > (boundary + 1))
320 ofs += (loff_t)(block - boundary - 1) << (this->erase_shift - 1);
321 return ofs;
324 loff_t onenand_addr(struct onenand_chip *this, int block)
326 if (!FLEXONENAND(this))
327 return (loff_t)block << this->erase_shift;
328 return flexonenand_addr(this, block);
330 EXPORT_SYMBOL(onenand_addr);
333 * onenand_get_density - [DEFAULT] Get OneNAND density
334 * @param dev_id OneNAND device ID
336 * Get OneNAND density from device ID
338 static inline int onenand_get_density(int dev_id)
340 int density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT;
341 return (density & ONENAND_DEVICE_DENSITY_MASK);
345 * flexonenand_region - [Flex-OneNAND] Return erase region of addr
346 * @param mtd MTD device structure
347 * @param addr address whose erase region needs to be identified
349 int flexonenand_region(struct mtd_info *mtd, loff_t addr)
351 int i;
353 for (i = 0; i < mtd->numeraseregions; i++)
354 if (addr < mtd->eraseregions[i].offset)
355 break;
356 return i - 1;
358 EXPORT_SYMBOL(flexonenand_region);
361 * onenand_command - [DEFAULT] Send command to OneNAND device
362 * @param mtd MTD device structure
363 * @param cmd the command to be sent
364 * @param addr offset to read from or write to
365 * @param len number of bytes to read or write
367 * Send command to OneNAND device. This function is used for middle/large page
368 * devices (1KB/2KB Bytes per page)
370 static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t len)
372 struct onenand_chip *this = mtd->priv;
373 int value, block, page;
375 /* Address translation */
376 switch (cmd) {
377 case ONENAND_CMD_UNLOCK:
378 case ONENAND_CMD_LOCK:
379 case ONENAND_CMD_LOCK_TIGHT:
380 case ONENAND_CMD_UNLOCK_ALL:
381 block = -1;
382 page = -1;
383 break;
385 case FLEXONENAND_CMD_PI_ACCESS:
386 /* addr contains die index */
387 block = addr * this->density_mask;
388 page = -1;
389 break;
391 case ONENAND_CMD_ERASE:
392 case ONENAND_CMD_MULTIBLOCK_ERASE:
393 case ONENAND_CMD_ERASE_VERIFY:
394 case ONENAND_CMD_BUFFERRAM:
395 case ONENAND_CMD_OTP_ACCESS:
396 block = onenand_block(this, addr);
397 page = -1;
398 break;
400 case FLEXONENAND_CMD_READ_PI:
401 cmd = ONENAND_CMD_READ;
402 block = addr * this->density_mask;
403 page = 0;
404 break;
406 default:
407 block = onenand_block(this, addr);
408 if (FLEXONENAND(this))
409 page = (int) (addr - onenand_addr(this, block))>>\
410 this->page_shift;
411 else
412 page = (int) (addr >> this->page_shift);
413 if (ONENAND_IS_2PLANE(this)) {
414 /* Make the even block number */
415 block &= ~1;
416 /* Is it the odd plane? */
417 if (addr & this->writesize)
418 block++;
419 page >>= 1;
421 page &= this->page_mask;
422 break;
425 /* NOTE: The setting order of the registers is very important! */
426 if (cmd == ONENAND_CMD_BUFFERRAM) {
427 /* Select DataRAM for DDP */
428 value = onenand_bufferram_address(this, block);
429 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
431 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this))
432 /* It is always BufferRAM0 */
433 ONENAND_SET_BUFFERRAM0(this);
434 else
435 /* Switch to the next data buffer */
436 ONENAND_SET_NEXT_BUFFERRAM(this);
438 return 0;
441 if (block != -1) {
442 /* Write 'DFS, FBA' of Flash */
443 value = onenand_block_address(this, block);
444 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
446 /* Select DataRAM for DDP */
447 value = onenand_bufferram_address(this, block);
448 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
451 if (page != -1) {
452 /* Now we use page size operation */
453 int sectors = 0, count = 0;
454 int dataram;
456 switch (cmd) {
457 case FLEXONENAND_CMD_RECOVER_LSB:
458 case ONENAND_CMD_READ:
459 case ONENAND_CMD_READOOB:
460 if (ONENAND_IS_4KB_PAGE(this))
461 /* It is always BufferRAM0 */
462 dataram = ONENAND_SET_BUFFERRAM0(this);
463 else
464 dataram = ONENAND_SET_NEXT_BUFFERRAM(this);
465 break;
467 default:
468 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
469 cmd = ONENAND_CMD_2X_PROG;
470 dataram = ONENAND_CURRENT_BUFFERRAM(this);
471 break;
474 /* Write 'FPA, FSA' of Flash */
475 value = onenand_page_address(page, sectors);
476 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS8);
478 /* Write 'BSA, BSC' of DataRAM */
479 value = onenand_buffer_address(dataram, sectors, count);
480 this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
483 /* Interrupt clear */
484 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
486 /* Write command */
487 this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
489 return 0;
493 * onenand_read_ecc - return ecc status
494 * @param this onenand chip structure
496 static inline int onenand_read_ecc(struct onenand_chip *this)
498 int ecc, i, result = 0;
500 if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this))
501 return this->read_word(this->base + ONENAND_REG_ECC_STATUS);
503 for (i = 0; i < 4; i++) {
504 ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS + i*2);
505 if (likely(!ecc))
506 continue;
507 if (ecc & FLEXONENAND_UNCORRECTABLE_ERROR)
508 return ONENAND_ECC_2BIT_ALL;
509 else
510 result = ONENAND_ECC_1BIT_ALL;
513 return result;
517 * onenand_wait - [DEFAULT] wait until the command is done
518 * @param mtd MTD device structure
519 * @param state state to select the max. timeout value
521 * Wait for command done. This applies to all OneNAND command
522 * Read can take up to 30us, erase up to 2ms and program up to 350us
523 * according to general OneNAND specs
525 static int onenand_wait(struct mtd_info *mtd, int state)
527 struct onenand_chip * this = mtd->priv;
528 unsigned long timeout;
529 unsigned int flags = ONENAND_INT_MASTER;
530 unsigned int interrupt = 0;
531 unsigned int ctrl;
533 /* The 20 msec is enough */
534 timeout = jiffies + msecs_to_jiffies(20);
535 while (time_before(jiffies, timeout)) {
536 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
538 if (interrupt & flags)
539 break;
541 if (state != FL_READING && state != FL_PREPARING_ERASE)
542 cond_resched();
544 /* To get correct interrupt status in timeout case */
545 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
547 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
550 * In the Spec. it checks the controller status first
551 * However if you get the correct information in case of
552 * power off recovery (POR) test, it should read ECC status first
554 if (interrupt & ONENAND_INT_READ) {
555 int ecc = onenand_read_ecc(this);
556 if (ecc) {
557 if (ecc & ONENAND_ECC_2BIT_ALL) {
558 printk(KERN_ERR "%s: ECC error = 0x%04x\n",
559 __func__, ecc);
560 mtd->ecc_stats.failed++;
561 return -EBADMSG;
562 } else if (ecc & ONENAND_ECC_1BIT_ALL) {
563 printk(KERN_DEBUG "%s: correctable ECC error = 0x%04x\n",
564 __func__, ecc);
565 mtd->ecc_stats.corrected++;
568 } else if (state == FL_READING) {
569 printk(KERN_ERR "%s: read timeout! ctrl=0x%04x intr=0x%04x\n",
570 __func__, ctrl, interrupt);
571 return -EIO;
574 if (state == FL_PREPARING_ERASE && !(interrupt & ONENAND_INT_ERASE)) {
575 printk(KERN_ERR "%s: mb erase timeout! ctrl=0x%04x intr=0x%04x\n",
576 __func__, ctrl, interrupt);
577 return -EIO;
580 if (!(interrupt & ONENAND_INT_MASTER)) {
581 printk(KERN_ERR "%s: timeout! ctrl=0x%04x intr=0x%04x\n",
582 __func__, ctrl, interrupt);
583 return -EIO;
586 /* If there's controller error, it's a real error */
587 if (ctrl & ONENAND_CTRL_ERROR) {
588 printk(KERN_ERR "%s: controller error = 0x%04x\n",
589 __func__, ctrl);
590 if (ctrl & ONENAND_CTRL_LOCK)
591 printk(KERN_ERR "%s: it's locked error.\n", __func__);
592 return -EIO;
595 return 0;
599 * onenand_interrupt - [DEFAULT] onenand interrupt handler
600 * @param irq onenand interrupt number
601 * @param dev_id interrupt data
603 * complete the work
605 static irqreturn_t onenand_interrupt(int irq, void *data)
607 struct onenand_chip *this = data;
609 /* To handle shared interrupt */
610 if (!this->complete.done)
611 complete(&this->complete);
613 return IRQ_HANDLED;
617 * onenand_interrupt_wait - [DEFAULT] wait until the command is done
618 * @param mtd MTD device structure
619 * @param state state to select the max. timeout value
621 * Wait for command done.
623 static int onenand_interrupt_wait(struct mtd_info *mtd, int state)
625 struct onenand_chip *this = mtd->priv;
627 wait_for_completion(&this->complete);
629 return onenand_wait(mtd, state);
633 * onenand_try_interrupt_wait - [DEFAULT] try interrupt wait
634 * @param mtd MTD device structure
635 * @param state state to select the max. timeout value
637 * Try interrupt based wait (It is used one-time)
639 static int onenand_try_interrupt_wait(struct mtd_info *mtd, int state)
641 struct onenand_chip *this = mtd->priv;
642 unsigned long remain, timeout;
644 /* We use interrupt wait first */
645 this->wait = onenand_interrupt_wait;
647 timeout = msecs_to_jiffies(100);
648 remain = wait_for_completion_timeout(&this->complete, timeout);
649 if (!remain) {
650 printk(KERN_INFO "OneNAND: There's no interrupt. "
651 "We use the normal wait\n");
653 /* Release the irq */
654 free_irq(this->irq, this);
656 this->wait = onenand_wait;
659 return onenand_wait(mtd, state);
663 * onenand_setup_wait - [OneNAND Interface] setup onenand wait method
664 * @param mtd MTD device structure
666 * There's two method to wait onenand work
667 * 1. polling - read interrupt status register
668 * 2. interrupt - use the kernel interrupt method
670 static void onenand_setup_wait(struct mtd_info *mtd)
672 struct onenand_chip *this = mtd->priv;
673 int syscfg;
675 init_completion(&this->complete);
677 if (this->irq <= 0) {
678 this->wait = onenand_wait;
679 return;
682 if (request_irq(this->irq, &onenand_interrupt,
683 IRQF_SHARED, "onenand", this)) {
684 /* If we can't get irq, use the normal wait */
685 this->wait = onenand_wait;
686 return;
689 /* Enable interrupt */
690 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
691 syscfg |= ONENAND_SYS_CFG1_IOBE;
692 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
694 this->wait = onenand_try_interrupt_wait;
698 * onenand_bufferram_offset - [DEFAULT] BufferRAM offset
699 * @param mtd MTD data structure
700 * @param area BufferRAM area
701 * @return offset given area
703 * Return BufferRAM offset given area
705 static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area)
707 struct onenand_chip *this = mtd->priv;
709 if (ONENAND_CURRENT_BUFFERRAM(this)) {
710 /* Note: the 'this->writesize' is a real page size */
711 if (area == ONENAND_DATARAM)
712 return this->writesize;
713 if (area == ONENAND_SPARERAM)
714 return mtd->oobsize;
717 return 0;
721 * onenand_read_bufferram - [OneNAND Interface] Read the bufferram area
722 * @param mtd MTD data structure
723 * @param area BufferRAM area
724 * @param buffer the databuffer to put/get data
725 * @param offset offset to read from or write to
726 * @param count number of bytes to read/write
728 * Read the BufferRAM area
730 static int onenand_read_bufferram(struct mtd_info *mtd, int area,
731 unsigned char *buffer, int offset, size_t count)
733 struct onenand_chip *this = mtd->priv;
734 void __iomem *bufferram;
736 bufferram = this->base + area;
738 bufferram += onenand_bufferram_offset(mtd, area);
740 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
741 unsigned short word;
743 /* Align with word(16-bit) size */
744 count--;
746 /* Read word and save byte */
747 word = this->read_word(bufferram + offset + count);
748 buffer[count] = (word & 0xff);
751 memcpy(buffer, bufferram + offset, count);
753 return 0;
757 * onenand_sync_read_bufferram - [OneNAND Interface] Read the bufferram area with Sync. Burst mode
758 * @param mtd MTD data structure
759 * @param area BufferRAM area
760 * @param buffer the databuffer to put/get data
761 * @param offset offset to read from or write to
762 * @param count number of bytes to read/write
764 * Read the BufferRAM area with Sync. Burst Mode
766 static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area,
767 unsigned char *buffer, int offset, size_t count)
769 struct onenand_chip *this = mtd->priv;
770 void __iomem *bufferram;
772 bufferram = this->base + area;
774 bufferram += onenand_bufferram_offset(mtd, area);
776 this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
778 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
779 unsigned short word;
781 /* Align with word(16-bit) size */
782 count--;
784 /* Read word and save byte */
785 word = this->read_word(bufferram + offset + count);
786 buffer[count] = (word & 0xff);
789 memcpy(buffer, bufferram + offset, count);
791 this->mmcontrol(mtd, 0);
793 return 0;
797 * onenand_write_bufferram - [OneNAND Interface] Write the bufferram area
798 * @param mtd MTD data structure
799 * @param area BufferRAM area
800 * @param buffer the databuffer to put/get data
801 * @param offset offset to read from or write to
802 * @param count number of bytes to read/write
804 * Write the BufferRAM area
806 static int onenand_write_bufferram(struct mtd_info *mtd, int area,
807 const unsigned char *buffer, int offset, size_t count)
809 struct onenand_chip *this = mtd->priv;
810 void __iomem *bufferram;
812 bufferram = this->base + area;
814 bufferram += onenand_bufferram_offset(mtd, area);
816 if (ONENAND_CHECK_BYTE_ACCESS(count)) {
817 unsigned short word;
818 int byte_offset;
820 /* Align with word(16-bit) size */
821 count--;
823 /* Calculate byte access offset */
824 byte_offset = offset + count;
826 /* Read word and save byte */
827 word = this->read_word(bufferram + byte_offset);
828 word = (word & ~0xff) | buffer[count];
829 this->write_word(word, bufferram + byte_offset);
832 memcpy(bufferram + offset, buffer, count);
834 return 0;
838 * onenand_get_2x_blockpage - [GENERIC] Get blockpage at 2x program mode
839 * @param mtd MTD data structure
840 * @param addr address to check
841 * @return blockpage address
843 * Get blockpage address at 2x program mode
845 static int onenand_get_2x_blockpage(struct mtd_info *mtd, loff_t addr)
847 struct onenand_chip *this = mtd->priv;
848 int blockpage, block, page;
850 /* Calculate the even block number */
851 block = (int) (addr >> this->erase_shift) & ~1;
852 /* Is it the odd plane? */
853 if (addr & this->writesize)
854 block++;
855 page = (int) (addr >> (this->page_shift + 1)) & this->page_mask;
856 blockpage = (block << 7) | page;
858 return blockpage;
862 * onenand_check_bufferram - [GENERIC] Check BufferRAM information
863 * @param mtd MTD data structure
864 * @param addr address to check
865 * @return 1 if there are valid data, otherwise 0
867 * Check bufferram if there is data we required
869 static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
871 struct onenand_chip *this = mtd->priv;
872 int blockpage, found = 0;
873 unsigned int i;
875 if (ONENAND_IS_2PLANE(this))
876 blockpage = onenand_get_2x_blockpage(mtd, addr);
877 else
878 blockpage = (int) (addr >> this->page_shift);
880 /* Is there valid data? */
881 i = ONENAND_CURRENT_BUFFERRAM(this);
882 if (this->bufferram[i].blockpage == blockpage)
883 found = 1;
884 else {
885 /* Check another BufferRAM */
886 i = ONENAND_NEXT_BUFFERRAM(this);
887 if (this->bufferram[i].blockpage == blockpage) {
888 ONENAND_SET_NEXT_BUFFERRAM(this);
889 found = 1;
893 if (found && ONENAND_IS_DDP(this)) {
894 /* Select DataRAM for DDP */
895 int block = onenand_block(this, addr);
896 int value = onenand_bufferram_address(this, block);
897 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
900 return found;
904 * onenand_update_bufferram - [GENERIC] Update BufferRAM information
905 * @param mtd MTD data structure
906 * @param addr address to update
907 * @param valid valid flag
909 * Update BufferRAM information
911 static void onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
912 int valid)
914 struct onenand_chip *this = mtd->priv;
915 int blockpage;
916 unsigned int i;
918 if (ONENAND_IS_2PLANE(this))
919 blockpage = onenand_get_2x_blockpage(mtd, addr);
920 else
921 blockpage = (int) (addr >> this->page_shift);
923 /* Invalidate another BufferRAM */
924 i = ONENAND_NEXT_BUFFERRAM(this);
925 if (this->bufferram[i].blockpage == blockpage)
926 this->bufferram[i].blockpage = -1;
928 /* Update BufferRAM */
929 i = ONENAND_CURRENT_BUFFERRAM(this);
930 if (valid)
931 this->bufferram[i].blockpage = blockpage;
932 else
933 this->bufferram[i].blockpage = -1;
937 * onenand_invalidate_bufferram - [GENERIC] Invalidate BufferRAM information
938 * @param mtd MTD data structure
939 * @param addr start address to invalidate
940 * @param len length to invalidate
942 * Invalidate BufferRAM information
944 static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr,
945 unsigned int len)
947 struct onenand_chip *this = mtd->priv;
948 int i;
949 loff_t end_addr = addr + len;
951 /* Invalidate BufferRAM */
952 for (i = 0; i < MAX_BUFFERRAM; i++) {
953 loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift;
954 if (buf_addr >= addr && buf_addr < end_addr)
955 this->bufferram[i].blockpage = -1;
960 * onenand_get_device - [GENERIC] Get chip for selected access
961 * @param mtd MTD device structure
962 * @param new_state the state which is requested
964 * Get the device and lock it for exclusive access
966 static int onenand_get_device(struct mtd_info *mtd, int new_state)
968 struct onenand_chip *this = mtd->priv;
969 DECLARE_WAITQUEUE(wait, current);
972 * Grab the lock and see if the device is available
974 while (1) {
975 spin_lock(&this->chip_lock);
976 if (this->state == FL_READY) {
977 this->state = new_state;
978 spin_unlock(&this->chip_lock);
979 if (new_state != FL_PM_SUSPENDED && this->enable)
980 this->enable(mtd);
981 break;
983 if (new_state == FL_PM_SUSPENDED) {
984 spin_unlock(&this->chip_lock);
985 return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
987 set_current_state(TASK_UNINTERRUPTIBLE);
988 add_wait_queue(&this->wq, &wait);
989 spin_unlock(&this->chip_lock);
990 schedule();
991 remove_wait_queue(&this->wq, &wait);
994 return 0;
998 * onenand_release_device - [GENERIC] release chip
999 * @param mtd MTD device structure
1001 * Deselect, release chip lock and wake up anyone waiting on the device
1003 static void onenand_release_device(struct mtd_info *mtd)
1005 struct onenand_chip *this = mtd->priv;
1007 if (this->state != FL_PM_SUSPENDED && this->disable)
1008 this->disable(mtd);
1009 /* Release the chip */
1010 spin_lock(&this->chip_lock);
1011 this->state = FL_READY;
1012 wake_up(&this->wq);
1013 spin_unlock(&this->chip_lock);
1017 * onenand_transfer_auto_oob - [INTERN] oob auto-placement transfer
1018 * @param mtd MTD device structure
1019 * @param buf destination address
1020 * @param column oob offset to read from
1021 * @param thislen oob length to read
1023 static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int column,
1024 int thislen)
1026 struct onenand_chip *this = mtd->priv;
1027 struct nand_oobfree *free;
1028 int readcol = column;
1029 int readend = column + thislen;
1030 int lastgap = 0;
1031 unsigned int i;
1032 uint8_t *oob_buf = this->oob_buf;
1034 free = this->ecclayout->oobfree;
1035 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1036 if (readcol >= lastgap)
1037 readcol += free->offset - lastgap;
1038 if (readend >= lastgap)
1039 readend += free->offset - lastgap;
1040 lastgap = free->offset + free->length;
1042 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1043 free = this->ecclayout->oobfree;
1044 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1045 int free_end = free->offset + free->length;
1046 if (free->offset < readend && free_end > readcol) {
1047 int st = max_t(int,free->offset,readcol);
1048 int ed = min_t(int,free_end,readend);
1049 int n = ed - st;
1050 memcpy(buf, oob_buf + st, n);
1051 buf += n;
1052 } else if (column == 0)
1053 break;
1055 return 0;
1059 * onenand_recover_lsb - [Flex-OneNAND] Recover LSB page data
1060 * @param mtd MTD device structure
1061 * @param addr address to recover
1062 * @param status return value from onenand_wait / onenand_bbt_wait
1064 * MLC NAND Flash cell has paired pages - LSB page and MSB page. LSB page has
1065 * lower page address and MSB page has higher page address in paired pages.
1066 * If power off occurs during MSB page program, the paired LSB page data can
1067 * become corrupt. LSB page recovery read is a way to read LSB page though page
1068 * data are corrupted. When uncorrectable error occurs as a result of LSB page
1069 * read after power up, issue LSB page recovery read.
1071 static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status)
1073 struct onenand_chip *this = mtd->priv;
1074 int i;
1076 /* Recovery is only for Flex-OneNAND */
1077 if (!FLEXONENAND(this))
1078 return status;
1080 /* check if we failed due to uncorrectable error */
1081 if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR)
1082 return status;
1084 /* check if address lies in MLC region */
1085 i = flexonenand_region(mtd, addr);
1086 if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift))
1087 return status;
1089 /* We are attempting to reread, so decrement stats.failed
1090 * which was incremented by onenand_wait due to read failure
1092 printk(KERN_INFO "%s: Attempting to recover from uncorrectable read\n",
1093 __func__);
1094 mtd->ecc_stats.failed--;
1096 /* Issue the LSB page recovery command */
1097 this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize);
1098 return this->wait(mtd, FL_READING);
1102 * onenand_mlc_read_ops_nolock - MLC OneNAND read main and/or out-of-band
1103 * @param mtd MTD device structure
1104 * @param from offset to read from
1105 * @param ops: oob operation description structure
1107 * MLC OneNAND / Flex-OneNAND has 4KB page size and 4KB dataram.
1108 * So, read-while-load is not present.
1110 static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1111 struct mtd_oob_ops *ops)
1113 struct onenand_chip *this = mtd->priv;
1114 struct mtd_ecc_stats stats;
1115 size_t len = ops->len;
1116 size_t ooblen = ops->ooblen;
1117 u_char *buf = ops->datbuf;
1118 u_char *oobbuf = ops->oobbuf;
1119 int read = 0, column, thislen;
1120 int oobread = 0, oobcolumn, thisooblen, oobsize;
1121 int ret = 0;
1122 int writesize = this->writesize;
1124 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1125 (int)len);
1127 if (ops->mode == MTD_OPS_AUTO_OOB)
1128 oobsize = this->ecclayout->oobavail;
1129 else
1130 oobsize = mtd->oobsize;
1132 oobcolumn = from & (mtd->oobsize - 1);
1134 /* Do not allow reads past end of device */
1135 if (from + len > mtd->size) {
1136 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1137 __func__);
1138 ops->retlen = 0;
1139 ops->oobretlen = 0;
1140 return -EINVAL;
1143 stats = mtd->ecc_stats;
1145 while (read < len) {
1146 cond_resched();
1148 thislen = min_t(int, writesize, len - read);
1150 column = from & (writesize - 1);
1151 if (column + thislen > writesize)
1152 thislen = writesize - column;
1154 if (!onenand_check_bufferram(mtd, from)) {
1155 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1157 ret = this->wait(mtd, FL_READING);
1158 if (unlikely(ret))
1159 ret = onenand_recover_lsb(mtd, from, ret);
1160 onenand_update_bufferram(mtd, from, !ret);
1161 if (mtd_is_eccerr(ret))
1162 ret = 0;
1163 if (ret)
1164 break;
1167 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1168 if (oobbuf) {
1169 thisooblen = oobsize - oobcolumn;
1170 thisooblen = min_t(int, thisooblen, ooblen - oobread);
1172 if (ops->mode == MTD_OPS_AUTO_OOB)
1173 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1174 else
1175 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1176 oobread += thisooblen;
1177 oobbuf += thisooblen;
1178 oobcolumn = 0;
1181 read += thislen;
1182 if (read == len)
1183 break;
1185 from += thislen;
1186 buf += thislen;
1190 * Return success, if no ECC failures, else -EBADMSG
1191 * fs driver will take care of that, because
1192 * retlen == desired len and result == -EBADMSG
1194 ops->retlen = read;
1195 ops->oobretlen = oobread;
1197 if (ret)
1198 return ret;
1200 if (mtd->ecc_stats.failed - stats.failed)
1201 return -EBADMSG;
1203 /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1204 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1208 * onenand_read_ops_nolock - [OneNAND Interface] OneNAND read main and/or out-of-band
1209 * @param mtd MTD device structure
1210 * @param from offset to read from
1211 * @param ops: oob operation description structure
1213 * OneNAND read main and/or out-of-band data
1215 static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1216 struct mtd_oob_ops *ops)
1218 struct onenand_chip *this = mtd->priv;
1219 struct mtd_ecc_stats stats;
1220 size_t len = ops->len;
1221 size_t ooblen = ops->ooblen;
1222 u_char *buf = ops->datbuf;
1223 u_char *oobbuf = ops->oobbuf;
1224 int read = 0, column, thislen;
1225 int oobread = 0, oobcolumn, thisooblen, oobsize;
1226 int ret = 0, boundary = 0;
1227 int writesize = this->writesize;
1229 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1230 (int)len);
1232 if (ops->mode == MTD_OPS_AUTO_OOB)
1233 oobsize = this->ecclayout->oobavail;
1234 else
1235 oobsize = mtd->oobsize;
1237 oobcolumn = from & (mtd->oobsize - 1);
1239 /* Do not allow reads past end of device */
1240 if ((from + len) > mtd->size) {
1241 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1242 __func__);
1243 ops->retlen = 0;
1244 ops->oobretlen = 0;
1245 return -EINVAL;
1248 stats = mtd->ecc_stats;
1250 /* Read-while-load method */
1252 /* Do first load to bufferRAM */
1253 if (read < len) {
1254 if (!onenand_check_bufferram(mtd, from)) {
1255 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1256 ret = this->wait(mtd, FL_READING);
1257 onenand_update_bufferram(mtd, from, !ret);
1258 if (mtd_is_eccerr(ret))
1259 ret = 0;
1263 thislen = min_t(int, writesize, len - read);
1264 column = from & (writesize - 1);
1265 if (column + thislen > writesize)
1266 thislen = writesize - column;
1268 while (!ret) {
1269 /* If there is more to load then start next load */
1270 from += thislen;
1271 if (read + thislen < len) {
1272 this->command(mtd, ONENAND_CMD_READ, from, writesize);
1274 * Chip boundary handling in DDP
1275 * Now we issued chip 1 read and pointed chip 1
1276 * bufferram so we have to point chip 0 bufferram.
1278 if (ONENAND_IS_DDP(this) &&
1279 unlikely(from == (this->chipsize >> 1))) {
1280 this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2);
1281 boundary = 1;
1282 } else
1283 boundary = 0;
1284 ONENAND_SET_PREV_BUFFERRAM(this);
1286 /* While load is going, read from last bufferRAM */
1287 this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1289 /* Read oob area if needed */
1290 if (oobbuf) {
1291 thisooblen = oobsize - oobcolumn;
1292 thisooblen = min_t(int, thisooblen, ooblen - oobread);
1294 if (ops->mode == MTD_OPS_AUTO_OOB)
1295 onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1296 else
1297 this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1298 oobread += thisooblen;
1299 oobbuf += thisooblen;
1300 oobcolumn = 0;
1303 /* See if we are done */
1304 read += thislen;
1305 if (read == len)
1306 break;
1307 /* Set up for next read from bufferRAM */
1308 if (unlikely(boundary))
1309 this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2);
1310 ONENAND_SET_NEXT_BUFFERRAM(this);
1311 buf += thislen;
1312 thislen = min_t(int, writesize, len - read);
1313 column = 0;
1314 cond_resched();
1315 /* Now wait for load */
1316 ret = this->wait(mtd, FL_READING);
1317 onenand_update_bufferram(mtd, from, !ret);
1318 if (mtd_is_eccerr(ret))
1319 ret = 0;
1323 * Return success, if no ECC failures, else -EBADMSG
1324 * fs driver will take care of that, because
1325 * retlen == desired len and result == -EBADMSG
1327 ops->retlen = read;
1328 ops->oobretlen = oobread;
1330 if (ret)
1331 return ret;
1333 if (mtd->ecc_stats.failed - stats.failed)
1334 return -EBADMSG;
1336 /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1337 return mtd->ecc_stats.corrected != stats.corrected ? 1 : 0;
1341 * onenand_read_oob_nolock - [MTD Interface] OneNAND read out-of-band
1342 * @param mtd MTD device structure
1343 * @param from offset to read from
1344 * @param ops: oob operation description structure
1346 * OneNAND read out-of-band data from the spare area
1348 static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
1349 struct mtd_oob_ops *ops)
1351 struct onenand_chip *this = mtd->priv;
1352 struct mtd_ecc_stats stats;
1353 int read = 0, thislen, column, oobsize;
1354 size_t len = ops->ooblen;
1355 unsigned int mode = ops->mode;
1356 u_char *buf = ops->oobbuf;
1357 int ret = 0, readcmd;
1359 from += ops->ooboffs;
1361 pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1362 (int)len);
1364 /* Initialize return length value */
1365 ops->oobretlen = 0;
1367 if (mode == MTD_OPS_AUTO_OOB)
1368 oobsize = this->ecclayout->oobavail;
1369 else
1370 oobsize = mtd->oobsize;
1372 column = from & (mtd->oobsize - 1);
1374 if (unlikely(column >= oobsize)) {
1375 printk(KERN_ERR "%s: Attempted to start read outside oob\n",
1376 __func__);
1377 return -EINVAL;
1380 /* Do not allow reads past end of device */
1381 if (unlikely(from >= mtd->size ||
1382 column + len > ((mtd->size >> this->page_shift) -
1383 (from >> this->page_shift)) * oobsize)) {
1384 printk(KERN_ERR "%s: Attempted to read beyond end of device\n",
1385 __func__);
1386 return -EINVAL;
1389 stats = mtd->ecc_stats;
1391 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1393 while (read < len) {
1394 cond_resched();
1396 thislen = oobsize - column;
1397 thislen = min_t(int, thislen, len);
1399 this->command(mtd, readcmd, from, mtd->oobsize);
1401 onenand_update_bufferram(mtd, from, 0);
1403 ret = this->wait(mtd, FL_READING);
1404 if (unlikely(ret))
1405 ret = onenand_recover_lsb(mtd, from, ret);
1407 if (ret && !mtd_is_eccerr(ret)) {
1408 printk(KERN_ERR "%s: read failed = 0x%x\n",
1409 __func__, ret);
1410 break;
1413 if (mode == MTD_OPS_AUTO_OOB)
1414 onenand_transfer_auto_oob(mtd, buf, column, thislen);
1415 else
1416 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1418 read += thislen;
1420 if (read == len)
1421 break;
1423 buf += thislen;
1425 /* Read more? */
1426 if (read < len) {
1427 /* Page size */
1428 from += mtd->writesize;
1429 column = 0;
1433 ops->oobretlen = read;
1435 if (ret)
1436 return ret;
1438 if (mtd->ecc_stats.failed - stats.failed)
1439 return -EBADMSG;
1441 return 0;
1445 * onenand_read - [MTD Interface] Read data from flash
1446 * @param mtd MTD device structure
1447 * @param from offset to read from
1448 * @param len number of bytes to read
1449 * @param retlen pointer to variable to store the number of read bytes
1450 * @param buf the databuffer to put data
1452 * Read with ecc
1454 static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len,
1455 size_t *retlen, u_char *buf)
1457 struct onenand_chip *this = mtd->priv;
1458 struct mtd_oob_ops ops = {
1459 .len = len,
1460 .ooblen = 0,
1461 .datbuf = buf,
1462 .oobbuf = NULL,
1464 int ret;
1466 onenand_get_device(mtd, FL_READING);
1467 ret = ONENAND_IS_4KB_PAGE(this) ?
1468 onenand_mlc_read_ops_nolock(mtd, from, &ops) :
1469 onenand_read_ops_nolock(mtd, from, &ops);
1470 onenand_release_device(mtd);
1472 *retlen = ops.retlen;
1473 return ret;
1477 * onenand_read_oob - [MTD Interface] Read main and/or out-of-band
1478 * @param mtd: MTD device structure
1479 * @param from: offset to read from
1480 * @param ops: oob operation description structure
1482 * Read main and/or out-of-band
1484 static int onenand_read_oob(struct mtd_info *mtd, loff_t from,
1485 struct mtd_oob_ops *ops)
1487 struct onenand_chip *this = mtd->priv;
1488 int ret;
1490 switch (ops->mode) {
1491 case MTD_OPS_PLACE_OOB:
1492 case MTD_OPS_AUTO_OOB:
1493 break;
1494 case MTD_OPS_RAW:
1495 /* Not implemented yet */
1496 default:
1497 return -EINVAL;
1500 onenand_get_device(mtd, FL_READING);
1501 if (ops->datbuf)
1502 ret = ONENAND_IS_4KB_PAGE(this) ?
1503 onenand_mlc_read_ops_nolock(mtd, from, ops) :
1504 onenand_read_ops_nolock(mtd, from, ops);
1505 else
1506 ret = onenand_read_oob_nolock(mtd, from, ops);
1507 onenand_release_device(mtd);
1509 return ret;
1513 * onenand_bbt_wait - [DEFAULT] wait until the command is done
1514 * @param mtd MTD device structure
1515 * @param state state to select the max. timeout value
1517 * Wait for command done.
1519 static int onenand_bbt_wait(struct mtd_info *mtd, int state)
1521 struct onenand_chip *this = mtd->priv;
1522 unsigned long timeout;
1523 unsigned int interrupt, ctrl, ecc, addr1, addr8;
1525 /* The 20 msec is enough */
1526 timeout = jiffies + msecs_to_jiffies(20);
1527 while (time_before(jiffies, timeout)) {
1528 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1529 if (interrupt & ONENAND_INT_MASTER)
1530 break;
1532 /* To get correct interrupt status in timeout case */
1533 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1534 ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
1535 addr1 = this->read_word(this->base + ONENAND_REG_START_ADDRESS1);
1536 addr8 = this->read_word(this->base + ONENAND_REG_START_ADDRESS8);
1538 if (interrupt & ONENAND_INT_READ) {
1539 ecc = onenand_read_ecc(this);
1540 if (ecc & ONENAND_ECC_2BIT_ALL) {
1541 printk(KERN_DEBUG "%s: ecc 0x%04x ctrl 0x%04x "
1542 "intr 0x%04x addr1 %#x addr8 %#x\n",
1543 __func__, ecc, ctrl, interrupt, addr1, addr8);
1544 return ONENAND_BBT_READ_ECC_ERROR;
1546 } else {
1547 printk(KERN_ERR "%s: read timeout! ctrl 0x%04x "
1548 "intr 0x%04x addr1 %#x addr8 %#x\n",
1549 __func__, ctrl, interrupt, addr1, addr8);
1550 return ONENAND_BBT_READ_FATAL_ERROR;
1553 /* Initial bad block case: 0x2400 or 0x0400 */
1554 if (ctrl & ONENAND_CTRL_ERROR) {
1555 printk(KERN_DEBUG "%s: ctrl 0x%04x intr 0x%04x addr1 %#x "
1556 "addr8 %#x\n", __func__, ctrl, interrupt, addr1, addr8);
1557 return ONENAND_BBT_READ_ERROR;
1560 return 0;
1564 * onenand_bbt_read_oob - [MTD Interface] OneNAND read out-of-band for bbt scan
1565 * @param mtd MTD device structure
1566 * @param from offset to read from
1567 * @param ops oob operation description structure
1569 * OneNAND read out-of-band data from the spare area for bbt scan
1571 int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
1572 struct mtd_oob_ops *ops)
1574 struct onenand_chip *this = mtd->priv;
1575 int read = 0, thislen, column;
1576 int ret = 0, readcmd;
1577 size_t len = ops->ooblen;
1578 u_char *buf = ops->oobbuf;
1580 pr_debug("%s: from = 0x%08x, len = %zi\n", __func__, (unsigned int)from,
1581 len);
1583 /* Initialize return value */
1584 ops->oobretlen = 0;
1586 /* Do not allow reads past end of device */
1587 if (unlikely((from + len) > mtd->size)) {
1588 printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1589 __func__);
1590 return ONENAND_BBT_READ_FATAL_ERROR;
1593 /* Grab the lock and see if the device is available */
1594 onenand_get_device(mtd, FL_READING);
1596 column = from & (mtd->oobsize - 1);
1598 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1600 while (read < len) {
1601 cond_resched();
1603 thislen = mtd->oobsize - column;
1604 thislen = min_t(int, thislen, len);
1606 this->command(mtd, readcmd, from, mtd->oobsize);
1608 onenand_update_bufferram(mtd, from, 0);
1610 ret = this->bbt_wait(mtd, FL_READING);
1611 if (unlikely(ret))
1612 ret = onenand_recover_lsb(mtd, from, ret);
1614 if (ret)
1615 break;
1617 this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1618 read += thislen;
1619 if (read == len)
1620 break;
1622 buf += thislen;
1624 /* Read more? */
1625 if (read < len) {
1626 /* Update Page size */
1627 from += this->writesize;
1628 column = 0;
1632 /* Deselect and wake up anyone waiting on the device */
1633 onenand_release_device(mtd);
1635 ops->oobretlen = read;
1636 return ret;
1639 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
1641 * onenand_verify_oob - [GENERIC] verify the oob contents after a write
1642 * @param mtd MTD device structure
1643 * @param buf the databuffer to verify
1644 * @param to offset to read from
1646 static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to)
1648 struct onenand_chip *this = mtd->priv;
1649 u_char *oob_buf = this->oob_buf;
1650 int status, i, readcmd;
1652 readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1654 this->command(mtd, readcmd, to, mtd->oobsize);
1655 onenand_update_bufferram(mtd, to, 0);
1656 status = this->wait(mtd, FL_READING);
1657 if (status)
1658 return status;
1660 this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1661 for (i = 0; i < mtd->oobsize; i++)
1662 if (buf[i] != 0xFF && buf[i] != oob_buf[i])
1663 return -EBADMSG;
1665 return 0;
1669 * onenand_verify - [GENERIC] verify the chip contents after a write
1670 * @param mtd MTD device structure
1671 * @param buf the databuffer to verify
1672 * @param addr offset to read from
1673 * @param len number of bytes to read and compare
1675 static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr, size_t len)
1677 struct onenand_chip *this = mtd->priv;
1678 int ret = 0;
1679 int thislen, column;
1681 column = addr & (this->writesize - 1);
1683 while (len != 0) {
1684 thislen = min_t(int, this->writesize - column, len);
1686 this->command(mtd, ONENAND_CMD_READ, addr, this->writesize);
1688 onenand_update_bufferram(mtd, addr, 0);
1690 ret = this->wait(mtd, FL_READING);
1691 if (ret)
1692 return ret;
1694 onenand_update_bufferram(mtd, addr, 1);
1696 this->read_bufferram(mtd, ONENAND_DATARAM, this->verify_buf, 0, mtd->writesize);
1698 if (memcmp(buf, this->verify_buf + column, thislen))
1699 return -EBADMSG;
1701 len -= thislen;
1702 buf += thislen;
1703 addr += thislen;
1704 column = 0;
1707 return 0;
1709 #else
1710 #define onenand_verify(...) (0)
1711 #define onenand_verify_oob(...) (0)
1712 #endif
1714 #define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
1716 static void onenand_panic_wait(struct mtd_info *mtd)
1718 struct onenand_chip *this = mtd->priv;
1719 unsigned int interrupt;
1720 int i;
1722 for (i = 0; i < 2000; i++) {
1723 interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1724 if (interrupt & ONENAND_INT_MASTER)
1725 break;
1726 udelay(10);
1731 * onenand_panic_write - [MTD Interface] write buffer to FLASH in a panic context
1732 * @param mtd MTD device structure
1733 * @param to offset to write to
1734 * @param len number of bytes to write
1735 * @param retlen pointer to variable to store the number of written bytes
1736 * @param buf the data to write
1738 * Write with ECC
1740 static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
1741 size_t *retlen, const u_char *buf)
1743 struct onenand_chip *this = mtd->priv;
1744 int column, subpage;
1745 int written = 0;
1747 if (this->state == FL_PM_SUSPENDED)
1748 return -EBUSY;
1750 /* Wait for any existing operation to clear */
1751 onenand_panic_wait(mtd);
1753 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1754 (int)len);
1756 /* Reject writes, which are not page aligned */
1757 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1758 printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1759 __func__);
1760 return -EINVAL;
1763 column = to & (mtd->writesize - 1);
1765 /* Loop until all data write */
1766 while (written < len) {
1767 int thislen = min_t(int, mtd->writesize - column, len - written);
1768 u_char *wbuf = (u_char *) buf;
1770 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1772 /* Partial page write */
1773 subpage = thislen < mtd->writesize;
1774 if (subpage) {
1775 memset(this->page_buf, 0xff, mtd->writesize);
1776 memcpy(this->page_buf + column, buf, thislen);
1777 wbuf = this->page_buf;
1780 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1781 this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize);
1783 this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);
1785 onenand_panic_wait(mtd);
1787 /* In partial page write we don't update bufferram */
1788 onenand_update_bufferram(mtd, to, !subpage);
1789 if (ONENAND_IS_2PLANE(this)) {
1790 ONENAND_SET_BUFFERRAM1(this);
1791 onenand_update_bufferram(mtd, to + this->writesize, !subpage);
1794 written += thislen;
1796 if (written == len)
1797 break;
1799 column = 0;
1800 to += thislen;
1801 buf += thislen;
1804 *retlen = written;
1805 return 0;
1809 * onenand_fill_auto_oob - [INTERN] oob auto-placement transfer
1810 * @param mtd MTD device structure
1811 * @param oob_buf oob buffer
1812 * @param buf source address
1813 * @param column oob offset to write to
1814 * @param thislen oob length to write
1816 static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
1817 const u_char *buf, int column, int thislen)
1819 struct onenand_chip *this = mtd->priv;
1820 struct nand_oobfree *free;
1821 int writecol = column;
1822 int writeend = column + thislen;
1823 int lastgap = 0;
1824 unsigned int i;
1826 free = this->ecclayout->oobfree;
1827 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1828 if (writecol >= lastgap)
1829 writecol += free->offset - lastgap;
1830 if (writeend >= lastgap)
1831 writeend += free->offset - lastgap;
1832 lastgap = free->offset + free->length;
1834 free = this->ecclayout->oobfree;
1835 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1836 int free_end = free->offset + free->length;
1837 if (free->offset < writeend && free_end > writecol) {
1838 int st = max_t(int,free->offset,writecol);
1839 int ed = min_t(int,free_end,writeend);
1840 int n = ed - st;
1841 memcpy(oob_buf + st, buf, n);
1842 buf += n;
1843 } else if (column == 0)
1844 break;
1846 return 0;
1850 * onenand_write_ops_nolock - [OneNAND Interface] write main and/or out-of-band
1851 * @param mtd MTD device structure
1852 * @param to offset to write to
1853 * @param ops oob operation description structure
1855 * Write main and/or oob with ECC
1857 static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
1858 struct mtd_oob_ops *ops)
1860 struct onenand_chip *this = mtd->priv;
1861 int written = 0, column, thislen = 0, subpage = 0;
1862 int prev = 0, prevlen = 0, prev_subpage = 0, first = 1;
1863 int oobwritten = 0, oobcolumn, thisooblen, oobsize;
1864 size_t len = ops->len;
1865 size_t ooblen = ops->ooblen;
1866 const u_char *buf = ops->datbuf;
1867 const u_char *oob = ops->oobbuf;
1868 u_char *oobbuf;
1869 int ret = 0, cmd;
1871 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1872 (int)len);
1874 /* Initialize retlen, in case of early exit */
1875 ops->retlen = 0;
1876 ops->oobretlen = 0;
1878 /* Reject writes, which are not page aligned */
1879 if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1880 printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1881 __func__);
1882 return -EINVAL;
1885 /* Check zero length */
1886 if (!len)
1887 return 0;
1889 if (ops->mode == MTD_OPS_AUTO_OOB)
1890 oobsize = this->ecclayout->oobavail;
1891 else
1892 oobsize = mtd->oobsize;
1894 oobcolumn = to & (mtd->oobsize - 1);
1896 column = to & (mtd->writesize - 1);
1898 /* Loop until all data write */
1899 while (1) {
1900 if (written < len) {
1901 u_char *wbuf = (u_char *) buf;
1903 thislen = min_t(int, mtd->writesize - column, len - written);
1904 thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten);
1906 cond_resched();
1908 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1910 /* Partial page write */
1911 subpage = thislen < mtd->writesize;
1912 if (subpage) {
1913 memset(this->page_buf, 0xff, mtd->writesize);
1914 memcpy(this->page_buf + column, buf, thislen);
1915 wbuf = this->page_buf;
1918 this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1920 if (oob) {
1921 oobbuf = this->oob_buf;
1923 /* We send data to spare ram with oobsize
1924 * to prevent byte access */
1925 memset(oobbuf, 0xff, mtd->oobsize);
1926 if (ops->mode == MTD_OPS_AUTO_OOB)
1927 onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
1928 else
1929 memcpy(oobbuf + oobcolumn, oob, thisooblen);
1931 oobwritten += thisooblen;
1932 oob += thisooblen;
1933 oobcolumn = 0;
1934 } else
1935 oobbuf = (u_char *) ffchars;
1937 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
1938 } else
1939 ONENAND_SET_NEXT_BUFFERRAM(this);
1942 * 2 PLANE, MLC, and Flex-OneNAND do not support
1943 * write-while-program feature.
1945 if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first) {
1946 ONENAND_SET_PREV_BUFFERRAM(this);
1948 ret = this->wait(mtd, FL_WRITING);
1950 /* In partial page write we don't update bufferram */
1951 onenand_update_bufferram(mtd, prev, !ret && !prev_subpage);
1952 if (ret) {
1953 written -= prevlen;
1954 printk(KERN_ERR "%s: write failed %d\n",
1955 __func__, ret);
1956 break;
1959 if (written == len) {
1960 /* Only check verify write turn on */
1961 ret = onenand_verify(mtd, buf - len, to - len, len);
1962 if (ret)
1963 printk(KERN_ERR "%s: verify failed %d\n",
1964 __func__, ret);
1965 break;
1968 ONENAND_SET_NEXT_BUFFERRAM(this);
1971 this->ongoing = 0;
1972 cmd = ONENAND_CMD_PROG;
1974 /* Exclude 1st OTP and OTP blocks for cache program feature */
1975 if (ONENAND_IS_CACHE_PROGRAM(this) &&
1976 likely(onenand_block(this, to) != 0) &&
1977 ONENAND_IS_4KB_PAGE(this) &&
1978 ((written + thislen) < len)) {
1979 cmd = ONENAND_CMD_2X_CACHE_PROG;
1980 this->ongoing = 1;
1983 this->command(mtd, cmd, to, mtd->writesize);
1986 * 2 PLANE, MLC, and Flex-OneNAND wait here
1988 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) {
1989 ret = this->wait(mtd, FL_WRITING);
1991 /* In partial page write we don't update bufferram */
1992 onenand_update_bufferram(mtd, to, !ret && !subpage);
1993 if (ret) {
1994 printk(KERN_ERR "%s: write failed %d\n",
1995 __func__, ret);
1996 break;
1999 /* Only check verify write turn on */
2000 ret = onenand_verify(mtd, buf, to, thislen);
2001 if (ret) {
2002 printk(KERN_ERR "%s: verify failed %d\n",
2003 __func__, ret);
2004 break;
2007 written += thislen;
2009 if (written == len)
2010 break;
2012 } else
2013 written += thislen;
2015 column = 0;
2016 prev_subpage = subpage;
2017 prev = to;
2018 prevlen = thislen;
2019 to += thislen;
2020 buf += thislen;
2021 first = 0;
2024 /* In error case, clear all bufferrams */
2025 if (written != len)
2026 onenand_invalidate_bufferram(mtd, 0, -1);
2028 ops->retlen = written;
2029 ops->oobretlen = oobwritten;
2031 return ret;
2036 * onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band
2037 * @param mtd MTD device structure
2038 * @param to offset to write to
2039 * @param len number of bytes to write
2040 * @param retlen pointer to variable to store the number of written bytes
2041 * @param buf the data to write
2042 * @param mode operation mode
2044 * OneNAND write out-of-band
2046 static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2047 struct mtd_oob_ops *ops)
2049 struct onenand_chip *this = mtd->priv;
2050 int column, ret = 0, oobsize;
2051 int written = 0, oobcmd;
2052 u_char *oobbuf;
2053 size_t len = ops->ooblen;
2054 const u_char *buf = ops->oobbuf;
2055 unsigned int mode = ops->mode;
2057 to += ops->ooboffs;
2059 pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
2060 (int)len);
2062 /* Initialize retlen, in case of early exit */
2063 ops->oobretlen = 0;
2065 if (mode == MTD_OPS_AUTO_OOB)
2066 oobsize = this->ecclayout->oobavail;
2067 else
2068 oobsize = mtd->oobsize;
2070 column = to & (mtd->oobsize - 1);
2072 if (unlikely(column >= oobsize)) {
2073 printk(KERN_ERR "%s: Attempted to start write outside oob\n",
2074 __func__);
2075 return -EINVAL;
2078 /* For compatibility with NAND: Do not allow write past end of page */
2079 if (unlikely(column + len > oobsize)) {
2080 printk(KERN_ERR "%s: Attempt to write past end of page\n",
2081 __func__);
2082 return -EINVAL;
2085 /* Do not allow reads past end of device */
2086 if (unlikely(to >= mtd->size ||
2087 column + len > ((mtd->size >> this->page_shift) -
2088 (to >> this->page_shift)) * oobsize)) {
2089 printk(KERN_ERR "%s: Attempted to write past end of device\n",
2090 __func__);
2091 return -EINVAL;
2094 oobbuf = this->oob_buf;
2096 oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB;
2098 /* Loop until all data write */
2099 while (written < len) {
2100 int thislen = min_t(int, oobsize, len - written);
2102 cond_resched();
2104 this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize);
2106 /* We send data to spare ram with oobsize
2107 * to prevent byte access */
2108 memset(oobbuf, 0xff, mtd->oobsize);
2109 if (mode == MTD_OPS_AUTO_OOB)
2110 onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
2111 else
2112 memcpy(oobbuf + column, buf, thislen);
2113 this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
2115 if (ONENAND_IS_4KB_PAGE(this)) {
2116 /* Set main area of DataRAM to 0xff*/
2117 memset(this->page_buf, 0xff, mtd->writesize);
2118 this->write_bufferram(mtd, ONENAND_DATARAM,
2119 this->page_buf, 0, mtd->writesize);
2122 this->command(mtd, oobcmd, to, mtd->oobsize);
2124 onenand_update_bufferram(mtd, to, 0);
2125 if (ONENAND_IS_2PLANE(this)) {
2126 ONENAND_SET_BUFFERRAM1(this);
2127 onenand_update_bufferram(mtd, to + this->writesize, 0);
2130 ret = this->wait(mtd, FL_WRITING);
2131 if (ret) {
2132 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2133 break;
2136 ret = onenand_verify_oob(mtd, oobbuf, to);
2137 if (ret) {
2138 printk(KERN_ERR "%s: verify failed %d\n",
2139 __func__, ret);
2140 break;
2143 written += thislen;
2144 if (written == len)
2145 break;
2147 to += mtd->writesize;
2148 buf += thislen;
2149 column = 0;
2152 ops->oobretlen = written;
2154 return ret;
2158 * onenand_write - [MTD Interface] write buffer to FLASH
2159 * @param mtd MTD device structure
2160 * @param to offset to write to
2161 * @param len number of bytes to write
2162 * @param retlen pointer to variable to store the number of written bytes
2163 * @param buf the data to write
2165 * Write with ECC
2167 static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len,
2168 size_t *retlen, const u_char *buf)
2170 struct mtd_oob_ops ops = {
2171 .len = len,
2172 .ooblen = 0,
2173 .datbuf = (u_char *) buf,
2174 .oobbuf = NULL,
2176 int ret;
2178 onenand_get_device(mtd, FL_WRITING);
2179 ret = onenand_write_ops_nolock(mtd, to, &ops);
2180 onenand_release_device(mtd);
2182 *retlen = ops.retlen;
2183 return ret;
2187 * onenand_write_oob - [MTD Interface] NAND write data and/or out-of-band
2188 * @param mtd: MTD device structure
2189 * @param to: offset to write
2190 * @param ops: oob operation description structure
2192 static int onenand_write_oob(struct mtd_info *mtd, loff_t to,
2193 struct mtd_oob_ops *ops)
2195 int ret;
2197 switch (ops->mode) {
2198 case MTD_OPS_PLACE_OOB:
2199 case MTD_OPS_AUTO_OOB:
2200 break;
2201 case MTD_OPS_RAW:
2202 /* Not implemented yet */
2203 default:
2204 return -EINVAL;
2207 onenand_get_device(mtd, FL_WRITING);
2208 if (ops->datbuf)
2209 ret = onenand_write_ops_nolock(mtd, to, ops);
2210 else
2211 ret = onenand_write_oob_nolock(mtd, to, ops);
2212 onenand_release_device(mtd);
2214 return ret;
2218 * onenand_block_isbad_nolock - [GENERIC] Check if a block is marked bad
2219 * @param mtd MTD device structure
2220 * @param ofs offset from device start
2221 * @param allowbbt 1, if its allowed to access the bbt area
2223 * Check, if the block is bad. Either by reading the bad block table or
2224 * calling of the scan function.
2226 static int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allowbbt)
2228 struct onenand_chip *this = mtd->priv;
2229 struct bbm_info *bbm = this->bbm;
2231 /* Return info from the table */
2232 return bbm->isbad_bbt(mtd, ofs, allowbbt);
2236 static int onenand_multiblock_erase_verify(struct mtd_info *mtd,
2237 struct erase_info *instr)
2239 struct onenand_chip *this = mtd->priv;
2240 loff_t addr = instr->addr;
2241 int len = instr->len;
2242 unsigned int block_size = (1 << this->erase_shift);
2243 int ret = 0;
2245 while (len) {
2246 this->command(mtd, ONENAND_CMD_ERASE_VERIFY, addr, block_size);
2247 ret = this->wait(mtd, FL_VERIFYING_ERASE);
2248 if (ret) {
2249 printk(KERN_ERR "%s: Failed verify, block %d\n",
2250 __func__, onenand_block(this, addr));
2251 instr->state = MTD_ERASE_FAILED;
2252 instr->fail_addr = addr;
2253 return -1;
2255 len -= block_size;
2256 addr += block_size;
2258 return 0;
2262 * onenand_multiblock_erase - [INTERN] erase block(s) using multiblock erase
2263 * @param mtd MTD device structure
2264 * @param instr erase instruction
2265 * @param region erase region
2267 * Erase one or more blocks up to 64 block at a time
2269 static int onenand_multiblock_erase(struct mtd_info *mtd,
2270 struct erase_info *instr,
2271 unsigned int block_size)
2273 struct onenand_chip *this = mtd->priv;
2274 loff_t addr = instr->addr;
2275 int len = instr->len;
2276 int eb_count = 0;
2277 int ret = 0;
2278 int bdry_block = 0;
2280 instr->state = MTD_ERASING;
2282 if (ONENAND_IS_DDP(this)) {
2283 loff_t bdry_addr = this->chipsize >> 1;
2284 if (addr < bdry_addr && (addr + len) > bdry_addr)
2285 bdry_block = bdry_addr >> this->erase_shift;
2288 /* Pre-check bbs */
2289 while (len) {
2290 /* Check if we have a bad block, we do not erase bad blocks */
2291 if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2292 printk(KERN_WARNING "%s: attempt to erase a bad block "
2293 "at addr 0x%012llx\n",
2294 __func__, (unsigned long long) addr);
2295 instr->state = MTD_ERASE_FAILED;
2296 return -EIO;
2298 len -= block_size;
2299 addr += block_size;
2302 len = instr->len;
2303 addr = instr->addr;
2305 /* loop over 64 eb batches */
2306 while (len) {
2307 struct erase_info verify_instr = *instr;
2308 int max_eb_count = MB_ERASE_MAX_BLK_COUNT;
2310 verify_instr.addr = addr;
2311 verify_instr.len = 0;
2313 /* do not cross chip boundary */
2314 if (bdry_block) {
2315 int this_block = (addr >> this->erase_shift);
2317 if (this_block < bdry_block) {
2318 max_eb_count = min(max_eb_count,
2319 (bdry_block - this_block));
2323 eb_count = 0;
2325 while (len > block_size && eb_count < (max_eb_count - 1)) {
2326 this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE,
2327 addr, block_size);
2328 onenand_invalidate_bufferram(mtd, addr, block_size);
2330 ret = this->wait(mtd, FL_PREPARING_ERASE);
2331 if (ret) {
2332 printk(KERN_ERR "%s: Failed multiblock erase, "
2333 "block %d\n", __func__,
2334 onenand_block(this, addr));
2335 instr->state = MTD_ERASE_FAILED;
2336 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2337 return -EIO;
2340 len -= block_size;
2341 addr += block_size;
2342 eb_count++;
2345 /* last block of 64-eb series */
2346 cond_resched();
2347 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2348 onenand_invalidate_bufferram(mtd, addr, block_size);
2350 ret = this->wait(mtd, FL_ERASING);
2351 /* Check if it is write protected */
2352 if (ret) {
2353 printk(KERN_ERR "%s: Failed erase, block %d\n",
2354 __func__, onenand_block(this, addr));
2355 instr->state = MTD_ERASE_FAILED;
2356 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2357 return -EIO;
2360 len -= block_size;
2361 addr += block_size;
2362 eb_count++;
2364 /* verify */
2365 verify_instr.len = eb_count * block_size;
2366 if (onenand_multiblock_erase_verify(mtd, &verify_instr)) {
2367 instr->state = verify_instr.state;
2368 instr->fail_addr = verify_instr.fail_addr;
2369 return -EIO;
2373 return 0;
2378 * onenand_block_by_block_erase - [INTERN] erase block(s) using regular erase
2379 * @param mtd MTD device structure
2380 * @param instr erase instruction
2381 * @param region erase region
2382 * @param block_size erase block size
2384 * Erase one or more blocks one block at a time
2386 static int onenand_block_by_block_erase(struct mtd_info *mtd,
2387 struct erase_info *instr,
2388 struct mtd_erase_region_info *region,
2389 unsigned int block_size)
2391 struct onenand_chip *this = mtd->priv;
2392 loff_t addr = instr->addr;
2393 int len = instr->len;
2394 loff_t region_end = 0;
2395 int ret = 0;
2397 if (region) {
2398 /* region is set for Flex-OneNAND */
2399 region_end = region->offset + region->erasesize * region->numblocks;
2402 instr->state = MTD_ERASING;
2404 /* Loop through the blocks */
2405 while (len) {
2406 cond_resched();
2408 /* Check if we have a bad block, we do not erase bad blocks */
2409 if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2410 printk(KERN_WARNING "%s: attempt to erase a bad block "
2411 "at addr 0x%012llx\n",
2412 __func__, (unsigned long long) addr);
2413 instr->state = MTD_ERASE_FAILED;
2414 return -EIO;
2417 this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2419 onenand_invalidate_bufferram(mtd, addr, block_size);
2421 ret = this->wait(mtd, FL_ERASING);
2422 /* Check, if it is write protected */
2423 if (ret) {
2424 printk(KERN_ERR "%s: Failed erase, block %d\n",
2425 __func__, onenand_block(this, addr));
2426 instr->state = MTD_ERASE_FAILED;
2427 instr->fail_addr = addr;
2428 return -EIO;
2431 len -= block_size;
2432 addr += block_size;
2434 if (region && addr == region_end) {
2435 if (!len)
2436 break;
2437 region++;
2439 block_size = region->erasesize;
2440 region_end = region->offset + region->erasesize * region->numblocks;
2442 if (len & (block_size - 1)) {
2443 /* FIXME: This should be handled at MTD partitioning level. */
2444 printk(KERN_ERR "%s: Unaligned address\n",
2445 __func__);
2446 return -EIO;
2450 return 0;
2454 * onenand_erase - [MTD Interface] erase block(s)
2455 * @param mtd MTD device structure
2456 * @param instr erase instruction
2458 * Erase one or more blocks
2460 static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
2462 struct onenand_chip *this = mtd->priv;
2463 unsigned int block_size;
2464 loff_t addr = instr->addr;
2465 loff_t len = instr->len;
2466 int ret = 0;
2467 struct mtd_erase_region_info *region = NULL;
2468 loff_t region_offset = 0;
2470 pr_debug("%s: start=0x%012llx, len=%llu\n", __func__,
2471 (unsigned long long)instr->addr,
2472 (unsigned long long)instr->len);
2474 if (FLEXONENAND(this)) {
2475 /* Find the eraseregion of this address */
2476 int i = flexonenand_region(mtd, addr);
2478 region = &mtd->eraseregions[i];
2479 block_size = region->erasesize;
2481 /* Start address within region must align on block boundary.
2482 * Erase region's start offset is always block start address.
2484 region_offset = region->offset;
2485 } else
2486 block_size = 1 << this->erase_shift;
2488 /* Start address must align on block boundary */
2489 if (unlikely((addr - region_offset) & (block_size - 1))) {
2490 printk(KERN_ERR "%s: Unaligned address\n", __func__);
2491 return -EINVAL;
2494 /* Length must align on block boundary */
2495 if (unlikely(len & (block_size - 1))) {
2496 printk(KERN_ERR "%s: Length not block aligned\n", __func__);
2497 return -EINVAL;
2500 /* Grab the lock and see if the device is available */
2501 onenand_get_device(mtd, FL_ERASING);
2503 if (ONENAND_IS_4KB_PAGE(this) || region ||
2504 instr->len < MB_ERASE_MIN_BLK_COUNT * block_size) {
2505 /* region is set for Flex-OneNAND (no mb erase) */
2506 ret = onenand_block_by_block_erase(mtd, instr,
2507 region, block_size);
2508 } else {
2509 ret = onenand_multiblock_erase(mtd, instr, block_size);
2512 /* Deselect and wake up anyone waiting on the device */
2513 onenand_release_device(mtd);
2515 /* Do call back function */
2516 if (!ret) {
2517 instr->state = MTD_ERASE_DONE;
2518 mtd_erase_callback(instr);
2521 return ret;
2525 * onenand_sync - [MTD Interface] sync
2526 * @param mtd MTD device structure
2528 * Sync is actually a wait for chip ready function
2530 static void onenand_sync(struct mtd_info *mtd)
2532 pr_debug("%s: called\n", __func__);
2534 /* Grab the lock and see if the device is available */
2535 onenand_get_device(mtd, FL_SYNCING);
2537 /* Release it and go back */
2538 onenand_release_device(mtd);
2542 * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
2543 * @param mtd MTD device structure
2544 * @param ofs offset relative to mtd start
2546 * Check whether the block is bad
2548 static int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs)
2550 int ret;
2552 onenand_get_device(mtd, FL_READING);
2553 ret = onenand_block_isbad_nolock(mtd, ofs, 0);
2554 onenand_release_device(mtd);
2555 return ret;
2559 * onenand_default_block_markbad - [DEFAULT] mark a block bad
2560 * @param mtd MTD device structure
2561 * @param ofs offset from device start
2563 * This is the default implementation, which can be overridden by
2564 * a hardware specific driver.
2566 static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
2568 struct onenand_chip *this = mtd->priv;
2569 struct bbm_info *bbm = this->bbm;
2570 u_char buf[2] = {0, 0};
2571 struct mtd_oob_ops ops = {
2572 .mode = MTD_OPS_PLACE_OOB,
2573 .ooblen = 2,
2574 .oobbuf = buf,
2575 .ooboffs = 0,
2577 int block;
2579 /* Get block number */
2580 block = onenand_block(this, ofs);
2581 if (bbm->bbt)
2582 bbm->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
2584 /* We write two bytes, so we don't have to mess with 16-bit access */
2585 ofs += mtd->oobsize + (bbm->badblockpos & ~0x01);
2586 /* FIXME : What to do when marking SLC block in partition
2587 * with MLC erasesize? For now, it is not advisable to
2588 * create partitions containing both SLC and MLC regions.
2590 return onenand_write_oob_nolock(mtd, ofs, &ops);
2594 * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
2595 * @param mtd MTD device structure
2596 * @param ofs offset relative to mtd start
2598 * Mark the block as bad
2600 static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
2602 int ret;
2604 ret = onenand_block_isbad(mtd, ofs);
2605 if (ret) {
2606 /* If it was bad already, return success and do nothing */
2607 if (ret > 0)
2608 return 0;
2609 return ret;
2612 onenand_get_device(mtd, FL_WRITING);
2613 ret = mtd_block_markbad(mtd, ofs);
2614 onenand_release_device(mtd);
2615 return ret;
2619 * onenand_do_lock_cmd - [OneNAND Interface] Lock or unlock block(s)
2620 * @param mtd MTD device structure
2621 * @param ofs offset relative to mtd start
2622 * @param len number of bytes to lock or unlock
2623 * @param cmd lock or unlock command
2625 * Lock or unlock one or more blocks
2627 static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int cmd)
2629 struct onenand_chip *this = mtd->priv;
2630 int start, end, block, value, status;
2631 int wp_status_mask;
2633 start = onenand_block(this, ofs);
2634 end = onenand_block(this, ofs + len) - 1;
2636 if (cmd == ONENAND_CMD_LOCK)
2637 wp_status_mask = ONENAND_WP_LS;
2638 else
2639 wp_status_mask = ONENAND_WP_US;
2641 /* Continuous lock scheme */
2642 if (this->options & ONENAND_HAS_CONT_LOCK) {
2643 /* Set start block address */
2644 this->write_word(start, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2645 /* Set end block address */
2646 this->write_word(end, this->base + ONENAND_REG_END_BLOCK_ADDRESS);
2647 /* Write lock command */
2648 this->command(mtd, cmd, 0, 0);
2650 /* There's no return value */
2651 this->wait(mtd, FL_LOCKING);
2653 /* Sanity check */
2654 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2655 & ONENAND_CTRL_ONGO)
2656 continue;
2658 /* Check lock status */
2659 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2660 if (!(status & wp_status_mask))
2661 printk(KERN_ERR "%s: wp status = 0x%x\n",
2662 __func__, status);
2664 return 0;
2667 /* Block lock scheme */
2668 for (block = start; block < end + 1; block++) {
2669 /* Set block address */
2670 value = onenand_block_address(this, block);
2671 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2672 /* Select DataRAM for DDP */
2673 value = onenand_bufferram_address(this, block);
2674 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2675 /* Set start block address */
2676 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2677 /* Write lock command */
2678 this->command(mtd, cmd, 0, 0);
2680 /* There's no return value */
2681 this->wait(mtd, FL_LOCKING);
2683 /* Sanity check */
2684 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2685 & ONENAND_CTRL_ONGO)
2686 continue;
2688 /* Check lock status */
2689 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2690 if (!(status & wp_status_mask))
2691 printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2692 __func__, block, status);
2695 return 0;
2699 * onenand_lock - [MTD Interface] Lock block(s)
2700 * @param mtd MTD device structure
2701 * @param ofs offset relative to mtd start
2702 * @param len number of bytes to unlock
2704 * Lock one or more blocks
2706 static int onenand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2708 int ret;
2710 onenand_get_device(mtd, FL_LOCKING);
2711 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK);
2712 onenand_release_device(mtd);
2713 return ret;
2717 * onenand_unlock - [MTD Interface] Unlock block(s)
2718 * @param mtd MTD device structure
2719 * @param ofs offset relative to mtd start
2720 * @param len number of bytes to unlock
2722 * Unlock one or more blocks
2724 static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2726 int ret;
2728 onenand_get_device(mtd, FL_LOCKING);
2729 ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2730 onenand_release_device(mtd);
2731 return ret;
2735 * onenand_check_lock_status - [OneNAND Interface] Check lock status
2736 * @param this onenand chip data structure
2738 * Check lock status
2740 static int onenand_check_lock_status(struct onenand_chip *this)
2742 unsigned int value, block, status;
2743 unsigned int end;
2745 end = this->chipsize >> this->erase_shift;
2746 for (block = 0; block < end; block++) {
2747 /* Set block address */
2748 value = onenand_block_address(this, block);
2749 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2750 /* Select DataRAM for DDP */
2751 value = onenand_bufferram_address(this, block);
2752 this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2753 /* Set start block address */
2754 this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2756 /* Check lock status */
2757 status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2758 if (!(status & ONENAND_WP_US)) {
2759 printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2760 __func__, block, status);
2761 return 0;
2765 return 1;
2769 * onenand_unlock_all - [OneNAND Interface] unlock all blocks
2770 * @param mtd MTD device structure
2772 * Unlock all blocks
2774 static void onenand_unlock_all(struct mtd_info *mtd)
2776 struct onenand_chip *this = mtd->priv;
2777 loff_t ofs = 0;
2778 loff_t len = mtd->size;
2780 if (this->options & ONENAND_HAS_UNLOCK_ALL) {
2781 /* Set start block address */
2782 this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2783 /* Write unlock command */
2784 this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0);
2786 /* There's no return value */
2787 this->wait(mtd, FL_LOCKING);
2789 /* Sanity check */
2790 while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2791 & ONENAND_CTRL_ONGO)
2792 continue;
2794 /* Don't check lock status */
2795 if (this->options & ONENAND_SKIP_UNLOCK_CHECK)
2796 return;
2798 /* Check lock status */
2799 if (onenand_check_lock_status(this))
2800 return;
2802 /* Workaround for all block unlock in DDP */
2803 if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) {
2804 /* All blocks on another chip */
2805 ofs = this->chipsize >> 1;
2806 len = this->chipsize >> 1;
2810 onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2813 #ifdef CONFIG_MTD_ONENAND_OTP
2816 * onenand_otp_command - Send OTP specific command to OneNAND device
2817 * @param mtd MTD device structure
2818 * @param cmd the command to be sent
2819 * @param addr offset to read from or write to
2820 * @param len number of bytes to read or write
2822 static int onenand_otp_command(struct mtd_info *mtd, int cmd, loff_t addr,
2823 size_t len)
2825 struct onenand_chip *this = mtd->priv;
2826 int value, block, page;
2828 /* Address translation */
2829 switch (cmd) {
2830 case ONENAND_CMD_OTP_ACCESS:
2831 block = (int) (addr >> this->erase_shift);
2832 page = -1;
2833 break;
2835 default:
2836 block = (int) (addr >> this->erase_shift);
2837 page = (int) (addr >> this->page_shift);
2839 if (ONENAND_IS_2PLANE(this)) {
2840 /* Make the even block number */
2841 block &= ~1;
2842 /* Is it the odd plane? */
2843 if (addr & this->writesize)
2844 block++;
2845 page >>= 1;
2847 page &= this->page_mask;
2848 break;
2851 if (block != -1) {
2852 /* Write 'DFS, FBA' of Flash */
2853 value = onenand_block_address(this, block);
2854 this->write_word(value, this->base +
2855 ONENAND_REG_START_ADDRESS1);
2858 if (page != -1) {
2859 /* Now we use page size operation */
2860 int sectors = 4, count = 4;
2861 int dataram;
2863 switch (cmd) {
2864 default:
2865 if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
2866 cmd = ONENAND_CMD_2X_PROG;
2867 dataram = ONENAND_CURRENT_BUFFERRAM(this);
2868 break;
2871 /* Write 'FPA, FSA' of Flash */
2872 value = onenand_page_address(page, sectors);
2873 this->write_word(value, this->base +
2874 ONENAND_REG_START_ADDRESS8);
2876 /* Write 'BSA, BSC' of DataRAM */
2877 value = onenand_buffer_address(dataram, sectors, count);
2878 this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
2881 /* Interrupt clear */
2882 this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
2884 /* Write command */
2885 this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
2887 return 0;
2891 * onenand_otp_write_oob_nolock - [INTERN] OneNAND write out-of-band, specific to OTP
2892 * @param mtd MTD device structure
2893 * @param to offset to write to
2894 * @param len number of bytes to write
2895 * @param retlen pointer to variable to store the number of written bytes
2896 * @param buf the data to write
2898 * OneNAND write out-of-band only for OTP
2900 static int onenand_otp_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2901 struct mtd_oob_ops *ops)
2903 struct onenand_chip *this = mtd->priv;
2904 int column, ret = 0, oobsize;
2905 int written = 0;
2906 u_char *oobbuf;
2907 size_t len = ops->ooblen;
2908 const u_char *buf = ops->oobbuf;
2909 int block, value, status;
2911 to += ops->ooboffs;
2913 /* Initialize retlen, in case of early exit */
2914 ops->oobretlen = 0;
2916 oobsize = mtd->oobsize;
2918 column = to & (mtd->oobsize - 1);
2920 oobbuf = this->oob_buf;
2922 /* Loop until all data write */
2923 while (written < len) {
2924 int thislen = min_t(int, oobsize, len - written);
2926 cond_resched();
2928 block = (int) (to >> this->erase_shift);
2930 * Write 'DFS, FBA' of Flash
2931 * Add: F100h DQ=DFS, FBA
2934 value = onenand_block_address(this, block);
2935 this->write_word(value, this->base +
2936 ONENAND_REG_START_ADDRESS1);
2939 * Select DataRAM for DDP
2940 * Add: F101h DQ=DBS
2943 value = onenand_bufferram_address(this, block);
2944 this->write_word(value, this->base +
2945 ONENAND_REG_START_ADDRESS2);
2946 ONENAND_SET_NEXT_BUFFERRAM(this);
2949 * Enter OTP access mode
2951 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
2952 this->wait(mtd, FL_OTPING);
2954 /* We send data to spare ram with oobsize
2955 * to prevent byte access */
2956 memcpy(oobbuf + column, buf, thislen);
2959 * Write Data into DataRAM
2960 * Add: 8th Word
2961 * in sector0/spare/page0
2962 * DQ=XXFCh
2964 this->write_bufferram(mtd, ONENAND_SPARERAM,
2965 oobbuf, 0, mtd->oobsize);
2967 onenand_otp_command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize);
2968 onenand_update_bufferram(mtd, to, 0);
2969 if (ONENAND_IS_2PLANE(this)) {
2970 ONENAND_SET_BUFFERRAM1(this);
2971 onenand_update_bufferram(mtd, to + this->writesize, 0);
2974 ret = this->wait(mtd, FL_WRITING);
2975 if (ret) {
2976 printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2977 break;
2980 /* Exit OTP access mode */
2981 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
2982 this->wait(mtd, FL_RESETING);
2984 status = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
2985 status &= 0x60;
2987 if (status == 0x60) {
2988 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2989 printk(KERN_DEBUG "1st Block\tLOCKED\n");
2990 printk(KERN_DEBUG "OTP Block\tLOCKED\n");
2991 } else if (status == 0x20) {
2992 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2993 printk(KERN_DEBUG "1st Block\tLOCKED\n");
2994 printk(KERN_DEBUG "OTP Block\tUN-LOCKED\n");
2995 } else if (status == 0x40) {
2996 printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2997 printk(KERN_DEBUG "1st Block\tUN-LOCKED\n");
2998 printk(KERN_DEBUG "OTP Block\tLOCKED\n");
2999 } else {
3000 printk(KERN_DEBUG "Reboot to check\n");
3003 written += thislen;
3004 if (written == len)
3005 break;
3007 to += mtd->writesize;
3008 buf += thislen;
3009 column = 0;
3012 ops->oobretlen = written;
3014 return ret;
3017 /* Internal OTP operation */
3018 typedef int (*otp_op_t)(struct mtd_info *mtd, loff_t form, size_t len,
3019 size_t *retlen, u_char *buf);
3022 * do_otp_read - [DEFAULT] Read OTP block area
3023 * @param mtd MTD device structure
3024 * @param from The offset to read
3025 * @param len number of bytes to read
3026 * @param retlen pointer to variable to store the number of readbytes
3027 * @param buf the databuffer to put/get data
3029 * Read OTP block area.
3031 static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
3032 size_t *retlen, u_char *buf)
3034 struct onenand_chip *this = mtd->priv;
3035 struct mtd_oob_ops ops = {
3036 .len = len,
3037 .ooblen = 0,
3038 .datbuf = buf,
3039 .oobbuf = NULL,
3041 int ret;
3043 /* Enter OTP access mode */
3044 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3045 this->wait(mtd, FL_OTPING);
3047 ret = ONENAND_IS_4KB_PAGE(this) ?
3048 onenand_mlc_read_ops_nolock(mtd, from, &ops) :
3049 onenand_read_ops_nolock(mtd, from, &ops);
3051 /* Exit OTP access mode */
3052 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3053 this->wait(mtd, FL_RESETING);
3055 return ret;
3059 * do_otp_write - [DEFAULT] Write OTP block area
3060 * @param mtd MTD device structure
3061 * @param to The offset to write
3062 * @param len number of bytes to write
3063 * @param retlen pointer to variable to store the number of write bytes
3064 * @param buf the databuffer to put/get data
3066 * Write OTP block area.
3068 static int do_otp_write(struct mtd_info *mtd, loff_t to, size_t len,
3069 size_t *retlen, u_char *buf)
3071 struct onenand_chip *this = mtd->priv;
3072 unsigned char *pbuf = buf;
3073 int ret;
3074 struct mtd_oob_ops ops;
3076 /* Force buffer page aligned */
3077 if (len < mtd->writesize) {
3078 memcpy(this->page_buf, buf, len);
3079 memset(this->page_buf + len, 0xff, mtd->writesize - len);
3080 pbuf = this->page_buf;
3081 len = mtd->writesize;
3084 /* Enter OTP access mode */
3085 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3086 this->wait(mtd, FL_OTPING);
3088 ops.len = len;
3089 ops.ooblen = 0;
3090 ops.datbuf = pbuf;
3091 ops.oobbuf = NULL;
3092 ret = onenand_write_ops_nolock(mtd, to, &ops);
3093 *retlen = ops.retlen;
3095 /* Exit OTP access mode */
3096 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3097 this->wait(mtd, FL_RESETING);
3099 return ret;
3103 * do_otp_lock - [DEFAULT] Lock OTP block area
3104 * @param mtd MTD device structure
3105 * @param from The offset to lock
3106 * @param len number of bytes to lock
3107 * @param retlen pointer to variable to store the number of lock bytes
3108 * @param buf the databuffer to put/get data
3110 * Lock OTP block area.
3112 static int do_otp_lock(struct mtd_info *mtd, loff_t from, size_t len,
3113 size_t *retlen, u_char *buf)
3115 struct onenand_chip *this = mtd->priv;
3116 struct mtd_oob_ops ops;
3117 int ret;
3119 if (FLEXONENAND(this)) {
3121 /* Enter OTP access mode */
3122 this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3123 this->wait(mtd, FL_OTPING);
3125 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3126 * main area of page 49.
3128 ops.len = mtd->writesize;
3129 ops.ooblen = 0;
3130 ops.datbuf = buf;
3131 ops.oobbuf = NULL;
3132 ret = onenand_write_ops_nolock(mtd, mtd->writesize * 49, &ops);
3133 *retlen = ops.retlen;
3135 /* Exit OTP access mode */
3136 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3137 this->wait(mtd, FL_RESETING);
3138 } else {
3139 ops.mode = MTD_OPS_PLACE_OOB;
3140 ops.ooblen = len;
3141 ops.oobbuf = buf;
3142 ops.ooboffs = 0;
3143 ret = onenand_otp_write_oob_nolock(mtd, from, &ops);
3144 *retlen = ops.oobretlen;
3147 return ret;
3151 * onenand_otp_walk - [DEFAULT] Handle OTP operation
3152 * @param mtd MTD device structure
3153 * @param from The offset to read/write
3154 * @param len number of bytes to read/write
3155 * @param retlen pointer to variable to store the number of read bytes
3156 * @param buf the databuffer to put/get data
3157 * @param action do given action
3158 * @param mode specify user and factory
3160 * Handle OTP operation.
3162 static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
3163 size_t *retlen, u_char *buf,
3164 otp_op_t action, int mode)
3166 struct onenand_chip *this = mtd->priv;
3167 int otp_pages;
3168 int density;
3169 int ret = 0;
3171 *retlen = 0;
3173 density = onenand_get_density(this->device_id);
3174 if (density < ONENAND_DEVICE_DENSITY_512Mb)
3175 otp_pages = 20;
3176 else
3177 otp_pages = 50;
3179 if (mode == MTD_OTP_FACTORY) {
3180 from += mtd->writesize * otp_pages;
3181 otp_pages = ONENAND_PAGES_PER_BLOCK - otp_pages;
3184 /* Check User/Factory boundary */
3185 if (mode == MTD_OTP_USER) {
3186 if (mtd->writesize * otp_pages < from + len)
3187 return 0;
3188 } else {
3189 if (mtd->writesize * otp_pages < len)
3190 return 0;
3193 onenand_get_device(mtd, FL_OTPING);
3194 while (len > 0 && otp_pages > 0) {
3195 if (!action) { /* OTP Info functions */
3196 struct otp_info *otpinfo;
3198 len -= sizeof(struct otp_info);
3199 if (len <= 0) {
3200 ret = -ENOSPC;
3201 break;
3204 otpinfo = (struct otp_info *) buf;
3205 otpinfo->start = from;
3206 otpinfo->length = mtd->writesize;
3207 otpinfo->locked = 0;
3209 from += mtd->writesize;
3210 buf += sizeof(struct otp_info);
3211 *retlen += sizeof(struct otp_info);
3212 } else {
3213 size_t tmp_retlen;
3215 ret = action(mtd, from, len, &tmp_retlen, buf);
3217 buf += tmp_retlen;
3218 len -= tmp_retlen;
3219 *retlen += tmp_retlen;
3221 if (ret)
3222 break;
3224 otp_pages--;
3226 onenand_release_device(mtd);
3228 return ret;
3232 * onenand_get_fact_prot_info - [MTD Interface] Read factory OTP info
3233 * @param mtd MTD device structure
3234 * @param len number of bytes to read
3235 * @param retlen pointer to variable to store the number of read bytes
3236 * @param buf the databuffer to put/get data
3238 * Read factory OTP info.
3240 static int onenand_get_fact_prot_info(struct mtd_info *mtd, size_t len,
3241 size_t *retlen, struct otp_info *buf)
3243 return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
3244 MTD_OTP_FACTORY);
3248 * onenand_read_fact_prot_reg - [MTD Interface] Read factory OTP area
3249 * @param mtd MTD device structure
3250 * @param from The offset to read
3251 * @param len number of bytes to read
3252 * @param retlen pointer to variable to store the number of read bytes
3253 * @param buf the databuffer to put/get data
3255 * Read factory OTP area.
3257 static int onenand_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
3258 size_t len, size_t *retlen, u_char *buf)
3260 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_FACTORY);
3264 * onenand_get_user_prot_info - [MTD Interface] Read user OTP info
3265 * @param mtd MTD device structure
3266 * @param retlen pointer to variable to store the number of read bytes
3267 * @param len number of bytes to read
3268 * @param buf the databuffer to put/get data
3270 * Read user OTP info.
3272 static int onenand_get_user_prot_info(struct mtd_info *mtd, size_t len,
3273 size_t *retlen, struct otp_info *buf)
3275 return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
3276 MTD_OTP_USER);
3280 * onenand_read_user_prot_reg - [MTD Interface] Read user OTP area
3281 * @param mtd MTD device structure
3282 * @param from The offset to read
3283 * @param len number of bytes to read
3284 * @param retlen pointer to variable to store the number of read bytes
3285 * @param buf the databuffer to put/get data
3287 * Read user OTP area.
3289 static int onenand_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
3290 size_t len, size_t *retlen, u_char *buf)
3292 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_USER);
3296 * onenand_write_user_prot_reg - [MTD Interface] Write user OTP area
3297 * @param mtd MTD device structure
3298 * @param from The offset to write
3299 * @param len number of bytes to write
3300 * @param retlen pointer to variable to store the number of write bytes
3301 * @param buf the databuffer to put/get data
3303 * Write user OTP area.
3305 static int onenand_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
3306 size_t len, size_t *retlen, u_char *buf)
3308 return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_write, MTD_OTP_USER);
3312 * onenand_lock_user_prot_reg - [MTD Interface] Lock user OTP area
3313 * @param mtd MTD device structure
3314 * @param from The offset to lock
3315 * @param len number of bytes to unlock
3317 * Write lock mark on spare area in page 0 in OTP block
3319 static int onenand_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
3320 size_t len)
3322 struct onenand_chip *this = mtd->priv;
3323 u_char *buf = FLEXONENAND(this) ? this->page_buf : this->oob_buf;
3324 size_t retlen;
3325 int ret;
3326 unsigned int otp_lock_offset = ONENAND_OTP_LOCK_OFFSET;
3328 memset(buf, 0xff, FLEXONENAND(this) ? this->writesize
3329 : mtd->oobsize);
3331 * Write lock mark to 8th word of sector0 of page0 of the spare0.
3332 * We write 16 bytes spare area instead of 2 bytes.
3333 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3334 * main area of page 49.
3337 from = 0;
3338 len = FLEXONENAND(this) ? mtd->writesize : 16;
3341 * Note: OTP lock operation
3342 * OTP block : 0xXXFC XX 1111 1100
3343 * 1st block : 0xXXF3 (If chip support) XX 1111 0011
3344 * Both : 0xXXF0 (If chip support) XX 1111 0000
3346 if (FLEXONENAND(this))
3347 otp_lock_offset = FLEXONENAND_OTP_LOCK_OFFSET;
3349 /* ONENAND_OTP_AREA | ONENAND_OTP_BLOCK0 | ONENAND_OTP_AREA_BLOCK0 */
3350 if (otp == 1)
3351 buf[otp_lock_offset] = 0xFC;
3352 else if (otp == 2)
3353 buf[otp_lock_offset] = 0xF3;
3354 else if (otp == 3)
3355 buf[otp_lock_offset] = 0xF0;
3356 else if (otp != 0)
3357 printk(KERN_DEBUG "[OneNAND] Invalid option selected for OTP\n");
3359 ret = onenand_otp_walk(mtd, from, len, &retlen, buf, do_otp_lock, MTD_OTP_USER);
3361 return ret ? : retlen;
3364 #endif /* CONFIG_MTD_ONENAND_OTP */
3367 * onenand_check_features - Check and set OneNAND features
3368 * @param mtd MTD data structure
3370 * Check and set OneNAND features
3371 * - lock scheme
3372 * - two plane
3374 static void onenand_check_features(struct mtd_info *mtd)
3376 struct onenand_chip *this = mtd->priv;
3377 unsigned int density, process, numbufs;
3379 /* Lock scheme depends on density and process */
3380 density = onenand_get_density(this->device_id);
3381 process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT;
3382 numbufs = this->read_word(this->base + ONENAND_REG_NUM_BUFFERS) >> 8;
3384 /* Lock scheme */
3385 switch (density) {
3386 case ONENAND_DEVICE_DENSITY_4Gb:
3387 if (ONENAND_IS_DDP(this))
3388 this->options |= ONENAND_HAS_2PLANE;
3389 else if (numbufs == 1) {
3390 this->options |= ONENAND_HAS_4KB_PAGE;
3391 this->options |= ONENAND_HAS_CACHE_PROGRAM;
3393 * There are two different 4KiB pagesize chips
3394 * and no way to detect it by H/W config values.
3396 * To detect the correct NOP for each chips,
3397 * It should check the version ID as workaround.
3399 * Now it has as following
3400 * KFM4G16Q4M has NOP 4 with version ID 0x0131
3401 * KFM4G16Q5M has NOP 1 with versoin ID 0x013e
3403 if ((this->version_id & 0xf) == 0xe)
3404 this->options |= ONENAND_HAS_NOP_1;
3407 case ONENAND_DEVICE_DENSITY_2Gb:
3408 /* 2Gb DDP does not have 2 plane */
3409 if (!ONENAND_IS_DDP(this))
3410 this->options |= ONENAND_HAS_2PLANE;
3411 this->options |= ONENAND_HAS_UNLOCK_ALL;
3413 case ONENAND_DEVICE_DENSITY_1Gb:
3414 /* A-Die has all block unlock */
3415 if (process)
3416 this->options |= ONENAND_HAS_UNLOCK_ALL;
3417 break;
3419 default:
3420 /* Some OneNAND has continuous lock scheme */
3421 if (!process)
3422 this->options |= ONENAND_HAS_CONT_LOCK;
3423 break;
3426 /* The MLC has 4KiB pagesize. */
3427 if (ONENAND_IS_MLC(this))
3428 this->options |= ONENAND_HAS_4KB_PAGE;
3430 if (ONENAND_IS_4KB_PAGE(this))
3431 this->options &= ~ONENAND_HAS_2PLANE;
3433 if (FLEXONENAND(this)) {
3434 this->options &= ~ONENAND_HAS_CONT_LOCK;
3435 this->options |= ONENAND_HAS_UNLOCK_ALL;
3438 if (this->options & ONENAND_HAS_CONT_LOCK)
3439 printk(KERN_DEBUG "Lock scheme is Continuous Lock\n");
3440 if (this->options & ONENAND_HAS_UNLOCK_ALL)
3441 printk(KERN_DEBUG "Chip support all block unlock\n");
3442 if (this->options & ONENAND_HAS_2PLANE)
3443 printk(KERN_DEBUG "Chip has 2 plane\n");
3444 if (this->options & ONENAND_HAS_4KB_PAGE)
3445 printk(KERN_DEBUG "Chip has 4KiB pagesize\n");
3446 if (this->options & ONENAND_HAS_CACHE_PROGRAM)
3447 printk(KERN_DEBUG "Chip has cache program feature\n");
3451 * onenand_print_device_info - Print device & version ID
3452 * @param device device ID
3453 * @param version version ID
3455 * Print device & version ID
3457 static void onenand_print_device_info(int device, int version)
3459 int vcc, demuxed, ddp, density, flexonenand;
3461 vcc = device & ONENAND_DEVICE_VCC_MASK;
3462 demuxed = device & ONENAND_DEVICE_IS_DEMUX;
3463 ddp = device & ONENAND_DEVICE_IS_DDP;
3464 density = onenand_get_density(device);
3465 flexonenand = device & DEVICE_IS_FLEXONENAND;
3466 printk(KERN_INFO "%s%sOneNAND%s %dMB %sV 16-bit (0x%02x)\n",
3467 demuxed ? "" : "Muxed ",
3468 flexonenand ? "Flex-" : "",
3469 ddp ? "(DDP)" : "",
3470 (16 << density),
3471 vcc ? "2.65/3.3" : "1.8",
3472 device);
3473 printk(KERN_INFO "OneNAND version = 0x%04x\n", version);
3476 static const struct onenand_manufacturers onenand_manuf_ids[] = {
3477 {ONENAND_MFR_SAMSUNG, "Samsung"},
3478 {ONENAND_MFR_NUMONYX, "Numonyx"},
3482 * onenand_check_maf - Check manufacturer ID
3483 * @param manuf manufacturer ID
3485 * Check manufacturer ID
3487 static int onenand_check_maf(int manuf)
3489 int size = ARRAY_SIZE(onenand_manuf_ids);
3490 char *name;
3491 int i;
3493 for (i = 0; i < size; i++)
3494 if (manuf == onenand_manuf_ids[i].id)
3495 break;
3497 if (i < size)
3498 name = onenand_manuf_ids[i].name;
3499 else
3500 name = "Unknown";
3502 printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n", name, manuf);
3504 return (i == size);
3508 * flexonenand_get_boundary - Reads the SLC boundary
3509 * @param onenand_info - onenand info structure
3511 static int flexonenand_get_boundary(struct mtd_info *mtd)
3513 struct onenand_chip *this = mtd->priv;
3514 unsigned die, bdry;
3515 int syscfg, locked;
3517 /* Disable ECC */
3518 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3519 this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1);
3521 for (die = 0; die < this->dies; die++) {
3522 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3523 this->wait(mtd, FL_SYNCING);
3525 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3526 this->wait(mtd, FL_READING);
3528 bdry = this->read_word(this->base + ONENAND_DATARAM);
3529 if ((bdry >> FLEXONENAND_PI_UNLOCK_SHIFT) == 3)
3530 locked = 0;
3531 else
3532 locked = 1;
3533 this->boundary[die] = bdry & FLEXONENAND_PI_MASK;
3535 this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3536 this->wait(mtd, FL_RESETING);
3538 printk(KERN_INFO "Die %d boundary: %d%s\n", die,
3539 this->boundary[die], locked ? "(Locked)" : "(Unlocked)");
3542 /* Enable ECC */
3543 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3544 return 0;
3548 * flexonenand_get_size - Fill up fields in onenand_chip and mtd_info
3549 * boundary[], diesize[], mtd->size, mtd->erasesize
3550 * @param mtd - MTD device structure
3552 static void flexonenand_get_size(struct mtd_info *mtd)
3554 struct onenand_chip *this = mtd->priv;
3555 int die, i, eraseshift, density;
3556 int blksperdie, maxbdry;
3557 loff_t ofs;
3559 density = onenand_get_density(this->device_id);
3560 blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift);
3561 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3562 maxbdry = blksperdie - 1;
3563 eraseshift = this->erase_shift - 1;
3565 mtd->numeraseregions = this->dies << 1;
3567 /* This fills up the device boundary */
3568 flexonenand_get_boundary(mtd);
3569 die = ofs = 0;
3570 i = -1;
3571 for (; die < this->dies; die++) {
3572 if (!die || this->boundary[die-1] != maxbdry) {
3573 i++;
3574 mtd->eraseregions[i].offset = ofs;
3575 mtd->eraseregions[i].erasesize = 1 << eraseshift;
3576 mtd->eraseregions[i].numblocks =
3577 this->boundary[die] + 1;
3578 ofs += mtd->eraseregions[i].numblocks << eraseshift;
3579 eraseshift++;
3580 } else {
3581 mtd->numeraseregions -= 1;
3582 mtd->eraseregions[i].numblocks +=
3583 this->boundary[die] + 1;
3584 ofs += (this->boundary[die] + 1) << (eraseshift - 1);
3586 if (this->boundary[die] != maxbdry) {
3587 i++;
3588 mtd->eraseregions[i].offset = ofs;
3589 mtd->eraseregions[i].erasesize = 1 << eraseshift;
3590 mtd->eraseregions[i].numblocks = maxbdry ^
3591 this->boundary[die];
3592 ofs += mtd->eraseregions[i].numblocks << eraseshift;
3593 eraseshift--;
3594 } else
3595 mtd->numeraseregions -= 1;
3598 /* Expose MLC erase size except when all blocks are SLC */
3599 mtd->erasesize = 1 << this->erase_shift;
3600 if (mtd->numeraseregions == 1)
3601 mtd->erasesize >>= 1;
3603 printk(KERN_INFO "Device has %d eraseregions\n", mtd->numeraseregions);
3604 for (i = 0; i < mtd->numeraseregions; i++)
3605 printk(KERN_INFO "[offset: 0x%08x, erasesize: 0x%05x,"
3606 " numblocks: %04u]\n",
3607 (unsigned int) mtd->eraseregions[i].offset,
3608 mtd->eraseregions[i].erasesize,
3609 mtd->eraseregions[i].numblocks);
3611 for (die = 0, mtd->size = 0; die < this->dies; die++) {
3612 this->diesize[die] = (loff_t)blksperdie << this->erase_shift;
3613 this->diesize[die] -= (loff_t)(this->boundary[die] + 1)
3614 << (this->erase_shift - 1);
3615 mtd->size += this->diesize[die];
3620 * flexonenand_check_blocks_erased - Check if blocks are erased
3621 * @param mtd_info - mtd info structure
3622 * @param start - first erase block to check
3623 * @param end - last erase block to check
3625 * Converting an unerased block from MLC to SLC
3626 * causes byte values to change. Since both data and its ECC
3627 * have changed, reads on the block give uncorrectable error.
3628 * This might lead to the block being detected as bad.
3630 * Avoid this by ensuring that the block to be converted is
3631 * erased.
3633 static int flexonenand_check_blocks_erased(struct mtd_info *mtd, int start, int end)
3635 struct onenand_chip *this = mtd->priv;
3636 int i, ret;
3637 int block;
3638 struct mtd_oob_ops ops = {
3639 .mode = MTD_OPS_PLACE_OOB,
3640 .ooboffs = 0,
3641 .ooblen = mtd->oobsize,
3642 .datbuf = NULL,
3643 .oobbuf = this->oob_buf,
3645 loff_t addr;
3647 printk(KERN_DEBUG "Check blocks from %d to %d\n", start, end);
3649 for (block = start; block <= end; block++) {
3650 addr = flexonenand_addr(this, block);
3651 if (onenand_block_isbad_nolock(mtd, addr, 0))
3652 continue;
3655 * Since main area write results in ECC write to spare,
3656 * it is sufficient to check only ECC bytes for change.
3658 ret = onenand_read_oob_nolock(mtd, addr, &ops);
3659 if (ret)
3660 return ret;
3662 for (i = 0; i < mtd->oobsize; i++)
3663 if (this->oob_buf[i] != 0xff)
3664 break;
3666 if (i != mtd->oobsize) {
3667 printk(KERN_WARNING "%s: Block %d not erased.\n",
3668 __func__, block);
3669 return 1;
3673 return 0;
3677 * flexonenand_set_boundary - Writes the SLC boundary
3678 * @param mtd - mtd info structure
3680 static int flexonenand_set_boundary(struct mtd_info *mtd, int die,
3681 int boundary, int lock)
3683 struct onenand_chip *this = mtd->priv;
3684 int ret, density, blksperdie, old, new, thisboundary;
3685 loff_t addr;
3687 /* Change only once for SDP Flex-OneNAND */
3688 if (die && (!ONENAND_IS_DDP(this)))
3689 return 0;
3691 /* boundary value of -1 indicates no required change */
3692 if (boundary < 0 || boundary == this->boundary[die])
3693 return 0;
3695 density = onenand_get_density(this->device_id);
3696 blksperdie = ((16 << density) << 20) >> this->erase_shift;
3697 blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3699 if (boundary >= blksperdie) {
3700 printk(KERN_ERR "%s: Invalid boundary value. "
3701 "Boundary not changed.\n", __func__);
3702 return -EINVAL;
3705 /* Check if converting blocks are erased */
3706 old = this->boundary[die] + (die * this->density_mask);
3707 new = boundary + (die * this->density_mask);
3708 ret = flexonenand_check_blocks_erased(mtd, min(old, new) + 1, max(old, new));
3709 if (ret) {
3710 printk(KERN_ERR "%s: Please erase blocks "
3711 "before boundary change\n", __func__);
3712 return ret;
3715 this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3716 this->wait(mtd, FL_SYNCING);
3718 /* Check is boundary is locked */
3719 this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3720 this->wait(mtd, FL_READING);
3722 thisboundary = this->read_word(this->base + ONENAND_DATARAM);
3723 if ((thisboundary >> FLEXONENAND_PI_UNLOCK_SHIFT) != 3) {
3724 printk(KERN_ERR "%s: boundary locked\n", __func__);
3725 ret = 1;
3726 goto out;
3729 printk(KERN_INFO "Changing die %d boundary: %d%s\n",
3730 die, boundary, lock ? "(Locked)" : "(Unlocked)");
3732 addr = die ? this->diesize[0] : 0;
3734 boundary &= FLEXONENAND_PI_MASK;
3735 boundary |= lock ? 0 : (3 << FLEXONENAND_PI_UNLOCK_SHIFT);
3737 this->command(mtd, ONENAND_CMD_ERASE, addr, 0);
3738 ret = this->wait(mtd, FL_ERASING);
3739 if (ret) {
3740 printk(KERN_ERR "%s: Failed PI erase for Die %d\n",
3741 __func__, die);
3742 goto out;
3745 this->write_word(boundary, this->base + ONENAND_DATARAM);
3746 this->command(mtd, ONENAND_CMD_PROG, addr, 0);
3747 ret = this->wait(mtd, FL_WRITING);
3748 if (ret) {
3749 printk(KERN_ERR "%s: Failed PI write for Die %d\n",
3750 __func__, die);
3751 goto out;
3754 this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0);
3755 ret = this->wait(mtd, FL_WRITING);
3756 out:
3757 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND);
3758 this->wait(mtd, FL_RESETING);
3759 if (!ret)
3760 /* Recalculate device size on boundary change*/
3761 flexonenand_get_size(mtd);
3763 return ret;
3767 * onenand_chip_probe - [OneNAND Interface] The generic chip probe
3768 * @param mtd MTD device structure
3770 * OneNAND detection method:
3771 * Compare the values from command with ones from register
3773 static int onenand_chip_probe(struct mtd_info *mtd)
3775 struct onenand_chip *this = mtd->priv;
3776 int bram_maf_id, bram_dev_id, maf_id, dev_id;
3777 int syscfg;
3779 /* Save system configuration 1 */
3780 syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3781 /* Clear Sync. Burst Read mode to read BootRAM */
3782 this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE), this->base + ONENAND_REG_SYS_CFG1);
3784 /* Send the command for reading device ID from BootRAM */
3785 this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
3787 /* Read manufacturer and device IDs from BootRAM */
3788 bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0);
3789 bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2);
3791 /* Reset OneNAND to read default register values */
3792 this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM);
3793 /* Wait reset */
3794 this->wait(mtd, FL_RESETING);
3796 /* Restore system configuration 1 */
3797 this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3799 /* Check manufacturer ID */
3800 if (onenand_check_maf(bram_maf_id))
3801 return -ENXIO;
3803 /* Read manufacturer and device IDs from Register */
3804 maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
3805 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3807 /* Check OneNAND device */
3808 if (maf_id != bram_maf_id || dev_id != bram_dev_id)
3809 return -ENXIO;
3811 return 0;
3815 * onenand_probe - [OneNAND Interface] Probe the OneNAND device
3816 * @param mtd MTD device structure
3818 static int onenand_probe(struct mtd_info *mtd)
3820 struct onenand_chip *this = mtd->priv;
3821 int dev_id, ver_id;
3822 int density;
3823 int ret;
3825 ret = this->chip_probe(mtd);
3826 if (ret)
3827 return ret;
3829 /* Device and version IDs from Register */
3830 dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3831 ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
3832 this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
3834 /* Flash device information */
3835 onenand_print_device_info(dev_id, ver_id);
3836 this->device_id = dev_id;
3837 this->version_id = ver_id;
3839 /* Check OneNAND features */
3840 onenand_check_features(mtd);
3842 density = onenand_get_density(dev_id);
3843 if (FLEXONENAND(this)) {
3844 this->dies = ONENAND_IS_DDP(this) ? 2 : 1;
3845 /* Maximum possible erase regions */
3846 mtd->numeraseregions = this->dies << 1;
3847 mtd->eraseregions = kzalloc(sizeof(struct mtd_erase_region_info)
3848 * (this->dies << 1), GFP_KERNEL);
3849 if (!mtd->eraseregions)
3850 return -ENOMEM;
3854 * For Flex-OneNAND, chipsize represents maximum possible device size.
3855 * mtd->size represents the actual device size.
3857 this->chipsize = (16 << density) << 20;
3859 /* OneNAND page size & block size */
3860 /* The data buffer size is equal to page size */
3861 mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE);
3862 /* We use the full BufferRAM */
3863 if (ONENAND_IS_4KB_PAGE(this))
3864 mtd->writesize <<= 1;
3866 mtd->oobsize = mtd->writesize >> 5;
3867 /* Pages per a block are always 64 in OneNAND */
3868 mtd->erasesize = mtd->writesize << 6;
3870 * Flex-OneNAND SLC area has 64 pages per block.
3871 * Flex-OneNAND MLC area has 128 pages per block.
3872 * Expose MLC erase size to find erase_shift and page_mask.
3874 if (FLEXONENAND(this))
3875 mtd->erasesize <<= 1;
3877 this->erase_shift = ffs(mtd->erasesize) - 1;
3878 this->page_shift = ffs(mtd->writesize) - 1;
3879 this->page_mask = (1 << (this->erase_shift - this->page_shift)) - 1;
3880 /* Set density mask. it is used for DDP */
3881 if (ONENAND_IS_DDP(this))
3882 this->density_mask = this->chipsize >> (this->erase_shift + 1);
3883 /* It's real page size */
3884 this->writesize = mtd->writesize;
3886 /* REVISIT: Multichip handling */
3888 if (FLEXONENAND(this))
3889 flexonenand_get_size(mtd);
3890 else
3891 mtd->size = this->chipsize;
3894 * We emulate the 4KiB page and 256KiB erase block size
3895 * But oobsize is still 64 bytes.
3896 * It is only valid if you turn on 2X program support,
3897 * Otherwise it will be ignored by compiler.
3899 if (ONENAND_IS_2PLANE(this)) {
3900 mtd->writesize <<= 1;
3901 mtd->erasesize <<= 1;
3904 return 0;
3908 * onenand_suspend - [MTD Interface] Suspend the OneNAND flash
3909 * @param mtd MTD device structure
3911 static int onenand_suspend(struct mtd_info *mtd)
3913 return onenand_get_device(mtd, FL_PM_SUSPENDED);
3917 * onenand_resume - [MTD Interface] Resume the OneNAND flash
3918 * @param mtd MTD device structure
3920 static void onenand_resume(struct mtd_info *mtd)
3922 struct onenand_chip *this = mtd->priv;
3924 if (this->state == FL_PM_SUSPENDED)
3925 onenand_release_device(mtd);
3926 else
3927 printk(KERN_ERR "%s: resume() called for the chip which is not "
3928 "in suspended state\n", __func__);
3932 * onenand_scan - [OneNAND Interface] Scan for the OneNAND device
3933 * @param mtd MTD device structure
3934 * @param maxchips Number of chips to scan for
3936 * This fills out all the not initialized function pointers
3937 * with the defaults.
3938 * The flash ID is read and the mtd/chip structures are
3939 * filled with the appropriate values.
3941 int onenand_scan(struct mtd_info *mtd, int maxchips)
3943 int i, ret;
3944 struct onenand_chip *this = mtd->priv;
3946 if (!this->read_word)
3947 this->read_word = onenand_readw;
3948 if (!this->write_word)
3949 this->write_word = onenand_writew;
3951 if (!this->command)
3952 this->command = onenand_command;
3953 if (!this->wait)
3954 onenand_setup_wait(mtd);
3955 if (!this->bbt_wait)
3956 this->bbt_wait = onenand_bbt_wait;
3957 if (!this->unlock_all)
3958 this->unlock_all = onenand_unlock_all;
3960 if (!this->chip_probe)
3961 this->chip_probe = onenand_chip_probe;
3963 if (!this->read_bufferram)
3964 this->read_bufferram = onenand_read_bufferram;
3965 if (!this->write_bufferram)
3966 this->write_bufferram = onenand_write_bufferram;
3968 if (!this->block_markbad)
3969 this->block_markbad = onenand_default_block_markbad;
3970 if (!this->scan_bbt)
3971 this->scan_bbt = onenand_default_bbt;
3973 if (onenand_probe(mtd))
3974 return -ENXIO;
3976 /* Set Sync. Burst Read after probing */
3977 if (this->mmcontrol) {
3978 printk(KERN_INFO "OneNAND Sync. Burst Read support\n");
3979 this->read_bufferram = onenand_sync_read_bufferram;
3982 /* Allocate buffers, if necessary */
3983 if (!this->page_buf) {
3984 this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3985 if (!this->page_buf)
3986 return -ENOMEM;
3987 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
3988 this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL);
3989 if (!this->verify_buf) {
3990 kfree(this->page_buf);
3991 return -ENOMEM;
3993 #endif
3994 this->options |= ONENAND_PAGEBUF_ALLOC;
3996 if (!this->oob_buf) {
3997 this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL);
3998 if (!this->oob_buf) {
3999 if (this->options & ONENAND_PAGEBUF_ALLOC) {
4000 this->options &= ~ONENAND_PAGEBUF_ALLOC;
4001 kfree(this->page_buf);
4003 return -ENOMEM;
4005 this->options |= ONENAND_OOBBUF_ALLOC;
4008 this->state = FL_READY;
4009 init_waitqueue_head(&this->wq);
4010 spin_lock_init(&this->chip_lock);
4013 * Allow subpage writes up to oobsize.
4015 switch (mtd->oobsize) {
4016 case 128:
4017 if (FLEXONENAND(this)) {
4018 this->ecclayout = &flexonenand_oob_128;
4019 mtd->subpage_sft = 0;
4020 } else {
4021 this->ecclayout = &onenand_oob_128;
4022 mtd->subpage_sft = 2;
4024 if (ONENAND_IS_NOP_1(this))
4025 mtd->subpage_sft = 0;
4026 break;
4027 case 64:
4028 this->ecclayout = &onenand_oob_64;
4029 mtd->subpage_sft = 2;
4030 break;
4032 case 32:
4033 this->ecclayout = &onenand_oob_32;
4034 mtd->subpage_sft = 1;
4035 break;
4037 default:
4038 printk(KERN_WARNING "%s: No OOB scheme defined for oobsize %d\n",
4039 __func__, mtd->oobsize);
4040 mtd->subpage_sft = 0;
4041 /* To prevent kernel oops */
4042 this->ecclayout = &onenand_oob_32;
4043 break;
4046 this->subpagesize = mtd->writesize >> mtd->subpage_sft;
4049 * The number of bytes available for a client to place data into
4050 * the out of band area
4052 this->ecclayout->oobavail = 0;
4053 for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES &&
4054 this->ecclayout->oobfree[i].length; i++)
4055 this->ecclayout->oobavail +=
4056 this->ecclayout->oobfree[i].length;
4057 mtd->oobavail = this->ecclayout->oobavail;
4059 mtd->ecclayout = this->ecclayout;
4060 mtd->ecc_strength = 1;
4062 /* Fill in remaining MTD driver data */
4063 mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH;
4064 mtd->flags = MTD_CAP_NANDFLASH;
4065 mtd->_erase = onenand_erase;
4066 mtd->_point = NULL;
4067 mtd->_unpoint = NULL;
4068 mtd->_read = onenand_read;
4069 mtd->_write = onenand_write;
4070 mtd->_read_oob = onenand_read_oob;
4071 mtd->_write_oob = onenand_write_oob;
4072 mtd->_panic_write = onenand_panic_write;
4073 #ifdef CONFIG_MTD_ONENAND_OTP
4074 mtd->_get_fact_prot_info = onenand_get_fact_prot_info;
4075 mtd->_read_fact_prot_reg = onenand_read_fact_prot_reg;
4076 mtd->_get_user_prot_info = onenand_get_user_prot_info;
4077 mtd->_read_user_prot_reg = onenand_read_user_prot_reg;
4078 mtd->_write_user_prot_reg = onenand_write_user_prot_reg;
4079 mtd->_lock_user_prot_reg = onenand_lock_user_prot_reg;
4080 #endif
4081 mtd->_sync = onenand_sync;
4082 mtd->_lock = onenand_lock;
4083 mtd->_unlock = onenand_unlock;
4084 mtd->_suspend = onenand_suspend;
4085 mtd->_resume = onenand_resume;
4086 mtd->_block_isbad = onenand_block_isbad;
4087 mtd->_block_markbad = onenand_block_markbad;
4088 mtd->owner = THIS_MODULE;
4089 mtd->writebufsize = mtd->writesize;
4091 /* Unlock whole block */
4092 if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING))
4093 this->unlock_all(mtd);
4095 ret = this->scan_bbt(mtd);
4096 if ((!FLEXONENAND(this)) || ret)
4097 return ret;
4099 /* Change Flex-OneNAND boundaries if required */
4100 for (i = 0; i < MAX_DIES; i++)
4101 flexonenand_set_boundary(mtd, i, flex_bdry[2 * i],
4102 flex_bdry[(2 * i) + 1]);
4104 return 0;
4108 * onenand_release - [OneNAND Interface] Free resources held by the OneNAND device
4109 * @param mtd MTD device structure
4111 void onenand_release(struct mtd_info *mtd)
4113 struct onenand_chip *this = mtd->priv;
4115 /* Deregister partitions */
4116 mtd_device_unregister(mtd);
4118 /* Free bad block table memory, if allocated */
4119 if (this->bbm) {
4120 struct bbm_info *bbm = this->bbm;
4121 kfree(bbm->bbt);
4122 kfree(this->bbm);
4124 /* Buffers allocated by onenand_scan */
4125 if (this->options & ONENAND_PAGEBUF_ALLOC) {
4126 kfree(this->page_buf);
4127 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4128 kfree(this->verify_buf);
4129 #endif
4131 if (this->options & ONENAND_OOBBUF_ALLOC)
4132 kfree(this->oob_buf);
4133 kfree(mtd->eraseregions);
4136 EXPORT_SYMBOL_GPL(onenand_scan);
4137 EXPORT_SYMBOL_GPL(onenand_release);
4139 MODULE_LICENSE("GPL");
4140 MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
4141 MODULE_DESCRIPTION("Generic OneNAND flash driver code");