2 * linux/drivers/mtd/onenand/onenand_base.c
4 * Copyright © 2005-2009 Samsung Electronics
5 * Copyright © 2007 Nokia Corporation
7 * Kyungmin Park <kyungmin.park@samsung.com>
10 * Adrian Hunter <ext-adrian.hunter@nokia.com>:
11 * auto-placement support, read-while load support, various fixes
13 * Vishak G <vishak.g at samsung.com>, Rohit Hagargundgi <h.rohit at samsung.com>
14 * Flex-OneNAND support
15 * Amul Kumar Saha <amul.saha at samsung.com>
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License version 2 as
20 * published by the Free Software Foundation.
23 #include <linux/kernel.h>
24 #include <linux/module.h>
25 #include <linux/moduleparam.h>
26 #include <linux/slab.h>
27 #include <linux/sched.h>
28 #include <linux/delay.h>
29 #include <linux/interrupt.h>
30 #include <linux/jiffies.h>
31 #include <linux/mtd/mtd.h>
32 #include <linux/mtd/onenand.h>
33 #include <linux/mtd/partitions.h>
38 * Multiblock erase if number of blocks to erase is 2 or more.
39 * Maximum number of blocks for simultaneous erase is 64.
41 #define MB_ERASE_MIN_BLK_COUNT 2
42 #define MB_ERASE_MAX_BLK_COUNT 64
44 /* Default Flex-OneNAND boundary and lock respectively */
45 static int flex_bdry
[MAX_DIES
* 2] = { -1, 0, -1, 0 };
47 module_param_array(flex_bdry
, int, NULL
, 0400);
48 MODULE_PARM_DESC(flex_bdry
, "SLC Boundary information for Flex-OneNAND"
49 "Syntax:flex_bdry=DIE_BDRY,LOCK,..."
50 "DIE_BDRY: SLC boundary of the die"
51 "LOCK: Locking information for SLC boundary"
52 " : 0->Set boundary in unlocked status"
53 " : 1->Set boundary in locked status");
55 /* Default OneNAND/Flex-OneNAND OTP options*/
58 module_param(otp
, int, 0400);
59 MODULE_PARM_DESC(otp
, "Corresponding behaviour of OneNAND in OTP"
60 "Syntax : otp=LOCK_TYPE"
61 "LOCK_TYPE : Keys issued, for specific OTP Lock type"
62 " : 0 -> Default (No Blocks Locked)"
63 " : 1 -> OTP Block lock"
64 " : 2 -> 1st Block lock"
65 " : 3 -> BOTH OTP Block and 1st Block lock");
68 * flexonenand_oob_128 - oob info for Flex-Onenand with 4KB page
69 * For now, we expose only 64 out of 80 ecc bytes
71 static struct nand_ecclayout flexonenand_oob_128
= {
74 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
75 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
76 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
77 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
78 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
79 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
83 {2, 4}, {18, 4}, {34, 4}, {50, 4},
84 {66, 4}, {82, 4}, {98, 4}, {114, 4}
89 * onenand_oob_128 - oob info for OneNAND with 4KB page
91 * Based on specification:
92 * 4Gb M-die OneNAND Flash (KFM4G16Q4M, KFN8G16Q4M). Rev. 1.3, Apr. 2010
94 * For eccpos we expose only 64 bytes out of 72 (see struct nand_ecclayout)
96 * oobfree uses the spare area fields marked as
97 * "Managed by internal ECC logic for Logical Sector Number area"
99 static struct nand_ecclayout onenand_oob_128
= {
102 7, 8, 9, 10, 11, 12, 13, 14, 15,
103 23, 24, 25, 26, 27, 28, 29, 30, 31,
104 39, 40, 41, 42, 43, 44, 45, 46, 47,
105 55, 56, 57, 58, 59, 60, 61, 62, 63,
106 71, 72, 73, 74, 75, 76, 77, 78, 79,
107 87, 88, 89, 90, 91, 92, 93, 94, 95,
108 103, 104, 105, 106, 107, 108, 109, 110, 111,
112 {2, 3}, {18, 3}, {34, 3}, {50, 3},
113 {66, 3}, {82, 3}, {98, 3}, {114, 3}
118 * onenand_oob_64 - oob info for large (2KB) page
120 static struct nand_ecclayout onenand_oob_64
= {
129 {2, 3}, {14, 2}, {18, 3}, {30, 2},
130 {34, 3}, {46, 2}, {50, 3}, {62, 2}
135 * onenand_oob_32 - oob info for middle (1KB) page
137 static struct nand_ecclayout onenand_oob_32
= {
143 .oobfree
= { {2, 3}, {14, 2}, {18, 3}, {30, 2} }
146 static const unsigned char ffchars
[] = {
147 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
148 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 16 */
149 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
150 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 32 */
151 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
152 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 48 */
153 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
154 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 64 */
155 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
156 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 80 */
157 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
158 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 96 */
159 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
160 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 112 */
161 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
162 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 128 */
166 * onenand_readw - [OneNAND Interface] Read OneNAND register
167 * @param addr address to read
169 * Read OneNAND register
171 static unsigned short onenand_readw(void __iomem
*addr
)
177 * onenand_writew - [OneNAND Interface] Write OneNAND register with value
178 * @param value value to write
179 * @param addr address to write
181 * Write OneNAND register with value
183 static void onenand_writew(unsigned short value
, void __iomem
*addr
)
189 * onenand_block_address - [DEFAULT] Get block address
190 * @param this onenand chip data structure
191 * @param block the block
192 * @return translated block address if DDP, otherwise same
194 * Setup Start Address 1 Register (F100h)
196 static int onenand_block_address(struct onenand_chip
*this, int block
)
198 /* Device Flash Core select, NAND Flash Block Address */
199 if (block
& this->density_mask
)
200 return ONENAND_DDP_CHIP1
| (block
^ this->density_mask
);
206 * onenand_bufferram_address - [DEFAULT] Get bufferram address
207 * @param this onenand chip data structure
208 * @param block the block
209 * @return set DBS value if DDP, otherwise 0
211 * Setup Start Address 2 Register (F101h) for DDP
213 static int onenand_bufferram_address(struct onenand_chip
*this, int block
)
215 /* Device BufferRAM Select */
216 if (block
& this->density_mask
)
217 return ONENAND_DDP_CHIP1
;
219 return ONENAND_DDP_CHIP0
;
223 * onenand_page_address - [DEFAULT] Get page address
224 * @param page the page address
225 * @param sector the sector address
226 * @return combined page and sector address
228 * Setup Start Address 8 Register (F107h)
230 static int onenand_page_address(int page
, int sector
)
232 /* Flash Page Address, Flash Sector Address */
235 fpa
= page
& ONENAND_FPA_MASK
;
236 fsa
= sector
& ONENAND_FSA_MASK
;
238 return ((fpa
<< ONENAND_FPA_SHIFT
) | fsa
);
242 * onenand_buffer_address - [DEFAULT] Get buffer address
243 * @param dataram1 DataRAM index
244 * @param sectors the sector address
245 * @param count the number of sectors
246 * @return the start buffer value
248 * Setup Start Buffer Register (F200h)
250 static int onenand_buffer_address(int dataram1
, int sectors
, int count
)
254 /* BufferRAM Sector Address */
255 bsa
= sectors
& ONENAND_BSA_MASK
;
258 bsa
|= ONENAND_BSA_DATARAM1
; /* DataRAM1 */
260 bsa
|= ONENAND_BSA_DATARAM0
; /* DataRAM0 */
262 /* BufferRAM Sector Count */
263 bsc
= count
& ONENAND_BSC_MASK
;
265 return ((bsa
<< ONENAND_BSA_SHIFT
) | bsc
);
269 * flexonenand_block- For given address return block number
270 * @param this - OneNAND device structure
271 * @param addr - Address for which block number is needed
273 static unsigned flexonenand_block(struct onenand_chip
*this, loff_t addr
)
275 unsigned boundary
, blk
, die
= 0;
277 if (ONENAND_IS_DDP(this) && addr
>= this->diesize
[0]) {
279 addr
-= this->diesize
[0];
282 boundary
= this->boundary
[die
];
284 blk
= addr
>> (this->erase_shift
- 1);
286 blk
= (blk
+ boundary
+ 1) >> 1;
288 blk
+= die
? this->density_mask
: 0;
292 inline unsigned onenand_block(struct onenand_chip
*this, loff_t addr
)
294 if (!FLEXONENAND(this))
295 return addr
>> this->erase_shift
;
296 return flexonenand_block(this, addr
);
300 * flexonenand_addr - Return address of the block
301 * @this: OneNAND device structure
302 * @block: Block number on Flex-OneNAND
304 * Return address of the block
306 static loff_t
flexonenand_addr(struct onenand_chip
*this, int block
)
309 int die
= 0, boundary
;
311 if (ONENAND_IS_DDP(this) && block
>= this->density_mask
) {
312 block
-= this->density_mask
;
314 ofs
= this->diesize
[0];
317 boundary
= this->boundary
[die
];
318 ofs
+= (loff_t
)block
<< (this->erase_shift
- 1);
319 if (block
> (boundary
+ 1))
320 ofs
+= (loff_t
)(block
- boundary
- 1) << (this->erase_shift
- 1);
324 loff_t
onenand_addr(struct onenand_chip
*this, int block
)
326 if (!FLEXONENAND(this))
327 return (loff_t
)block
<< this->erase_shift
;
328 return flexonenand_addr(this, block
);
330 EXPORT_SYMBOL(onenand_addr
);
333 * onenand_get_density - [DEFAULT] Get OneNAND density
334 * @param dev_id OneNAND device ID
336 * Get OneNAND density from device ID
338 static inline int onenand_get_density(int dev_id
)
340 int density
= dev_id
>> ONENAND_DEVICE_DENSITY_SHIFT
;
341 return (density
& ONENAND_DEVICE_DENSITY_MASK
);
345 * flexonenand_region - [Flex-OneNAND] Return erase region of addr
346 * @param mtd MTD device structure
347 * @param addr address whose erase region needs to be identified
349 int flexonenand_region(struct mtd_info
*mtd
, loff_t addr
)
353 for (i
= 0; i
< mtd
->numeraseregions
; i
++)
354 if (addr
< mtd
->eraseregions
[i
].offset
)
358 EXPORT_SYMBOL(flexonenand_region
);
361 * onenand_command - [DEFAULT] Send command to OneNAND device
362 * @param mtd MTD device structure
363 * @param cmd the command to be sent
364 * @param addr offset to read from or write to
365 * @param len number of bytes to read or write
367 * Send command to OneNAND device. This function is used for middle/large page
368 * devices (1KB/2KB Bytes per page)
370 static int onenand_command(struct mtd_info
*mtd
, int cmd
, loff_t addr
, size_t len
)
372 struct onenand_chip
*this = mtd
->priv
;
373 int value
, block
, page
;
375 /* Address translation */
377 case ONENAND_CMD_UNLOCK
:
378 case ONENAND_CMD_LOCK
:
379 case ONENAND_CMD_LOCK_TIGHT
:
380 case ONENAND_CMD_UNLOCK_ALL
:
385 case FLEXONENAND_CMD_PI_ACCESS
:
386 /* addr contains die index */
387 block
= addr
* this->density_mask
;
391 case ONENAND_CMD_ERASE
:
392 case ONENAND_CMD_MULTIBLOCK_ERASE
:
393 case ONENAND_CMD_ERASE_VERIFY
:
394 case ONENAND_CMD_BUFFERRAM
:
395 case ONENAND_CMD_OTP_ACCESS
:
396 block
= onenand_block(this, addr
);
400 case FLEXONENAND_CMD_READ_PI
:
401 cmd
= ONENAND_CMD_READ
;
402 block
= addr
* this->density_mask
;
407 block
= onenand_block(this, addr
);
408 if (FLEXONENAND(this))
409 page
= (int) (addr
- onenand_addr(this, block
))>>\
412 page
= (int) (addr
>> this->page_shift
);
413 if (ONENAND_IS_2PLANE(this)) {
414 /* Make the even block number */
416 /* Is it the odd plane? */
417 if (addr
& this->writesize
)
421 page
&= this->page_mask
;
425 /* NOTE: The setting order of the registers is very important! */
426 if (cmd
== ONENAND_CMD_BUFFERRAM
) {
427 /* Select DataRAM for DDP */
428 value
= onenand_bufferram_address(this, block
);
429 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS2
);
431 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this))
432 /* It is always BufferRAM0 */
433 ONENAND_SET_BUFFERRAM0(this);
435 /* Switch to the next data buffer */
436 ONENAND_SET_NEXT_BUFFERRAM(this);
442 /* Write 'DFS, FBA' of Flash */
443 value
= onenand_block_address(this, block
);
444 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS1
);
446 /* Select DataRAM for DDP */
447 value
= onenand_bufferram_address(this, block
);
448 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS2
);
452 /* Now we use page size operation */
453 int sectors
= 0, count
= 0;
457 case FLEXONENAND_CMD_RECOVER_LSB
:
458 case ONENAND_CMD_READ
:
459 case ONENAND_CMD_READOOB
:
460 if (ONENAND_IS_4KB_PAGE(this))
461 /* It is always BufferRAM0 */
462 dataram
= ONENAND_SET_BUFFERRAM0(this);
464 dataram
= ONENAND_SET_NEXT_BUFFERRAM(this);
468 if (ONENAND_IS_2PLANE(this) && cmd
== ONENAND_CMD_PROG
)
469 cmd
= ONENAND_CMD_2X_PROG
;
470 dataram
= ONENAND_CURRENT_BUFFERRAM(this);
474 /* Write 'FPA, FSA' of Flash */
475 value
= onenand_page_address(page
, sectors
);
476 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS8
);
478 /* Write 'BSA, BSC' of DataRAM */
479 value
= onenand_buffer_address(dataram
, sectors
, count
);
480 this->write_word(value
, this->base
+ ONENAND_REG_START_BUFFER
);
483 /* Interrupt clear */
484 this->write_word(ONENAND_INT_CLEAR
, this->base
+ ONENAND_REG_INTERRUPT
);
487 this->write_word(cmd
, this->base
+ ONENAND_REG_COMMAND
);
493 * onenand_read_ecc - return ecc status
494 * @param this onenand chip structure
496 static inline int onenand_read_ecc(struct onenand_chip
*this)
498 int ecc
, i
, result
= 0;
500 if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this))
501 return this->read_word(this->base
+ ONENAND_REG_ECC_STATUS
);
503 for (i
= 0; i
< 4; i
++) {
504 ecc
= this->read_word(this->base
+ ONENAND_REG_ECC_STATUS
+ i
*2);
507 if (ecc
& FLEXONENAND_UNCORRECTABLE_ERROR
)
508 return ONENAND_ECC_2BIT_ALL
;
510 result
= ONENAND_ECC_1BIT_ALL
;
517 * onenand_wait - [DEFAULT] wait until the command is done
518 * @param mtd MTD device structure
519 * @param state state to select the max. timeout value
521 * Wait for command done. This applies to all OneNAND command
522 * Read can take up to 30us, erase up to 2ms and program up to 350us
523 * according to general OneNAND specs
525 static int onenand_wait(struct mtd_info
*mtd
, int state
)
527 struct onenand_chip
* this = mtd
->priv
;
528 unsigned long timeout
;
529 unsigned int flags
= ONENAND_INT_MASTER
;
530 unsigned int interrupt
= 0;
533 /* The 20 msec is enough */
534 timeout
= jiffies
+ msecs_to_jiffies(20);
535 while (time_before(jiffies
, timeout
)) {
536 interrupt
= this->read_word(this->base
+ ONENAND_REG_INTERRUPT
);
538 if (interrupt
& flags
)
541 if (state
!= FL_READING
&& state
!= FL_PREPARING_ERASE
)
544 /* To get correct interrupt status in timeout case */
545 interrupt
= this->read_word(this->base
+ ONENAND_REG_INTERRUPT
);
547 ctrl
= this->read_word(this->base
+ ONENAND_REG_CTRL_STATUS
);
550 * In the Spec. it checks the controller status first
551 * However if you get the correct information in case of
552 * power off recovery (POR) test, it should read ECC status first
554 if (interrupt
& ONENAND_INT_READ
) {
555 int ecc
= onenand_read_ecc(this);
557 if (ecc
& ONENAND_ECC_2BIT_ALL
) {
558 printk(KERN_ERR
"%s: ECC error = 0x%04x\n",
560 mtd
->ecc_stats
.failed
++;
562 } else if (ecc
& ONENAND_ECC_1BIT_ALL
) {
563 printk(KERN_DEBUG
"%s: correctable ECC error = 0x%04x\n",
565 mtd
->ecc_stats
.corrected
++;
568 } else if (state
== FL_READING
) {
569 printk(KERN_ERR
"%s: read timeout! ctrl=0x%04x intr=0x%04x\n",
570 __func__
, ctrl
, interrupt
);
574 if (state
== FL_PREPARING_ERASE
&& !(interrupt
& ONENAND_INT_ERASE
)) {
575 printk(KERN_ERR
"%s: mb erase timeout! ctrl=0x%04x intr=0x%04x\n",
576 __func__
, ctrl
, interrupt
);
580 if (!(interrupt
& ONENAND_INT_MASTER
)) {
581 printk(KERN_ERR
"%s: timeout! ctrl=0x%04x intr=0x%04x\n",
582 __func__
, ctrl
, interrupt
);
586 /* If there's controller error, it's a real error */
587 if (ctrl
& ONENAND_CTRL_ERROR
) {
588 printk(KERN_ERR
"%s: controller error = 0x%04x\n",
590 if (ctrl
& ONENAND_CTRL_LOCK
)
591 printk(KERN_ERR
"%s: it's locked error.\n", __func__
);
599 * onenand_interrupt - [DEFAULT] onenand interrupt handler
600 * @param irq onenand interrupt number
601 * @param dev_id interrupt data
605 static irqreturn_t
onenand_interrupt(int irq
, void *data
)
607 struct onenand_chip
*this = data
;
609 /* To handle shared interrupt */
610 if (!this->complete
.done
)
611 complete(&this->complete
);
617 * onenand_interrupt_wait - [DEFAULT] wait until the command is done
618 * @param mtd MTD device structure
619 * @param state state to select the max. timeout value
621 * Wait for command done.
623 static int onenand_interrupt_wait(struct mtd_info
*mtd
, int state
)
625 struct onenand_chip
*this = mtd
->priv
;
627 wait_for_completion(&this->complete
);
629 return onenand_wait(mtd
, state
);
633 * onenand_try_interrupt_wait - [DEFAULT] try interrupt wait
634 * @param mtd MTD device structure
635 * @param state state to select the max. timeout value
637 * Try interrupt based wait (It is used one-time)
639 static int onenand_try_interrupt_wait(struct mtd_info
*mtd
, int state
)
641 struct onenand_chip
*this = mtd
->priv
;
642 unsigned long remain
, timeout
;
644 /* We use interrupt wait first */
645 this->wait
= onenand_interrupt_wait
;
647 timeout
= msecs_to_jiffies(100);
648 remain
= wait_for_completion_timeout(&this->complete
, timeout
);
650 printk(KERN_INFO
"OneNAND: There's no interrupt. "
651 "We use the normal wait\n");
653 /* Release the irq */
654 free_irq(this->irq
, this);
656 this->wait
= onenand_wait
;
659 return onenand_wait(mtd
, state
);
663 * onenand_setup_wait - [OneNAND Interface] setup onenand wait method
664 * @param mtd MTD device structure
666 * There's two method to wait onenand work
667 * 1. polling - read interrupt status register
668 * 2. interrupt - use the kernel interrupt method
670 static void onenand_setup_wait(struct mtd_info
*mtd
)
672 struct onenand_chip
*this = mtd
->priv
;
675 init_completion(&this->complete
);
677 if (this->irq
<= 0) {
678 this->wait
= onenand_wait
;
682 if (request_irq(this->irq
, &onenand_interrupt
,
683 IRQF_SHARED
, "onenand", this)) {
684 /* If we can't get irq, use the normal wait */
685 this->wait
= onenand_wait
;
689 /* Enable interrupt */
690 syscfg
= this->read_word(this->base
+ ONENAND_REG_SYS_CFG1
);
691 syscfg
|= ONENAND_SYS_CFG1_IOBE
;
692 this->write_word(syscfg
, this->base
+ ONENAND_REG_SYS_CFG1
);
694 this->wait
= onenand_try_interrupt_wait
;
698 * onenand_bufferram_offset - [DEFAULT] BufferRAM offset
699 * @param mtd MTD data structure
700 * @param area BufferRAM area
701 * @return offset given area
703 * Return BufferRAM offset given area
705 static inline int onenand_bufferram_offset(struct mtd_info
*mtd
, int area
)
707 struct onenand_chip
*this = mtd
->priv
;
709 if (ONENAND_CURRENT_BUFFERRAM(this)) {
710 /* Note: the 'this->writesize' is a real page size */
711 if (area
== ONENAND_DATARAM
)
712 return this->writesize
;
713 if (area
== ONENAND_SPARERAM
)
721 * onenand_read_bufferram - [OneNAND Interface] Read the bufferram area
722 * @param mtd MTD data structure
723 * @param area BufferRAM area
724 * @param buffer the databuffer to put/get data
725 * @param offset offset to read from or write to
726 * @param count number of bytes to read/write
728 * Read the BufferRAM area
730 static int onenand_read_bufferram(struct mtd_info
*mtd
, int area
,
731 unsigned char *buffer
, int offset
, size_t count
)
733 struct onenand_chip
*this = mtd
->priv
;
734 void __iomem
*bufferram
;
736 bufferram
= this->base
+ area
;
738 bufferram
+= onenand_bufferram_offset(mtd
, area
);
740 if (ONENAND_CHECK_BYTE_ACCESS(count
)) {
743 /* Align with word(16-bit) size */
746 /* Read word and save byte */
747 word
= this->read_word(bufferram
+ offset
+ count
);
748 buffer
[count
] = (word
& 0xff);
751 memcpy(buffer
, bufferram
+ offset
, count
);
757 * onenand_sync_read_bufferram - [OneNAND Interface] Read the bufferram area with Sync. Burst mode
758 * @param mtd MTD data structure
759 * @param area BufferRAM area
760 * @param buffer the databuffer to put/get data
761 * @param offset offset to read from or write to
762 * @param count number of bytes to read/write
764 * Read the BufferRAM area with Sync. Burst Mode
766 static int onenand_sync_read_bufferram(struct mtd_info
*mtd
, int area
,
767 unsigned char *buffer
, int offset
, size_t count
)
769 struct onenand_chip
*this = mtd
->priv
;
770 void __iomem
*bufferram
;
772 bufferram
= this->base
+ area
;
774 bufferram
+= onenand_bufferram_offset(mtd
, area
);
776 this->mmcontrol(mtd
, ONENAND_SYS_CFG1_SYNC_READ
);
778 if (ONENAND_CHECK_BYTE_ACCESS(count
)) {
781 /* Align with word(16-bit) size */
784 /* Read word and save byte */
785 word
= this->read_word(bufferram
+ offset
+ count
);
786 buffer
[count
] = (word
& 0xff);
789 memcpy(buffer
, bufferram
+ offset
, count
);
791 this->mmcontrol(mtd
, 0);
797 * onenand_write_bufferram - [OneNAND Interface] Write the bufferram area
798 * @param mtd MTD data structure
799 * @param area BufferRAM area
800 * @param buffer the databuffer to put/get data
801 * @param offset offset to read from or write to
802 * @param count number of bytes to read/write
804 * Write the BufferRAM area
806 static int onenand_write_bufferram(struct mtd_info
*mtd
, int area
,
807 const unsigned char *buffer
, int offset
, size_t count
)
809 struct onenand_chip
*this = mtd
->priv
;
810 void __iomem
*bufferram
;
812 bufferram
= this->base
+ area
;
814 bufferram
+= onenand_bufferram_offset(mtd
, area
);
816 if (ONENAND_CHECK_BYTE_ACCESS(count
)) {
820 /* Align with word(16-bit) size */
823 /* Calculate byte access offset */
824 byte_offset
= offset
+ count
;
826 /* Read word and save byte */
827 word
= this->read_word(bufferram
+ byte_offset
);
828 word
= (word
& ~0xff) | buffer
[count
];
829 this->write_word(word
, bufferram
+ byte_offset
);
832 memcpy(bufferram
+ offset
, buffer
, count
);
838 * onenand_get_2x_blockpage - [GENERIC] Get blockpage at 2x program mode
839 * @param mtd MTD data structure
840 * @param addr address to check
841 * @return blockpage address
843 * Get blockpage address at 2x program mode
845 static int onenand_get_2x_blockpage(struct mtd_info
*mtd
, loff_t addr
)
847 struct onenand_chip
*this = mtd
->priv
;
848 int blockpage
, block
, page
;
850 /* Calculate the even block number */
851 block
= (int) (addr
>> this->erase_shift
) & ~1;
852 /* Is it the odd plane? */
853 if (addr
& this->writesize
)
855 page
= (int) (addr
>> (this->page_shift
+ 1)) & this->page_mask
;
856 blockpage
= (block
<< 7) | page
;
862 * onenand_check_bufferram - [GENERIC] Check BufferRAM information
863 * @param mtd MTD data structure
864 * @param addr address to check
865 * @return 1 if there are valid data, otherwise 0
867 * Check bufferram if there is data we required
869 static int onenand_check_bufferram(struct mtd_info
*mtd
, loff_t addr
)
871 struct onenand_chip
*this = mtd
->priv
;
872 int blockpage
, found
= 0;
875 if (ONENAND_IS_2PLANE(this))
876 blockpage
= onenand_get_2x_blockpage(mtd
, addr
);
878 blockpage
= (int) (addr
>> this->page_shift
);
880 /* Is there valid data? */
881 i
= ONENAND_CURRENT_BUFFERRAM(this);
882 if (this->bufferram
[i
].blockpage
== blockpage
)
885 /* Check another BufferRAM */
886 i
= ONENAND_NEXT_BUFFERRAM(this);
887 if (this->bufferram
[i
].blockpage
== blockpage
) {
888 ONENAND_SET_NEXT_BUFFERRAM(this);
893 if (found
&& ONENAND_IS_DDP(this)) {
894 /* Select DataRAM for DDP */
895 int block
= onenand_block(this, addr
);
896 int value
= onenand_bufferram_address(this, block
);
897 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS2
);
904 * onenand_update_bufferram - [GENERIC] Update BufferRAM information
905 * @param mtd MTD data structure
906 * @param addr address to update
907 * @param valid valid flag
909 * Update BufferRAM information
911 static void onenand_update_bufferram(struct mtd_info
*mtd
, loff_t addr
,
914 struct onenand_chip
*this = mtd
->priv
;
918 if (ONENAND_IS_2PLANE(this))
919 blockpage
= onenand_get_2x_blockpage(mtd
, addr
);
921 blockpage
= (int) (addr
>> this->page_shift
);
923 /* Invalidate another BufferRAM */
924 i
= ONENAND_NEXT_BUFFERRAM(this);
925 if (this->bufferram
[i
].blockpage
== blockpage
)
926 this->bufferram
[i
].blockpage
= -1;
928 /* Update BufferRAM */
929 i
= ONENAND_CURRENT_BUFFERRAM(this);
931 this->bufferram
[i
].blockpage
= blockpage
;
933 this->bufferram
[i
].blockpage
= -1;
937 * onenand_invalidate_bufferram - [GENERIC] Invalidate BufferRAM information
938 * @param mtd MTD data structure
939 * @param addr start address to invalidate
940 * @param len length to invalidate
942 * Invalidate BufferRAM information
944 static void onenand_invalidate_bufferram(struct mtd_info
*mtd
, loff_t addr
,
947 struct onenand_chip
*this = mtd
->priv
;
949 loff_t end_addr
= addr
+ len
;
951 /* Invalidate BufferRAM */
952 for (i
= 0; i
< MAX_BUFFERRAM
; i
++) {
953 loff_t buf_addr
= this->bufferram
[i
].blockpage
<< this->page_shift
;
954 if (buf_addr
>= addr
&& buf_addr
< end_addr
)
955 this->bufferram
[i
].blockpage
= -1;
960 * onenand_get_device - [GENERIC] Get chip for selected access
961 * @param mtd MTD device structure
962 * @param new_state the state which is requested
964 * Get the device and lock it for exclusive access
966 static int onenand_get_device(struct mtd_info
*mtd
, int new_state
)
968 struct onenand_chip
*this = mtd
->priv
;
969 DECLARE_WAITQUEUE(wait
, current
);
972 * Grab the lock and see if the device is available
975 spin_lock(&this->chip_lock
);
976 if (this->state
== FL_READY
) {
977 this->state
= new_state
;
978 spin_unlock(&this->chip_lock
);
979 if (new_state
!= FL_PM_SUSPENDED
&& this->enable
)
983 if (new_state
== FL_PM_SUSPENDED
) {
984 spin_unlock(&this->chip_lock
);
985 return (this->state
== FL_PM_SUSPENDED
) ? 0 : -EAGAIN
;
987 set_current_state(TASK_UNINTERRUPTIBLE
);
988 add_wait_queue(&this->wq
, &wait
);
989 spin_unlock(&this->chip_lock
);
991 remove_wait_queue(&this->wq
, &wait
);
998 * onenand_release_device - [GENERIC] release chip
999 * @param mtd MTD device structure
1001 * Deselect, release chip lock and wake up anyone waiting on the device
1003 static void onenand_release_device(struct mtd_info
*mtd
)
1005 struct onenand_chip
*this = mtd
->priv
;
1007 if (this->state
!= FL_PM_SUSPENDED
&& this->disable
)
1009 /* Release the chip */
1010 spin_lock(&this->chip_lock
);
1011 this->state
= FL_READY
;
1013 spin_unlock(&this->chip_lock
);
1017 * onenand_transfer_auto_oob - [INTERN] oob auto-placement transfer
1018 * @param mtd MTD device structure
1019 * @param buf destination address
1020 * @param column oob offset to read from
1021 * @param thislen oob length to read
1023 static int onenand_transfer_auto_oob(struct mtd_info
*mtd
, uint8_t *buf
, int column
,
1026 struct onenand_chip
*this = mtd
->priv
;
1027 struct nand_oobfree
*free
;
1028 int readcol
= column
;
1029 int readend
= column
+ thislen
;
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
);
1050 memcpy(buf
, oob_buf
+ st
, n
);
1052 } else if (column
== 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
;
1076 /* Recovery is only for Flex-OneNAND */
1077 if (!FLEXONENAND(this))
1080 /* check if we failed due to uncorrectable error */
1081 if (!mtd_is_eccerr(status
) && status
!= ONENAND_BBT_READ_ECC_ERROR
)
1084 /* check if address lies in MLC region */
1085 i
= flexonenand_region(mtd
, addr
);
1086 if (mtd
->eraseregions
[i
].erasesize
< (1 << this->erase_shift
))
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",
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
;
1122 int writesize
= this->writesize
;
1124 pr_debug("%s: from = 0x%08x, len = %i\n", __func__
, (unsigned int)from
,
1127 oobsize
= mtd_oobavail(mtd
, ops
);
1128 oobcolumn
= from
& (mtd
->oobsize
- 1);
1130 /* Do not allow reads past end of device */
1131 if (from
+ len
> mtd
->size
) {
1132 printk(KERN_ERR
"%s: Attempt read beyond end of device\n",
1139 stats
= mtd
->ecc_stats
;
1141 while (read
< len
) {
1144 thislen
= min_t(int, writesize
, len
- read
);
1146 column
= from
& (writesize
- 1);
1147 if (column
+ thislen
> writesize
)
1148 thislen
= writesize
- column
;
1150 if (!onenand_check_bufferram(mtd
, from
)) {
1151 this->command(mtd
, ONENAND_CMD_READ
, from
, writesize
);
1153 ret
= this->wait(mtd
, FL_READING
);
1155 ret
= onenand_recover_lsb(mtd
, from
, ret
);
1156 onenand_update_bufferram(mtd
, from
, !ret
);
1157 if (mtd_is_eccerr(ret
))
1163 this->read_bufferram(mtd
, ONENAND_DATARAM
, buf
, column
, thislen
);
1165 thisooblen
= oobsize
- oobcolumn
;
1166 thisooblen
= min_t(int, thisooblen
, ooblen
- oobread
);
1168 if (ops
->mode
== MTD_OPS_AUTO_OOB
)
1169 onenand_transfer_auto_oob(mtd
, oobbuf
, oobcolumn
, thisooblen
);
1171 this->read_bufferram(mtd
, ONENAND_SPARERAM
, oobbuf
, oobcolumn
, thisooblen
);
1172 oobread
+= thisooblen
;
1173 oobbuf
+= thisooblen
;
1186 * Return success, if no ECC failures, else -EBADMSG
1187 * fs driver will take care of that, because
1188 * retlen == desired len and result == -EBADMSG
1191 ops
->oobretlen
= oobread
;
1196 if (mtd
->ecc_stats
.failed
- stats
.failed
)
1199 /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1200 return mtd
->ecc_stats
.corrected
!= stats
.corrected
? 1 : 0;
1204 * onenand_read_ops_nolock - [OneNAND Interface] OneNAND read main and/or out-of-band
1205 * @param mtd MTD device structure
1206 * @param from offset to read from
1207 * @param ops: oob operation description structure
1209 * OneNAND read main and/or out-of-band data
1211 static int onenand_read_ops_nolock(struct mtd_info
*mtd
, loff_t from
,
1212 struct mtd_oob_ops
*ops
)
1214 struct onenand_chip
*this = mtd
->priv
;
1215 struct mtd_ecc_stats stats
;
1216 size_t len
= ops
->len
;
1217 size_t ooblen
= ops
->ooblen
;
1218 u_char
*buf
= ops
->datbuf
;
1219 u_char
*oobbuf
= ops
->oobbuf
;
1220 int read
= 0, column
, thislen
;
1221 int oobread
= 0, oobcolumn
, thisooblen
, oobsize
;
1222 int ret
= 0, boundary
= 0;
1223 int writesize
= this->writesize
;
1225 pr_debug("%s: from = 0x%08x, len = %i\n", __func__
, (unsigned int)from
,
1228 oobsize
= mtd_oobavail(mtd
, ops
);
1229 oobcolumn
= from
& (mtd
->oobsize
- 1);
1231 /* Do not allow reads past end of device */
1232 if ((from
+ len
) > mtd
->size
) {
1233 printk(KERN_ERR
"%s: Attempt read beyond end of device\n",
1240 stats
= mtd
->ecc_stats
;
1242 /* Read-while-load method */
1244 /* Do first load to bufferRAM */
1246 if (!onenand_check_bufferram(mtd
, from
)) {
1247 this->command(mtd
, ONENAND_CMD_READ
, from
, writesize
);
1248 ret
= this->wait(mtd
, FL_READING
);
1249 onenand_update_bufferram(mtd
, from
, !ret
);
1250 if (mtd_is_eccerr(ret
))
1255 thislen
= min_t(int, writesize
, len
- read
);
1256 column
= from
& (writesize
- 1);
1257 if (column
+ thislen
> writesize
)
1258 thislen
= writesize
- column
;
1261 /* If there is more to load then start next load */
1263 if (read
+ thislen
< len
) {
1264 this->command(mtd
, ONENAND_CMD_READ
, from
, writesize
);
1266 * Chip boundary handling in DDP
1267 * Now we issued chip 1 read and pointed chip 1
1268 * bufferram so we have to point chip 0 bufferram.
1270 if (ONENAND_IS_DDP(this) &&
1271 unlikely(from
== (this->chipsize
>> 1))) {
1272 this->write_word(ONENAND_DDP_CHIP0
, this->base
+ ONENAND_REG_START_ADDRESS2
);
1276 ONENAND_SET_PREV_BUFFERRAM(this);
1278 /* While load is going, read from last bufferRAM */
1279 this->read_bufferram(mtd
, ONENAND_DATARAM
, buf
, column
, thislen
);
1281 /* Read oob area if needed */
1283 thisooblen
= oobsize
- oobcolumn
;
1284 thisooblen
= min_t(int, thisooblen
, ooblen
- oobread
);
1286 if (ops
->mode
== MTD_OPS_AUTO_OOB
)
1287 onenand_transfer_auto_oob(mtd
, oobbuf
, oobcolumn
, thisooblen
);
1289 this->read_bufferram(mtd
, ONENAND_SPARERAM
, oobbuf
, oobcolumn
, thisooblen
);
1290 oobread
+= thisooblen
;
1291 oobbuf
+= thisooblen
;
1295 /* See if we are done */
1299 /* Set up for next read from bufferRAM */
1300 if (unlikely(boundary
))
1301 this->write_word(ONENAND_DDP_CHIP1
, this->base
+ ONENAND_REG_START_ADDRESS2
);
1302 ONENAND_SET_NEXT_BUFFERRAM(this);
1304 thislen
= min_t(int, writesize
, len
- read
);
1307 /* Now wait for load */
1308 ret
= this->wait(mtd
, FL_READING
);
1309 onenand_update_bufferram(mtd
, from
, !ret
);
1310 if (mtd_is_eccerr(ret
))
1315 * Return success, if no ECC failures, else -EBADMSG
1316 * fs driver will take care of that, because
1317 * retlen == desired len and result == -EBADMSG
1320 ops
->oobretlen
= oobread
;
1325 if (mtd
->ecc_stats
.failed
- stats
.failed
)
1328 /* return max bitflips per ecc step; ONENANDs correct 1 bit only */
1329 return mtd
->ecc_stats
.corrected
!= stats
.corrected
? 1 : 0;
1333 * onenand_read_oob_nolock - [MTD Interface] OneNAND read out-of-band
1334 * @param mtd MTD device structure
1335 * @param from offset to read from
1336 * @param ops: oob operation description structure
1338 * OneNAND read out-of-band data from the spare area
1340 static int onenand_read_oob_nolock(struct mtd_info
*mtd
, loff_t from
,
1341 struct mtd_oob_ops
*ops
)
1343 struct onenand_chip
*this = mtd
->priv
;
1344 struct mtd_ecc_stats stats
;
1345 int read
= 0, thislen
, column
, oobsize
;
1346 size_t len
= ops
->ooblen
;
1347 unsigned int mode
= ops
->mode
;
1348 u_char
*buf
= ops
->oobbuf
;
1349 int ret
= 0, readcmd
;
1351 from
+= ops
->ooboffs
;
1353 pr_debug("%s: from = 0x%08x, len = %i\n", __func__
, (unsigned int)from
,
1356 /* Initialize return length value */
1359 if (mode
== MTD_OPS_AUTO_OOB
)
1360 oobsize
= mtd
->oobavail
;
1362 oobsize
= mtd
->oobsize
;
1364 column
= from
& (mtd
->oobsize
- 1);
1366 if (unlikely(column
>= oobsize
)) {
1367 printk(KERN_ERR
"%s: Attempted to start read outside oob\n",
1372 /* Do not allow reads past end of device */
1373 if (unlikely(from
>= mtd
->size
||
1374 column
+ len
> ((mtd
->size
>> this->page_shift
) -
1375 (from
>> this->page_shift
)) * oobsize
)) {
1376 printk(KERN_ERR
"%s: Attempted to read beyond end of device\n",
1381 stats
= mtd
->ecc_stats
;
1383 readcmd
= ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ
: ONENAND_CMD_READOOB
;
1385 while (read
< len
) {
1388 thislen
= oobsize
- column
;
1389 thislen
= min_t(int, thislen
, len
);
1391 this->command(mtd
, readcmd
, from
, mtd
->oobsize
);
1393 onenand_update_bufferram(mtd
, from
, 0);
1395 ret
= this->wait(mtd
, FL_READING
);
1397 ret
= onenand_recover_lsb(mtd
, from
, ret
);
1399 if (ret
&& !mtd_is_eccerr(ret
)) {
1400 printk(KERN_ERR
"%s: read failed = 0x%x\n",
1405 if (mode
== MTD_OPS_AUTO_OOB
)
1406 onenand_transfer_auto_oob(mtd
, buf
, column
, thislen
);
1408 this->read_bufferram(mtd
, ONENAND_SPARERAM
, buf
, column
, thislen
);
1420 from
+= mtd
->writesize
;
1425 ops
->oobretlen
= read
;
1430 if (mtd
->ecc_stats
.failed
- stats
.failed
)
1437 * onenand_read - [MTD Interface] Read data from flash
1438 * @param mtd MTD device structure
1439 * @param from offset to read from
1440 * @param len number of bytes to read
1441 * @param retlen pointer to variable to store the number of read bytes
1442 * @param buf the databuffer to put data
1446 static int onenand_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
1447 size_t *retlen
, u_char
*buf
)
1449 struct onenand_chip
*this = mtd
->priv
;
1450 struct mtd_oob_ops ops
= {
1458 onenand_get_device(mtd
, FL_READING
);
1459 ret
= ONENAND_IS_4KB_PAGE(this) ?
1460 onenand_mlc_read_ops_nolock(mtd
, from
, &ops
) :
1461 onenand_read_ops_nolock(mtd
, from
, &ops
);
1462 onenand_release_device(mtd
);
1464 *retlen
= ops
.retlen
;
1469 * onenand_read_oob - [MTD Interface] Read main and/or out-of-band
1470 * @param mtd: MTD device structure
1471 * @param from: offset to read from
1472 * @param ops: oob operation description structure
1474 * Read main and/or out-of-band
1476 static int onenand_read_oob(struct mtd_info
*mtd
, loff_t from
,
1477 struct mtd_oob_ops
*ops
)
1479 struct onenand_chip
*this = mtd
->priv
;
1482 switch (ops
->mode
) {
1483 case MTD_OPS_PLACE_OOB
:
1484 case MTD_OPS_AUTO_OOB
:
1487 /* Not implemented yet */
1492 onenand_get_device(mtd
, FL_READING
);
1494 ret
= ONENAND_IS_4KB_PAGE(this) ?
1495 onenand_mlc_read_ops_nolock(mtd
, from
, ops
) :
1496 onenand_read_ops_nolock(mtd
, from
, ops
);
1498 ret
= onenand_read_oob_nolock(mtd
, from
, ops
);
1499 onenand_release_device(mtd
);
1505 * onenand_bbt_wait - [DEFAULT] wait until the command is done
1506 * @param mtd MTD device structure
1507 * @param state state to select the max. timeout value
1509 * Wait for command done.
1511 static int onenand_bbt_wait(struct mtd_info
*mtd
, int state
)
1513 struct onenand_chip
*this = mtd
->priv
;
1514 unsigned long timeout
;
1515 unsigned int interrupt
, ctrl
, ecc
, addr1
, addr8
;
1517 /* The 20 msec is enough */
1518 timeout
= jiffies
+ msecs_to_jiffies(20);
1519 while (time_before(jiffies
, timeout
)) {
1520 interrupt
= this->read_word(this->base
+ ONENAND_REG_INTERRUPT
);
1521 if (interrupt
& ONENAND_INT_MASTER
)
1524 /* To get correct interrupt status in timeout case */
1525 interrupt
= this->read_word(this->base
+ ONENAND_REG_INTERRUPT
);
1526 ctrl
= this->read_word(this->base
+ ONENAND_REG_CTRL_STATUS
);
1527 addr1
= this->read_word(this->base
+ ONENAND_REG_START_ADDRESS1
);
1528 addr8
= this->read_word(this->base
+ ONENAND_REG_START_ADDRESS8
);
1530 if (interrupt
& ONENAND_INT_READ
) {
1531 ecc
= onenand_read_ecc(this);
1532 if (ecc
& ONENAND_ECC_2BIT_ALL
) {
1533 printk(KERN_DEBUG
"%s: ecc 0x%04x ctrl 0x%04x "
1534 "intr 0x%04x addr1 %#x addr8 %#x\n",
1535 __func__
, ecc
, ctrl
, interrupt
, addr1
, addr8
);
1536 return ONENAND_BBT_READ_ECC_ERROR
;
1539 printk(KERN_ERR
"%s: read timeout! ctrl 0x%04x "
1540 "intr 0x%04x addr1 %#x addr8 %#x\n",
1541 __func__
, ctrl
, interrupt
, addr1
, addr8
);
1542 return ONENAND_BBT_READ_FATAL_ERROR
;
1545 /* Initial bad block case: 0x2400 or 0x0400 */
1546 if (ctrl
& ONENAND_CTRL_ERROR
) {
1547 printk(KERN_DEBUG
"%s: ctrl 0x%04x intr 0x%04x addr1 %#x "
1548 "addr8 %#x\n", __func__
, ctrl
, interrupt
, addr1
, addr8
);
1549 return ONENAND_BBT_READ_ERROR
;
1556 * onenand_bbt_read_oob - [MTD Interface] OneNAND read out-of-band for bbt scan
1557 * @param mtd MTD device structure
1558 * @param from offset to read from
1559 * @param ops oob operation description structure
1561 * OneNAND read out-of-band data from the spare area for bbt scan
1563 int onenand_bbt_read_oob(struct mtd_info
*mtd
, loff_t from
,
1564 struct mtd_oob_ops
*ops
)
1566 struct onenand_chip
*this = mtd
->priv
;
1567 int read
= 0, thislen
, column
;
1568 int ret
= 0, readcmd
;
1569 size_t len
= ops
->ooblen
;
1570 u_char
*buf
= ops
->oobbuf
;
1572 pr_debug("%s: from = 0x%08x, len = %zi\n", __func__
, (unsigned int)from
,
1575 /* Initialize return value */
1578 /* Do not allow reads past end of device */
1579 if (unlikely((from
+ len
) > mtd
->size
)) {
1580 printk(KERN_ERR
"%s: Attempt read beyond end of device\n",
1582 return ONENAND_BBT_READ_FATAL_ERROR
;
1585 /* Grab the lock and see if the device is available */
1586 onenand_get_device(mtd
, FL_READING
);
1588 column
= from
& (mtd
->oobsize
- 1);
1590 readcmd
= ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ
: ONENAND_CMD_READOOB
;
1592 while (read
< len
) {
1595 thislen
= mtd
->oobsize
- column
;
1596 thislen
= min_t(int, thislen
, len
);
1598 this->command(mtd
, readcmd
, from
, mtd
->oobsize
);
1600 onenand_update_bufferram(mtd
, from
, 0);
1602 ret
= this->bbt_wait(mtd
, FL_READING
);
1604 ret
= onenand_recover_lsb(mtd
, from
, ret
);
1609 this->read_bufferram(mtd
, ONENAND_SPARERAM
, buf
, column
, thislen
);
1618 /* Update Page size */
1619 from
+= this->writesize
;
1624 /* Deselect and wake up anyone waiting on the device */
1625 onenand_release_device(mtd
);
1627 ops
->oobretlen
= read
;
1631 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
1633 * onenand_verify_oob - [GENERIC] verify the oob contents after a write
1634 * @param mtd MTD device structure
1635 * @param buf the databuffer to verify
1636 * @param to offset to read from
1638 static int onenand_verify_oob(struct mtd_info
*mtd
, const u_char
*buf
, loff_t to
)
1640 struct onenand_chip
*this = mtd
->priv
;
1641 u_char
*oob_buf
= this->oob_buf
;
1642 int status
, i
, readcmd
;
1644 readcmd
= ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ
: ONENAND_CMD_READOOB
;
1646 this->command(mtd
, readcmd
, to
, mtd
->oobsize
);
1647 onenand_update_bufferram(mtd
, to
, 0);
1648 status
= this->wait(mtd
, FL_READING
);
1652 this->read_bufferram(mtd
, ONENAND_SPARERAM
, oob_buf
, 0, mtd
->oobsize
);
1653 for (i
= 0; i
< mtd
->oobsize
; i
++)
1654 if (buf
[i
] != 0xFF && buf
[i
] != oob_buf
[i
])
1661 * onenand_verify - [GENERIC] verify the chip contents after a write
1662 * @param mtd MTD device structure
1663 * @param buf the databuffer to verify
1664 * @param addr offset to read from
1665 * @param len number of bytes to read and compare
1667 static int onenand_verify(struct mtd_info
*mtd
, const u_char
*buf
, loff_t addr
, size_t len
)
1669 struct onenand_chip
*this = mtd
->priv
;
1671 int thislen
, column
;
1673 column
= addr
& (this->writesize
- 1);
1676 thislen
= min_t(int, this->writesize
- column
, len
);
1678 this->command(mtd
, ONENAND_CMD_READ
, addr
, this->writesize
);
1680 onenand_update_bufferram(mtd
, addr
, 0);
1682 ret
= this->wait(mtd
, FL_READING
);
1686 onenand_update_bufferram(mtd
, addr
, 1);
1688 this->read_bufferram(mtd
, ONENAND_DATARAM
, this->verify_buf
, 0, mtd
->writesize
);
1690 if (memcmp(buf
, this->verify_buf
+ column
, thislen
))
1702 #define onenand_verify(...) (0)
1703 #define onenand_verify_oob(...) (0)
1706 #define NOTALIGNED(x) ((x & (this->subpagesize - 1)) != 0)
1708 static void onenand_panic_wait(struct mtd_info
*mtd
)
1710 struct onenand_chip
*this = mtd
->priv
;
1711 unsigned int interrupt
;
1714 for (i
= 0; i
< 2000; i
++) {
1715 interrupt
= this->read_word(this->base
+ ONENAND_REG_INTERRUPT
);
1716 if (interrupt
& ONENAND_INT_MASTER
)
1723 * onenand_panic_write - [MTD Interface] write buffer to FLASH in a panic context
1724 * @param mtd MTD device structure
1725 * @param to offset to write to
1726 * @param len number of bytes to write
1727 * @param retlen pointer to variable to store the number of written bytes
1728 * @param buf the data to write
1732 static int onenand_panic_write(struct mtd_info
*mtd
, loff_t to
, size_t len
,
1733 size_t *retlen
, const u_char
*buf
)
1735 struct onenand_chip
*this = mtd
->priv
;
1736 int column
, subpage
;
1739 if (this->state
== FL_PM_SUSPENDED
)
1742 /* Wait for any existing operation to clear */
1743 onenand_panic_wait(mtd
);
1745 pr_debug("%s: to = 0x%08x, len = %i\n", __func__
, (unsigned int)to
,
1748 /* Reject writes, which are not page aligned */
1749 if (unlikely(NOTALIGNED(to
) || NOTALIGNED(len
))) {
1750 printk(KERN_ERR
"%s: Attempt to write not page aligned data\n",
1755 column
= to
& (mtd
->writesize
- 1);
1757 /* Loop until all data write */
1758 while (written
< len
) {
1759 int thislen
= min_t(int, mtd
->writesize
- column
, len
- written
);
1760 u_char
*wbuf
= (u_char
*) buf
;
1762 this->command(mtd
, ONENAND_CMD_BUFFERRAM
, to
, thislen
);
1764 /* Partial page write */
1765 subpage
= thislen
< mtd
->writesize
;
1767 memset(this->page_buf
, 0xff, mtd
->writesize
);
1768 memcpy(this->page_buf
+ column
, buf
, thislen
);
1769 wbuf
= this->page_buf
;
1772 this->write_bufferram(mtd
, ONENAND_DATARAM
, wbuf
, 0, mtd
->writesize
);
1773 this->write_bufferram(mtd
, ONENAND_SPARERAM
, ffchars
, 0, mtd
->oobsize
);
1775 this->command(mtd
, ONENAND_CMD_PROG
, to
, mtd
->writesize
);
1777 onenand_panic_wait(mtd
);
1779 /* In partial page write we don't update bufferram */
1780 onenand_update_bufferram(mtd
, to
, !subpage
);
1781 if (ONENAND_IS_2PLANE(this)) {
1782 ONENAND_SET_BUFFERRAM1(this);
1783 onenand_update_bufferram(mtd
, to
+ this->writesize
, !subpage
);
1801 * onenand_fill_auto_oob - [INTERN] oob auto-placement transfer
1802 * @param mtd MTD device structure
1803 * @param oob_buf oob buffer
1804 * @param buf source address
1805 * @param column oob offset to write to
1806 * @param thislen oob length to write
1808 static int onenand_fill_auto_oob(struct mtd_info
*mtd
, u_char
*oob_buf
,
1809 const u_char
*buf
, int column
, int thislen
)
1811 struct onenand_chip
*this = mtd
->priv
;
1812 struct nand_oobfree
*free
;
1813 int writecol
= column
;
1814 int writeend
= column
+ thislen
;
1818 free
= this->ecclayout
->oobfree
;
1819 for (i
= 0; i
< MTD_MAX_OOBFREE_ENTRIES
&& free
->length
; i
++, free
++) {
1820 if (writecol
>= lastgap
)
1821 writecol
+= free
->offset
- lastgap
;
1822 if (writeend
>= lastgap
)
1823 writeend
+= free
->offset
- lastgap
;
1824 lastgap
= free
->offset
+ free
->length
;
1826 free
= this->ecclayout
->oobfree
;
1827 for (i
= 0; i
< MTD_MAX_OOBFREE_ENTRIES
&& free
->length
; i
++, free
++) {
1828 int free_end
= free
->offset
+ free
->length
;
1829 if (free
->offset
< writeend
&& free_end
> writecol
) {
1830 int st
= max_t(int,free
->offset
,writecol
);
1831 int ed
= min_t(int,free_end
,writeend
);
1833 memcpy(oob_buf
+ st
, buf
, n
);
1835 } else if (column
== 0)
1842 * onenand_write_ops_nolock - [OneNAND Interface] write main and/or out-of-band
1843 * @param mtd MTD device structure
1844 * @param to offset to write to
1845 * @param ops oob operation description structure
1847 * Write main and/or oob with ECC
1849 static int onenand_write_ops_nolock(struct mtd_info
*mtd
, loff_t to
,
1850 struct mtd_oob_ops
*ops
)
1852 struct onenand_chip
*this = mtd
->priv
;
1853 int written
= 0, column
, thislen
= 0, subpage
= 0;
1854 int prev
= 0, prevlen
= 0, prev_subpage
= 0, first
= 1;
1855 int oobwritten
= 0, oobcolumn
, thisooblen
, oobsize
;
1856 size_t len
= ops
->len
;
1857 size_t ooblen
= ops
->ooblen
;
1858 const u_char
*buf
= ops
->datbuf
;
1859 const u_char
*oob
= ops
->oobbuf
;
1863 pr_debug("%s: to = 0x%08x, len = %i\n", __func__
, (unsigned int)to
,
1866 /* Initialize retlen, in case of early exit */
1870 /* Reject writes, which are not page aligned */
1871 if (unlikely(NOTALIGNED(to
) || NOTALIGNED(len
))) {
1872 printk(KERN_ERR
"%s: Attempt to write not page aligned data\n",
1877 /* Check zero length */
1880 oobsize
= mtd_oobavail(mtd
, ops
);
1881 oobcolumn
= to
& (mtd
->oobsize
- 1);
1883 column
= to
& (mtd
->writesize
- 1);
1885 /* Loop until all data write */
1887 if (written
< len
) {
1888 u_char
*wbuf
= (u_char
*) buf
;
1890 thislen
= min_t(int, mtd
->writesize
- column
, len
- written
);
1891 thisooblen
= min_t(int, oobsize
- oobcolumn
, ooblen
- oobwritten
);
1895 this->command(mtd
, ONENAND_CMD_BUFFERRAM
, to
, thislen
);
1897 /* Partial page write */
1898 subpage
= thislen
< mtd
->writesize
;
1900 memset(this->page_buf
, 0xff, mtd
->writesize
);
1901 memcpy(this->page_buf
+ column
, buf
, thislen
);
1902 wbuf
= this->page_buf
;
1905 this->write_bufferram(mtd
, ONENAND_DATARAM
, wbuf
, 0, mtd
->writesize
);
1908 oobbuf
= this->oob_buf
;
1910 /* We send data to spare ram with oobsize
1911 * to prevent byte access */
1912 memset(oobbuf
, 0xff, mtd
->oobsize
);
1913 if (ops
->mode
== MTD_OPS_AUTO_OOB
)
1914 onenand_fill_auto_oob(mtd
, oobbuf
, oob
, oobcolumn
, thisooblen
);
1916 memcpy(oobbuf
+ oobcolumn
, oob
, thisooblen
);
1918 oobwritten
+= thisooblen
;
1922 oobbuf
= (u_char
*) ffchars
;
1924 this->write_bufferram(mtd
, ONENAND_SPARERAM
, oobbuf
, 0, mtd
->oobsize
);
1926 ONENAND_SET_NEXT_BUFFERRAM(this);
1929 * 2 PLANE, MLC, and Flex-OneNAND do not support
1930 * write-while-program feature.
1932 if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first
) {
1933 ONENAND_SET_PREV_BUFFERRAM(this);
1935 ret
= this->wait(mtd
, FL_WRITING
);
1937 /* In partial page write we don't update bufferram */
1938 onenand_update_bufferram(mtd
, prev
, !ret
&& !prev_subpage
);
1941 printk(KERN_ERR
"%s: write failed %d\n",
1946 if (written
== len
) {
1947 /* Only check verify write turn on */
1948 ret
= onenand_verify(mtd
, buf
- len
, to
- len
, len
);
1950 printk(KERN_ERR
"%s: verify failed %d\n",
1955 ONENAND_SET_NEXT_BUFFERRAM(this);
1959 cmd
= ONENAND_CMD_PROG
;
1961 /* Exclude 1st OTP and OTP blocks for cache program feature */
1962 if (ONENAND_IS_CACHE_PROGRAM(this) &&
1963 likely(onenand_block(this, to
) != 0) &&
1964 ONENAND_IS_4KB_PAGE(this) &&
1965 ((written
+ thislen
) < len
)) {
1966 cmd
= ONENAND_CMD_2X_CACHE_PROG
;
1970 this->command(mtd
, cmd
, to
, mtd
->writesize
);
1973 * 2 PLANE, MLC, and Flex-OneNAND wait here
1975 if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) {
1976 ret
= this->wait(mtd
, FL_WRITING
);
1978 /* In partial page write we don't update bufferram */
1979 onenand_update_bufferram(mtd
, to
, !ret
&& !subpage
);
1981 printk(KERN_ERR
"%s: write failed %d\n",
1986 /* Only check verify write turn on */
1987 ret
= onenand_verify(mtd
, buf
, to
, thislen
);
1989 printk(KERN_ERR
"%s: verify failed %d\n",
2003 prev_subpage
= subpage
;
2011 /* In error case, clear all bufferrams */
2013 onenand_invalidate_bufferram(mtd
, 0, -1);
2015 ops
->retlen
= written
;
2016 ops
->oobretlen
= oobwritten
;
2023 * onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band
2024 * @param mtd MTD device structure
2025 * @param to offset to write to
2026 * @param len number of bytes to write
2027 * @param retlen pointer to variable to store the number of written bytes
2028 * @param buf the data to write
2029 * @param mode operation mode
2031 * OneNAND write out-of-band
2033 static int onenand_write_oob_nolock(struct mtd_info
*mtd
, loff_t to
,
2034 struct mtd_oob_ops
*ops
)
2036 struct onenand_chip
*this = mtd
->priv
;
2037 int column
, ret
= 0, oobsize
;
2038 int written
= 0, oobcmd
;
2040 size_t len
= ops
->ooblen
;
2041 const u_char
*buf
= ops
->oobbuf
;
2042 unsigned int mode
= ops
->mode
;
2046 pr_debug("%s: to = 0x%08x, len = %i\n", __func__
, (unsigned int)to
,
2049 /* Initialize retlen, in case of early exit */
2052 if (mode
== MTD_OPS_AUTO_OOB
)
2053 oobsize
= mtd
->oobavail
;
2055 oobsize
= mtd
->oobsize
;
2057 column
= to
& (mtd
->oobsize
- 1);
2059 if (unlikely(column
>= oobsize
)) {
2060 printk(KERN_ERR
"%s: Attempted to start write outside oob\n",
2065 /* For compatibility with NAND: Do not allow write past end of page */
2066 if (unlikely(column
+ len
> oobsize
)) {
2067 printk(KERN_ERR
"%s: Attempt to write past end of page\n",
2072 /* Do not allow reads past end of device */
2073 if (unlikely(to
>= mtd
->size
||
2074 column
+ len
> ((mtd
->size
>> this->page_shift
) -
2075 (to
>> this->page_shift
)) * oobsize
)) {
2076 printk(KERN_ERR
"%s: Attempted to write past end of device\n",
2081 oobbuf
= this->oob_buf
;
2083 oobcmd
= ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG
: ONENAND_CMD_PROGOOB
;
2085 /* Loop until all data write */
2086 while (written
< len
) {
2087 int thislen
= min_t(int, oobsize
, len
- written
);
2091 this->command(mtd
, ONENAND_CMD_BUFFERRAM
, to
, mtd
->oobsize
);
2093 /* We send data to spare ram with oobsize
2094 * to prevent byte access */
2095 memset(oobbuf
, 0xff, mtd
->oobsize
);
2096 if (mode
== MTD_OPS_AUTO_OOB
)
2097 onenand_fill_auto_oob(mtd
, oobbuf
, buf
, column
, thislen
);
2099 memcpy(oobbuf
+ column
, buf
, thislen
);
2100 this->write_bufferram(mtd
, ONENAND_SPARERAM
, oobbuf
, 0, mtd
->oobsize
);
2102 if (ONENAND_IS_4KB_PAGE(this)) {
2103 /* Set main area of DataRAM to 0xff*/
2104 memset(this->page_buf
, 0xff, mtd
->writesize
);
2105 this->write_bufferram(mtd
, ONENAND_DATARAM
,
2106 this->page_buf
, 0, mtd
->writesize
);
2109 this->command(mtd
, oobcmd
, to
, mtd
->oobsize
);
2111 onenand_update_bufferram(mtd
, to
, 0);
2112 if (ONENAND_IS_2PLANE(this)) {
2113 ONENAND_SET_BUFFERRAM1(this);
2114 onenand_update_bufferram(mtd
, to
+ this->writesize
, 0);
2117 ret
= this->wait(mtd
, FL_WRITING
);
2119 printk(KERN_ERR
"%s: write failed %d\n", __func__
, ret
);
2123 ret
= onenand_verify_oob(mtd
, oobbuf
, to
);
2125 printk(KERN_ERR
"%s: verify failed %d\n",
2134 to
+= mtd
->writesize
;
2139 ops
->oobretlen
= written
;
2145 * onenand_write - [MTD Interface] write buffer to FLASH
2146 * @param mtd MTD device structure
2147 * @param to offset to write to
2148 * @param len number of bytes to write
2149 * @param retlen pointer to variable to store the number of written bytes
2150 * @param buf the data to write
2154 static int onenand_write(struct mtd_info
*mtd
, loff_t to
, size_t len
,
2155 size_t *retlen
, const u_char
*buf
)
2157 struct mtd_oob_ops ops
= {
2160 .datbuf
= (u_char
*) buf
,
2165 onenand_get_device(mtd
, FL_WRITING
);
2166 ret
= onenand_write_ops_nolock(mtd
, to
, &ops
);
2167 onenand_release_device(mtd
);
2169 *retlen
= ops
.retlen
;
2174 * onenand_write_oob - [MTD Interface] NAND write data and/or out-of-band
2175 * @param mtd: MTD device structure
2176 * @param to: offset to write
2177 * @param ops: oob operation description structure
2179 static int onenand_write_oob(struct mtd_info
*mtd
, loff_t to
,
2180 struct mtd_oob_ops
*ops
)
2184 switch (ops
->mode
) {
2185 case MTD_OPS_PLACE_OOB
:
2186 case MTD_OPS_AUTO_OOB
:
2189 /* Not implemented yet */
2194 onenand_get_device(mtd
, FL_WRITING
);
2196 ret
= onenand_write_ops_nolock(mtd
, to
, ops
);
2198 ret
= onenand_write_oob_nolock(mtd
, to
, ops
);
2199 onenand_release_device(mtd
);
2205 * onenand_block_isbad_nolock - [GENERIC] Check if a block is marked bad
2206 * @param mtd MTD device structure
2207 * @param ofs offset from device start
2208 * @param allowbbt 1, if its allowed to access the bbt area
2210 * Check, if the block is bad. Either by reading the bad block table or
2211 * calling of the scan function.
2213 static int onenand_block_isbad_nolock(struct mtd_info
*mtd
, loff_t ofs
, int allowbbt
)
2215 struct onenand_chip
*this = mtd
->priv
;
2216 struct bbm_info
*bbm
= this->bbm
;
2218 /* Return info from the table */
2219 return bbm
->isbad_bbt(mtd
, ofs
, allowbbt
);
2223 static int onenand_multiblock_erase_verify(struct mtd_info
*mtd
,
2224 struct erase_info
*instr
)
2226 struct onenand_chip
*this = mtd
->priv
;
2227 loff_t addr
= instr
->addr
;
2228 int len
= instr
->len
;
2229 unsigned int block_size
= (1 << this->erase_shift
);
2233 this->command(mtd
, ONENAND_CMD_ERASE_VERIFY
, addr
, block_size
);
2234 ret
= this->wait(mtd
, FL_VERIFYING_ERASE
);
2236 printk(KERN_ERR
"%s: Failed verify, block %d\n",
2237 __func__
, onenand_block(this, addr
));
2238 instr
->state
= MTD_ERASE_FAILED
;
2239 instr
->fail_addr
= addr
;
2249 * onenand_multiblock_erase - [INTERN] erase block(s) using multiblock erase
2250 * @param mtd MTD device structure
2251 * @param instr erase instruction
2252 * @param region erase region
2254 * Erase one or more blocks up to 64 block at a time
2256 static int onenand_multiblock_erase(struct mtd_info
*mtd
,
2257 struct erase_info
*instr
,
2258 unsigned int block_size
)
2260 struct onenand_chip
*this = mtd
->priv
;
2261 loff_t addr
= instr
->addr
;
2262 int len
= instr
->len
;
2267 instr
->state
= MTD_ERASING
;
2269 if (ONENAND_IS_DDP(this)) {
2270 loff_t bdry_addr
= this->chipsize
>> 1;
2271 if (addr
< bdry_addr
&& (addr
+ len
) > bdry_addr
)
2272 bdry_block
= bdry_addr
>> this->erase_shift
;
2277 /* Check if we have a bad block, we do not erase bad blocks */
2278 if (onenand_block_isbad_nolock(mtd
, addr
, 0)) {
2279 printk(KERN_WARNING
"%s: attempt to erase a bad block "
2280 "at addr 0x%012llx\n",
2281 __func__
, (unsigned long long) addr
);
2282 instr
->state
= MTD_ERASE_FAILED
;
2292 /* loop over 64 eb batches */
2294 struct erase_info verify_instr
= *instr
;
2295 int max_eb_count
= MB_ERASE_MAX_BLK_COUNT
;
2297 verify_instr
.addr
= addr
;
2298 verify_instr
.len
= 0;
2300 /* do not cross chip boundary */
2302 int this_block
= (addr
>> this->erase_shift
);
2304 if (this_block
< bdry_block
) {
2305 max_eb_count
= min(max_eb_count
,
2306 (bdry_block
- this_block
));
2312 while (len
> block_size
&& eb_count
< (max_eb_count
- 1)) {
2313 this->command(mtd
, ONENAND_CMD_MULTIBLOCK_ERASE
,
2315 onenand_invalidate_bufferram(mtd
, addr
, block_size
);
2317 ret
= this->wait(mtd
, FL_PREPARING_ERASE
);
2319 printk(KERN_ERR
"%s: Failed multiblock erase, "
2320 "block %d\n", __func__
,
2321 onenand_block(this, addr
));
2322 instr
->state
= MTD_ERASE_FAILED
;
2323 instr
->fail_addr
= MTD_FAIL_ADDR_UNKNOWN
;
2332 /* last block of 64-eb series */
2334 this->command(mtd
, ONENAND_CMD_ERASE
, addr
, block_size
);
2335 onenand_invalidate_bufferram(mtd
, addr
, block_size
);
2337 ret
= this->wait(mtd
, FL_ERASING
);
2338 /* Check if it is write protected */
2340 printk(KERN_ERR
"%s: Failed erase, block %d\n",
2341 __func__
, onenand_block(this, addr
));
2342 instr
->state
= MTD_ERASE_FAILED
;
2343 instr
->fail_addr
= MTD_FAIL_ADDR_UNKNOWN
;
2352 verify_instr
.len
= eb_count
* block_size
;
2353 if (onenand_multiblock_erase_verify(mtd
, &verify_instr
)) {
2354 instr
->state
= verify_instr
.state
;
2355 instr
->fail_addr
= verify_instr
.fail_addr
;
2365 * onenand_block_by_block_erase - [INTERN] erase block(s) using regular erase
2366 * @param mtd MTD device structure
2367 * @param instr erase instruction
2368 * @param region erase region
2369 * @param block_size erase block size
2371 * Erase one or more blocks one block at a time
2373 static int onenand_block_by_block_erase(struct mtd_info
*mtd
,
2374 struct erase_info
*instr
,
2375 struct mtd_erase_region_info
*region
,
2376 unsigned int block_size
)
2378 struct onenand_chip
*this = mtd
->priv
;
2379 loff_t addr
= instr
->addr
;
2380 int len
= instr
->len
;
2381 loff_t region_end
= 0;
2385 /* region is set for Flex-OneNAND */
2386 region_end
= region
->offset
+ region
->erasesize
* region
->numblocks
;
2389 instr
->state
= MTD_ERASING
;
2391 /* Loop through the blocks */
2395 /* Check if we have a bad block, we do not erase bad blocks */
2396 if (onenand_block_isbad_nolock(mtd
, addr
, 0)) {
2397 printk(KERN_WARNING
"%s: attempt to erase a bad block "
2398 "at addr 0x%012llx\n",
2399 __func__
, (unsigned long long) addr
);
2400 instr
->state
= MTD_ERASE_FAILED
;
2404 this->command(mtd
, ONENAND_CMD_ERASE
, addr
, block_size
);
2406 onenand_invalidate_bufferram(mtd
, addr
, block_size
);
2408 ret
= this->wait(mtd
, FL_ERASING
);
2409 /* Check, if it is write protected */
2411 printk(KERN_ERR
"%s: Failed erase, block %d\n",
2412 __func__
, onenand_block(this, addr
));
2413 instr
->state
= MTD_ERASE_FAILED
;
2414 instr
->fail_addr
= addr
;
2421 if (region
&& addr
== region_end
) {
2426 block_size
= region
->erasesize
;
2427 region_end
= region
->offset
+ region
->erasesize
* region
->numblocks
;
2429 if (len
& (block_size
- 1)) {
2430 /* FIXME: This should be handled at MTD partitioning level. */
2431 printk(KERN_ERR
"%s: Unaligned address\n",
2441 * onenand_erase - [MTD Interface] erase block(s)
2442 * @param mtd MTD device structure
2443 * @param instr erase instruction
2445 * Erase one or more blocks
2447 static int onenand_erase(struct mtd_info
*mtd
, struct erase_info
*instr
)
2449 struct onenand_chip
*this = mtd
->priv
;
2450 unsigned int block_size
;
2451 loff_t addr
= instr
->addr
;
2452 loff_t len
= instr
->len
;
2454 struct mtd_erase_region_info
*region
= NULL
;
2455 loff_t region_offset
= 0;
2457 pr_debug("%s: start=0x%012llx, len=%llu\n", __func__
,
2458 (unsigned long long)instr
->addr
,
2459 (unsigned long long)instr
->len
);
2461 if (FLEXONENAND(this)) {
2462 /* Find the eraseregion of this address */
2463 int i
= flexonenand_region(mtd
, addr
);
2465 region
= &mtd
->eraseregions
[i
];
2466 block_size
= region
->erasesize
;
2468 /* Start address within region must align on block boundary.
2469 * Erase region's start offset is always block start address.
2471 region_offset
= region
->offset
;
2473 block_size
= 1 << this->erase_shift
;
2475 /* Start address must align on block boundary */
2476 if (unlikely((addr
- region_offset
) & (block_size
- 1))) {
2477 printk(KERN_ERR
"%s: Unaligned address\n", __func__
);
2481 /* Length must align on block boundary */
2482 if (unlikely(len
& (block_size
- 1))) {
2483 printk(KERN_ERR
"%s: Length not block aligned\n", __func__
);
2487 /* Grab the lock and see if the device is available */
2488 onenand_get_device(mtd
, FL_ERASING
);
2490 if (ONENAND_IS_4KB_PAGE(this) || region
||
2491 instr
->len
< MB_ERASE_MIN_BLK_COUNT
* block_size
) {
2492 /* region is set for Flex-OneNAND (no mb erase) */
2493 ret
= onenand_block_by_block_erase(mtd
, instr
,
2494 region
, block_size
);
2496 ret
= onenand_multiblock_erase(mtd
, instr
, block_size
);
2499 /* Deselect and wake up anyone waiting on the device */
2500 onenand_release_device(mtd
);
2502 /* Do call back function */
2504 instr
->state
= MTD_ERASE_DONE
;
2505 mtd_erase_callback(instr
);
2512 * onenand_sync - [MTD Interface] sync
2513 * @param mtd MTD device structure
2515 * Sync is actually a wait for chip ready function
2517 static void onenand_sync(struct mtd_info
*mtd
)
2519 pr_debug("%s: called\n", __func__
);
2521 /* Grab the lock and see if the device is available */
2522 onenand_get_device(mtd
, FL_SYNCING
);
2524 /* Release it and go back */
2525 onenand_release_device(mtd
);
2529 * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
2530 * @param mtd MTD device structure
2531 * @param ofs offset relative to mtd start
2533 * Check whether the block is bad
2535 static int onenand_block_isbad(struct mtd_info
*mtd
, loff_t ofs
)
2539 onenand_get_device(mtd
, FL_READING
);
2540 ret
= onenand_block_isbad_nolock(mtd
, ofs
, 0);
2541 onenand_release_device(mtd
);
2546 * onenand_default_block_markbad - [DEFAULT] mark a block bad
2547 * @param mtd MTD device structure
2548 * @param ofs offset from device start
2550 * This is the default implementation, which can be overridden by
2551 * a hardware specific driver.
2553 static int onenand_default_block_markbad(struct mtd_info
*mtd
, loff_t ofs
)
2555 struct onenand_chip
*this = mtd
->priv
;
2556 struct bbm_info
*bbm
= this->bbm
;
2557 u_char buf
[2] = {0, 0};
2558 struct mtd_oob_ops ops
= {
2559 .mode
= MTD_OPS_PLACE_OOB
,
2566 /* Get block number */
2567 block
= onenand_block(this, ofs
);
2569 bbm
->bbt
[block
>> 2] |= 0x01 << ((block
& 0x03) << 1);
2571 /* We write two bytes, so we don't have to mess with 16-bit access */
2572 ofs
+= mtd
->oobsize
+ (bbm
->badblockpos
& ~0x01);
2573 /* FIXME : What to do when marking SLC block in partition
2574 * with MLC erasesize? For now, it is not advisable to
2575 * create partitions containing both SLC and MLC regions.
2577 return onenand_write_oob_nolock(mtd
, ofs
, &ops
);
2581 * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
2582 * @param mtd MTD device structure
2583 * @param ofs offset relative to mtd start
2585 * Mark the block as bad
2587 static int onenand_block_markbad(struct mtd_info
*mtd
, loff_t ofs
)
2589 struct onenand_chip
*this = mtd
->priv
;
2592 ret
= onenand_block_isbad(mtd
, ofs
);
2594 /* If it was bad already, return success and do nothing */
2600 onenand_get_device(mtd
, FL_WRITING
);
2601 ret
= this->block_markbad(mtd
, ofs
);
2602 onenand_release_device(mtd
);
2607 * onenand_do_lock_cmd - [OneNAND Interface] Lock or unlock block(s)
2608 * @param mtd MTD device structure
2609 * @param ofs offset relative to mtd start
2610 * @param len number of bytes to lock or unlock
2611 * @param cmd lock or unlock command
2613 * Lock or unlock one or more blocks
2615 static int onenand_do_lock_cmd(struct mtd_info
*mtd
, loff_t ofs
, size_t len
, int cmd
)
2617 struct onenand_chip
*this = mtd
->priv
;
2618 int start
, end
, block
, value
, status
;
2621 start
= onenand_block(this, ofs
);
2622 end
= onenand_block(this, ofs
+ len
) - 1;
2624 if (cmd
== ONENAND_CMD_LOCK
)
2625 wp_status_mask
= ONENAND_WP_LS
;
2627 wp_status_mask
= ONENAND_WP_US
;
2629 /* Continuous lock scheme */
2630 if (this->options
& ONENAND_HAS_CONT_LOCK
) {
2631 /* Set start block address */
2632 this->write_word(start
, this->base
+ ONENAND_REG_START_BLOCK_ADDRESS
);
2633 /* Set end block address */
2634 this->write_word(end
, this->base
+ ONENAND_REG_END_BLOCK_ADDRESS
);
2635 /* Write lock command */
2636 this->command(mtd
, cmd
, 0, 0);
2638 /* There's no return value */
2639 this->wait(mtd
, FL_LOCKING
);
2642 while (this->read_word(this->base
+ ONENAND_REG_CTRL_STATUS
)
2643 & ONENAND_CTRL_ONGO
)
2646 /* Check lock status */
2647 status
= this->read_word(this->base
+ ONENAND_REG_WP_STATUS
);
2648 if (!(status
& wp_status_mask
))
2649 printk(KERN_ERR
"%s: wp status = 0x%x\n",
2655 /* Block lock scheme */
2656 for (block
= start
; block
< end
+ 1; block
++) {
2657 /* Set block address */
2658 value
= onenand_block_address(this, block
);
2659 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS1
);
2660 /* Select DataRAM for DDP */
2661 value
= onenand_bufferram_address(this, block
);
2662 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS2
);
2663 /* Set start block address */
2664 this->write_word(block
, this->base
+ ONENAND_REG_START_BLOCK_ADDRESS
);
2665 /* Write lock command */
2666 this->command(mtd
, cmd
, 0, 0);
2668 /* There's no return value */
2669 this->wait(mtd
, FL_LOCKING
);
2672 while (this->read_word(this->base
+ ONENAND_REG_CTRL_STATUS
)
2673 & ONENAND_CTRL_ONGO
)
2676 /* Check lock status */
2677 status
= this->read_word(this->base
+ ONENAND_REG_WP_STATUS
);
2678 if (!(status
& wp_status_mask
))
2679 printk(KERN_ERR
"%s: block = %d, wp status = 0x%x\n",
2680 __func__
, block
, status
);
2687 * onenand_lock - [MTD Interface] Lock block(s)
2688 * @param mtd MTD device structure
2689 * @param ofs offset relative to mtd start
2690 * @param len number of bytes to unlock
2692 * Lock one or more blocks
2694 static int onenand_lock(struct mtd_info
*mtd
, loff_t ofs
, uint64_t len
)
2698 onenand_get_device(mtd
, FL_LOCKING
);
2699 ret
= onenand_do_lock_cmd(mtd
, ofs
, len
, ONENAND_CMD_LOCK
);
2700 onenand_release_device(mtd
);
2705 * onenand_unlock - [MTD Interface] Unlock block(s)
2706 * @param mtd MTD device structure
2707 * @param ofs offset relative to mtd start
2708 * @param len number of bytes to unlock
2710 * Unlock one or more blocks
2712 static int onenand_unlock(struct mtd_info
*mtd
, loff_t ofs
, uint64_t len
)
2716 onenand_get_device(mtd
, FL_LOCKING
);
2717 ret
= onenand_do_lock_cmd(mtd
, ofs
, len
, ONENAND_CMD_UNLOCK
);
2718 onenand_release_device(mtd
);
2723 * onenand_check_lock_status - [OneNAND Interface] Check lock status
2724 * @param this onenand chip data structure
2728 static int onenand_check_lock_status(struct onenand_chip
*this)
2730 unsigned int value
, block
, status
;
2733 end
= this->chipsize
>> this->erase_shift
;
2734 for (block
= 0; block
< end
; block
++) {
2735 /* Set block address */
2736 value
= onenand_block_address(this, block
);
2737 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS1
);
2738 /* Select DataRAM for DDP */
2739 value
= onenand_bufferram_address(this, block
);
2740 this->write_word(value
, this->base
+ ONENAND_REG_START_ADDRESS2
);
2741 /* Set start block address */
2742 this->write_word(block
, this->base
+ ONENAND_REG_START_BLOCK_ADDRESS
);
2744 /* Check lock status */
2745 status
= this->read_word(this->base
+ ONENAND_REG_WP_STATUS
);
2746 if (!(status
& ONENAND_WP_US
)) {
2747 printk(KERN_ERR
"%s: block = %d, wp status = 0x%x\n",
2748 __func__
, block
, status
);
2757 * onenand_unlock_all - [OneNAND Interface] unlock all blocks
2758 * @param mtd MTD device structure
2762 static void onenand_unlock_all(struct mtd_info
*mtd
)
2764 struct onenand_chip
*this = mtd
->priv
;
2766 loff_t len
= mtd
->size
;
2768 if (this->options
& ONENAND_HAS_UNLOCK_ALL
) {
2769 /* Set start block address */
2770 this->write_word(0, this->base
+ ONENAND_REG_START_BLOCK_ADDRESS
);
2771 /* Write unlock command */
2772 this->command(mtd
, ONENAND_CMD_UNLOCK_ALL
, 0, 0);
2774 /* There's no return value */
2775 this->wait(mtd
, FL_LOCKING
);
2778 while (this->read_word(this->base
+ ONENAND_REG_CTRL_STATUS
)
2779 & ONENAND_CTRL_ONGO
)
2782 /* Don't check lock status */
2783 if (this->options
& ONENAND_SKIP_UNLOCK_CHECK
)
2786 /* Check lock status */
2787 if (onenand_check_lock_status(this))
2790 /* Workaround for all block unlock in DDP */
2791 if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) {
2792 /* All blocks on another chip */
2793 ofs
= this->chipsize
>> 1;
2794 len
= this->chipsize
>> 1;
2798 onenand_do_lock_cmd(mtd
, ofs
, len
, ONENAND_CMD_UNLOCK
);
2801 #ifdef CONFIG_MTD_ONENAND_OTP
2804 * onenand_otp_command - Send OTP specific command to OneNAND device
2805 * @param mtd MTD device structure
2806 * @param cmd the command to be sent
2807 * @param addr offset to read from or write to
2808 * @param len number of bytes to read or write
2810 static int onenand_otp_command(struct mtd_info
*mtd
, int cmd
, loff_t addr
,
2813 struct onenand_chip
*this = mtd
->priv
;
2814 int value
, block
, page
;
2816 /* Address translation */
2818 case ONENAND_CMD_OTP_ACCESS
:
2819 block
= (int) (addr
>> this->erase_shift
);
2824 block
= (int) (addr
>> this->erase_shift
);
2825 page
= (int) (addr
>> this->page_shift
);
2827 if (ONENAND_IS_2PLANE(this)) {
2828 /* Make the even block number */
2830 /* Is it the odd plane? */
2831 if (addr
& this->writesize
)
2835 page
&= this->page_mask
;
2840 /* Write 'DFS, FBA' of Flash */
2841 value
= onenand_block_address(this, block
);
2842 this->write_word(value
, this->base
+
2843 ONENAND_REG_START_ADDRESS1
);
2847 /* Now we use page size operation */
2848 int sectors
= 4, count
= 4;
2853 if (ONENAND_IS_2PLANE(this) && cmd
== ONENAND_CMD_PROG
)
2854 cmd
= ONENAND_CMD_2X_PROG
;
2855 dataram
= ONENAND_CURRENT_BUFFERRAM(this);
2859 /* Write 'FPA, FSA' of Flash */
2860 value
= onenand_page_address(page
, sectors
);
2861 this->write_word(value
, this->base
+
2862 ONENAND_REG_START_ADDRESS8
);
2864 /* Write 'BSA, BSC' of DataRAM */
2865 value
= onenand_buffer_address(dataram
, sectors
, count
);
2866 this->write_word(value
, this->base
+ ONENAND_REG_START_BUFFER
);
2869 /* Interrupt clear */
2870 this->write_word(ONENAND_INT_CLEAR
, this->base
+ ONENAND_REG_INTERRUPT
);
2873 this->write_word(cmd
, this->base
+ ONENAND_REG_COMMAND
);
2879 * onenand_otp_write_oob_nolock - [INTERN] OneNAND write out-of-band, specific to OTP
2880 * @param mtd MTD device structure
2881 * @param to offset to write to
2882 * @param len number of bytes to write
2883 * @param retlen pointer to variable to store the number of written bytes
2884 * @param buf the data to write
2886 * OneNAND write out-of-band only for OTP
2888 static int onenand_otp_write_oob_nolock(struct mtd_info
*mtd
, loff_t to
,
2889 struct mtd_oob_ops
*ops
)
2891 struct onenand_chip
*this = mtd
->priv
;
2892 int column
, ret
= 0, oobsize
;
2895 size_t len
= ops
->ooblen
;
2896 const u_char
*buf
= ops
->oobbuf
;
2897 int block
, value
, status
;
2901 /* Initialize retlen, in case of early exit */
2904 oobsize
= mtd
->oobsize
;
2906 column
= to
& (mtd
->oobsize
- 1);
2908 oobbuf
= this->oob_buf
;
2910 /* Loop until all data write */
2911 while (written
< len
) {
2912 int thislen
= min_t(int, oobsize
, len
- written
);
2916 block
= (int) (to
>> this->erase_shift
);
2918 * Write 'DFS, FBA' of Flash
2919 * Add: F100h DQ=DFS, FBA
2922 value
= onenand_block_address(this, block
);
2923 this->write_word(value
, this->base
+
2924 ONENAND_REG_START_ADDRESS1
);
2927 * Select DataRAM for DDP
2931 value
= onenand_bufferram_address(this, block
);
2932 this->write_word(value
, this->base
+
2933 ONENAND_REG_START_ADDRESS2
);
2934 ONENAND_SET_NEXT_BUFFERRAM(this);
2937 * Enter OTP access mode
2939 this->command(mtd
, ONENAND_CMD_OTP_ACCESS
, 0, 0);
2940 this->wait(mtd
, FL_OTPING
);
2942 /* We send data to spare ram with oobsize
2943 * to prevent byte access */
2944 memcpy(oobbuf
+ column
, buf
, thislen
);
2947 * Write Data into DataRAM
2949 * in sector0/spare/page0
2952 this->write_bufferram(mtd
, ONENAND_SPARERAM
,
2953 oobbuf
, 0, mtd
->oobsize
);
2955 onenand_otp_command(mtd
, ONENAND_CMD_PROGOOB
, to
, mtd
->oobsize
);
2956 onenand_update_bufferram(mtd
, to
, 0);
2957 if (ONENAND_IS_2PLANE(this)) {
2958 ONENAND_SET_BUFFERRAM1(this);
2959 onenand_update_bufferram(mtd
, to
+ this->writesize
, 0);
2962 ret
= this->wait(mtd
, FL_WRITING
);
2964 printk(KERN_ERR
"%s: write failed %d\n", __func__
, ret
);
2968 /* Exit OTP access mode */
2969 this->command(mtd
, ONENAND_CMD_RESET
, 0, 0);
2970 this->wait(mtd
, FL_RESETING
);
2972 status
= this->read_word(this->base
+ ONENAND_REG_CTRL_STATUS
);
2975 if (status
== 0x60) {
2976 printk(KERN_DEBUG
"\nBLOCK\tSTATUS\n");
2977 printk(KERN_DEBUG
"1st Block\tLOCKED\n");
2978 printk(KERN_DEBUG
"OTP Block\tLOCKED\n");
2979 } else if (status
== 0x20) {
2980 printk(KERN_DEBUG
"\nBLOCK\tSTATUS\n");
2981 printk(KERN_DEBUG
"1st Block\tLOCKED\n");
2982 printk(KERN_DEBUG
"OTP Block\tUN-LOCKED\n");
2983 } else if (status
== 0x40) {
2984 printk(KERN_DEBUG
"\nBLOCK\tSTATUS\n");
2985 printk(KERN_DEBUG
"1st Block\tUN-LOCKED\n");
2986 printk(KERN_DEBUG
"OTP Block\tLOCKED\n");
2988 printk(KERN_DEBUG
"Reboot to check\n");
2995 to
+= mtd
->writesize
;
3000 ops
->oobretlen
= written
;
3005 /* Internal OTP operation */
3006 typedef int (*otp_op_t
)(struct mtd_info
*mtd
, loff_t form
, size_t len
,
3007 size_t *retlen
, u_char
*buf
);
3010 * do_otp_read - [DEFAULT] Read OTP block area
3011 * @param mtd MTD device structure
3012 * @param from The offset to read
3013 * @param len number of bytes to read
3014 * @param retlen pointer to variable to store the number of readbytes
3015 * @param buf the databuffer to put/get data
3017 * Read OTP block area.
3019 static int do_otp_read(struct mtd_info
*mtd
, loff_t from
, size_t len
,
3020 size_t *retlen
, u_char
*buf
)
3022 struct onenand_chip
*this = mtd
->priv
;
3023 struct mtd_oob_ops ops
= {
3031 /* Enter OTP access mode */
3032 this->command(mtd
, ONENAND_CMD_OTP_ACCESS
, 0, 0);
3033 this->wait(mtd
, FL_OTPING
);
3035 ret
= ONENAND_IS_4KB_PAGE(this) ?
3036 onenand_mlc_read_ops_nolock(mtd
, from
, &ops
) :
3037 onenand_read_ops_nolock(mtd
, from
, &ops
);
3039 /* Exit OTP access mode */
3040 this->command(mtd
, ONENAND_CMD_RESET
, 0, 0);
3041 this->wait(mtd
, FL_RESETING
);
3047 * do_otp_write - [DEFAULT] Write OTP block area
3048 * @param mtd MTD device structure
3049 * @param to The offset to write
3050 * @param len number of bytes to write
3051 * @param retlen pointer to variable to store the number of write bytes
3052 * @param buf the databuffer to put/get data
3054 * Write OTP block area.
3056 static int do_otp_write(struct mtd_info
*mtd
, loff_t to
, size_t len
,
3057 size_t *retlen
, u_char
*buf
)
3059 struct onenand_chip
*this = mtd
->priv
;
3060 unsigned char *pbuf
= buf
;
3062 struct mtd_oob_ops ops
;
3064 /* Force buffer page aligned */
3065 if (len
< mtd
->writesize
) {
3066 memcpy(this->page_buf
, buf
, len
);
3067 memset(this->page_buf
+ len
, 0xff, mtd
->writesize
- len
);
3068 pbuf
= this->page_buf
;
3069 len
= mtd
->writesize
;
3072 /* Enter OTP access mode */
3073 this->command(mtd
, ONENAND_CMD_OTP_ACCESS
, 0, 0);
3074 this->wait(mtd
, FL_OTPING
);
3080 ret
= onenand_write_ops_nolock(mtd
, to
, &ops
);
3081 *retlen
= ops
.retlen
;
3083 /* Exit OTP access mode */
3084 this->command(mtd
, ONENAND_CMD_RESET
, 0, 0);
3085 this->wait(mtd
, FL_RESETING
);
3091 * do_otp_lock - [DEFAULT] Lock OTP block area
3092 * @param mtd MTD device structure
3093 * @param from The offset to lock
3094 * @param len number of bytes to lock
3095 * @param retlen pointer to variable to store the number of lock bytes
3096 * @param buf the databuffer to put/get data
3098 * Lock OTP block area.
3100 static int do_otp_lock(struct mtd_info
*mtd
, loff_t from
, size_t len
,
3101 size_t *retlen
, u_char
*buf
)
3103 struct onenand_chip
*this = mtd
->priv
;
3104 struct mtd_oob_ops ops
;
3107 if (FLEXONENAND(this)) {
3109 /* Enter OTP access mode */
3110 this->command(mtd
, ONENAND_CMD_OTP_ACCESS
, 0, 0);
3111 this->wait(mtd
, FL_OTPING
);
3113 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3114 * main area of page 49.
3116 ops
.len
= mtd
->writesize
;
3120 ret
= onenand_write_ops_nolock(mtd
, mtd
->writesize
* 49, &ops
);
3121 *retlen
= ops
.retlen
;
3123 /* Exit OTP access mode */
3124 this->command(mtd
, ONENAND_CMD_RESET
, 0, 0);
3125 this->wait(mtd
, FL_RESETING
);
3127 ops
.mode
= MTD_OPS_PLACE_OOB
;
3131 ret
= onenand_otp_write_oob_nolock(mtd
, from
, &ops
);
3132 *retlen
= ops
.oobretlen
;
3139 * onenand_otp_walk - [DEFAULT] Handle OTP operation
3140 * @param mtd MTD device structure
3141 * @param from The offset to read/write
3142 * @param len number of bytes to read/write
3143 * @param retlen pointer to variable to store the number of read bytes
3144 * @param buf the databuffer to put/get data
3145 * @param action do given action
3146 * @param mode specify user and factory
3148 * Handle OTP operation.
3150 static int onenand_otp_walk(struct mtd_info
*mtd
, loff_t from
, size_t len
,
3151 size_t *retlen
, u_char
*buf
,
3152 otp_op_t action
, int mode
)
3154 struct onenand_chip
*this = mtd
->priv
;
3161 density
= onenand_get_density(this->device_id
);
3162 if (density
< ONENAND_DEVICE_DENSITY_512Mb
)
3167 if (mode
== MTD_OTP_FACTORY
) {
3168 from
+= mtd
->writesize
* otp_pages
;
3169 otp_pages
= ONENAND_PAGES_PER_BLOCK
- otp_pages
;
3172 /* Check User/Factory boundary */
3173 if (mode
== MTD_OTP_USER
) {
3174 if (mtd
->writesize
* otp_pages
< from
+ len
)
3177 if (mtd
->writesize
* otp_pages
< len
)
3181 onenand_get_device(mtd
, FL_OTPING
);
3182 while (len
> 0 && otp_pages
> 0) {
3183 if (!action
) { /* OTP Info functions */
3184 struct otp_info
*otpinfo
;
3186 len
-= sizeof(struct otp_info
);
3192 otpinfo
= (struct otp_info
*) buf
;
3193 otpinfo
->start
= from
;
3194 otpinfo
->length
= mtd
->writesize
;
3195 otpinfo
->locked
= 0;
3197 from
+= mtd
->writesize
;
3198 buf
+= sizeof(struct otp_info
);
3199 *retlen
+= sizeof(struct otp_info
);
3203 ret
= action(mtd
, from
, len
, &tmp_retlen
, buf
);
3207 *retlen
+= tmp_retlen
;
3214 onenand_release_device(mtd
);
3220 * onenand_get_fact_prot_info - [MTD Interface] Read factory OTP info
3221 * @param mtd MTD device structure
3222 * @param len number of bytes to read
3223 * @param retlen pointer to variable to store the number of read bytes
3224 * @param buf the databuffer to put/get data
3226 * Read factory OTP info.
3228 static int onenand_get_fact_prot_info(struct mtd_info
*mtd
, size_t len
,
3229 size_t *retlen
, struct otp_info
*buf
)
3231 return onenand_otp_walk(mtd
, 0, len
, retlen
, (u_char
*) buf
, NULL
,
3236 * onenand_read_fact_prot_reg - [MTD Interface] Read factory OTP area
3237 * @param mtd MTD device structure
3238 * @param from The offset to read
3239 * @param len number of bytes to read
3240 * @param retlen pointer to variable to store the number of read bytes
3241 * @param buf the databuffer to put/get data
3243 * Read factory OTP area.
3245 static int onenand_read_fact_prot_reg(struct mtd_info
*mtd
, loff_t from
,
3246 size_t len
, size_t *retlen
, u_char
*buf
)
3248 return onenand_otp_walk(mtd
, from
, len
, retlen
, buf
, do_otp_read
, MTD_OTP_FACTORY
);
3252 * onenand_get_user_prot_info - [MTD Interface] Read user OTP info
3253 * @param mtd MTD device structure
3254 * @param retlen pointer to variable to store the number of read bytes
3255 * @param len number of bytes to read
3256 * @param buf the databuffer to put/get data
3258 * Read user OTP info.
3260 static int onenand_get_user_prot_info(struct mtd_info
*mtd
, size_t len
,
3261 size_t *retlen
, struct otp_info
*buf
)
3263 return onenand_otp_walk(mtd
, 0, len
, retlen
, (u_char
*) buf
, NULL
,
3268 * onenand_read_user_prot_reg - [MTD Interface] Read user OTP area
3269 * @param mtd MTD device structure
3270 * @param from The offset to read
3271 * @param len number of bytes to read
3272 * @param retlen pointer to variable to store the number of read bytes
3273 * @param buf the databuffer to put/get data
3275 * Read user OTP area.
3277 static int onenand_read_user_prot_reg(struct mtd_info
*mtd
, loff_t from
,
3278 size_t len
, size_t *retlen
, u_char
*buf
)
3280 return onenand_otp_walk(mtd
, from
, len
, retlen
, buf
, do_otp_read
, MTD_OTP_USER
);
3284 * onenand_write_user_prot_reg - [MTD Interface] Write user OTP area
3285 * @param mtd MTD device structure
3286 * @param from The offset to write
3287 * @param len number of bytes to write
3288 * @param retlen pointer to variable to store the number of write bytes
3289 * @param buf the databuffer to put/get data
3291 * Write user OTP area.
3293 static int onenand_write_user_prot_reg(struct mtd_info
*mtd
, loff_t from
,
3294 size_t len
, size_t *retlen
, u_char
*buf
)
3296 return onenand_otp_walk(mtd
, from
, len
, retlen
, buf
, do_otp_write
, MTD_OTP_USER
);
3300 * onenand_lock_user_prot_reg - [MTD Interface] Lock user OTP area
3301 * @param mtd MTD device structure
3302 * @param from The offset to lock
3303 * @param len number of bytes to unlock
3305 * Write lock mark on spare area in page 0 in OTP block
3307 static int onenand_lock_user_prot_reg(struct mtd_info
*mtd
, loff_t from
,
3310 struct onenand_chip
*this = mtd
->priv
;
3311 u_char
*buf
= FLEXONENAND(this) ? this->page_buf
: this->oob_buf
;
3314 unsigned int otp_lock_offset
= ONENAND_OTP_LOCK_OFFSET
;
3316 memset(buf
, 0xff, FLEXONENAND(this) ? this->writesize
3319 * Write lock mark to 8th word of sector0 of page0 of the spare0.
3320 * We write 16 bytes spare area instead of 2 bytes.
3321 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3322 * main area of page 49.
3326 len
= FLEXONENAND(this) ? mtd
->writesize
: 16;
3329 * Note: OTP lock operation
3330 * OTP block : 0xXXFC XX 1111 1100
3331 * 1st block : 0xXXF3 (If chip support) XX 1111 0011
3332 * Both : 0xXXF0 (If chip support) XX 1111 0000
3334 if (FLEXONENAND(this))
3335 otp_lock_offset
= FLEXONENAND_OTP_LOCK_OFFSET
;
3337 /* ONENAND_OTP_AREA | ONENAND_OTP_BLOCK0 | ONENAND_OTP_AREA_BLOCK0 */
3339 buf
[otp_lock_offset
] = 0xFC;
3341 buf
[otp_lock_offset
] = 0xF3;
3343 buf
[otp_lock_offset
] = 0xF0;
3345 printk(KERN_DEBUG
"[OneNAND] Invalid option selected for OTP\n");
3347 ret
= onenand_otp_walk(mtd
, from
, len
, &retlen
, buf
, do_otp_lock
, MTD_OTP_USER
);
3349 return ret
? : retlen
;
3352 #endif /* CONFIG_MTD_ONENAND_OTP */
3355 * onenand_check_features - Check and set OneNAND features
3356 * @param mtd MTD data structure
3358 * Check and set OneNAND features
3362 static void onenand_check_features(struct mtd_info
*mtd
)
3364 struct onenand_chip
*this = mtd
->priv
;
3365 unsigned int density
, process
, numbufs
;
3367 /* Lock scheme depends on density and process */
3368 density
= onenand_get_density(this->device_id
);
3369 process
= this->version_id
>> ONENAND_VERSION_PROCESS_SHIFT
;
3370 numbufs
= this->read_word(this->base
+ ONENAND_REG_NUM_BUFFERS
) >> 8;
3374 case ONENAND_DEVICE_DENSITY_4Gb
:
3375 if (ONENAND_IS_DDP(this))
3376 this->options
|= ONENAND_HAS_2PLANE
;
3377 else if (numbufs
== 1) {
3378 this->options
|= ONENAND_HAS_4KB_PAGE
;
3379 this->options
|= ONENAND_HAS_CACHE_PROGRAM
;
3381 * There are two different 4KiB pagesize chips
3382 * and no way to detect it by H/W config values.
3384 * To detect the correct NOP for each chips,
3385 * It should check the version ID as workaround.
3387 * Now it has as following
3388 * KFM4G16Q4M has NOP 4 with version ID 0x0131
3389 * KFM4G16Q5M has NOP 1 with versoin ID 0x013e
3391 if ((this->version_id
& 0xf) == 0xe)
3392 this->options
|= ONENAND_HAS_NOP_1
;
3395 case ONENAND_DEVICE_DENSITY_2Gb
:
3396 /* 2Gb DDP does not have 2 plane */
3397 if (!ONENAND_IS_DDP(this))
3398 this->options
|= ONENAND_HAS_2PLANE
;
3399 this->options
|= ONENAND_HAS_UNLOCK_ALL
;
3401 case ONENAND_DEVICE_DENSITY_1Gb
:
3402 /* A-Die has all block unlock */
3404 this->options
|= ONENAND_HAS_UNLOCK_ALL
;
3408 /* Some OneNAND has continuous lock scheme */
3410 this->options
|= ONENAND_HAS_CONT_LOCK
;
3414 /* The MLC has 4KiB pagesize. */
3415 if (ONENAND_IS_MLC(this))
3416 this->options
|= ONENAND_HAS_4KB_PAGE
;
3418 if (ONENAND_IS_4KB_PAGE(this))
3419 this->options
&= ~ONENAND_HAS_2PLANE
;
3421 if (FLEXONENAND(this)) {
3422 this->options
&= ~ONENAND_HAS_CONT_LOCK
;
3423 this->options
|= ONENAND_HAS_UNLOCK_ALL
;
3426 if (this->options
& ONENAND_HAS_CONT_LOCK
)
3427 printk(KERN_DEBUG
"Lock scheme is Continuous Lock\n");
3428 if (this->options
& ONENAND_HAS_UNLOCK_ALL
)
3429 printk(KERN_DEBUG
"Chip support all block unlock\n");
3430 if (this->options
& ONENAND_HAS_2PLANE
)
3431 printk(KERN_DEBUG
"Chip has 2 plane\n");
3432 if (this->options
& ONENAND_HAS_4KB_PAGE
)
3433 printk(KERN_DEBUG
"Chip has 4KiB pagesize\n");
3434 if (this->options
& ONENAND_HAS_CACHE_PROGRAM
)
3435 printk(KERN_DEBUG
"Chip has cache program feature\n");
3439 * onenand_print_device_info - Print device & version ID
3440 * @param device device ID
3441 * @param version version ID
3443 * Print device & version ID
3445 static void onenand_print_device_info(int device
, int version
)
3447 int vcc
, demuxed
, ddp
, density
, flexonenand
;
3449 vcc
= device
& ONENAND_DEVICE_VCC_MASK
;
3450 demuxed
= device
& ONENAND_DEVICE_IS_DEMUX
;
3451 ddp
= device
& ONENAND_DEVICE_IS_DDP
;
3452 density
= onenand_get_density(device
);
3453 flexonenand
= device
& DEVICE_IS_FLEXONENAND
;
3454 printk(KERN_INFO
"%s%sOneNAND%s %dMB %sV 16-bit (0x%02x)\n",
3455 demuxed
? "" : "Muxed ",
3456 flexonenand
? "Flex-" : "",
3459 vcc
? "2.65/3.3" : "1.8",
3461 printk(KERN_INFO
"OneNAND version = 0x%04x\n", version
);
3464 static const struct onenand_manufacturers onenand_manuf_ids
[] = {
3465 {ONENAND_MFR_SAMSUNG
, "Samsung"},
3466 {ONENAND_MFR_NUMONYX
, "Numonyx"},
3470 * onenand_check_maf - Check manufacturer ID
3471 * @param manuf manufacturer ID
3473 * Check manufacturer ID
3475 static int onenand_check_maf(int manuf
)
3477 int size
= ARRAY_SIZE(onenand_manuf_ids
);
3481 for (i
= 0; i
< size
; i
++)
3482 if (manuf
== onenand_manuf_ids
[i
].id
)
3486 name
= onenand_manuf_ids
[i
].name
;
3490 printk(KERN_DEBUG
"OneNAND Manufacturer: %s (0x%0x)\n", name
, manuf
);
3496 * flexonenand_get_boundary - Reads the SLC boundary
3497 * @param onenand_info - onenand info structure
3499 static int flexonenand_get_boundary(struct mtd_info
*mtd
)
3501 struct onenand_chip
*this = mtd
->priv
;
3506 syscfg
= this->read_word(this->base
+ ONENAND_REG_SYS_CFG1
);
3507 this->write_word((syscfg
| 0x0100), this->base
+ ONENAND_REG_SYS_CFG1
);
3509 for (die
= 0; die
< this->dies
; die
++) {
3510 this->command(mtd
, FLEXONENAND_CMD_PI_ACCESS
, die
, 0);
3511 this->wait(mtd
, FL_SYNCING
);
3513 this->command(mtd
, FLEXONENAND_CMD_READ_PI
, die
, 0);
3514 this->wait(mtd
, FL_READING
);
3516 bdry
= this->read_word(this->base
+ ONENAND_DATARAM
);
3517 if ((bdry
>> FLEXONENAND_PI_UNLOCK_SHIFT
) == 3)
3521 this->boundary
[die
] = bdry
& FLEXONENAND_PI_MASK
;
3523 this->command(mtd
, ONENAND_CMD_RESET
, 0, 0);
3524 this->wait(mtd
, FL_RESETING
);
3526 printk(KERN_INFO
"Die %d boundary: %d%s\n", die
,
3527 this->boundary
[die
], locked
? "(Locked)" : "(Unlocked)");
3531 this->write_word(syscfg
, this->base
+ ONENAND_REG_SYS_CFG1
);
3536 * flexonenand_get_size - Fill up fields in onenand_chip and mtd_info
3537 * boundary[], diesize[], mtd->size, mtd->erasesize
3538 * @param mtd - MTD device structure
3540 static void flexonenand_get_size(struct mtd_info
*mtd
)
3542 struct onenand_chip
*this = mtd
->priv
;
3543 int die
, i
, eraseshift
, density
;
3544 int blksperdie
, maxbdry
;
3547 density
= onenand_get_density(this->device_id
);
3548 blksperdie
= ((loff_t
)(16 << density
) << 20) >> (this->erase_shift
);
3549 blksperdie
>>= ONENAND_IS_DDP(this) ? 1 : 0;
3550 maxbdry
= blksperdie
- 1;
3551 eraseshift
= this->erase_shift
- 1;
3553 mtd
->numeraseregions
= this->dies
<< 1;
3555 /* This fills up the device boundary */
3556 flexonenand_get_boundary(mtd
);
3559 for (; die
< this->dies
; die
++) {
3560 if (!die
|| this->boundary
[die
-1] != maxbdry
) {
3562 mtd
->eraseregions
[i
].offset
= ofs
;
3563 mtd
->eraseregions
[i
].erasesize
= 1 << eraseshift
;
3564 mtd
->eraseregions
[i
].numblocks
=
3565 this->boundary
[die
] + 1;
3566 ofs
+= mtd
->eraseregions
[i
].numblocks
<< eraseshift
;
3569 mtd
->numeraseregions
-= 1;
3570 mtd
->eraseregions
[i
].numblocks
+=
3571 this->boundary
[die
] + 1;
3572 ofs
+= (this->boundary
[die
] + 1) << (eraseshift
- 1);
3574 if (this->boundary
[die
] != maxbdry
) {
3576 mtd
->eraseregions
[i
].offset
= ofs
;
3577 mtd
->eraseregions
[i
].erasesize
= 1 << eraseshift
;
3578 mtd
->eraseregions
[i
].numblocks
= maxbdry
^
3579 this->boundary
[die
];
3580 ofs
+= mtd
->eraseregions
[i
].numblocks
<< eraseshift
;
3583 mtd
->numeraseregions
-= 1;
3586 /* Expose MLC erase size except when all blocks are SLC */
3587 mtd
->erasesize
= 1 << this->erase_shift
;
3588 if (mtd
->numeraseregions
== 1)
3589 mtd
->erasesize
>>= 1;
3591 printk(KERN_INFO
"Device has %d eraseregions\n", mtd
->numeraseregions
);
3592 for (i
= 0; i
< mtd
->numeraseregions
; i
++)
3593 printk(KERN_INFO
"[offset: 0x%08x, erasesize: 0x%05x,"
3594 " numblocks: %04u]\n",
3595 (unsigned int) mtd
->eraseregions
[i
].offset
,
3596 mtd
->eraseregions
[i
].erasesize
,
3597 mtd
->eraseregions
[i
].numblocks
);
3599 for (die
= 0, mtd
->size
= 0; die
< this->dies
; die
++) {
3600 this->diesize
[die
] = (loff_t
)blksperdie
<< this->erase_shift
;
3601 this->diesize
[die
] -= (loff_t
)(this->boundary
[die
] + 1)
3602 << (this->erase_shift
- 1);
3603 mtd
->size
+= this->diesize
[die
];
3608 * flexonenand_check_blocks_erased - Check if blocks are erased
3609 * @param mtd_info - mtd info structure
3610 * @param start - first erase block to check
3611 * @param end - last erase block to check
3613 * Converting an unerased block from MLC to SLC
3614 * causes byte values to change. Since both data and its ECC
3615 * have changed, reads on the block give uncorrectable error.
3616 * This might lead to the block being detected as bad.
3618 * Avoid this by ensuring that the block to be converted is
3621 static int flexonenand_check_blocks_erased(struct mtd_info
*mtd
, int start
, int end
)
3623 struct onenand_chip
*this = mtd
->priv
;
3626 struct mtd_oob_ops ops
= {
3627 .mode
= MTD_OPS_PLACE_OOB
,
3629 .ooblen
= mtd
->oobsize
,
3631 .oobbuf
= this->oob_buf
,
3635 printk(KERN_DEBUG
"Check blocks from %d to %d\n", start
, end
);
3637 for (block
= start
; block
<= end
; block
++) {
3638 addr
= flexonenand_addr(this, block
);
3639 if (onenand_block_isbad_nolock(mtd
, addr
, 0))
3643 * Since main area write results in ECC write to spare,
3644 * it is sufficient to check only ECC bytes for change.
3646 ret
= onenand_read_oob_nolock(mtd
, addr
, &ops
);
3650 for (i
= 0; i
< mtd
->oobsize
; i
++)
3651 if (this->oob_buf
[i
] != 0xff)
3654 if (i
!= mtd
->oobsize
) {
3655 printk(KERN_WARNING
"%s: Block %d not erased.\n",
3665 * flexonenand_set_boundary - Writes the SLC boundary
3666 * @param mtd - mtd info structure
3668 static int flexonenand_set_boundary(struct mtd_info
*mtd
, int die
,
3669 int boundary
, int lock
)
3671 struct onenand_chip
*this = mtd
->priv
;
3672 int ret
, density
, blksperdie
, old
, new, thisboundary
;
3675 /* Change only once for SDP Flex-OneNAND */
3676 if (die
&& (!ONENAND_IS_DDP(this)))
3679 /* boundary value of -1 indicates no required change */
3680 if (boundary
< 0 || boundary
== this->boundary
[die
])
3683 density
= onenand_get_density(this->device_id
);
3684 blksperdie
= ((16 << density
) << 20) >> this->erase_shift
;
3685 blksperdie
>>= ONENAND_IS_DDP(this) ? 1 : 0;
3687 if (boundary
>= blksperdie
) {
3688 printk(KERN_ERR
"%s: Invalid boundary value. "
3689 "Boundary not changed.\n", __func__
);
3693 /* Check if converting blocks are erased */
3694 old
= this->boundary
[die
] + (die
* this->density_mask
);
3695 new = boundary
+ (die
* this->density_mask
);
3696 ret
= flexonenand_check_blocks_erased(mtd
, min(old
, new) + 1, max(old
, new));
3698 printk(KERN_ERR
"%s: Please erase blocks "
3699 "before boundary change\n", __func__
);
3703 this->command(mtd
, FLEXONENAND_CMD_PI_ACCESS
, die
, 0);
3704 this->wait(mtd
, FL_SYNCING
);
3706 /* Check is boundary is locked */
3707 this->command(mtd
, FLEXONENAND_CMD_READ_PI
, die
, 0);
3708 this->wait(mtd
, FL_READING
);
3710 thisboundary
= this->read_word(this->base
+ ONENAND_DATARAM
);
3711 if ((thisboundary
>> FLEXONENAND_PI_UNLOCK_SHIFT
) != 3) {
3712 printk(KERN_ERR
"%s: boundary locked\n", __func__
);
3717 printk(KERN_INFO
"Changing die %d boundary: %d%s\n",
3718 die
, boundary
, lock
? "(Locked)" : "(Unlocked)");
3720 addr
= die
? this->diesize
[0] : 0;
3722 boundary
&= FLEXONENAND_PI_MASK
;
3723 boundary
|= lock
? 0 : (3 << FLEXONENAND_PI_UNLOCK_SHIFT
);
3725 this->command(mtd
, ONENAND_CMD_ERASE
, addr
, 0);
3726 ret
= this->wait(mtd
, FL_ERASING
);
3728 printk(KERN_ERR
"%s: Failed PI erase for Die %d\n",
3733 this->write_word(boundary
, this->base
+ ONENAND_DATARAM
);
3734 this->command(mtd
, ONENAND_CMD_PROG
, addr
, 0);
3735 ret
= this->wait(mtd
, FL_WRITING
);
3737 printk(KERN_ERR
"%s: Failed PI write for Die %d\n",
3742 this->command(mtd
, FLEXONENAND_CMD_PI_UPDATE
, die
, 0);
3743 ret
= this->wait(mtd
, FL_WRITING
);
3745 this->write_word(ONENAND_CMD_RESET
, this->base
+ ONENAND_REG_COMMAND
);
3746 this->wait(mtd
, FL_RESETING
);
3748 /* Recalculate device size on boundary change*/
3749 flexonenand_get_size(mtd
);
3755 * onenand_chip_probe - [OneNAND Interface] The generic chip probe
3756 * @param mtd MTD device structure
3758 * OneNAND detection method:
3759 * Compare the values from command with ones from register
3761 static int onenand_chip_probe(struct mtd_info
*mtd
)
3763 struct onenand_chip
*this = mtd
->priv
;
3764 int bram_maf_id
, bram_dev_id
, maf_id
, dev_id
;
3767 /* Save system configuration 1 */
3768 syscfg
= this->read_word(this->base
+ ONENAND_REG_SYS_CFG1
);
3769 /* Clear Sync. Burst Read mode to read BootRAM */
3770 this->write_word((syscfg
& ~ONENAND_SYS_CFG1_SYNC_READ
& ~ONENAND_SYS_CFG1_SYNC_WRITE
), this->base
+ ONENAND_REG_SYS_CFG1
);
3772 /* Send the command for reading device ID from BootRAM */
3773 this->write_word(ONENAND_CMD_READID
, this->base
+ ONENAND_BOOTRAM
);
3775 /* Read manufacturer and device IDs from BootRAM */
3776 bram_maf_id
= this->read_word(this->base
+ ONENAND_BOOTRAM
+ 0x0);
3777 bram_dev_id
= this->read_word(this->base
+ ONENAND_BOOTRAM
+ 0x2);
3779 /* Reset OneNAND to read default register values */
3780 this->write_word(ONENAND_CMD_RESET
, this->base
+ ONENAND_BOOTRAM
);
3782 this->wait(mtd
, FL_RESETING
);
3784 /* Restore system configuration 1 */
3785 this->write_word(syscfg
, this->base
+ ONENAND_REG_SYS_CFG1
);
3787 /* Check manufacturer ID */
3788 if (onenand_check_maf(bram_maf_id
))
3791 /* Read manufacturer and device IDs from Register */
3792 maf_id
= this->read_word(this->base
+ ONENAND_REG_MANUFACTURER_ID
);
3793 dev_id
= this->read_word(this->base
+ ONENAND_REG_DEVICE_ID
);
3795 /* Check OneNAND device */
3796 if (maf_id
!= bram_maf_id
|| dev_id
!= bram_dev_id
)
3803 * onenand_probe - [OneNAND Interface] Probe the OneNAND device
3804 * @param mtd MTD device structure
3806 static int onenand_probe(struct mtd_info
*mtd
)
3808 struct onenand_chip
*this = mtd
->priv
;
3813 ret
= this->chip_probe(mtd
);
3817 /* Device and version IDs from Register */
3818 dev_id
= this->read_word(this->base
+ ONENAND_REG_DEVICE_ID
);
3819 ver_id
= this->read_word(this->base
+ ONENAND_REG_VERSION_ID
);
3820 this->technology
= this->read_word(this->base
+ ONENAND_REG_TECHNOLOGY
);
3822 /* Flash device information */
3823 onenand_print_device_info(dev_id
, ver_id
);
3824 this->device_id
= dev_id
;
3825 this->version_id
= ver_id
;
3827 /* Check OneNAND features */
3828 onenand_check_features(mtd
);
3830 density
= onenand_get_density(dev_id
);
3831 if (FLEXONENAND(this)) {
3832 this->dies
= ONENAND_IS_DDP(this) ? 2 : 1;
3833 /* Maximum possible erase regions */
3834 mtd
->numeraseregions
= this->dies
<< 1;
3835 mtd
->eraseregions
= kzalloc(sizeof(struct mtd_erase_region_info
)
3836 * (this->dies
<< 1), GFP_KERNEL
);
3837 if (!mtd
->eraseregions
)
3842 * For Flex-OneNAND, chipsize represents maximum possible device size.
3843 * mtd->size represents the actual device size.
3845 this->chipsize
= (16 << density
) << 20;
3847 /* OneNAND page size & block size */
3848 /* The data buffer size is equal to page size */
3849 mtd
->writesize
= this->read_word(this->base
+ ONENAND_REG_DATA_BUFFER_SIZE
);
3850 /* We use the full BufferRAM */
3851 if (ONENAND_IS_4KB_PAGE(this))
3852 mtd
->writesize
<<= 1;
3854 mtd
->oobsize
= mtd
->writesize
>> 5;
3855 /* Pages per a block are always 64 in OneNAND */
3856 mtd
->erasesize
= mtd
->writesize
<< 6;
3858 * Flex-OneNAND SLC area has 64 pages per block.
3859 * Flex-OneNAND MLC area has 128 pages per block.
3860 * Expose MLC erase size to find erase_shift and page_mask.
3862 if (FLEXONENAND(this))
3863 mtd
->erasesize
<<= 1;
3865 this->erase_shift
= ffs(mtd
->erasesize
) - 1;
3866 this->page_shift
= ffs(mtd
->writesize
) - 1;
3867 this->page_mask
= (1 << (this->erase_shift
- this->page_shift
)) - 1;
3868 /* Set density mask. it is used for DDP */
3869 if (ONENAND_IS_DDP(this))
3870 this->density_mask
= this->chipsize
>> (this->erase_shift
+ 1);
3871 /* It's real page size */
3872 this->writesize
= mtd
->writesize
;
3874 /* REVISIT: Multichip handling */
3876 if (FLEXONENAND(this))
3877 flexonenand_get_size(mtd
);
3879 mtd
->size
= this->chipsize
;
3882 * We emulate the 4KiB page and 256KiB erase block size
3883 * But oobsize is still 64 bytes.
3884 * It is only valid if you turn on 2X program support,
3885 * Otherwise it will be ignored by compiler.
3887 if (ONENAND_IS_2PLANE(this)) {
3888 mtd
->writesize
<<= 1;
3889 mtd
->erasesize
<<= 1;
3896 * onenand_suspend - [MTD Interface] Suspend the OneNAND flash
3897 * @param mtd MTD device structure
3899 static int onenand_suspend(struct mtd_info
*mtd
)
3901 return onenand_get_device(mtd
, FL_PM_SUSPENDED
);
3905 * onenand_resume - [MTD Interface] Resume the OneNAND flash
3906 * @param mtd MTD device structure
3908 static void onenand_resume(struct mtd_info
*mtd
)
3910 struct onenand_chip
*this = mtd
->priv
;
3912 if (this->state
== FL_PM_SUSPENDED
)
3913 onenand_release_device(mtd
);
3915 printk(KERN_ERR
"%s: resume() called for the chip which is not "
3916 "in suspended state\n", __func__
);
3920 * onenand_scan - [OneNAND Interface] Scan for the OneNAND device
3921 * @param mtd MTD device structure
3922 * @param maxchips Number of chips to scan for
3924 * This fills out all the not initialized function pointers
3925 * with the defaults.
3926 * The flash ID is read and the mtd/chip structures are
3927 * filled with the appropriate values.
3929 int onenand_scan(struct mtd_info
*mtd
, int maxchips
)
3932 struct onenand_chip
*this = mtd
->priv
;
3934 if (!this->read_word
)
3935 this->read_word
= onenand_readw
;
3936 if (!this->write_word
)
3937 this->write_word
= onenand_writew
;
3940 this->command
= onenand_command
;
3942 onenand_setup_wait(mtd
);
3943 if (!this->bbt_wait
)
3944 this->bbt_wait
= onenand_bbt_wait
;
3945 if (!this->unlock_all
)
3946 this->unlock_all
= onenand_unlock_all
;
3948 if (!this->chip_probe
)
3949 this->chip_probe
= onenand_chip_probe
;
3951 if (!this->read_bufferram
)
3952 this->read_bufferram
= onenand_read_bufferram
;
3953 if (!this->write_bufferram
)
3954 this->write_bufferram
= onenand_write_bufferram
;
3956 if (!this->block_markbad
)
3957 this->block_markbad
= onenand_default_block_markbad
;
3958 if (!this->scan_bbt
)
3959 this->scan_bbt
= onenand_default_bbt
;
3961 if (onenand_probe(mtd
))
3964 /* Set Sync. Burst Read after probing */
3965 if (this->mmcontrol
) {
3966 printk(KERN_INFO
"OneNAND Sync. Burst Read support\n");
3967 this->read_bufferram
= onenand_sync_read_bufferram
;
3970 /* Allocate buffers, if necessary */
3971 if (!this->page_buf
) {
3972 this->page_buf
= kzalloc(mtd
->writesize
, GFP_KERNEL
);
3973 if (!this->page_buf
)
3975 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
3976 this->verify_buf
= kzalloc(mtd
->writesize
, GFP_KERNEL
);
3977 if (!this->verify_buf
) {
3978 kfree(this->page_buf
);
3982 this->options
|= ONENAND_PAGEBUF_ALLOC
;
3984 if (!this->oob_buf
) {
3985 this->oob_buf
= kzalloc(mtd
->oobsize
, GFP_KERNEL
);
3986 if (!this->oob_buf
) {
3987 if (this->options
& ONENAND_PAGEBUF_ALLOC
) {
3988 this->options
&= ~ONENAND_PAGEBUF_ALLOC
;
3989 kfree(this->page_buf
);
3993 this->options
|= ONENAND_OOBBUF_ALLOC
;
3996 this->state
= FL_READY
;
3997 init_waitqueue_head(&this->wq
);
3998 spin_lock_init(&this->chip_lock
);
4001 * Allow subpage writes up to oobsize.
4003 switch (mtd
->oobsize
) {
4005 if (FLEXONENAND(this)) {
4006 this->ecclayout
= &flexonenand_oob_128
;
4007 mtd
->subpage_sft
= 0;
4009 this->ecclayout
= &onenand_oob_128
;
4010 mtd
->subpage_sft
= 2;
4012 if (ONENAND_IS_NOP_1(this))
4013 mtd
->subpage_sft
= 0;
4016 this->ecclayout
= &onenand_oob_64
;
4017 mtd
->subpage_sft
= 2;
4021 this->ecclayout
= &onenand_oob_32
;
4022 mtd
->subpage_sft
= 1;
4026 printk(KERN_WARNING
"%s: No OOB scheme defined for oobsize %d\n",
4027 __func__
, mtd
->oobsize
);
4028 mtd
->subpage_sft
= 0;
4029 /* To prevent kernel oops */
4030 this->ecclayout
= &onenand_oob_32
;
4034 this->subpagesize
= mtd
->writesize
>> mtd
->subpage_sft
;
4037 * The number of bytes available for a client to place data into
4038 * the out of band area
4041 for (i
= 0; i
< MTD_MAX_OOBFREE_ENTRIES
&&
4042 this->ecclayout
->oobfree
[i
].length
; i
++)
4043 mtd
->oobavail
+= this->ecclayout
->oobfree
[i
].length
;
4045 mtd
->ecclayout
= this->ecclayout
;
4046 mtd
->ecc_strength
= 1;
4048 /* Fill in remaining MTD driver data */
4049 mtd
->type
= ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH
: MTD_NANDFLASH
;
4050 mtd
->flags
= MTD_CAP_NANDFLASH
;
4051 mtd
->_erase
= onenand_erase
;
4053 mtd
->_unpoint
= NULL
;
4054 mtd
->_read
= onenand_read
;
4055 mtd
->_write
= onenand_write
;
4056 mtd
->_read_oob
= onenand_read_oob
;
4057 mtd
->_write_oob
= onenand_write_oob
;
4058 mtd
->_panic_write
= onenand_panic_write
;
4059 #ifdef CONFIG_MTD_ONENAND_OTP
4060 mtd
->_get_fact_prot_info
= onenand_get_fact_prot_info
;
4061 mtd
->_read_fact_prot_reg
= onenand_read_fact_prot_reg
;
4062 mtd
->_get_user_prot_info
= onenand_get_user_prot_info
;
4063 mtd
->_read_user_prot_reg
= onenand_read_user_prot_reg
;
4064 mtd
->_write_user_prot_reg
= onenand_write_user_prot_reg
;
4065 mtd
->_lock_user_prot_reg
= onenand_lock_user_prot_reg
;
4067 mtd
->_sync
= onenand_sync
;
4068 mtd
->_lock
= onenand_lock
;
4069 mtd
->_unlock
= onenand_unlock
;
4070 mtd
->_suspend
= onenand_suspend
;
4071 mtd
->_resume
= onenand_resume
;
4072 mtd
->_block_isbad
= onenand_block_isbad
;
4073 mtd
->_block_markbad
= onenand_block_markbad
;
4074 mtd
->owner
= THIS_MODULE
;
4075 mtd
->writebufsize
= mtd
->writesize
;
4077 /* Unlock whole block */
4078 if (!(this->options
& ONENAND_SKIP_INITIAL_UNLOCKING
))
4079 this->unlock_all(mtd
);
4081 ret
= this->scan_bbt(mtd
);
4082 if ((!FLEXONENAND(this)) || ret
)
4085 /* Change Flex-OneNAND boundaries if required */
4086 for (i
= 0; i
< MAX_DIES
; i
++)
4087 flexonenand_set_boundary(mtd
, i
, flex_bdry
[2 * i
],
4088 flex_bdry
[(2 * i
) + 1]);
4094 * onenand_release - [OneNAND Interface] Free resources held by the OneNAND device
4095 * @param mtd MTD device structure
4097 void onenand_release(struct mtd_info
*mtd
)
4099 struct onenand_chip
*this = mtd
->priv
;
4101 /* Deregister partitions */
4102 mtd_device_unregister(mtd
);
4104 /* Free bad block table memory, if allocated */
4106 struct bbm_info
*bbm
= this->bbm
;
4110 /* Buffers allocated by onenand_scan */
4111 if (this->options
& ONENAND_PAGEBUF_ALLOC
) {
4112 kfree(this->page_buf
);
4113 #ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4114 kfree(this->verify_buf
);
4117 if (this->options
& ONENAND_OOBBUF_ALLOC
)
4118 kfree(this->oob_buf
);
4119 kfree(mtd
->eraseregions
);
4122 EXPORT_SYMBOL_GPL(onenand_scan
);
4123 EXPORT_SYMBOL_GPL(onenand_release
);
4125 MODULE_LICENSE("GPL");
4126 MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
4127 MODULE_DESCRIPTION("Generic OneNAND flash driver code");