1/*
2 *  linux/drivers/mtd/onenand/onenand_base.c
3 *
4 *  Copyright © 2005-2009 Samsung Electronics
5 *  Copyright © 2007 Nokia Corporation
6 *
7 *  Kyungmin Park <kyungmin.park@samsung.com>
8 *
9 *  Credits:
10 *	Adrian Hunter <ext-adrian.hunter@nokia.com>:
11 *	auto-placement support, read-while load support, various fixes
12 *
13 *	Vishak G <vishak.g at samsung.com>, Rohit Hagargundgi <h.rohit at samsung.com>
14 *	Flex-OneNAND support
15 *	Amul Kumar Saha <amul.saha at samsung.com>
16 *	OTP support
17 *
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.
21 */
22
23#include <linux/kernel.h>
24#include <linux/module.h>
25#include <linux/moduleparam.h>
26#include <linux/slab.h>
27#include <linux/init.h>
28#include <linux/sched.h>
29#include <linux/delay.h>
30#include <linux/interrupt.h>
31#include <linux/jiffies.h>
32#include <linux/mtd/mtd.h>
33#include <linux/mtd/onenand.h>
34#include <linux/mtd/partitions.h>
35
36#include <asm/io.h>
37
38/*
39 * Multiblock erase if number of blocks to erase is 2 or more.
40 * Maximum number of blocks for simultaneous erase is 64.
41 */
42#define MB_ERASE_MIN_BLK_COUNT 2
43#define MB_ERASE_MAX_BLK_COUNT 64
44
45/* Default Flex-OneNAND boundary and lock respectively */
46static int flex_bdry[MAX_DIES * 2] = { -1, 0, -1, 0 };
47
48module_param_array(flex_bdry, int, NULL, 0400);
49MODULE_PARM_DESC(flex_bdry,	"SLC Boundary information for Flex-OneNAND"
50				"Syntax:flex_bdry=DIE_BDRY,LOCK,..."
51				"DIE_BDRY: SLC boundary of the die"
52				"LOCK: Locking information for SLC boundary"
53				"    : 0->Set boundary in unlocked status"
54				"    : 1->Set boundary in locked status");
55
56/* Default OneNAND/Flex-OneNAND OTP options*/
57static int otp;
58
59module_param(otp, int, 0400);
60MODULE_PARM_DESC(otp,	"Corresponding behaviour of OneNAND in OTP"
61			"Syntax : otp=LOCK_TYPE"
62			"LOCK_TYPE : Keys issued, for specific OTP Lock type"
63			"	   : 0 -> Default (No Blocks Locked)"
64			"	   : 1 -> OTP Block lock"
65			"	   : 2 -> 1st Block lock"
66			"	   : 3 -> BOTH OTP Block and 1st Block lock");
67
68/*
69 * flexonenand_oob_128 - oob info for Flex-Onenand with 4KB page
70 * For now, we expose only 64 out of 80 ecc bytes
71 */
72static struct nand_ecclayout flexonenand_oob_128 = {
73	.eccbytes	= 64,
74	.eccpos		= {
75		6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
76		22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
77		38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
78		54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
79		70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80		86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
81		102, 103, 104, 105
82		},
83	.oobfree	= {
84		{2, 4}, {18, 4}, {34, 4}, {50, 4},
85		{66, 4}, {82, 4}, {98, 4}, {114, 4}
86	}
87};
88
89/*
90 * onenand_oob_128 - oob info for OneNAND with 4KB page
91 *
92 * Based on specification:
93 * 4Gb M-die OneNAND Flash (KFM4G16Q4M, KFN8G16Q4M). Rev. 1.3, Apr. 2010
94 *
95 * For eccpos we expose only 64 bytes out of 72 (see struct nand_ecclayout)
96 *
97 * oobfree uses the spare area fields marked as
98 * "Managed by internal ECC logic for Logical Sector Number area"
99 */
100static struct nand_ecclayout onenand_oob_128 = {
101	.eccbytes	= 64,
102	.eccpos		= {
103		7, 8, 9, 10, 11, 12, 13, 14, 15,
104		23, 24, 25, 26, 27, 28, 29, 30, 31,
105		39, 40, 41, 42, 43, 44, 45, 46, 47,
106		55, 56, 57, 58, 59, 60, 61, 62, 63,
107		71, 72, 73, 74, 75, 76, 77, 78, 79,
108		87, 88, 89, 90, 91, 92, 93, 94, 95,
109		103, 104, 105, 106, 107, 108, 109, 110, 111,
110		119
111	},
112	.oobfree	= {
113		{2, 3}, {18, 3}, {34, 3}, {50, 3},
114		{66, 3}, {82, 3}, {98, 3}, {114, 3}
115	}
116};
117
118/**
119 * onenand_oob_64 - oob info for large (2KB) page
120 */
121static struct nand_ecclayout onenand_oob_64 = {
122	.eccbytes	= 20,
123	.eccpos		= {
124		8, 9, 10, 11, 12,
125		24, 25, 26, 27, 28,
126		40, 41, 42, 43, 44,
127		56, 57, 58, 59, 60,
128		},
129	.oobfree	= {
130		{2, 3}, {14, 2}, {18, 3}, {30, 2},
131		{34, 3}, {46, 2}, {50, 3}, {62, 2}
132	}
133};
134
135/**
136 * onenand_oob_32 - oob info for middle (1KB) page
137 */
138static struct nand_ecclayout onenand_oob_32 = {
139	.eccbytes	= 10,
140	.eccpos		= {
141		8, 9, 10, 11, 12,
142		24, 25, 26, 27, 28,
143		},
144	.oobfree	= { {2, 3}, {14, 2}, {18, 3}, {30, 2} }
145};
146
147static const unsigned char ffchars[] = {
148	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
149	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,	/* 16 */
150	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
151	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,	/* 32 */
152	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
153	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,	/* 48 */
154	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
155	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,	/* 64 */
156	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
157	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,	/* 80 */
158	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
159	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,	/* 96 */
160	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
161	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,	/* 112 */
162	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
163	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,	/* 128 */
164};
165
166/**
167 * onenand_readw - [OneNAND Interface] Read OneNAND register
168 * @param addr		address to read
169 *
170 * Read OneNAND register
171 */
172static unsigned short onenand_readw(void __iomem *addr)
173{
174	return readw(addr);
175}
176
177/**
178 * onenand_writew - [OneNAND Interface] Write OneNAND register with value
179 * @param value		value to write
180 * @param addr		address to write
181 *
182 * Write OneNAND register with value
183 */
184static void onenand_writew(unsigned short value, void __iomem *addr)
185{
186	writew(value, addr);
187}
188
189/**
190 * onenand_block_address - [DEFAULT] Get block address
191 * @param this		onenand chip data structure
192 * @param block		the block
193 * @return		translated block address if DDP, otherwise same
194 *
195 * Setup Start Address 1 Register (F100h)
196 */
197static int onenand_block_address(struct onenand_chip *this, int block)
198{
199	/* Device Flash Core select, NAND Flash Block Address */
200	if (block & this->density_mask)
201		return ONENAND_DDP_CHIP1 | (block ^ this->density_mask);
202
203	return block;
204}
205
206/**
207 * onenand_bufferram_address - [DEFAULT] Get bufferram address
208 * @param this		onenand chip data structure
209 * @param block		the block
210 * @return		set DBS value if DDP, otherwise 0
211 *
212 * Setup Start Address 2 Register (F101h) for DDP
213 */
214static int onenand_bufferram_address(struct onenand_chip *this, int block)
215{
216	/* Device BufferRAM Select */
217	if (block & this->density_mask)
218		return ONENAND_DDP_CHIP1;
219
220	return ONENAND_DDP_CHIP0;
221}
222
223/**
224 * onenand_page_address - [DEFAULT] Get page address
225 * @param page		the page address
226 * @param sector	the sector address
227 * @return		combined page and sector address
228 *
229 * Setup Start Address 8 Register (F107h)
230 */
231static int onenand_page_address(int page, int sector)
232{
233	/* Flash Page Address, Flash Sector Address */
234	int fpa, fsa;
235
236	fpa = page & ONENAND_FPA_MASK;
237	fsa = sector & ONENAND_FSA_MASK;
238
239	return ((fpa << ONENAND_FPA_SHIFT) | fsa);
240}
241
242/**
243 * onenand_buffer_address - [DEFAULT] Get buffer address
244 * @param dataram1	DataRAM index
245 * @param sectors	the sector address
246 * @param count		the number of sectors
247 * @return		the start buffer value
248 *
249 * Setup Start Buffer Register (F200h)
250 */
251static int onenand_buffer_address(int dataram1, int sectors, int count)
252{
253	int bsa, bsc;
254
255	/* BufferRAM Sector Address */
256	bsa = sectors & ONENAND_BSA_MASK;
257
258	if (dataram1)
259		bsa |= ONENAND_BSA_DATARAM1;	/* DataRAM1 */
260	else
261		bsa |= ONENAND_BSA_DATARAM0;	/* DataRAM0 */
262
263	/* BufferRAM Sector Count */
264	bsc = count & ONENAND_BSC_MASK;
265
266	return ((bsa << ONENAND_BSA_SHIFT) | bsc);
267}
268
269/**
270 * flexonenand_block- For given address return block number
271 * @param this         - OneNAND device structure
272 * @param addr		- Address for which block number is needed
273 */
274static unsigned flexonenand_block(struct onenand_chip *this, loff_t addr)
275{
276	unsigned boundary, blk, die = 0;
277
278	if (ONENAND_IS_DDP(this) && addr >= this->diesize[0]) {
279		die = 1;
280		addr -= this->diesize[0];
281	}
282
283	boundary = this->boundary[die];
284
285	blk = addr >> (this->erase_shift - 1);
286	if (blk > boundary)
287		blk = (blk + boundary + 1) >> 1;
288
289	blk += die ? this->density_mask : 0;
290	return blk;
291}
292
293inline unsigned onenand_block(struct onenand_chip *this, loff_t addr)
294{
295	if (!FLEXONENAND(this))
296		return addr >> this->erase_shift;
297	return flexonenand_block(this, addr);
298}
299
300/**
301 * flexonenand_addr - Return address of the block
302 * @this:		OneNAND device structure
303 * @block:		Block number on Flex-OneNAND
304 *
305 * Return address of the block
306 */
307static loff_t flexonenand_addr(struct onenand_chip *this, int block)
308{
309	loff_t ofs = 0;
310	int die = 0, boundary;
311
312	if (ONENAND_IS_DDP(this) && block >= this->density_mask) {
313		block -= this->density_mask;
314		die = 1;
315		ofs = this->diesize[0];
316	}
317
318	boundary = this->boundary[die];
319	ofs += (loff_t)block << (this->erase_shift - 1);
320	if (block > (boundary + 1))
321		ofs += (loff_t)(block - boundary - 1) << (this->erase_shift - 1);
322	return ofs;
323}
324
325loff_t onenand_addr(struct onenand_chip *this, int block)
326{
327	if (!FLEXONENAND(this))
328		return (loff_t)block << this->erase_shift;
329	return flexonenand_addr(this, block);
330}
331EXPORT_SYMBOL(onenand_addr);
332
333/**
334 * onenand_get_density - [DEFAULT] Get OneNAND density
335 * @param dev_id	OneNAND device ID
336 *
337 * Get OneNAND density from device ID
338 */
339static inline int onenand_get_density(int dev_id)
340{
341	int density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT;
342	return (density & ONENAND_DEVICE_DENSITY_MASK);
343}
344
345/**
346 * flexonenand_region - [Flex-OneNAND] Return erase region of addr
347 * @param mtd		MTD device structure
348 * @param addr		address whose erase region needs to be identified
349 */
350int flexonenand_region(struct mtd_info *mtd, loff_t addr)
351{
352	int i;
353
354	for (i = 0; i < mtd->numeraseregions; i++)
355		if (addr < mtd->eraseregions[i].offset)
356			break;
357	return i - 1;
358}
359EXPORT_SYMBOL(flexonenand_region);
360
361/**
362 * onenand_command - [DEFAULT] Send command to OneNAND device
363 * @param mtd		MTD device structure
364 * @param cmd		the command to be sent
365 * @param addr		offset to read from or write to
366 * @param len		number of bytes to read or write
367 *
368 * Send command to OneNAND device. This function is used for middle/large page
369 * devices (1KB/2KB Bytes per page)
370 */
371static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t len)
372{
373	struct onenand_chip *this = mtd->priv;
374	int value, block, page;
375
376	/* Address translation */
377	switch (cmd) {
378	case ONENAND_CMD_UNLOCK:
379	case ONENAND_CMD_LOCK:
380	case ONENAND_CMD_LOCK_TIGHT:
381	case ONENAND_CMD_UNLOCK_ALL:
382		block = -1;
383		page = -1;
384		break;
385
386	case FLEXONENAND_CMD_PI_ACCESS:
387		/* addr contains die index */
388		block = addr * this->density_mask;
389		page = -1;
390		break;
391
392	case ONENAND_CMD_ERASE:
393	case ONENAND_CMD_MULTIBLOCK_ERASE:
394	case ONENAND_CMD_ERASE_VERIFY:
395	case ONENAND_CMD_BUFFERRAM:
396	case ONENAND_CMD_OTP_ACCESS:
397		block = onenand_block(this, addr);
398		page = -1;
399		break;
400
401	case FLEXONENAND_CMD_READ_PI:
402		cmd = ONENAND_CMD_READ;
403		block = addr * this->density_mask;
404		page = 0;
405		break;
406
407	default:
408		block = onenand_block(this, addr);
409		if (FLEXONENAND(this))
410			page = (int) (addr - onenand_addr(this, block))>>\
411				this->page_shift;
412		else
413			page = (int) (addr >> this->page_shift);
414		if (ONENAND_IS_2PLANE(this)) {
415			/* Make the even block number */
416			block &= ~1;
417			/* Is it the odd plane? */
418			if (addr & this->writesize)
419				block++;
420			page >>= 1;
421		}
422		page &= this->page_mask;
423		break;
424	}
425
426	/* NOTE: The setting order of the registers is very important! */
427	if (cmd == ONENAND_CMD_BUFFERRAM) {
428		/* Select DataRAM for DDP */
429		value = onenand_bufferram_address(this, block);
430		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
431
432		if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this))
433			/* It is always BufferRAM0 */
434			ONENAND_SET_BUFFERRAM0(this);
435		else
436			/* Switch to the next data buffer */
437			ONENAND_SET_NEXT_BUFFERRAM(this);
438
439		return 0;
440	}
441
442	if (block != -1) {
443		/* Write 'DFS, FBA' of Flash */
444		value = onenand_block_address(this, block);
445		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
446
447		/* Select DataRAM for DDP */
448		value = onenand_bufferram_address(this, block);
449		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
450	}
451
452	if (page != -1) {
453		/* Now we use page size operation */
454		int sectors = 0, count = 0;
455		int dataram;
456
457		switch (cmd) {
458		case FLEXONENAND_CMD_RECOVER_LSB:
459		case ONENAND_CMD_READ:
460		case ONENAND_CMD_READOOB:
461			if (ONENAND_IS_4KB_PAGE(this))
462				/* It is always BufferRAM0 */
463				dataram = ONENAND_SET_BUFFERRAM0(this);
464			else
465				dataram = ONENAND_SET_NEXT_BUFFERRAM(this);
466			break;
467
468		default:
469			if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
470				cmd = ONENAND_CMD_2X_PROG;
471			dataram = ONENAND_CURRENT_BUFFERRAM(this);
472			break;
473		}
474
475		/* Write 'FPA, FSA' of Flash */
476		value = onenand_page_address(page, sectors);
477		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS8);
478
479		/* Write 'BSA, BSC' of DataRAM */
480		value = onenand_buffer_address(dataram, sectors, count);
481		this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
482	}
483
484	/* Interrupt clear */
485	this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
486
487	/* Write command */
488	this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
489
490	return 0;
491}
492
493/**
494 * onenand_read_ecc - return ecc status
495 * @param this		onenand chip structure
496 */
497static inline int onenand_read_ecc(struct onenand_chip *this)
498{
499	int ecc, i, result = 0;
500
501	if (!FLEXONENAND(this) && !ONENAND_IS_4KB_PAGE(this))
502		return this->read_word(this->base + ONENAND_REG_ECC_STATUS);
503
504	for (i = 0; i < 4; i++) {
505		ecc = this->read_word(this->base + ONENAND_REG_ECC_STATUS + i*2);
506		if (likely(!ecc))
507			continue;
508		if (ecc & FLEXONENAND_UNCORRECTABLE_ERROR)
509			return ONENAND_ECC_2BIT_ALL;
510		else
511			result = ONENAND_ECC_1BIT_ALL;
512	}
513
514	return result;
515}
516
517/**
518 * onenand_wait - [DEFAULT] wait until the command is done
519 * @param mtd		MTD device structure
520 * @param state		state to select the max. timeout value
521 *
522 * Wait for command done. This applies to all OneNAND command
523 * Read can take up to 30us, erase up to 2ms and program up to 350us
524 * according to general OneNAND specs
525 */
526static int onenand_wait(struct mtd_info *mtd, int state)
527{
528	struct onenand_chip * this = mtd->priv;
529	unsigned long timeout;
530	unsigned int flags = ONENAND_INT_MASTER;
531	unsigned int interrupt = 0;
532	unsigned int ctrl;
533
534	/* The 20 msec is enough */
535	timeout = jiffies + msecs_to_jiffies(20);
536	while (time_before(jiffies, timeout)) {
537		interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
538
539		if (interrupt & flags)
540			break;
541
542		if (state != FL_READING && state != FL_PREPARING_ERASE)
543			cond_resched();
544	}
545	/* To get correct interrupt status in timeout case */
546	interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
547
548	ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
549
550	/*
551	 * In the Spec. it checks the controller status first
552	 * However if you get the correct information in case of
553	 * power off recovery (POR) test, it should read ECC status first
554	 */
555	if (interrupt & ONENAND_INT_READ) {
556		int ecc = onenand_read_ecc(this);
557		if (ecc) {
558			if (ecc & ONENAND_ECC_2BIT_ALL) {
559				printk(KERN_ERR "%s: ECC error = 0x%04x\n",
560					__func__, ecc);
561				mtd->ecc_stats.failed++;
562				return -EBADMSG;
563			} else if (ecc & ONENAND_ECC_1BIT_ALL) {
564				printk(KERN_DEBUG "%s: correctable ECC error = 0x%04x\n",
565					__func__, ecc);
566				mtd->ecc_stats.corrected++;
567			}
568		}
569	} else if (state == FL_READING) {
570		printk(KERN_ERR "%s: read timeout! ctrl=0x%04x intr=0x%04x\n",
571			__func__, ctrl, interrupt);
572		return -EIO;
573	}
574
575	if (state == FL_PREPARING_ERASE && !(interrupt & ONENAND_INT_ERASE)) {
576		printk(KERN_ERR "%s: mb erase timeout! ctrl=0x%04x intr=0x%04x\n",
577		       __func__, ctrl, interrupt);
578		return -EIO;
579	}
580
581	if (!(interrupt & ONENAND_INT_MASTER)) {
582		printk(KERN_ERR "%s: timeout! ctrl=0x%04x intr=0x%04x\n",
583		       __func__, ctrl, interrupt);
584		return -EIO;
585	}
586
587	/* If there's controller error, it's a real error */
588	if (ctrl & ONENAND_CTRL_ERROR) {
589		printk(KERN_ERR "%s: controller error = 0x%04x\n",
590			__func__, ctrl);
591		if (ctrl & ONENAND_CTRL_LOCK)
592			printk(KERN_ERR "%s: it's locked error.\n", __func__);
593		return -EIO;
594	}
595
596	return 0;
597}
598
599/*
600 * onenand_interrupt - [DEFAULT] onenand interrupt handler
601 * @param irq		onenand interrupt number
602 * @param dev_id	interrupt data
603 *
604 * complete the work
605 */
606static irqreturn_t onenand_interrupt(int irq, void *data)
607{
608	struct onenand_chip *this = data;
609
610	/* To handle shared interrupt */
611	if (!this->complete.done)
612		complete(&this->complete);
613
614	return IRQ_HANDLED;
615}
616
617/*
618 * onenand_interrupt_wait - [DEFAULT] wait until the command is done
619 * @param mtd		MTD device structure
620 * @param state		state to select the max. timeout value
621 *
622 * Wait for command done.
623 */
624static int onenand_interrupt_wait(struct mtd_info *mtd, int state)
625{
626	struct onenand_chip *this = mtd->priv;
627
628	wait_for_completion(&this->complete);
629
630	return onenand_wait(mtd, state);
631}
632
633/*
634 * onenand_try_interrupt_wait - [DEFAULT] try interrupt wait
635 * @param mtd		MTD device structure
636 * @param state		state to select the max. timeout value
637 *
638 * Try interrupt based wait (It is used one-time)
639 */
640static int onenand_try_interrupt_wait(struct mtd_info *mtd, int state)
641{
642	struct onenand_chip *this = mtd->priv;
643	unsigned long remain, timeout;
644
645	/* We use interrupt wait first */
646	this->wait = onenand_interrupt_wait;
647
648	timeout = msecs_to_jiffies(100);
649	remain = wait_for_completion_timeout(&this->complete, timeout);
650	if (!remain) {
651		printk(KERN_INFO "OneNAND: There's no interrupt. "
652				"We use the normal wait\n");
653
654		/* Release the irq */
655		free_irq(this->irq, this);
656
657		this->wait = onenand_wait;
658	}
659
660	return onenand_wait(mtd, state);
661}
662
663/*
664 * onenand_setup_wait - [OneNAND Interface] setup onenand wait method
665 * @param mtd		MTD device structure
666 *
667 * There's two method to wait onenand work
668 * 1. polling - read interrupt status register
669 * 2. interrupt - use the kernel interrupt method
670 */
671static void onenand_setup_wait(struct mtd_info *mtd)
672{
673	struct onenand_chip *this = mtd->priv;
674	int syscfg;
675
676	init_completion(&this->complete);
677
678	if (this->irq <= 0) {
679		this->wait = onenand_wait;
680		return;
681	}
682
683	if (request_irq(this->irq, &onenand_interrupt,
684				IRQF_SHARED, "onenand", this)) {
685		/* If we can't get irq, use the normal wait */
686		this->wait = onenand_wait;
687		return;
688	}
689
690	/* Enable interrupt */
691	syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
692	syscfg |= ONENAND_SYS_CFG1_IOBE;
693	this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
694
695	this->wait = onenand_try_interrupt_wait;
696}
697
698/**
699 * onenand_bufferram_offset - [DEFAULT] BufferRAM offset
700 * @param mtd		MTD data structure
701 * @param area		BufferRAM area
702 * @return		offset given area
703 *
704 * Return BufferRAM offset given area
705 */
706static inline int onenand_bufferram_offset(struct mtd_info *mtd, int area)
707{
708	struct onenand_chip *this = mtd->priv;
709
710	if (ONENAND_CURRENT_BUFFERRAM(this)) {
711		/* Note: the 'this->writesize' is a real page size */
712		if (area == ONENAND_DATARAM)
713			return this->writesize;
714		if (area == ONENAND_SPARERAM)
715			return mtd->oobsize;
716	}
717
718	return 0;
719}
720
721/**
722 * onenand_read_bufferram - [OneNAND Interface] Read the bufferram area
723 * @param mtd		MTD data structure
724 * @param area		BufferRAM area
725 * @param buffer	the databuffer to put/get data
726 * @param offset	offset to read from or write to
727 * @param count		number of bytes to read/write
728 *
729 * Read the BufferRAM area
730 */
731static int onenand_read_bufferram(struct mtd_info *mtd, int area,
732		unsigned char *buffer, int offset, size_t count)
733{
734	struct onenand_chip *this = mtd->priv;
735	void __iomem *bufferram;
736
737	bufferram = this->base + area;
738
739	bufferram += onenand_bufferram_offset(mtd, area);
740
741	if (ONENAND_CHECK_BYTE_ACCESS(count)) {
742		unsigned short word;
743
744		/* Align with word(16-bit) size */
745		count--;
746
747		/* Read word and save byte */
748		word = this->read_word(bufferram + offset + count);
749		buffer[count] = (word & 0xff);
750	}
751
752	memcpy(buffer, bufferram + offset, count);
753
754	return 0;
755}
756
757/**
758 * onenand_sync_read_bufferram - [OneNAND Interface] Read the bufferram area with Sync. Burst mode
759 * @param mtd		MTD data structure
760 * @param area		BufferRAM area
761 * @param buffer	the databuffer to put/get data
762 * @param offset	offset to read from or write to
763 * @param count		number of bytes to read/write
764 *
765 * Read the BufferRAM area with Sync. Burst Mode
766 */
767static int onenand_sync_read_bufferram(struct mtd_info *mtd, int area,
768		unsigned char *buffer, int offset, size_t count)
769{
770	struct onenand_chip *this = mtd->priv;
771	void __iomem *bufferram;
772
773	bufferram = this->base + area;
774
775	bufferram += onenand_bufferram_offset(mtd, area);
776
777	this->mmcontrol(mtd, ONENAND_SYS_CFG1_SYNC_READ);
778
779	if (ONENAND_CHECK_BYTE_ACCESS(count)) {
780		unsigned short word;
781
782		/* Align with word(16-bit) size */
783		count--;
784
785		/* Read word and save byte */
786		word = this->read_word(bufferram + offset + count);
787		buffer[count] = (word & 0xff);
788	}
789
790	memcpy(buffer, bufferram + offset, count);
791
792	this->mmcontrol(mtd, 0);
793
794	return 0;
795}
796
797/**
798 * onenand_write_bufferram - [OneNAND Interface] Write the bufferram area
799 * @param mtd		MTD data structure
800 * @param area		BufferRAM area
801 * @param buffer	the databuffer to put/get data
802 * @param offset	offset to read from or write to
803 * @param count		number of bytes to read/write
804 *
805 * Write the BufferRAM area
806 */
807static int onenand_write_bufferram(struct mtd_info *mtd, int area,
808		const unsigned char *buffer, int offset, size_t count)
809{
810	struct onenand_chip *this = mtd->priv;
811	void __iomem *bufferram;
812
813	bufferram = this->base + area;
814
815	bufferram += onenand_bufferram_offset(mtd, area);
816
817	if (ONENAND_CHECK_BYTE_ACCESS(count)) {
818		unsigned short word;
819		int byte_offset;
820
821		/* Align with word(16-bit) size */
822		count--;
823
824		/* Calculate byte access offset */
825		byte_offset = offset + count;
826
827		/* Read word and save byte */
828		word = this->read_word(bufferram + byte_offset);
829		word = (word & ~0xff) | buffer[count];
830		this->write_word(word, bufferram + byte_offset);
831	}
832
833	memcpy(bufferram + offset, buffer, count);
834
835	return 0;
836}
837
838/**
839 * onenand_get_2x_blockpage - [GENERIC] Get blockpage at 2x program mode
840 * @param mtd		MTD data structure
841 * @param addr		address to check
842 * @return		blockpage address
843 *
844 * Get blockpage address at 2x program mode
845 */
846static int onenand_get_2x_blockpage(struct mtd_info *mtd, loff_t addr)
847{
848	struct onenand_chip *this = mtd->priv;
849	int blockpage, block, page;
850
851	/* Calculate the even block number */
852	block = (int) (addr >> this->erase_shift) & ~1;
853	/* Is it the odd plane? */
854	if (addr & this->writesize)
855		block++;
856	page = (int) (addr >> (this->page_shift + 1)) & this->page_mask;
857	blockpage = (block << 7) | page;
858
859	return blockpage;
860}
861
862/**
863 * onenand_check_bufferram - [GENERIC] Check BufferRAM information
864 * @param mtd		MTD data structure
865 * @param addr		address to check
866 * @return		1 if there are valid data, otherwise 0
867 *
868 * Check bufferram if there is data we required
869 */
870static int onenand_check_bufferram(struct mtd_info *mtd, loff_t addr)
871{
872	struct onenand_chip *this = mtd->priv;
873	int blockpage, found = 0;
874	unsigned int i;
875
876	if (ONENAND_IS_2PLANE(this))
877		blockpage = onenand_get_2x_blockpage(mtd, addr);
878	else
879		blockpage = (int) (addr >> this->page_shift);
880
881	/* Is there valid data? */
882	i = ONENAND_CURRENT_BUFFERRAM(this);
883	if (this->bufferram[i].blockpage == blockpage)
884		found = 1;
885	else {
886		/* Check another BufferRAM */
887		i = ONENAND_NEXT_BUFFERRAM(this);
888		if (this->bufferram[i].blockpage == blockpage) {
889			ONENAND_SET_NEXT_BUFFERRAM(this);
890			found = 1;
891		}
892	}
893
894	if (found && ONENAND_IS_DDP(this)) {
895		/* Select DataRAM for DDP */
896		int block = onenand_block(this, addr);
897		int value = onenand_bufferram_address(this, block);
898		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
899	}
900
901	return found;
902}
903
904/**
905 * onenand_update_bufferram - [GENERIC] Update BufferRAM information
906 * @param mtd		MTD data structure
907 * @param addr		address to update
908 * @param valid		valid flag
909 *
910 * Update BufferRAM information
911 */
912static void onenand_update_bufferram(struct mtd_info *mtd, loff_t addr,
913		int valid)
914{
915	struct onenand_chip *this = mtd->priv;
916	int blockpage;
917	unsigned int i;
918
919	if (ONENAND_IS_2PLANE(this))
920		blockpage = onenand_get_2x_blockpage(mtd, addr);
921	else
922		blockpage = (int) (addr >> this->page_shift);
923
924	/* Invalidate another BufferRAM */
925	i = ONENAND_NEXT_BUFFERRAM(this);
926	if (this->bufferram[i].blockpage == blockpage)
927		this->bufferram[i].blockpage = -1;
928
929	/* Update BufferRAM */
930	i = ONENAND_CURRENT_BUFFERRAM(this);
931	if (valid)
932		this->bufferram[i].blockpage = blockpage;
933	else
934		this->bufferram[i].blockpage = -1;
935}
936
937/**
938 * onenand_invalidate_bufferram - [GENERIC] Invalidate BufferRAM information
939 * @param mtd		MTD data structure
940 * @param addr		start address to invalidate
941 * @param len		length to invalidate
942 *
943 * Invalidate BufferRAM information
944 */
945static void onenand_invalidate_bufferram(struct mtd_info *mtd, loff_t addr,
946		unsigned int len)
947{
948	struct onenand_chip *this = mtd->priv;
949	int i;
950	loff_t end_addr = addr + len;
951
952	/* Invalidate BufferRAM */
953	for (i = 0; i < MAX_BUFFERRAM; i++) {
954		loff_t buf_addr = this->bufferram[i].blockpage << this->page_shift;
955		if (buf_addr >= addr && buf_addr < end_addr)
956			this->bufferram[i].blockpage = -1;
957	}
958}
959
960/**
961 * onenand_get_device - [GENERIC] Get chip for selected access
962 * @param mtd		MTD device structure
963 * @param new_state	the state which is requested
964 *
965 * Get the device and lock it for exclusive access
966 */
967static int onenand_get_device(struct mtd_info *mtd, int new_state)
968{
969	struct onenand_chip *this = mtd->priv;
970	DECLARE_WAITQUEUE(wait, current);
971
972	/*
973	 * Grab the lock and see if the device is available
974	 */
975	while (1) {
976		spin_lock(&this->chip_lock);
977		if (this->state == FL_READY) {
978			this->state = new_state;
979			spin_unlock(&this->chip_lock);
980			if (new_state != FL_PM_SUSPENDED && this->enable)
981				this->enable(mtd);
982			break;
983		}
984		if (new_state == FL_PM_SUSPENDED) {
985			spin_unlock(&this->chip_lock);
986			return (this->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
987		}
988		set_current_state(TASK_UNINTERRUPTIBLE);
989		add_wait_queue(&this->wq, &wait);
990		spin_unlock(&this->chip_lock);
991		schedule();
992		remove_wait_queue(&this->wq, &wait);
993	}
994
995	return 0;
996}
997
998/**
999 * onenand_release_device - [GENERIC] release chip
1000 * @param mtd		MTD device structure
1001 *
1002 * Deselect, release chip lock and wake up anyone waiting on the device
1003 */
1004static void onenand_release_device(struct mtd_info *mtd)
1005{
1006	struct onenand_chip *this = mtd->priv;
1007
1008	if (this->state != FL_PM_SUSPENDED && this->disable)
1009		this->disable(mtd);
1010	/* Release the chip */
1011	spin_lock(&this->chip_lock);
1012	this->state = FL_READY;
1013	wake_up(&this->wq);
1014	spin_unlock(&this->chip_lock);
1015}
1016
1017/**
1018 * onenand_transfer_auto_oob - [INTERN] oob auto-placement transfer
1019 * @param mtd		MTD device structure
1020 * @param buf		destination address
1021 * @param column	oob offset to read from
1022 * @param thislen	oob length to read
1023 */
1024static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int column,
1025				int thislen)
1026{
1027	struct onenand_chip *this = mtd->priv;
1028	struct nand_oobfree *free;
1029	int readcol = column;
1030	int readend = column + thislen;
1031	int lastgap = 0;
1032	unsigned int i;
1033	uint8_t *oob_buf = this->oob_buf;
1034
1035	free = this->ecclayout->oobfree;
1036	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1037		if (readcol >= lastgap)
1038			readcol += free->offset - lastgap;
1039		if (readend >= lastgap)
1040			readend += free->offset - lastgap;
1041		lastgap = free->offset + free->length;
1042	}
1043	this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1044	free = this->ecclayout->oobfree;
1045	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1046		int free_end = free->offset + free->length;
1047		if (free->offset < readend && free_end > readcol) {
1048			int st = max_t(int,free->offset,readcol);
1049			int ed = min_t(int,free_end,readend);
1050			int n = ed - st;
1051			memcpy(buf, oob_buf + st, n);
1052			buf += n;
1053		} else if (column == 0)
1054			break;
1055	}
1056	return 0;
1057}
1058
1059/**
1060 * onenand_recover_lsb - [Flex-OneNAND] Recover LSB page data
1061 * @param mtd		MTD device structure
1062 * @param addr		address to recover
1063 * @param status	return value from onenand_wait / onenand_bbt_wait
1064 *
1065 * MLC NAND Flash cell has paired pages - LSB page and MSB page. LSB page has
1066 * lower page address and MSB page has higher page address in paired pages.
1067 * If power off occurs during MSB page program, the paired LSB page data can
1068 * become corrupt. LSB page recovery read is a way to read LSB page though page
1069 * data are corrupted. When uncorrectable error occurs as a result of LSB page
1070 * read after power up, issue LSB page recovery read.
1071 */
1072static int onenand_recover_lsb(struct mtd_info *mtd, loff_t addr, int status)
1073{
1074	struct onenand_chip *this = mtd->priv;
1075	int i;
1076
1077	/* Recovery is only for Flex-OneNAND */
1078	if (!FLEXONENAND(this))
1079		return status;
1080
1081	/* check if we failed due to uncorrectable error */
1082	if (!mtd_is_eccerr(status) && status != ONENAND_BBT_READ_ECC_ERROR)
1083		return status;
1084
1085	/* check if address lies in MLC region */
1086	i = flexonenand_region(mtd, addr);
1087	if (mtd->eraseregions[i].erasesize < (1 << this->erase_shift))
1088		return status;
1089
1090	/* We are attempting to reread, so decrement stats.failed
1091	 * which was incremented by onenand_wait due to read failure
1092	 */
1093	printk(KERN_INFO "%s: Attempting to recover from uncorrectable read\n",
1094		__func__);
1095	mtd->ecc_stats.failed--;
1096
1097	/* Issue the LSB page recovery command */
1098	this->command(mtd, FLEXONENAND_CMD_RECOVER_LSB, addr, this->writesize);
1099	return this->wait(mtd, FL_READING);
1100}
1101
1102/**
1103 * onenand_mlc_read_ops_nolock - MLC OneNAND read main and/or out-of-band
1104 * @param mtd		MTD device structure
1105 * @param from		offset to read from
1106 * @param ops:		oob operation description structure
1107 *
1108 * MLC OneNAND / Flex-OneNAND has 4KB page size and 4KB dataram.
1109 * So, read-while-load is not present.
1110 */
1111static int onenand_mlc_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1112				struct mtd_oob_ops *ops)
1113{
1114	struct onenand_chip *this = mtd->priv;
1115	struct mtd_ecc_stats stats;
1116	size_t len = ops->len;
1117	size_t ooblen = ops->ooblen;
1118	u_char *buf = ops->datbuf;
1119	u_char *oobbuf = ops->oobbuf;
1120	int read = 0, column, thislen;
1121	int oobread = 0, oobcolumn, thisooblen, oobsize;
1122	int ret = 0;
1123	int writesize = this->writesize;
1124
1125	pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1126			(int)len);
1127
1128	if (ops->mode == MTD_OPS_AUTO_OOB)
1129		oobsize = this->ecclayout->oobavail;
1130	else
1131		oobsize = mtd->oobsize;
1132
1133	oobcolumn = from & (mtd->oobsize - 1);
1134
1135	/* Do not allow reads past end of device */
1136	if (from + len > mtd->size) {
1137		printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1138			__func__);
1139		ops->retlen = 0;
1140		ops->oobretlen = 0;
1141		return -EINVAL;
1142	}
1143
1144	stats = mtd->ecc_stats;
1145
1146	while (read < len) {
1147		cond_resched();
1148
1149		thislen = min_t(int, writesize, len - read);
1150
1151		column = from & (writesize - 1);
1152		if (column + thislen > writesize)
1153			thislen = writesize - column;
1154
1155		if (!onenand_check_bufferram(mtd, from)) {
1156			this->command(mtd, ONENAND_CMD_READ, from, writesize);
1157
1158			ret = this->wait(mtd, FL_READING);
1159			if (unlikely(ret))
1160				ret = onenand_recover_lsb(mtd, from, ret);
1161			onenand_update_bufferram(mtd, from, !ret);
1162			if (mtd_is_eccerr(ret))
1163				ret = 0;
1164			if (ret)
1165				break;
1166		}
1167
1168		this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1169		if (oobbuf) {
1170			thisooblen = oobsize - oobcolumn;
1171			thisooblen = min_t(int, thisooblen, ooblen - oobread);
1172
1173			if (ops->mode == MTD_OPS_AUTO_OOB)
1174				onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1175			else
1176				this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1177			oobread += thisooblen;
1178			oobbuf += thisooblen;
1179			oobcolumn = 0;
1180		}
1181
1182		read += thislen;
1183		if (read == len)
1184			break;
1185
1186		from += thislen;
1187		buf += thislen;
1188	}
1189
1190	/*
1191	 * Return success, if no ECC failures, else -EBADMSG
1192	 * fs driver will take care of that, because
1193	 * retlen == desired len and result == -EBADMSG
1194	 */
1195	ops->retlen = read;
1196	ops->oobretlen = oobread;
1197
1198	if (ret)
1199		return ret;
1200
1201	if (mtd->ecc_stats.failed - stats.failed)
1202		return -EBADMSG;
1203
1204	return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
1205}
1206
1207/**
1208 * onenand_read_ops_nolock - [OneNAND Interface] OneNAND read main and/or out-of-band
1209 * @param mtd		MTD device structure
1210 * @param from		offset to read from
1211 * @param ops:		oob operation description structure
1212 *
1213 * OneNAND read main and/or out-of-band data
1214 */
1215static int onenand_read_ops_nolock(struct mtd_info *mtd, loff_t from,
1216				struct mtd_oob_ops *ops)
1217{
1218	struct onenand_chip *this = mtd->priv;
1219	struct mtd_ecc_stats stats;
1220	size_t len = ops->len;
1221	size_t ooblen = ops->ooblen;
1222	u_char *buf = ops->datbuf;
1223	u_char *oobbuf = ops->oobbuf;
1224	int read = 0, column, thislen;
1225	int oobread = 0, oobcolumn, thisooblen, oobsize;
1226	int ret = 0, boundary = 0;
1227	int writesize = this->writesize;
1228
1229	pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1230			(int)len);
1231
1232	if (ops->mode == MTD_OPS_AUTO_OOB)
1233		oobsize = this->ecclayout->oobavail;
1234	else
1235		oobsize = mtd->oobsize;
1236
1237	oobcolumn = from & (mtd->oobsize - 1);
1238
1239	/* Do not allow reads past end of device */
1240	if ((from + len) > mtd->size) {
1241		printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1242			__func__);
1243		ops->retlen = 0;
1244		ops->oobretlen = 0;
1245		return -EINVAL;
1246	}
1247
1248	stats = mtd->ecc_stats;
1249
1250 	/* Read-while-load method */
1251
1252 	/* Do first load to bufferRAM */
1253 	if (read < len) {
1254 		if (!onenand_check_bufferram(mtd, from)) {
1255			this->command(mtd, ONENAND_CMD_READ, from, writesize);
1256 			ret = this->wait(mtd, FL_READING);
1257 			onenand_update_bufferram(mtd, from, !ret);
1258			if (mtd_is_eccerr(ret))
1259				ret = 0;
1260 		}
1261 	}
1262
1263	thislen = min_t(int, writesize, len - read);
1264	column = from & (writesize - 1);
1265	if (column + thislen > writesize)
1266		thislen = writesize - column;
1267
1268 	while (!ret) {
1269 		/* If there is more to load then start next load */
1270 		from += thislen;
1271 		if (read + thislen < len) {
1272			this->command(mtd, ONENAND_CMD_READ, from, writesize);
1273 			/*
1274 			 * Chip boundary handling in DDP
1275 			 * Now we issued chip 1 read and pointed chip 1
1276			 * bufferram so we have to point chip 0 bufferram.
1277 			 */
1278 			if (ONENAND_IS_DDP(this) &&
1279 			    unlikely(from == (this->chipsize >> 1))) {
1280 				this->write_word(ONENAND_DDP_CHIP0, this->base + ONENAND_REG_START_ADDRESS2);
1281 				boundary = 1;
1282 			} else
1283 				boundary = 0;
1284 			ONENAND_SET_PREV_BUFFERRAM(this);
1285 		}
1286 		/* While load is going, read from last bufferRAM */
1287 		this->read_bufferram(mtd, ONENAND_DATARAM, buf, column, thislen);
1288
1289		/* Read oob area if needed */
1290		if (oobbuf) {
1291			thisooblen = oobsize - oobcolumn;
1292			thisooblen = min_t(int, thisooblen, ooblen - oobread);
1293
1294			if (ops->mode == MTD_OPS_AUTO_OOB)
1295				onenand_transfer_auto_oob(mtd, oobbuf, oobcolumn, thisooblen);
1296			else
1297				this->read_bufferram(mtd, ONENAND_SPARERAM, oobbuf, oobcolumn, thisooblen);
1298			oobread += thisooblen;
1299			oobbuf += thisooblen;
1300			oobcolumn = 0;
1301		}
1302
1303 		/* See if we are done */
1304 		read += thislen;
1305 		if (read == len)
1306 			break;
1307 		/* Set up for next read from bufferRAM */
1308 		if (unlikely(boundary))
1309 			this->write_word(ONENAND_DDP_CHIP1, this->base + ONENAND_REG_START_ADDRESS2);
1310 		ONENAND_SET_NEXT_BUFFERRAM(this);
1311 		buf += thislen;
1312		thislen = min_t(int, writesize, len - read);
1313 		column = 0;
1314 		cond_resched();
1315 		/* Now wait for load */
1316 		ret = this->wait(mtd, FL_READING);
1317 		onenand_update_bufferram(mtd, from, !ret);
1318		if (mtd_is_eccerr(ret))
1319			ret = 0;
1320 	}
1321
1322	/*
1323	 * Return success, if no ECC failures, else -EBADMSG
1324	 * fs driver will take care of that, because
1325	 * retlen == desired len and result == -EBADMSG
1326	 */
1327	ops->retlen = read;
1328	ops->oobretlen = oobread;
1329
1330	if (ret)
1331		return ret;
1332
1333	if (mtd->ecc_stats.failed - stats.failed)
1334		return -EBADMSG;
1335
1336	return mtd->ecc_stats.corrected - stats.corrected ? -EUCLEAN : 0;
1337}
1338
1339/**
1340 * onenand_read_oob_nolock - [MTD Interface] OneNAND read out-of-band
1341 * @param mtd		MTD device structure
1342 * @param from		offset to read from
1343 * @param ops:		oob operation description structure
1344 *
1345 * OneNAND read out-of-band data from the spare area
1346 */
1347static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
1348			struct mtd_oob_ops *ops)
1349{
1350	struct onenand_chip *this = mtd->priv;
1351	struct mtd_ecc_stats stats;
1352	int read = 0, thislen, column, oobsize;
1353	size_t len = ops->ooblen;
1354	unsigned int mode = ops->mode;
1355	u_char *buf = ops->oobbuf;
1356	int ret = 0, readcmd;
1357
1358	from += ops->ooboffs;
1359
1360	pr_debug("%s: from = 0x%08x, len = %i\n", __func__, (unsigned int)from,
1361			(int)len);
1362
1363	/* Initialize return length value */
1364	ops->oobretlen = 0;
1365
1366	if (mode == MTD_OPS_AUTO_OOB)
1367		oobsize = this->ecclayout->oobavail;
1368	else
1369		oobsize = mtd->oobsize;
1370
1371	column = from & (mtd->oobsize - 1);
1372
1373	if (unlikely(column >= oobsize)) {
1374		printk(KERN_ERR "%s: Attempted to start read outside oob\n",
1375			__func__);
1376		return -EINVAL;
1377	}
1378
1379	/* Do not allow reads past end of device */
1380	if (unlikely(from >= mtd->size ||
1381		     column + len > ((mtd->size >> this->page_shift) -
1382				     (from >> this->page_shift)) * oobsize)) {
1383		printk(KERN_ERR "%s: Attempted to read beyond end of device\n",
1384			__func__);
1385		return -EINVAL;
1386	}
1387
1388	stats = mtd->ecc_stats;
1389
1390	readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1391
1392	while (read < len) {
1393		cond_resched();
1394
1395		thislen = oobsize - column;
1396		thislen = min_t(int, thislen, len);
1397
1398		this->command(mtd, readcmd, from, mtd->oobsize);
1399
1400		onenand_update_bufferram(mtd, from, 0);
1401
1402		ret = this->wait(mtd, FL_READING);
1403		if (unlikely(ret))
1404			ret = onenand_recover_lsb(mtd, from, ret);
1405
1406		if (ret && !mtd_is_eccerr(ret)) {
1407			printk(KERN_ERR "%s: read failed = 0x%x\n",
1408				__func__, ret);
1409			break;
1410		}
1411
1412		if (mode == MTD_OPS_AUTO_OOB)
1413			onenand_transfer_auto_oob(mtd, buf, column, thislen);
1414		else
1415			this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1416
1417		read += thislen;
1418
1419		if (read == len)
1420			break;
1421
1422		buf += thislen;
1423
1424		/* Read more? */
1425		if (read < len) {
1426			/* Page size */
1427			from += mtd->writesize;
1428			column = 0;
1429		}
1430	}
1431
1432	ops->oobretlen = read;
1433
1434	if (ret)
1435		return ret;
1436
1437	if (mtd->ecc_stats.failed - stats.failed)
1438		return -EBADMSG;
1439
1440	return 0;
1441}
1442
1443/**
1444 * onenand_read - [MTD Interface] Read data from flash
1445 * @param mtd		MTD device structure
1446 * @param from		offset to read from
1447 * @param len		number of bytes to read
1448 * @param retlen	pointer to variable to store the number of read bytes
1449 * @param buf		the databuffer to put data
1450 *
1451 * Read with ecc
1452*/
1453static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len,
1454	size_t *retlen, u_char *buf)
1455{
1456	struct onenand_chip *this = mtd->priv;
1457	struct mtd_oob_ops ops = {
1458		.len	= len,
1459		.ooblen	= 0,
1460		.datbuf	= buf,
1461		.oobbuf	= NULL,
1462	};
1463	int ret;
1464
1465	onenand_get_device(mtd, FL_READING);
1466	ret = ONENAND_IS_4KB_PAGE(this) ?
1467		onenand_mlc_read_ops_nolock(mtd, from, &ops) :
1468		onenand_read_ops_nolock(mtd, from, &ops);
1469	onenand_release_device(mtd);
1470
1471	*retlen = ops.retlen;
1472	return ret;
1473}
1474
1475/**
1476 * onenand_read_oob - [MTD Interface] Read main and/or out-of-band
1477 * @param mtd:		MTD device structure
1478 * @param from:		offset to read from
1479 * @param ops:		oob operation description structure
1480
1481 * Read main and/or out-of-band
1482 */
1483static int onenand_read_oob(struct mtd_info *mtd, loff_t from,
1484			    struct mtd_oob_ops *ops)
1485{
1486	struct onenand_chip *this = mtd->priv;
1487	int ret;
1488
1489	switch (ops->mode) {
1490	case MTD_OPS_PLACE_OOB:
1491	case MTD_OPS_AUTO_OOB:
1492		break;
1493	case MTD_OPS_RAW:
1494		/* Not implemented yet */
1495	default:
1496		return -EINVAL;
1497	}
1498
1499	onenand_get_device(mtd, FL_READING);
1500	if (ops->datbuf)
1501		ret = ONENAND_IS_4KB_PAGE(this) ?
1502			onenand_mlc_read_ops_nolock(mtd, from, ops) :
1503			onenand_read_ops_nolock(mtd, from, ops);
1504	else
1505		ret = onenand_read_oob_nolock(mtd, from, ops);
1506	onenand_release_device(mtd);
1507
1508	return ret;
1509}
1510
1511/**
1512 * onenand_bbt_wait - [DEFAULT] wait until the command is done
1513 * @param mtd		MTD device structure
1514 * @param state		state to select the max. timeout value
1515 *
1516 * Wait for command done.
1517 */
1518static int onenand_bbt_wait(struct mtd_info *mtd, int state)
1519{
1520	struct onenand_chip *this = mtd->priv;
1521	unsigned long timeout;
1522	unsigned int interrupt, ctrl, ecc, addr1, addr8;
1523
1524	/* The 20 msec is enough */
1525	timeout = jiffies + msecs_to_jiffies(20);
1526	while (time_before(jiffies, timeout)) {
1527		interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1528		if (interrupt & ONENAND_INT_MASTER)
1529			break;
1530	}
1531	/* To get correct interrupt status in timeout case */
1532	interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1533	ctrl = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
1534	addr1 = this->read_word(this->base + ONENAND_REG_START_ADDRESS1);
1535	addr8 = this->read_word(this->base + ONENAND_REG_START_ADDRESS8);
1536
1537	if (interrupt & ONENAND_INT_READ) {
1538		ecc = onenand_read_ecc(this);
1539		if (ecc & ONENAND_ECC_2BIT_ALL) {
1540			printk(KERN_DEBUG "%s: ecc 0x%04x ctrl 0x%04x "
1541			       "intr 0x%04x addr1 %#x addr8 %#x\n",
1542			       __func__, ecc, ctrl, interrupt, addr1, addr8);
1543			return ONENAND_BBT_READ_ECC_ERROR;
1544		}
1545	} else {
1546		printk(KERN_ERR "%s: read timeout! ctrl 0x%04x "
1547		       "intr 0x%04x addr1 %#x addr8 %#x\n",
1548		       __func__, ctrl, interrupt, addr1, addr8);
1549		return ONENAND_BBT_READ_FATAL_ERROR;
1550	}
1551
1552	/* Initial bad block case: 0x2400 or 0x0400 */
1553	if (ctrl & ONENAND_CTRL_ERROR) {
1554		printk(KERN_DEBUG "%s: ctrl 0x%04x intr 0x%04x addr1 %#x "
1555		       "addr8 %#x\n", __func__, ctrl, interrupt, addr1, addr8);
1556		return ONENAND_BBT_READ_ERROR;
1557	}
1558
1559	return 0;
1560}
1561
1562/**
1563 * onenand_bbt_read_oob - [MTD Interface] OneNAND read out-of-band for bbt scan
1564 * @param mtd		MTD device structure
1565 * @param from		offset to read from
1566 * @param ops		oob operation description structure
1567 *
1568 * OneNAND read out-of-band data from the spare area for bbt scan
1569 */
1570int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
1571			    struct mtd_oob_ops *ops)
1572{
1573	struct onenand_chip *this = mtd->priv;
1574	int read = 0, thislen, column;
1575	int ret = 0, readcmd;
1576	size_t len = ops->ooblen;
1577	u_char *buf = ops->oobbuf;
1578
1579	pr_debug("%s: from = 0x%08x, len = %zi\n", __func__, (unsigned int)from,
1580			len);
1581
1582	/* Initialize return value */
1583	ops->oobretlen = 0;
1584
1585	/* Do not allow reads past end of device */
1586	if (unlikely((from + len) > mtd->size)) {
1587		printk(KERN_ERR "%s: Attempt read beyond end of device\n",
1588			__func__);
1589		return ONENAND_BBT_READ_FATAL_ERROR;
1590	}
1591
1592	/* Grab the lock and see if the device is available */
1593	onenand_get_device(mtd, FL_READING);
1594
1595	column = from & (mtd->oobsize - 1);
1596
1597	readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1598
1599	while (read < len) {
1600		cond_resched();
1601
1602		thislen = mtd->oobsize - column;
1603		thislen = min_t(int, thislen, len);
1604
1605		this->command(mtd, readcmd, from, mtd->oobsize);
1606
1607		onenand_update_bufferram(mtd, from, 0);
1608
1609		ret = this->bbt_wait(mtd, FL_READING);
1610		if (unlikely(ret))
1611			ret = onenand_recover_lsb(mtd, from, ret);
1612
1613		if (ret)
1614			break;
1615
1616		this->read_bufferram(mtd, ONENAND_SPARERAM, buf, column, thislen);
1617		read += thislen;
1618		if (read == len)
1619			break;
1620
1621		buf += thislen;
1622
1623		/* Read more? */
1624		if (read < len) {
1625			/* Update Page size */
1626			from += this->writesize;
1627			column = 0;
1628		}
1629	}
1630
1631	/* Deselect and wake up anyone waiting on the device */
1632	onenand_release_device(mtd);
1633
1634	ops->oobretlen = read;
1635	return ret;
1636}
1637
1638#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
1639/**
1640 * onenand_verify_oob - [GENERIC] verify the oob contents after a write
1641 * @param mtd		MTD device structure
1642 * @param buf		the databuffer to verify
1643 * @param to		offset to read from
1644 */
1645static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to)
1646{
1647	struct onenand_chip *this = mtd->priv;
1648	u_char *oob_buf = this->oob_buf;
1649	int status, i, readcmd;
1650
1651	readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
1652
1653	this->command(mtd, readcmd, to, mtd->oobsize);
1654	onenand_update_bufferram(mtd, to, 0);
1655	status = this->wait(mtd, FL_READING);
1656	if (status)
1657		return status;
1658
1659	this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
1660	for (i = 0; i < mtd->oobsize; i++)
1661		if (buf[i] != 0xFF && buf[i] != oob_buf[i])
1662			return -EBADMSG;
1663
1664	return 0;
1665}
1666
1667/**
1668 * onenand_verify - [GENERIC] verify the chip contents after a write
1669 * @param mtd          MTD device structure
1670 * @param buf          the databuffer to verify
1671 * @param addr         offset to read from
1672 * @param len          number of bytes to read and compare
1673 */
1674static int onenand_verify(struct mtd_info *mtd, const u_char *buf, loff_t addr, size_t len)
1675{
1676	struct onenand_chip *this = mtd->priv;
1677	int ret = 0;
1678	int thislen, column;
1679
1680	column = addr & (this->writesize - 1);
1681
1682	while (len != 0) {
1683		thislen = min_t(int, this->writesize - column, len);
1684
1685		this->command(mtd, ONENAND_CMD_READ, addr, this->writesize);
1686
1687		onenand_update_bufferram(mtd, addr, 0);
1688
1689		ret = this->wait(mtd, FL_READING);
1690		if (ret)
1691			return ret;
1692
1693		onenand_update_bufferram(mtd, addr, 1);
1694
1695		this->read_bufferram(mtd, ONENAND_DATARAM, this->verify_buf, 0, mtd->writesize);
1696
1697		if (memcmp(buf, this->verify_buf + column, thislen))
1698			return -EBADMSG;
1699
1700		len -= thislen;
1701		buf += thislen;
1702		addr += thislen;
1703		column = 0;
1704	}
1705
1706	return 0;
1707}
1708#else
1709#define onenand_verify(...)		(0)
1710#define onenand_verify_oob(...)		(0)
1711#endif
1712
1713#define NOTALIGNED(x)	((x & (this->subpagesize - 1)) != 0)
1714
1715static void onenand_panic_wait(struct mtd_info *mtd)
1716{
1717	struct onenand_chip *this = mtd->priv;
1718	unsigned int interrupt;
1719	int i;
1720
1721	for (i = 0; i < 2000; i++) {
1722		interrupt = this->read_word(this->base + ONENAND_REG_INTERRUPT);
1723		if (interrupt & ONENAND_INT_MASTER)
1724			break;
1725		udelay(10);
1726	}
1727}
1728
1729/**
1730 * onenand_panic_write - [MTD Interface] write buffer to FLASH in a panic context
1731 * @param mtd		MTD device structure
1732 * @param to		offset to write to
1733 * @param len		number of bytes to write
1734 * @param retlen	pointer to variable to store the number of written bytes
1735 * @param buf		the data to write
1736 *
1737 * Write with ECC
1738 */
1739static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,
1740			 size_t *retlen, const u_char *buf)
1741{
1742	struct onenand_chip *this = mtd->priv;
1743	int column, subpage;
1744	int written = 0;
1745	int ret = 0;
1746
1747	if (this->state == FL_PM_SUSPENDED)
1748		return -EBUSY;
1749
1750	/* Wait for any existing operation to clear */
1751	onenand_panic_wait(mtd);
1752
1753	pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1754			(int)len);
1755
1756	/* Reject writes, which are not page aligned */
1757        if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1758		printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1759			__func__);
1760                return -EINVAL;
1761        }
1762
1763	column = to & (mtd->writesize - 1);
1764
1765	/* Loop until all data write */
1766	while (written < len) {
1767		int thislen = min_t(int, mtd->writesize - column, len - written);
1768		u_char *wbuf = (u_char *) buf;
1769
1770		this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1771
1772		/* Partial page write */
1773		subpage = thislen < mtd->writesize;
1774		if (subpage) {
1775			memset(this->page_buf, 0xff, mtd->writesize);
1776			memcpy(this->page_buf + column, buf, thislen);
1777			wbuf = this->page_buf;
1778		}
1779
1780		this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1781		this->write_bufferram(mtd, ONENAND_SPARERAM, ffchars, 0, mtd->oobsize);
1782
1783		this->command(mtd, ONENAND_CMD_PROG, to, mtd->writesize);
1784
1785		onenand_panic_wait(mtd);
1786
1787		/* In partial page write we don't update bufferram */
1788		onenand_update_bufferram(mtd, to, !ret && !subpage);
1789		if (ONENAND_IS_2PLANE(this)) {
1790			ONENAND_SET_BUFFERRAM1(this);
1791			onenand_update_bufferram(mtd, to + this->writesize, !ret && !subpage);
1792		}
1793
1794		if (ret) {
1795			printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
1796			break;
1797		}
1798
1799		written += thislen;
1800
1801		if (written == len)
1802			break;
1803
1804		column = 0;
1805		to += thislen;
1806		buf += thislen;
1807	}
1808
1809	*retlen = written;
1810	return ret;
1811}
1812
1813/**
1814 * onenand_fill_auto_oob - [INTERN] oob auto-placement transfer
1815 * @param mtd		MTD device structure
1816 * @param oob_buf	oob buffer
1817 * @param buf		source address
1818 * @param column	oob offset to write to
1819 * @param thislen	oob length to write
1820 */
1821static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
1822				  const u_char *buf, int column, int thislen)
1823{
1824	struct onenand_chip *this = mtd->priv;
1825	struct nand_oobfree *free;
1826	int writecol = column;
1827	int writeend = column + thislen;
1828	int lastgap = 0;
1829	unsigned int i;
1830
1831	free = this->ecclayout->oobfree;
1832	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1833		if (writecol >= lastgap)
1834			writecol += free->offset - lastgap;
1835		if (writeend >= lastgap)
1836			writeend += free->offset - lastgap;
1837		lastgap = free->offset + free->length;
1838	}
1839	free = this->ecclayout->oobfree;
1840	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
1841		int free_end = free->offset + free->length;
1842		if (free->offset < writeend && free_end > writecol) {
1843			int st = max_t(int,free->offset,writecol);
1844			int ed = min_t(int,free_end,writeend);
1845			int n = ed - st;
1846			memcpy(oob_buf + st, buf, n);
1847			buf += n;
1848		} else if (column == 0)
1849			break;
1850	}
1851	return 0;
1852}
1853
1854/**
1855 * onenand_write_ops_nolock - [OneNAND Interface] write main and/or out-of-band
1856 * @param mtd		MTD device structure
1857 * @param to		offset to write to
1858 * @param ops		oob operation description structure
1859 *
1860 * Write main and/or oob with ECC
1861 */
1862static int onenand_write_ops_nolock(struct mtd_info *mtd, loff_t to,
1863				struct mtd_oob_ops *ops)
1864{
1865	struct onenand_chip *this = mtd->priv;
1866	int written = 0, column, thislen = 0, subpage = 0;
1867	int prev = 0, prevlen = 0, prev_subpage = 0, first = 1;
1868	int oobwritten = 0, oobcolumn, thisooblen, oobsize;
1869	size_t len = ops->len;
1870	size_t ooblen = ops->ooblen;
1871	const u_char *buf = ops->datbuf;
1872	const u_char *oob = ops->oobbuf;
1873	u_char *oobbuf;
1874	int ret = 0, cmd;
1875
1876	pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
1877			(int)len);
1878
1879	/* Initialize retlen, in case of early exit */
1880	ops->retlen = 0;
1881	ops->oobretlen = 0;
1882
1883	/* Reject writes, which are not page aligned */
1884        if (unlikely(NOTALIGNED(to) || NOTALIGNED(len))) {
1885		printk(KERN_ERR "%s: Attempt to write not page aligned data\n",
1886			__func__);
1887                return -EINVAL;
1888        }
1889
1890	/* Check zero length */
1891	if (!len)
1892		return 0;
1893
1894	if (ops->mode == MTD_OPS_AUTO_OOB)
1895		oobsize = this->ecclayout->oobavail;
1896	else
1897		oobsize = mtd->oobsize;
1898
1899	oobcolumn = to & (mtd->oobsize - 1);
1900
1901	column = to & (mtd->writesize - 1);
1902
1903	/* Loop until all data write */
1904	while (1) {
1905		if (written < len) {
1906			u_char *wbuf = (u_char *) buf;
1907
1908			thislen = min_t(int, mtd->writesize - column, len - written);
1909			thisooblen = min_t(int, oobsize - oobcolumn, ooblen - oobwritten);
1910
1911			cond_resched();
1912
1913			this->command(mtd, ONENAND_CMD_BUFFERRAM, to, thislen);
1914
1915			/* Partial page write */
1916			subpage = thislen < mtd->writesize;
1917			if (subpage) {
1918				memset(this->page_buf, 0xff, mtd->writesize);
1919				memcpy(this->page_buf + column, buf, thislen);
1920				wbuf = this->page_buf;
1921			}
1922
1923			this->write_bufferram(mtd, ONENAND_DATARAM, wbuf, 0, mtd->writesize);
1924
1925			if (oob) {
1926				oobbuf = this->oob_buf;
1927
1928				/* We send data to spare ram with oobsize
1929				 * to prevent byte access */
1930				memset(oobbuf, 0xff, mtd->oobsize);
1931				if (ops->mode == MTD_OPS_AUTO_OOB)
1932					onenand_fill_auto_oob(mtd, oobbuf, oob, oobcolumn, thisooblen);
1933				else
1934					memcpy(oobbuf + oobcolumn, oob, thisooblen);
1935
1936				oobwritten += thisooblen;
1937				oob += thisooblen;
1938				oobcolumn = 0;
1939			} else
1940				oobbuf = (u_char *) ffchars;
1941
1942			this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
1943		} else
1944			ONENAND_SET_NEXT_BUFFERRAM(this);
1945
1946		/*
1947		 * 2 PLANE, MLC, and Flex-OneNAND do not support
1948		 * write-while-program feature.
1949		 */
1950		if (!ONENAND_IS_2PLANE(this) && !ONENAND_IS_4KB_PAGE(this) && !first) {
1951			ONENAND_SET_PREV_BUFFERRAM(this);
1952
1953			ret = this->wait(mtd, FL_WRITING);
1954
1955			/* In partial page write we don't update bufferram */
1956			onenand_update_bufferram(mtd, prev, !ret && !prev_subpage);
1957			if (ret) {
1958				written -= prevlen;
1959				printk(KERN_ERR "%s: write failed %d\n",
1960					__func__, ret);
1961				break;
1962			}
1963
1964			if (written == len) {
1965				/* Only check verify write turn on */
1966				ret = onenand_verify(mtd, buf - len, to - len, len);
1967				if (ret)
1968					printk(KERN_ERR "%s: verify failed %d\n",
1969						__func__, ret);
1970				break;
1971			}
1972
1973			ONENAND_SET_NEXT_BUFFERRAM(this);
1974		}
1975
1976		this->ongoing = 0;
1977		cmd = ONENAND_CMD_PROG;
1978
1979		/* Exclude 1st OTP and OTP blocks for cache program feature */
1980		if (ONENAND_IS_CACHE_PROGRAM(this) &&
1981		    likely(onenand_block(this, to) != 0) &&
1982		    ONENAND_IS_4KB_PAGE(this) &&
1983		    ((written + thislen) < len)) {
1984			cmd = ONENAND_CMD_2X_CACHE_PROG;
1985			this->ongoing = 1;
1986		}
1987
1988		this->command(mtd, cmd, to, mtd->writesize);
1989
1990		/*
1991		 * 2 PLANE, MLC, and Flex-OneNAND wait here
1992		 */
1993		if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this)) {
1994			ret = this->wait(mtd, FL_WRITING);
1995
1996			/* In partial page write we don't update bufferram */
1997			onenand_update_bufferram(mtd, to, !ret && !subpage);
1998			if (ret) {
1999				printk(KERN_ERR "%s: write failed %d\n",
2000					__func__, ret);
2001				break;
2002			}
2003
2004			/* Only check verify write turn on */
2005			ret = onenand_verify(mtd, buf, to, thislen);
2006			if (ret) {
2007				printk(KERN_ERR "%s: verify failed %d\n",
2008					__func__, ret);
2009				break;
2010			}
2011
2012			written += thislen;
2013
2014			if (written == len)
2015				break;
2016
2017		} else
2018			written += thislen;
2019
2020		column = 0;
2021		prev_subpage = subpage;
2022		prev = to;
2023		prevlen = thislen;
2024		to += thislen;
2025		buf += thislen;
2026		first = 0;
2027	}
2028
2029	/* In error case, clear all bufferrams */
2030	if (written != len)
2031		onenand_invalidate_bufferram(mtd, 0, -1);
2032
2033	ops->retlen = written;
2034	ops->oobretlen = oobwritten;
2035
2036	return ret;
2037}
2038
2039
2040/**
2041 * onenand_write_oob_nolock - [INTERN] OneNAND write out-of-band
2042 * @param mtd		MTD device structure
2043 * @param to		offset to write to
2044 * @param len		number of bytes to write
2045 * @param retlen	pointer to variable to store the number of written bytes
2046 * @param buf		the data to write
2047 * @param mode		operation mode
2048 *
2049 * OneNAND write out-of-band
2050 */
2051static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2052				    struct mtd_oob_ops *ops)
2053{
2054	struct onenand_chip *this = mtd->priv;
2055	int column, ret = 0, oobsize;
2056	int written = 0, oobcmd;
2057	u_char *oobbuf;
2058	size_t len = ops->ooblen;
2059	const u_char *buf = ops->oobbuf;
2060	unsigned int mode = ops->mode;
2061
2062	to += ops->ooboffs;
2063
2064	pr_debug("%s: to = 0x%08x, len = %i\n", __func__, (unsigned int)to,
2065			(int)len);
2066
2067	/* Initialize retlen, in case of early exit */
2068	ops->oobretlen = 0;
2069
2070	if (mode == MTD_OPS_AUTO_OOB)
2071		oobsize = this->ecclayout->oobavail;
2072	else
2073		oobsize = mtd->oobsize;
2074
2075	column = to & (mtd->oobsize - 1);
2076
2077	if (unlikely(column >= oobsize)) {
2078		printk(KERN_ERR "%s: Attempted to start write outside oob\n",
2079			__func__);
2080		return -EINVAL;
2081	}
2082
2083	/* For compatibility with NAND: Do not allow write past end of page */
2084	if (unlikely(column + len > oobsize)) {
2085		printk(KERN_ERR "%s: Attempt to write past end of page\n",
2086			__func__);
2087		return -EINVAL;
2088	}
2089
2090	/* Do not allow reads past end of device */
2091	if (unlikely(to >= mtd->size ||
2092		     column + len > ((mtd->size >> this->page_shift) -
2093				     (to >> this->page_shift)) * oobsize)) {
2094		printk(KERN_ERR "%s: Attempted to write past end of device\n",
2095		       __func__);
2096		return -EINVAL;
2097	}
2098
2099	oobbuf = this->oob_buf;
2100
2101	oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB;
2102
2103	/* Loop until all data write */
2104	while (written < len) {
2105		int thislen = min_t(int, oobsize, len - written);
2106
2107		cond_resched();
2108
2109		this->command(mtd, ONENAND_CMD_BUFFERRAM, to, mtd->oobsize);
2110
2111		/* We send data to spare ram with oobsize
2112		 * to prevent byte access */
2113		memset(oobbuf, 0xff, mtd->oobsize);
2114		if (mode == MTD_OPS_AUTO_OOB)
2115			onenand_fill_auto_oob(mtd, oobbuf, buf, column, thislen);
2116		else
2117			memcpy(oobbuf + column, buf, thislen);
2118		this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
2119
2120		if (ONENAND_IS_4KB_PAGE(this)) {
2121			/* Set main area of DataRAM to 0xff*/
2122			memset(this->page_buf, 0xff, mtd->writesize);
2123			this->write_bufferram(mtd, ONENAND_DATARAM,
2124					 this->page_buf, 0, mtd->writesize);
2125		}
2126
2127		this->command(mtd, oobcmd, to, mtd->oobsize);
2128
2129		onenand_update_bufferram(mtd, to, 0);
2130		if (ONENAND_IS_2PLANE(this)) {
2131			ONENAND_SET_BUFFERRAM1(this);
2132			onenand_update_bufferram(mtd, to + this->writesize, 0);
2133		}
2134
2135		ret = this->wait(mtd, FL_WRITING);
2136		if (ret) {
2137			printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2138			break;
2139		}
2140
2141		ret = onenand_verify_oob(mtd, oobbuf, to);
2142		if (ret) {
2143			printk(KERN_ERR "%s: verify failed %d\n",
2144				__func__, ret);
2145			break;
2146		}
2147
2148		written += thislen;
2149		if (written == len)
2150			break;
2151
2152		to += mtd->writesize;
2153		buf += thislen;
2154		column = 0;
2155	}
2156
2157	ops->oobretlen = written;
2158
2159	return ret;
2160}
2161
2162/**
2163 * onenand_write - [MTD Interface] write buffer to FLASH
2164 * @param mtd		MTD device structure
2165 * @param to		offset to write to
2166 * @param len		number of bytes to write
2167 * @param retlen	pointer to variable to store the number of written bytes
2168 * @param buf		the data to write
2169 *
2170 * Write with ECC
2171 */
2172static int onenand_write(struct mtd_info *mtd, loff_t to, size_t len,
2173	size_t *retlen, const u_char *buf)
2174{
2175	struct mtd_oob_ops ops = {
2176		.len	= len,
2177		.ooblen	= 0,
2178		.datbuf	= (u_char *) buf,
2179		.oobbuf	= NULL,
2180	};
2181	int ret;
2182
2183	onenand_get_device(mtd, FL_WRITING);
2184	ret = onenand_write_ops_nolock(mtd, to, &ops);
2185	onenand_release_device(mtd);
2186
2187	*retlen = ops.retlen;
2188	return ret;
2189}
2190
2191/**
2192 * onenand_write_oob - [MTD Interface] NAND write data and/or out-of-band
2193 * @param mtd:		MTD device structure
2194 * @param to:		offset to write
2195 * @param ops:		oob operation description structure
2196 */
2197static int onenand_write_oob(struct mtd_info *mtd, loff_t to,
2198			     struct mtd_oob_ops *ops)
2199{
2200	int ret;
2201
2202	switch (ops->mode) {
2203	case MTD_OPS_PLACE_OOB:
2204	case MTD_OPS_AUTO_OOB:
2205		break;
2206	case MTD_OPS_RAW:
2207		/* Not implemented yet */
2208	default:
2209		return -EINVAL;
2210	}
2211
2212	onenand_get_device(mtd, FL_WRITING);
2213	if (ops->datbuf)
2214		ret = onenand_write_ops_nolock(mtd, to, ops);
2215	else
2216		ret = onenand_write_oob_nolock(mtd, to, ops);
2217	onenand_release_device(mtd);
2218
2219	return ret;
2220}
2221
2222/**
2223 * onenand_block_isbad_nolock - [GENERIC] Check if a block is marked bad
2224 * @param mtd		MTD device structure
2225 * @param ofs		offset from device start
2226 * @param allowbbt	1, if its allowed to access the bbt area
2227 *
2228 * Check, if the block is bad. Either by reading the bad block table or
2229 * calling of the scan function.
2230 */
2231static int onenand_block_isbad_nolock(struct mtd_info *mtd, loff_t ofs, int allowbbt)
2232{
2233	struct onenand_chip *this = mtd->priv;
2234	struct bbm_info *bbm = this->bbm;
2235
2236	/* Return info from the table */
2237	return bbm->isbad_bbt(mtd, ofs, allowbbt);
2238}
2239
2240
2241static int onenand_multiblock_erase_verify(struct mtd_info *mtd,
2242					   struct erase_info *instr)
2243{
2244	struct onenand_chip *this = mtd->priv;
2245	loff_t addr = instr->addr;
2246	int len = instr->len;
2247	unsigned int block_size = (1 << this->erase_shift);
2248	int ret = 0;
2249
2250	while (len) {
2251		this->command(mtd, ONENAND_CMD_ERASE_VERIFY, addr, block_size);
2252		ret = this->wait(mtd, FL_VERIFYING_ERASE);
2253		if (ret) {
2254			printk(KERN_ERR "%s: Failed verify, block %d\n",
2255			       __func__, onenand_block(this, addr));
2256			instr->state = MTD_ERASE_FAILED;
2257			instr->fail_addr = addr;
2258			return -1;
2259		}
2260		len -= block_size;
2261		addr += block_size;
2262	}
2263	return 0;
2264}
2265
2266/**
2267 * onenand_multiblock_erase - [INTERN] erase block(s) using multiblock erase
2268 * @param mtd		MTD device structure
2269 * @param instr		erase instruction
2270 * @param region	erase region
2271 *
2272 * Erase one or more blocks up to 64 block at a time
2273 */
2274static int onenand_multiblock_erase(struct mtd_info *mtd,
2275				    struct erase_info *instr,
2276				    unsigned int block_size)
2277{
2278	struct onenand_chip *this = mtd->priv;
2279	loff_t addr = instr->addr;
2280	int len = instr->len;
2281	int eb_count = 0;
2282	int ret = 0;
2283	int bdry_block = 0;
2284
2285	instr->state = MTD_ERASING;
2286
2287	if (ONENAND_IS_DDP(this)) {
2288		loff_t bdry_addr = this->chipsize >> 1;
2289		if (addr < bdry_addr && (addr + len) > bdry_addr)
2290			bdry_block = bdry_addr >> this->erase_shift;
2291	}
2292
2293	/* Pre-check bbs */
2294	while (len) {
2295		/* Check if we have a bad block, we do not erase bad blocks */
2296		if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2297			printk(KERN_WARNING "%s: attempt to erase a bad block "
2298			       "at addr 0x%012llx\n",
2299			       __func__, (unsigned long long) addr);
2300			instr->state = MTD_ERASE_FAILED;
2301			return -EIO;
2302		}
2303		len -= block_size;
2304		addr += block_size;
2305	}
2306
2307	len = instr->len;
2308	addr = instr->addr;
2309
2310	/* loop over 64 eb batches */
2311	while (len) {
2312		struct erase_info verify_instr = *instr;
2313		int max_eb_count = MB_ERASE_MAX_BLK_COUNT;
2314
2315		verify_instr.addr = addr;
2316		verify_instr.len = 0;
2317
2318		/* do not cross chip boundary */
2319		if (bdry_block) {
2320			int this_block = (addr >> this->erase_shift);
2321
2322			if (this_block < bdry_block) {
2323				max_eb_count = min(max_eb_count,
2324						   (bdry_block - this_block));
2325			}
2326		}
2327
2328		eb_count = 0;
2329
2330		while (len > block_size && eb_count < (max_eb_count - 1)) {
2331			this->command(mtd, ONENAND_CMD_MULTIBLOCK_ERASE,
2332				      addr, block_size);
2333			onenand_invalidate_bufferram(mtd, addr, block_size);
2334
2335			ret = this->wait(mtd, FL_PREPARING_ERASE);
2336			if (ret) {
2337				printk(KERN_ERR "%s: Failed multiblock erase, "
2338				       "block %d\n", __func__,
2339				       onenand_block(this, addr));
2340				instr->state = MTD_ERASE_FAILED;
2341				instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2342				return -EIO;
2343			}
2344
2345			len -= block_size;
2346			addr += block_size;
2347			eb_count++;
2348		}
2349
2350		/* last block of 64-eb series */
2351		cond_resched();
2352		this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2353		onenand_invalidate_bufferram(mtd, addr, block_size);
2354
2355		ret = this->wait(mtd, FL_ERASING);
2356		/* Check if it is write protected */
2357		if (ret) {
2358			printk(KERN_ERR "%s: Failed erase, block %d\n",
2359			       __func__, onenand_block(this, addr));
2360			instr->state = MTD_ERASE_FAILED;
2361			instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2362			return -EIO;
2363		}
2364
2365		len -= block_size;
2366		addr += block_size;
2367		eb_count++;
2368
2369		/* verify */
2370		verify_instr.len = eb_count * block_size;
2371		if (onenand_multiblock_erase_verify(mtd, &verify_instr)) {
2372			instr->state = verify_instr.state;
2373			instr->fail_addr = verify_instr.fail_addr;
2374			return -EIO;
2375		}
2376
2377	}
2378	return 0;
2379}
2380
2381
2382/**
2383 * onenand_block_by_block_erase - [INTERN] erase block(s) using regular erase
2384 * @param mtd		MTD device structure
2385 * @param instr		erase instruction
2386 * @param region	erase region
2387 * @param block_size	erase block size
2388 *
2389 * Erase one or more blocks one block at a time
2390 */
2391static int onenand_block_by_block_erase(struct mtd_info *mtd,
2392					struct erase_info *instr,
2393					struct mtd_erase_region_info *region,
2394					unsigned int block_size)
2395{
2396	struct onenand_chip *this = mtd->priv;
2397	loff_t addr = instr->addr;
2398	int len = instr->len;
2399	loff_t region_end = 0;
2400	int ret = 0;
2401
2402	if (region) {
2403		/* region is set for Flex-OneNAND */
2404		region_end = region->offset + region->erasesize * region->numblocks;
2405	}
2406
2407	instr->state = MTD_ERASING;
2408
2409	/* Loop through the blocks */
2410	while (len) {
2411		cond_resched();
2412
2413		/* Check if we have a bad block, we do not erase bad blocks */
2414		if (onenand_block_isbad_nolock(mtd, addr, 0)) {
2415			printk(KERN_WARNING "%s: attempt to erase a bad block "
2416					"at addr 0x%012llx\n",
2417					__func__, (unsigned long long) addr);
2418			instr->state = MTD_ERASE_FAILED;
2419			return -EIO;
2420		}
2421
2422		this->command(mtd, ONENAND_CMD_ERASE, addr, block_size);
2423
2424		onenand_invalidate_bufferram(mtd, addr, block_size);
2425
2426		ret = this->wait(mtd, FL_ERASING);
2427		/* Check, if it is write protected */
2428		if (ret) {
2429			printk(KERN_ERR "%s: Failed erase, block %d\n",
2430				__func__, onenand_block(this, addr));
2431			instr->state = MTD_ERASE_FAILED;
2432			instr->fail_addr = addr;
2433			return -EIO;
2434		}
2435
2436		len -= block_size;
2437		addr += block_size;
2438
2439		if (region && addr == region_end) {
2440			if (!len)
2441				break;
2442			region++;
2443
2444			block_size = region->erasesize;
2445			region_end = region->offset + region->erasesize * region->numblocks;
2446
2447			if (len & (block_size - 1)) {
2448				/* FIXME: This should be handled at MTD partitioning level. */
2449				printk(KERN_ERR "%s: Unaligned address\n",
2450					__func__);
2451				return -EIO;
2452			}
2453		}
2454	}
2455	return 0;
2456}
2457
2458/**
2459 * onenand_erase - [MTD Interface] erase block(s)
2460 * @param mtd		MTD device structure
2461 * @param instr		erase instruction
2462 *
2463 * Erase one or more blocks
2464 */
2465static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
2466{
2467	struct onenand_chip *this = mtd->priv;
2468	unsigned int block_size;
2469	loff_t addr = instr->addr;
2470	loff_t len = instr->len;
2471	int ret = 0;
2472	struct mtd_erase_region_info *region = NULL;
2473	loff_t region_offset = 0;
2474
2475	pr_debug("%s: start=0x%012llx, len=%llu\n", __func__,
2476			(unsigned long long)instr->addr,
2477			(unsigned long long)instr->len);
2478
2479	if (FLEXONENAND(this)) {
2480		/* Find the eraseregion of this address */
2481		int i = flexonenand_region(mtd, addr);
2482
2483		region = &mtd->eraseregions[i];
2484		block_size = region->erasesize;
2485
2486		/* Start address within region must align on block boundary.
2487		 * Erase region's start offset is always block start address.
2488		 */
2489		region_offset = region->offset;
2490	} else
2491		block_size = 1 << this->erase_shift;
2492
2493	/* Start address must align on block boundary */
2494	if (unlikely((addr - region_offset) & (block_size - 1))) {
2495		printk(KERN_ERR "%s: Unaligned address\n", __func__);
2496		return -EINVAL;
2497	}
2498
2499	/* Length must align on block boundary */
2500	if (unlikely(len & (block_size - 1))) {
2501		printk(KERN_ERR "%s: Length not block aligned\n", __func__);
2502		return -EINVAL;
2503	}
2504
2505	/* Grab the lock and see if the device is available */
2506	onenand_get_device(mtd, FL_ERASING);
2507
2508	if (ONENAND_IS_4KB_PAGE(this) || region ||
2509	    instr->len < MB_ERASE_MIN_BLK_COUNT * block_size) {
2510		/* region is set for Flex-OneNAND (no mb erase) */
2511		ret = onenand_block_by_block_erase(mtd, instr,
2512						   region, block_size);
2513	} else {
2514		ret = onenand_multiblock_erase(mtd, instr, block_size);
2515	}
2516
2517	/* Deselect and wake up anyone waiting on the device */
2518	onenand_release_device(mtd);
2519
2520	/* Do call back function */
2521	if (!ret) {
2522		instr->state = MTD_ERASE_DONE;
2523		mtd_erase_callback(instr);
2524	}
2525
2526	return ret;
2527}
2528
2529/**
2530 * onenand_sync - [MTD Interface] sync
2531 * @param mtd		MTD device structure
2532 *
2533 * Sync is actually a wait for chip ready function
2534 */
2535static void onenand_sync(struct mtd_info *mtd)
2536{
2537	pr_debug("%s: called\n", __func__);
2538
2539	/* Grab the lock and see if the device is available */
2540	onenand_get_device(mtd, FL_SYNCING);
2541
2542	/* Release it and go back */
2543	onenand_release_device(mtd);
2544}
2545
2546/**
2547 * onenand_block_isbad - [MTD Interface] Check whether the block at the given offset is bad
2548 * @param mtd		MTD device structure
2549 * @param ofs		offset relative to mtd start
2550 *
2551 * Check whether the block is bad
2552 */
2553static int onenand_block_isbad(struct mtd_info *mtd, loff_t ofs)
2554{
2555	int ret;
2556
2557	/* Check for invalid offset */
2558	if (ofs > mtd->size)
2559		return -EINVAL;
2560
2561	onenand_get_device(mtd, FL_READING);
2562	ret = onenand_block_isbad_nolock(mtd, ofs, 0);
2563	onenand_release_device(mtd);
2564	return ret;
2565}
2566
2567/**
2568 * onenand_default_block_markbad - [DEFAULT] mark a block bad
2569 * @param mtd		MTD device structure
2570 * @param ofs		offset from device start
2571 *
2572 * This is the default implementation, which can be overridden by
2573 * a hardware specific driver.
2574 */
2575static int onenand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
2576{
2577	struct onenand_chip *this = mtd->priv;
2578	struct bbm_info *bbm = this->bbm;
2579	u_char buf[2] = {0, 0};
2580	struct mtd_oob_ops ops = {
2581		.mode = MTD_OPS_PLACE_OOB,
2582		.ooblen = 2,
2583		.oobbuf = buf,
2584		.ooboffs = 0,
2585	};
2586	int block;
2587
2588	/* Get block number */
2589	block = onenand_block(this, ofs);
2590        if (bbm->bbt)
2591                bbm->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
2592
2593        /* We write two bytes, so we don't have to mess with 16-bit access */
2594        ofs += mtd->oobsize + (bbm->badblockpos & ~0x01);
2595	/* FIXME : What to do when marking SLC block in partition
2596	 * 	   with MLC erasesize? For now, it is not advisable to
2597	 *	   create partitions containing both SLC and MLC regions.
2598	 */
2599	return onenand_write_oob_nolock(mtd, ofs, &ops);
2600}
2601
2602/**
2603 * onenand_block_markbad - [MTD Interface] Mark the block at the given offset as bad
2604 * @param mtd		MTD device structure
2605 * @param ofs		offset relative to mtd start
2606 *
2607 * Mark the block as bad
2608 */
2609static int onenand_block_markbad(struct mtd_info *mtd, loff_t ofs)
2610{
2611	int ret;
2612
2613	ret = onenand_block_isbad(mtd, ofs);
2614	if (ret) {
2615		/* If it was bad already, return success and do nothing */
2616		if (ret > 0)
2617			return 0;
2618		return ret;
2619	}
2620
2621	onenand_get_device(mtd, FL_WRITING);
2622	ret = mtd_block_markbad(mtd, ofs);
2623	onenand_release_device(mtd);
2624	return ret;
2625}
2626
2627/**
2628 * onenand_do_lock_cmd - [OneNAND Interface] Lock or unlock block(s)
2629 * @param mtd		MTD device structure
2630 * @param ofs		offset relative to mtd start
2631 * @param len		number of bytes to lock or unlock
2632 * @param cmd		lock or unlock command
2633 *
2634 * Lock or unlock one or more blocks
2635 */
2636static int onenand_do_lock_cmd(struct mtd_info *mtd, loff_t ofs, size_t len, int cmd)
2637{
2638	struct onenand_chip *this = mtd->priv;
2639	int start, end, block, value, status;
2640	int wp_status_mask;
2641
2642	start = onenand_block(this, ofs);
2643	end = onenand_block(this, ofs + len) - 1;
2644
2645	if (cmd == ONENAND_CMD_LOCK)
2646		wp_status_mask = ONENAND_WP_LS;
2647	else
2648		wp_status_mask = ONENAND_WP_US;
2649
2650	/* Continuous lock scheme */
2651	if (this->options & ONENAND_HAS_CONT_LOCK) {
2652		/* Set start block address */
2653		this->write_word(start, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2654		/* Set end block address */
2655		this->write_word(end, this->base +  ONENAND_REG_END_BLOCK_ADDRESS);
2656		/* Write lock command */
2657		this->command(mtd, cmd, 0, 0);
2658
2659		/* There's no return value */
2660		this->wait(mtd, FL_LOCKING);
2661
2662		/* Sanity check */
2663		while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2664		    & ONENAND_CTRL_ONGO)
2665			continue;
2666
2667		/* Check lock status */
2668		status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2669		if (!(status & wp_status_mask))
2670			printk(KERN_ERR "%s: wp status = 0x%x\n",
2671				__func__, status);
2672
2673		return 0;
2674	}
2675
2676	/* Block lock scheme */
2677	for (block = start; block < end + 1; block++) {
2678		/* Set block address */
2679		value = onenand_block_address(this, block);
2680		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2681		/* Select DataRAM for DDP */
2682		value = onenand_bufferram_address(this, block);
2683		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2684		/* Set start block address */
2685		this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2686		/* Write lock command */
2687		this->command(mtd, cmd, 0, 0);
2688
2689		/* There's no return value */
2690		this->wait(mtd, FL_LOCKING);
2691
2692		/* Sanity check */
2693		while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2694		    & ONENAND_CTRL_ONGO)
2695			continue;
2696
2697		/* Check lock status */
2698		status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2699		if (!(status & wp_status_mask))
2700			printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2701				__func__, block, status);
2702	}
2703
2704	return 0;
2705}
2706
2707/**
2708 * onenand_lock - [MTD Interface] Lock block(s)
2709 * @param mtd		MTD device structure
2710 * @param ofs		offset relative to mtd start
2711 * @param len		number of bytes to unlock
2712 *
2713 * Lock one or more blocks
2714 */
2715static int onenand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2716{
2717	int ret;
2718
2719	onenand_get_device(mtd, FL_LOCKING);
2720	ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_LOCK);
2721	onenand_release_device(mtd);
2722	return ret;
2723}
2724
2725/**
2726 * onenand_unlock - [MTD Interface] Unlock block(s)
2727 * @param mtd		MTD device structure
2728 * @param ofs		offset relative to mtd start
2729 * @param len		number of bytes to unlock
2730 *
2731 * Unlock one or more blocks
2732 */
2733static int onenand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
2734{
2735	int ret;
2736
2737	onenand_get_device(mtd, FL_LOCKING);
2738	ret = onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2739	onenand_release_device(mtd);
2740	return ret;
2741}
2742
2743/**
2744 * onenand_check_lock_status - [OneNAND Interface] Check lock status
2745 * @param this		onenand chip data structure
2746 *
2747 * Check lock status
2748 */
2749static int onenand_check_lock_status(struct onenand_chip *this)
2750{
2751	unsigned int value, block, status;
2752	unsigned int end;
2753
2754	end = this->chipsize >> this->erase_shift;
2755	for (block = 0; block < end; block++) {
2756		/* Set block address */
2757		value = onenand_block_address(this, block);
2758		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS1);
2759		/* Select DataRAM for DDP */
2760		value = onenand_bufferram_address(this, block);
2761		this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
2762		/* Set start block address */
2763		this->write_word(block, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2764
2765		/* Check lock status */
2766		status = this->read_word(this->base + ONENAND_REG_WP_STATUS);
2767		if (!(status & ONENAND_WP_US)) {
2768			printk(KERN_ERR "%s: block = %d, wp status = 0x%x\n",
2769				__func__, block, status);
2770			return 0;
2771		}
2772	}
2773
2774	return 1;
2775}
2776
2777/**
2778 * onenand_unlock_all - [OneNAND Interface] unlock all blocks
2779 * @param mtd		MTD device structure
2780 *
2781 * Unlock all blocks
2782 */
2783static void onenand_unlock_all(struct mtd_info *mtd)
2784{
2785	struct onenand_chip *this = mtd->priv;
2786	loff_t ofs = 0;
2787	loff_t len = mtd->size;
2788
2789	if (this->options & ONENAND_HAS_UNLOCK_ALL) {
2790		/* Set start block address */
2791		this->write_word(0, this->base + ONENAND_REG_START_BLOCK_ADDRESS);
2792		/* Write unlock command */
2793		this->command(mtd, ONENAND_CMD_UNLOCK_ALL, 0, 0);
2794
2795		/* There's no return value */
2796		this->wait(mtd, FL_LOCKING);
2797
2798		/* Sanity check */
2799		while (this->read_word(this->base + ONENAND_REG_CTRL_STATUS)
2800		    & ONENAND_CTRL_ONGO)
2801			continue;
2802
2803		/* Don't check lock status */
2804		if (this->options & ONENAND_SKIP_UNLOCK_CHECK)
2805			return;
2806
2807		/* Check lock status */
2808		if (onenand_check_lock_status(this))
2809			return;
2810
2811		/* Workaround for all block unlock in DDP */
2812		if (ONENAND_IS_DDP(this) && !FLEXONENAND(this)) {
2813			/* All blocks on another chip */
2814			ofs = this->chipsize >> 1;
2815			len = this->chipsize >> 1;
2816		}
2817	}
2818
2819	onenand_do_lock_cmd(mtd, ofs, len, ONENAND_CMD_UNLOCK);
2820}
2821
2822#ifdef CONFIG_MTD_ONENAND_OTP
2823
2824/**
2825 * onenand_otp_command - Send OTP specific command to OneNAND device
2826 * @param mtd	 MTD device structure
2827 * @param cmd	 the command to be sent
2828 * @param addr	 offset to read from or write to
2829 * @param len	 number of bytes to read or write
2830 */
2831static int onenand_otp_command(struct mtd_info *mtd, int cmd, loff_t addr,
2832				size_t len)
2833{
2834	struct onenand_chip *this = mtd->priv;
2835	int value, block, page;
2836
2837	/* Address translation */
2838	switch (cmd) {
2839	case ONENAND_CMD_OTP_ACCESS:
2840		block = (int) (addr >> this->erase_shift);
2841		page = -1;
2842		break;
2843
2844	default:
2845		block = (int) (addr >> this->erase_shift);
2846		page = (int) (addr >> this->page_shift);
2847
2848		if (ONENAND_IS_2PLANE(this)) {
2849			/* Make the even block number */
2850			block &= ~1;
2851			/* Is it the odd plane? */
2852			if (addr & this->writesize)
2853				block++;
2854			page >>= 1;
2855		}
2856		page &= this->page_mask;
2857		break;
2858	}
2859
2860	if (block != -1) {
2861		/* Write 'DFS, FBA' of Flash */
2862		value = onenand_block_address(this, block);
2863		this->write_word(value, this->base +
2864				ONENAND_REG_START_ADDRESS1);
2865	}
2866
2867	if (page != -1) {
2868		/* Now we use page size operation */
2869		int sectors = 4, count = 4;
2870		int dataram;
2871
2872		switch (cmd) {
2873		default:
2874			if (ONENAND_IS_2PLANE(this) && cmd == ONENAND_CMD_PROG)
2875				cmd = ONENAND_CMD_2X_PROG;
2876			dataram = ONENAND_CURRENT_BUFFERRAM(this);
2877			break;
2878		}
2879
2880		/* Write 'FPA, FSA' of Flash */
2881		value = onenand_page_address(page, sectors);
2882		this->write_word(value, this->base +
2883				ONENAND_REG_START_ADDRESS8);
2884
2885		/* Write 'BSA, BSC' of DataRAM */
2886		value = onenand_buffer_address(dataram, sectors, count);
2887		this->write_word(value, this->base + ONENAND_REG_START_BUFFER);
2888	}
2889
2890	/* Interrupt clear */
2891	this->write_word(ONENAND_INT_CLEAR, this->base + ONENAND_REG_INTERRUPT);
2892
2893	/* Write command */
2894	this->write_word(cmd, this->base + ONENAND_REG_COMMAND);
2895
2896	return 0;
2897}
2898
2899/**
2900 * onenand_otp_write_oob_nolock - [INTERN] OneNAND write out-of-band, specific to OTP
2901 * @param mtd		MTD device structure
2902 * @param to		offset to write to
2903 * @param len		number of bytes to write
2904 * @param retlen	pointer to variable to store the number of written bytes
2905 * @param buf		the data to write
2906 *
2907 * OneNAND write out-of-band only for OTP
2908 */
2909static int onenand_otp_write_oob_nolock(struct mtd_info *mtd, loff_t to,
2910				    struct mtd_oob_ops *ops)
2911{
2912	struct onenand_chip *this = mtd->priv;
2913	int column, ret = 0, oobsize;
2914	int written = 0;
2915	u_char *oobbuf;
2916	size_t len = ops->ooblen;
2917	const u_char *buf = ops->oobbuf;
2918	int block, value, status;
2919
2920	to += ops->ooboffs;
2921
2922	/* Initialize retlen, in case of early exit */
2923	ops->oobretlen = 0;
2924
2925	oobsize = mtd->oobsize;
2926
2927	column = to & (mtd->oobsize - 1);
2928
2929	oobbuf = this->oob_buf;
2930
2931	/* Loop until all data write */
2932	while (written < len) {
2933		int thislen = min_t(int, oobsize, len - written);
2934
2935		cond_resched();
2936
2937		block = (int) (to >> this->erase_shift);
2938		/*
2939		 * Write 'DFS, FBA' of Flash
2940		 * Add: F100h DQ=DFS, FBA
2941		 */
2942
2943		value = onenand_block_address(this, block);
2944		this->write_word(value, this->base +
2945				ONENAND_REG_START_ADDRESS1);
2946
2947		/*
2948		 * Select DataRAM for DDP
2949		 * Add: F101h DQ=DBS
2950		 */
2951
2952		value = onenand_bufferram_address(this, block);
2953		this->write_word(value, this->base +
2954				ONENAND_REG_START_ADDRESS2);
2955		ONENAND_SET_NEXT_BUFFERRAM(this);
2956
2957		/*
2958		 * Enter OTP access mode
2959		 */
2960		this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
2961		this->wait(mtd, FL_OTPING);
2962
2963		/* We send data to spare ram with oobsize
2964		 * to prevent byte access */
2965		memcpy(oobbuf + column, buf, thislen);
2966
2967		/*
2968		 * Write Data into DataRAM
2969		 * Add: 8th Word
2970		 * in sector0/spare/page0
2971		 * DQ=XXFCh
2972		 */
2973		this->write_bufferram(mtd, ONENAND_SPARERAM,
2974					oobbuf, 0, mtd->oobsize);
2975
2976		onenand_otp_command(mtd, ONENAND_CMD_PROGOOB, to, mtd->oobsize);
2977		onenand_update_bufferram(mtd, to, 0);
2978		if (ONENAND_IS_2PLANE(this)) {
2979			ONENAND_SET_BUFFERRAM1(this);
2980			onenand_update_bufferram(mtd, to + this->writesize, 0);
2981		}
2982
2983		ret = this->wait(mtd, FL_WRITING);
2984		if (ret) {
2985			printk(KERN_ERR "%s: write failed %d\n", __func__, ret);
2986			break;
2987		}
2988
2989		/* Exit OTP access mode */
2990		this->command(mtd, ONENAND_CMD_RESET, 0, 0);
2991		this->wait(mtd, FL_RESETING);
2992
2993		status = this->read_word(this->base + ONENAND_REG_CTRL_STATUS);
2994		status &= 0x60;
2995
2996		if (status == 0x60) {
2997			printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
2998			printk(KERN_DEBUG "1st Block\tLOCKED\n");
2999			printk(KERN_DEBUG "OTP Block\tLOCKED\n");
3000		} else if (status == 0x20) {
3001			printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
3002			printk(KERN_DEBUG "1st Block\tLOCKED\n");
3003			printk(KERN_DEBUG "OTP Block\tUN-LOCKED\n");
3004		} else if (status == 0x40) {
3005			printk(KERN_DEBUG "\nBLOCK\tSTATUS\n");
3006			printk(KERN_DEBUG "1st Block\tUN-LOCKED\n");
3007			printk(KERN_DEBUG "OTP Block\tLOCKED\n");
3008		} else {
3009			printk(KERN_DEBUG "Reboot to check\n");
3010		}
3011
3012		written += thislen;
3013		if (written == len)
3014			break;
3015
3016		to += mtd->writesize;
3017		buf += thislen;
3018		column = 0;
3019	}
3020
3021	ops->oobretlen = written;
3022
3023	return ret;
3024}
3025
3026/* Internal OTP operation */
3027typedef int (*otp_op_t)(struct mtd_info *mtd, loff_t form, size_t len,
3028		size_t *retlen, u_char *buf);
3029
3030/**
3031 * do_otp_read - [DEFAULT] Read OTP block area
3032 * @param mtd		MTD device structure
3033 * @param from		The offset to read
3034 * @param len		number of bytes to read
3035 * @param retlen	pointer to variable to store the number of readbytes
3036 * @param buf		the databuffer to put/get data
3037 *
3038 * Read OTP block area.
3039 */
3040static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
3041		size_t *retlen, u_char *buf)
3042{
3043	struct onenand_chip *this = mtd->priv;
3044	struct mtd_oob_ops ops = {
3045		.len	= len,
3046		.ooblen	= 0,
3047		.datbuf	= buf,
3048		.oobbuf	= NULL,
3049	};
3050	int ret;
3051
3052	/* Enter OTP access mode */
3053	this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3054	this->wait(mtd, FL_OTPING);
3055
3056	ret = ONENAND_IS_4KB_PAGE(this) ?
3057		onenand_mlc_read_ops_nolock(mtd, from, &ops) :
3058		onenand_read_ops_nolock(mtd, from, &ops);
3059
3060	/* Exit OTP access mode */
3061	this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3062	this->wait(mtd, FL_RESETING);
3063
3064	return ret;
3065}
3066
3067/**
3068 * do_otp_write - [DEFAULT] Write OTP block area
3069 * @param mtd		MTD device structure
3070 * @param to		The offset to write
3071 * @param len		number of bytes to write
3072 * @param retlen	pointer to variable to store the number of write bytes
3073 * @param buf		the databuffer to put/get data
3074 *
3075 * Write OTP block area.
3076 */
3077static int do_otp_write(struct mtd_info *mtd, loff_t to, size_t len,
3078		size_t *retlen, u_char *buf)
3079{
3080	struct onenand_chip *this = mtd->priv;
3081	unsigned char *pbuf = buf;
3082	int ret;
3083	struct mtd_oob_ops ops;
3084
3085	/* Force buffer page aligned */
3086	if (len < mtd->writesize) {
3087		memcpy(this->page_buf, buf, len);
3088		memset(this->page_buf + len, 0xff, mtd->writesize - len);
3089		pbuf = this->page_buf;
3090		len = mtd->writesize;
3091	}
3092
3093	/* Enter OTP access mode */
3094	this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3095	this->wait(mtd, FL_OTPING);
3096
3097	ops.len = len;
3098	ops.ooblen = 0;
3099	ops.datbuf = pbuf;
3100	ops.oobbuf = NULL;
3101	ret = onenand_write_ops_nolock(mtd, to, &ops);
3102	*retlen = ops.retlen;
3103
3104	/* Exit OTP access mode */
3105	this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3106	this->wait(mtd, FL_RESETING);
3107
3108	return ret;
3109}
3110
3111/**
3112 * do_otp_lock - [DEFAULT] Lock OTP block area
3113 * @param mtd		MTD device structure
3114 * @param from		The offset to lock
3115 * @param len		number of bytes to lock
3116 * @param retlen	pointer to variable to store the number of lock bytes
3117 * @param buf		the databuffer to put/get data
3118 *
3119 * Lock OTP block area.
3120 */
3121static int do_otp_lock(struct mtd_info *mtd, loff_t from, size_t len,
3122		size_t *retlen, u_char *buf)
3123{
3124	struct onenand_chip *this = mtd->priv;
3125	struct mtd_oob_ops ops;
3126	int ret;
3127
3128	if (FLEXONENAND(this)) {
3129
3130		/* Enter OTP access mode */
3131		this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
3132		this->wait(mtd, FL_OTPING);
3133		/*
3134		 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3135		 * main area of page 49.
3136		 */
3137		ops.len = mtd->writesize;
3138		ops.ooblen = 0;
3139		ops.datbuf = buf;
3140		ops.oobbuf = NULL;
3141		ret = onenand_write_ops_nolock(mtd, mtd->writesize * 49, &ops);
3142		*retlen = ops.retlen;
3143
3144		/* Exit OTP access mode */
3145		this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3146		this->wait(mtd, FL_RESETING);
3147	} else {
3148		ops.mode = MTD_OPS_PLACE_OOB;
3149		ops.ooblen = len;
3150		ops.oobbuf = buf;
3151		ops.ooboffs = 0;
3152		ret = onenand_otp_write_oob_nolock(mtd, from, &ops);
3153		*retlen = ops.oobretlen;
3154	}
3155
3156	return ret;
3157}
3158
3159/**
3160 * onenand_otp_walk - [DEFAULT] Handle OTP operation
3161 * @param mtd		MTD device structure
3162 * @param from		The offset to read/write
3163 * @param len		number of bytes to read/write
3164 * @param retlen	pointer to variable to store the number of read bytes
3165 * @param buf		the databuffer to put/get data
3166 * @param action	do given action
3167 * @param mode		specify user and factory
3168 *
3169 * Handle OTP operation.
3170 */
3171static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
3172			size_t *retlen, u_char *buf,
3173			otp_op_t action, int mode)
3174{
3175	struct onenand_chip *this = mtd->priv;
3176	int otp_pages;
3177	int density;
3178	int ret = 0;
3179
3180	*retlen = 0;
3181
3182	density = onenand_get_density(this->device_id);
3183	if (density < ONENAND_DEVICE_DENSITY_512Mb)
3184		otp_pages = 20;
3185	else
3186		otp_pages = 50;
3187
3188	if (mode == MTD_OTP_FACTORY) {
3189		from += mtd->writesize * otp_pages;
3190		otp_pages = ONENAND_PAGES_PER_BLOCK - otp_pages;
3191	}
3192
3193	/* Check User/Factory boundary */
3194	if (mode == MTD_OTP_USER) {
3195		if (mtd->writesize * otp_pages < from + len)
3196			return 0;
3197	} else {
3198		if (mtd->writesize * otp_pages <  len)
3199			return 0;
3200	}
3201
3202	onenand_get_device(mtd, FL_OTPING);
3203	while (len > 0 && otp_pages > 0) {
3204		if (!action) {	/* OTP Info functions */
3205			struct otp_info *otpinfo;
3206
3207			len -= sizeof(struct otp_info);
3208			if (len <= 0) {
3209				ret = -ENOSPC;
3210				break;
3211			}
3212
3213			otpinfo = (struct otp_info *) buf;
3214			otpinfo->start = from;
3215			otpinfo->length = mtd->writesize;
3216			otpinfo->locked = 0;
3217
3218			from += mtd->writesize;
3219			buf += sizeof(struct otp_info);
3220			*retlen += sizeof(struct otp_info);
3221		} else {
3222			size_t tmp_retlen;
3223
3224			ret = action(mtd, from, len, &tmp_retlen, buf);
3225
3226			buf += tmp_retlen;
3227			len -= tmp_retlen;
3228			*retlen += tmp_retlen;
3229
3230			if (ret)
3231				break;
3232		}
3233		otp_pages--;
3234	}
3235	onenand_release_device(mtd);
3236
3237	return ret;
3238}
3239
3240/**
3241 * onenand_get_fact_prot_info - [MTD Interface] Read factory OTP info
3242 * @param mtd		MTD device structure
3243 * @param buf		the databuffer to put/get data
3244 * @param len		number of bytes to read
3245 *
3246 * Read factory OTP info.
3247 */
3248static int onenand_get_fact_prot_info(struct mtd_info *mtd,
3249			struct otp_info *buf, size_t len)
3250{
3251	size_t retlen;
3252	int ret;
3253
3254	ret = onenand_otp_walk(mtd, 0, len, &retlen, (u_char *) buf, NULL, MTD_OTP_FACTORY);
3255
3256	return ret ? : retlen;
3257}
3258
3259/**
3260 * onenand_read_fact_prot_reg - [MTD Interface] Read factory OTP area
3261 * @param mtd		MTD device structure
3262 * @param from		The offset to read
3263 * @param len		number of bytes to read
3264 * @param retlen	pointer to variable to store the number of read bytes
3265 * @param buf		the databuffer to put/get data
3266 *
3267 * Read factory OTP area.
3268 */
3269static int onenand_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
3270			size_t len, size_t *retlen, u_char *buf)
3271{
3272	return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_FACTORY);
3273}
3274
3275/**
3276 * onenand_get_user_prot_info - [MTD Interface] Read user OTP info
3277 * @param mtd		MTD device structure
3278 * @param buf		the databuffer to put/get data
3279 * @param len		number of bytes to read
3280 *
3281 * Read user OTP info.
3282 */
3283static int onenand_get_user_prot_info(struct mtd_info *mtd,
3284			struct otp_info *buf, size_t len)
3285{
3286	size_t retlen;
3287	int ret;
3288
3289	ret = onenand_otp_walk(mtd, 0, len, &retlen, (u_char *) buf, NULL, MTD_OTP_USER);
3290
3291	return ret ? : retlen;
3292}
3293
3294/**
3295 * onenand_read_user_prot_reg - [MTD Interface] Read user OTP area
3296 * @param mtd		MTD device structure
3297 * @param from		The offset to read
3298 * @param len		number of bytes to read
3299 * @param retlen	pointer to variable to store the number of read bytes
3300 * @param buf		the databuffer to put/get data
3301 *
3302 * Read user OTP area.
3303 */
3304static int onenand_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
3305			size_t len, size_t *retlen, u_char *buf)
3306{
3307	return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_read, MTD_OTP_USER);
3308}
3309
3310/**
3311 * onenand_write_user_prot_reg - [MTD Interface] Write user OTP area
3312 * @param mtd		MTD device structure
3313 * @param from		The offset to write
3314 * @param len		number of bytes to write
3315 * @param retlen	pointer to variable to store the number of write bytes
3316 * @param buf		the databuffer to put/get data
3317 *
3318 * Write user OTP area.
3319 */
3320static int onenand_write_user_prot_reg(struct mtd_info *mtd, loff_t from,
3321			size_t len, size_t *retlen, u_char *buf)
3322{
3323	return onenand_otp_walk(mtd, from, len, retlen, buf, do_otp_write, MTD_OTP_USER);
3324}
3325
3326/**
3327 * onenand_lock_user_prot_reg - [MTD Interface] Lock user OTP area
3328 * @param mtd		MTD device structure
3329 * @param from		The offset to lock
3330 * @param len		number of bytes to unlock
3331 *
3332 * Write lock mark on spare area in page 0 in OTP block
3333 */
3334static int onenand_lock_user_prot_reg(struct mtd_info *mtd, loff_t from,
3335			size_t len)
3336{
3337	struct onenand_chip *this = mtd->priv;
3338	u_char *buf = FLEXONENAND(this) ? this->page_buf : this->oob_buf;
3339	size_t retlen;
3340	int ret;
3341	unsigned int otp_lock_offset = ONENAND_OTP_LOCK_OFFSET;
3342
3343	memset(buf, 0xff, FLEXONENAND(this) ? this->writesize
3344						 : mtd->oobsize);
3345	/*
3346	 * Write lock mark to 8th word of sector0 of page0 of the spare0.
3347	 * We write 16 bytes spare area instead of 2 bytes.
3348	 * For Flex-OneNAND, we write lock mark to 1st word of sector 4 of
3349	 * main area of page 49.
3350	 */
3351
3352	from = 0;
3353	len = FLEXONENAND(this) ? mtd->writesize : 16;
3354
3355	/*
3356	 * Note: OTP lock operation
3357	 *       OTP block : 0xXXFC			XX 1111 1100
3358	 *       1st block : 0xXXF3 (If chip support)	XX 1111 0011
3359	 *       Both      : 0xXXF0 (If chip support)	XX 1111 0000
3360	 */
3361	if (FLEXONENAND(this))
3362		otp_lock_offset = FLEXONENAND_OTP_LOCK_OFFSET;
3363
3364	/* ONENAND_OTP_AREA | ONENAND_OTP_BLOCK0 | ONENAND_OTP_AREA_BLOCK0 */
3365	if (otp == 1)
3366		buf[otp_lock_offset] = 0xFC;
3367	else if (otp == 2)
3368		buf[otp_lock_offset] = 0xF3;
3369	else if (otp == 3)
3370		buf[otp_lock_offset] = 0xF0;
3371	else if (otp != 0)
3372		printk(KERN_DEBUG "[OneNAND] Invalid option selected for OTP\n");
3373
3374	ret = onenand_otp_walk(mtd, from, len, &retlen, buf, do_otp_lock, MTD_OTP_USER);
3375
3376	return ret ? : retlen;
3377}
3378
3379#endif	/* CONFIG_MTD_ONENAND_OTP */
3380
3381/**
3382 * onenand_check_features - Check and set OneNAND features
3383 * @param mtd		MTD data structure
3384 *
3385 * Check and set OneNAND features
3386 * - lock scheme
3387 * - two plane
3388 */
3389static void onenand_check_features(struct mtd_info *mtd)
3390{
3391	struct onenand_chip *this = mtd->priv;
3392	unsigned int density, process, numbufs;
3393
3394	/* Lock scheme depends on density and process */
3395	density = onenand_get_density(this->device_id);
3396	process = this->version_id >> ONENAND_VERSION_PROCESS_SHIFT;
3397	numbufs = this->read_word(this->base + ONENAND_REG_NUM_BUFFERS) >> 8;
3398
3399	/* Lock scheme */
3400	switch (density) {
3401	case ONENAND_DEVICE_DENSITY_4Gb:
3402		if (ONENAND_IS_DDP(this))
3403			this->options |= ONENAND_HAS_2PLANE;
3404		else if (numbufs == 1) {
3405			this->options |= ONENAND_HAS_4KB_PAGE;
3406			this->options |= ONENAND_HAS_CACHE_PROGRAM;
3407			/*
3408			 * There are two different 4KiB pagesize chips
3409			 * and no way to detect it by H/W config values.
3410			 *
3411			 * To detect the correct NOP for each chips,
3412			 * It should check the version ID as workaround.
3413			 *
3414			 * Now it has as following
3415			 * KFM4G16Q4M has NOP 4 with version ID 0x0131
3416			 * KFM4G16Q5M has NOP 1 with versoin ID 0x013e
3417			 */
3418			if ((this->version_id & 0xf) == 0xe)
3419				this->options |= ONENAND_HAS_NOP_1;
3420		}
3421
3422	case ONENAND_DEVICE_DENSITY_2Gb:
3423		/* 2Gb DDP does not have 2 plane */
3424		if (!ONENAND_IS_DDP(this))
3425			this->options |= ONENAND_HAS_2PLANE;
3426		this->options |= ONENAND_HAS_UNLOCK_ALL;
3427
3428	case ONENAND_DEVICE_DENSITY_1Gb:
3429		/* A-Die has all block unlock */
3430		if (process)
3431			this->options |= ONENAND_HAS_UNLOCK_ALL;
3432		break;
3433
3434	default:
3435		/* Some OneNAND has continuous lock scheme */
3436		if (!process)
3437			this->options |= ONENAND_HAS_CONT_LOCK;
3438		break;
3439	}
3440
3441	/* The MLC has 4KiB pagesize. */
3442	if (ONENAND_IS_MLC(this))
3443		this->options |= ONENAND_HAS_4KB_PAGE;
3444
3445	if (ONENAND_IS_4KB_PAGE(this))
3446		this->options &= ~ONENAND_HAS_2PLANE;
3447
3448	if (FLEXONENAND(this)) {
3449		this->options &= ~ONENAND_HAS_CONT_LOCK;
3450		this->options |= ONENAND_HAS_UNLOCK_ALL;
3451	}
3452
3453	if (this->options & ONENAND_HAS_CONT_LOCK)
3454		printk(KERN_DEBUG "Lock scheme is Continuous Lock\n");
3455	if (this->options & ONENAND_HAS_UNLOCK_ALL)
3456		printk(KERN_DEBUG "Chip support all block unlock\n");
3457	if (this->options & ONENAND_HAS_2PLANE)
3458		printk(KERN_DEBUG "Chip has 2 plane\n");
3459	if (this->options & ONENAND_HAS_4KB_PAGE)
3460		printk(KERN_DEBUG "Chip has 4KiB pagesize\n");
3461	if (this->options & ONENAND_HAS_CACHE_PROGRAM)
3462		printk(KERN_DEBUG "Chip has cache program feature\n");
3463}
3464
3465/**
3466 * onenand_print_device_info - Print device & version ID
3467 * @param device        device ID
3468 * @param version	version ID
3469 *
3470 * Print device & version ID
3471 */
3472static void onenand_print_device_info(int device, int version)
3473{
3474	int vcc, demuxed, ddp, density, flexonenand;
3475
3476        vcc = device & ONENAND_DEVICE_VCC_MASK;
3477        demuxed = device & ONENAND_DEVICE_IS_DEMUX;
3478        ddp = device & ONENAND_DEVICE_IS_DDP;
3479        density = onenand_get_density(device);
3480	flexonenand = device & DEVICE_IS_FLEXONENAND;
3481	printk(KERN_INFO "%s%sOneNAND%s %dMB %sV 16-bit (0x%02x)\n",
3482		demuxed ? "" : "Muxed ",
3483		flexonenand ? "Flex-" : "",
3484                ddp ? "(DDP)" : "",
3485                (16 << density),
3486                vcc ? "2.65/3.3" : "1.8",
3487                device);
3488	printk(KERN_INFO "OneNAND version = 0x%04x\n", version);
3489}
3490
3491static const struct onenand_manufacturers onenand_manuf_ids[] = {
3492        {ONENAND_MFR_SAMSUNG, "Samsung"},
3493	{ONENAND_MFR_NUMONYX, "Numonyx"},
3494};
3495
3496/**
3497 * onenand_check_maf - Check manufacturer ID
3498 * @param manuf         manufacturer ID
3499 *
3500 * Check manufacturer ID
3501 */
3502static int onenand_check_maf(int manuf)
3503{
3504	int size = ARRAY_SIZE(onenand_manuf_ids);
3505	char *name;
3506        int i;
3507
3508	for (i = 0; i < size; i++)
3509                if (manuf == onenand_manuf_ids[i].id)
3510                        break;
3511
3512	if (i < size)
3513		name = onenand_manuf_ids[i].name;
3514	else
3515		name = "Unknown";
3516
3517	printk(KERN_DEBUG "OneNAND Manufacturer: %s (0x%0x)\n", name, manuf);
3518
3519	return (i == size);
3520}
3521
3522/**
3523* flexonenand_get_boundary	- Reads the SLC boundary
3524* @param onenand_info		- onenand info structure
3525**/
3526static int flexonenand_get_boundary(struct mtd_info *mtd)
3527{
3528	struct onenand_chip *this = mtd->priv;
3529	unsigned die, bdry;
3530	int ret, syscfg, locked;
3531
3532	/* Disable ECC */
3533	syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3534	this->write_word((syscfg | 0x0100), this->base + ONENAND_REG_SYS_CFG1);
3535
3536	for (die = 0; die < this->dies; die++) {
3537		this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3538		this->wait(mtd, FL_SYNCING);
3539
3540		this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3541		ret = this->wait(mtd, FL_READING);
3542
3543		bdry = this->read_word(this->base + ONENAND_DATARAM);
3544		if ((bdry >> FLEXONENAND_PI_UNLOCK_SHIFT) == 3)
3545			locked = 0;
3546		else
3547			locked = 1;
3548		this->boundary[die] = bdry & FLEXONENAND_PI_MASK;
3549
3550		this->command(mtd, ONENAND_CMD_RESET, 0, 0);
3551		ret = this->wait(mtd, FL_RESETING);
3552
3553		printk(KERN_INFO "Die %d boundary: %d%s\n", die,
3554		       this->boundary[die], locked ? "(Locked)" : "(Unlocked)");
3555	}
3556
3557	/* Enable ECC */
3558	this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3559	return 0;
3560}
3561
3562/**
3563 * flexonenand_get_size - Fill up fields in onenand_chip and mtd_info
3564 * 			  boundary[], diesize[], mtd->size, mtd->erasesize
3565 * @param mtd		- MTD device structure
3566 */
3567static void flexonenand_get_size(struct mtd_info *mtd)
3568{
3569	struct onenand_chip *this = mtd->priv;
3570	int die, i, eraseshift, density;
3571	int blksperdie, maxbdry;
3572	loff_t ofs;
3573
3574	density = onenand_get_density(this->device_id);
3575	blksperdie = ((loff_t)(16 << density) << 20) >> (this->erase_shift);
3576	blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3577	maxbdry = blksperdie - 1;
3578	eraseshift = this->erase_shift - 1;
3579
3580	mtd->numeraseregions = this->dies << 1;
3581
3582	/* This fills up the device boundary */
3583	flexonenand_get_boundary(mtd);
3584	die = ofs = 0;
3585	i = -1;
3586	for (; die < this->dies; die++) {
3587		if (!die || this->boundary[die-1] != maxbdry) {
3588			i++;
3589			mtd->eraseregions[i].offset = ofs;
3590			mtd->eraseregions[i].erasesize = 1 << eraseshift;
3591			mtd->eraseregions[i].numblocks =
3592							this->boundary[die] + 1;
3593			ofs += mtd->eraseregions[i].numblocks << eraseshift;
3594			eraseshift++;
3595		} else {
3596			mtd->numeraseregions -= 1;
3597			mtd->eraseregions[i].numblocks +=
3598							this->boundary[die] + 1;
3599			ofs += (this->boundary[die] + 1) << (eraseshift - 1);
3600		}
3601		if (this->boundary[die] != maxbdry) {
3602			i++;
3603			mtd->eraseregions[i].offset = ofs;
3604			mtd->eraseregions[i].erasesize = 1 << eraseshift;
3605			mtd->eraseregions[i].numblocks = maxbdry ^
3606							 this->boundary[die];
3607			ofs += mtd->eraseregions[i].numblocks << eraseshift;
3608			eraseshift--;
3609		} else
3610			mtd->numeraseregions -= 1;
3611	}
3612
3613	/* Expose MLC erase size except when all blocks are SLC */
3614	mtd->erasesize = 1 << this->erase_shift;
3615	if (mtd->numeraseregions == 1)
3616		mtd->erasesize >>= 1;
3617
3618	printk(KERN_INFO "Device has %d eraseregions\n", mtd->numeraseregions);
3619	for (i = 0; i < mtd->numeraseregions; i++)
3620		printk(KERN_INFO "[offset: 0x%08x, erasesize: 0x%05x,"
3621			" numblocks: %04u]\n",
3622			(unsigned int) mtd->eraseregions[i].offset,
3623			mtd->eraseregions[i].erasesize,
3624			mtd->eraseregions[i].numblocks);
3625
3626	for (die = 0, mtd->size = 0; die < this->dies; die++) {
3627		this->diesize[die] = (loff_t)blksperdie << this->erase_shift;
3628		this->diesize[die] -= (loff_t)(this->boundary[die] + 1)
3629						 << (this->erase_shift - 1);
3630		mtd->size += this->diesize[die];
3631	}
3632}
3633
3634/**
3635 * flexonenand_check_blocks_erased - Check if blocks are erased
3636 * @param mtd_info	- mtd info structure
3637 * @param start		- first erase block to check
3638 * @param end		- last erase block to check
3639 *
3640 * Converting an unerased block from MLC to SLC
3641 * causes byte values to change. Since both data and its ECC
3642 * have changed, reads on the block give uncorrectable error.
3643 * This might lead to the block being detected as bad.
3644 *
3645 * Avoid this by ensuring that the block to be converted is
3646 * erased.
3647 */
3648static int flexonenand_check_blocks_erased(struct mtd_info *mtd, int start, int end)
3649{
3650	struct onenand_chip *this = mtd->priv;
3651	int i, ret;
3652	int block;
3653	struct mtd_oob_ops ops = {
3654		.mode = MTD_OPS_PLACE_OOB,
3655		.ooboffs = 0,
3656		.ooblen	= mtd->oobsize,
3657		.datbuf	= NULL,
3658		.oobbuf	= this->oob_buf,
3659	};
3660	loff_t addr;
3661
3662	printk(KERN_DEBUG "Check blocks from %d to %d\n", start, end);
3663
3664	for (block = start; block <= end; block++) {
3665		addr = flexonenand_addr(this, block);
3666		if (onenand_block_isbad_nolock(mtd, addr, 0))
3667			continue;
3668
3669		/*
3670		 * Since main area write results in ECC write to spare,
3671		 * it is sufficient to check only ECC bytes for change.
3672		 */
3673		ret = onenand_read_oob_nolock(mtd, addr, &ops);
3674		if (ret)
3675			return ret;
3676
3677		for (i = 0; i < mtd->oobsize; i++)
3678			if (this->oob_buf[i] != 0xff)
3679				break;
3680
3681		if (i != mtd->oobsize) {
3682			printk(KERN_WARNING "%s: Block %d not erased.\n",
3683				__func__, block);
3684			return 1;
3685		}
3686	}
3687
3688	return 0;
3689}
3690
3691/**
3692 * flexonenand_set_boundary	- Writes the SLC boundary
3693 * @param mtd			- mtd info structure
3694 */
3695int flexonenand_set_boundary(struct mtd_info *mtd, int die,
3696				    int boundary, int lock)
3697{
3698	struct onenand_chip *this = mtd->priv;
3699	int ret, density, blksperdie, old, new, thisboundary;
3700	loff_t addr;
3701
3702	/* Change only once for SDP Flex-OneNAND */
3703	if (die && (!ONENAND_IS_DDP(this)))
3704		return 0;
3705
3706	/* boundary value of -1 indicates no required change */
3707	if (boundary < 0 || boundary == this->boundary[die])
3708		return 0;
3709
3710	density = onenand_get_density(this->device_id);
3711	blksperdie = ((16 << density) << 20) >> this->erase_shift;
3712	blksperdie >>= ONENAND_IS_DDP(this) ? 1 : 0;
3713
3714	if (boundary >= blksperdie) {
3715		printk(KERN_ERR "%s: Invalid boundary value. "
3716				"Boundary not changed.\n", __func__);
3717		return -EINVAL;
3718	}
3719
3720	/* Check if converting blocks are erased */
3721	old = this->boundary[die] + (die * this->density_mask);
3722	new = boundary + (die * this->density_mask);
3723	ret = flexonenand_check_blocks_erased(mtd, min(old, new) + 1, max(old, new));
3724	if (ret) {
3725		printk(KERN_ERR "%s: Please erase blocks "
3726				"before boundary change\n", __func__);
3727		return ret;
3728	}
3729
3730	this->command(mtd, FLEXONENAND_CMD_PI_ACCESS, die, 0);
3731	this->wait(mtd, FL_SYNCING);
3732
3733	/* Check is boundary is locked */
3734	this->command(mtd, FLEXONENAND_CMD_READ_PI, die, 0);
3735	ret = this->wait(mtd, FL_READING);
3736
3737	thisboundary = this->read_word(this->base + ONENAND_DATARAM);
3738	if ((thisboundary >> FLEXONENAND_PI_UNLOCK_SHIFT) != 3) {
3739		printk(KERN_ERR "%s: boundary locked\n", __func__);
3740		ret = 1;
3741		goto out;
3742	}
3743
3744	printk(KERN_INFO "Changing die %d boundary: %d%s\n",
3745			die, boundary, lock ? "(Locked)" : "(Unlocked)");
3746
3747	addr = die ? this->diesize[0] : 0;
3748
3749	boundary &= FLEXONENAND_PI_MASK;
3750	boundary |= lock ? 0 : (3 << FLEXONENAND_PI_UNLOCK_SHIFT);
3751
3752	this->command(mtd, ONENAND_CMD_ERASE, addr, 0);
3753	ret = this->wait(mtd, FL_ERASING);
3754	if (ret) {
3755		printk(KERN_ERR "%s: Failed PI erase for Die %d\n",
3756		       __func__, die);
3757		goto out;
3758	}
3759
3760	this->write_word(boundary, this->base + ONENAND_DATARAM);
3761	this->command(mtd, ONENAND_CMD_PROG, addr, 0);
3762	ret = this->wait(mtd, FL_WRITING);
3763	if (ret) {
3764		printk(KERN_ERR "%s: Failed PI write for Die %d\n",
3765			__func__, die);
3766		goto out;
3767	}
3768
3769	this->command(mtd, FLEXONENAND_CMD_PI_UPDATE, die, 0);
3770	ret = this->wait(mtd, FL_WRITING);
3771out:
3772	this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_REG_COMMAND);
3773	this->wait(mtd, FL_RESETING);
3774	if (!ret)
3775		/* Recalculate device size on boundary change*/
3776		flexonenand_get_size(mtd);
3777
3778	return ret;
3779}
3780
3781/**
3782 * onenand_chip_probe - [OneNAND Interface] The generic chip probe
3783 * @param mtd		MTD device structure
3784 *
3785 * OneNAND detection method:
3786 *   Compare the values from command with ones from register
3787 */
3788static int onenand_chip_probe(struct mtd_info *mtd)
3789{
3790	struct onenand_chip *this = mtd->priv;
3791	int bram_maf_id, bram_dev_id, maf_id, dev_id;
3792	int syscfg;
3793
3794	/* Save system configuration 1 */
3795	syscfg = this->read_word(this->base + ONENAND_REG_SYS_CFG1);
3796	/* Clear Sync. Burst Read mode to read BootRAM */
3797	this->write_word((syscfg & ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE), this->base + ONENAND_REG_SYS_CFG1);
3798
3799	/* Send the command for reading device ID from BootRAM */
3800	this->write_word(ONENAND_CMD_READID, this->base + ONENAND_BOOTRAM);
3801
3802	/* Read manufacturer and device IDs from BootRAM */
3803	bram_maf_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x0);
3804	bram_dev_id = this->read_word(this->base + ONENAND_BOOTRAM + 0x2);
3805
3806	/* Reset OneNAND to read default register values */
3807	this->write_word(ONENAND_CMD_RESET, this->base + ONENAND_BOOTRAM);
3808	/* Wait reset */
3809	this->wait(mtd, FL_RESETING);
3810
3811	/* Restore system configuration 1 */
3812	this->write_word(syscfg, this->base + ONENAND_REG_SYS_CFG1);
3813
3814	/* Check manufacturer ID */
3815	if (onenand_check_maf(bram_maf_id))
3816		return -ENXIO;
3817
3818	/* Read manufacturer and device IDs from Register */
3819	maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
3820	dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3821
3822	/* Check OneNAND device */
3823	if (maf_id != bram_maf_id || dev_id != bram_dev_id)
3824		return -ENXIO;
3825
3826	return 0;
3827}
3828
3829/**
3830 * onenand_probe - [OneNAND Interface] Probe the OneNAND device
3831 * @param mtd		MTD device structure
3832 */
3833static int onenand_probe(struct mtd_info *mtd)
3834{
3835	struct onenand_chip *this = mtd->priv;
3836	int maf_id, dev_id, ver_id;
3837	int density;
3838	int ret;
3839
3840	ret = this->chip_probe(mtd);
3841	if (ret)
3842		return ret;
3843
3844	/* Read manufacturer and device IDs from Register */
3845	maf_id = this->read_word(this->base + ONENAND_REG_MANUFACTURER_ID);
3846	dev_id = this->read_word(this->base + ONENAND_REG_DEVICE_ID);
3847	ver_id = this->read_word(this->base + ONENAND_REG_VERSION_ID);
3848	this->technology = this->read_word(this->base + ONENAND_REG_TECHNOLOGY);
3849
3850	/* Flash device information */
3851	onenand_print_device_info(dev_id, ver_id);
3852	this->device_id = dev_id;
3853	this->version_id = ver_id;
3854
3855	/* Check OneNAND features */
3856	onenand_check_features(mtd);
3857
3858	density = onenand_get_density(dev_id);
3859	if (FLEXONENAND(this)) {
3860		this->dies = ONENAND_IS_DDP(this) ? 2 : 1;
3861		/* Maximum possible erase regions */
3862		mtd->numeraseregions = this->dies << 1;
3863		mtd->eraseregions = kzalloc(sizeof(struct mtd_erase_region_info)
3864					* (this->dies << 1), GFP_KERNEL);
3865		if (!mtd->eraseregions)
3866			return -ENOMEM;
3867	}
3868
3869	/*
3870	 * For Flex-OneNAND, chipsize represents maximum possible device size.
3871	 * mtd->size represents the actual device size.
3872	 */
3873	this->chipsize = (16 << density) << 20;
3874
3875	/* OneNAND page size & block size */
3876	/* The data buffer size is equal to page size */
3877	mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE);
3878	/* We use the full BufferRAM */
3879	if (ONENAND_IS_4KB_PAGE(this))
3880		mtd->writesize <<= 1;
3881
3882	mtd->oobsize = mtd->writesize >> 5;
3883	/* Pages per a block are always 64 in OneNAND */
3884	mtd->erasesize = mtd->writesize << 6;
3885	/*
3886	 * Flex-OneNAND SLC area has 64 pages per block.
3887	 * Flex-OneNAND MLC area has 128 pages per block.
3888	 * Expose MLC erase size to find erase_shift and page_mask.
3889	 */
3890	if (FLEXONENAND(this))
3891		mtd->erasesize <<= 1;
3892
3893	this->erase_shift = ffs(mtd->erasesize) - 1;
3894	this->page_shift = ffs(mtd->writesize) - 1;
3895	this->page_mask = (1 << (this->erase_shift - this->page_shift)) - 1;
3896	/* Set density mask. it is used for DDP */
3897	if (ONENAND_IS_DDP(this))
3898		this->density_mask = this->chipsize >> (this->erase_shift + 1);
3899	/* It's real page size */
3900	this->writesize = mtd->writesize;
3901
3902	/* REVISIT: Multichip handling */
3903
3904	if (FLEXONENAND(this))
3905		flexonenand_get_size(mtd);
3906	else
3907		mtd->size = this->chipsize;
3908
3909	/*
3910	 * We emulate the 4KiB page and 256KiB erase block size
3911	 * But oobsize is still 64 bytes.
3912	 * It is only valid if you turn on 2X program support,
3913	 * Otherwise it will be ignored by compiler.
3914	 */
3915	if (ONENAND_IS_2PLANE(this)) {
3916		mtd->writesize <<= 1;
3917		mtd->erasesize <<= 1;
3918	}
3919
3920	return 0;
3921}
3922
3923/**
3924 * onenand_suspend - [MTD Interface] Suspend the OneNAND flash
3925 * @param mtd		MTD device structure
3926 */
3927static int onenand_suspend(struct mtd_info *mtd)
3928{
3929	return onenand_get_device(mtd, FL_PM_SUSPENDED);
3930}
3931
3932/**
3933 * onenand_resume - [MTD Interface] Resume the OneNAND flash
3934 * @param mtd		MTD device structure
3935 */
3936static void onenand_resume(struct mtd_info *mtd)
3937{
3938	struct onenand_chip *this = mtd->priv;
3939
3940	if (this->state == FL_PM_SUSPENDED)
3941		onenand_release_device(mtd);
3942	else
3943		printk(KERN_ERR "%s: resume() called for the chip which is not "
3944				"in suspended state\n", __func__);
3945}
3946
3947/**
3948 * onenand_scan - [OneNAND Interface] Scan for the OneNAND device
3949 * @param mtd		MTD device structure
3950 * @param maxchips	Number of chips to scan for
3951 *
3952 * This fills out all the not initialized function pointers
3953 * with the defaults.
3954 * The flash ID is read and the mtd/chip structures are
3955 * filled with the appropriate values.
3956 */
3957int onenand_scan(struct mtd_info *mtd, int maxchips)
3958{
3959	int i, ret;
3960	struct onenand_chip *this = mtd->priv;
3961
3962	if (!this->read_word)
3963		this->read_word = onenand_readw;
3964	if (!this->write_word)
3965		this->write_word = onenand_writew;
3966
3967	if (!this->command)
3968		this->command = onenand_command;
3969	if (!this->wait)
3970		onenand_setup_wait(mtd);
3971	if (!this->bbt_wait)
3972		this->bbt_wait = onenand_bbt_wait;
3973	if (!this->unlock_all)
3974		this->unlock_all = onenand_unlock_all;
3975
3976	if (!this->chip_probe)
3977		this->chip_probe = onenand_chip_probe;
3978
3979	if (!this->read_bufferram)
3980		this->read_bufferram = onenand_read_bufferram;
3981	if (!this->write_bufferram)
3982		this->write_bufferram = onenand_write_bufferram;
3983
3984	if (!this->block_markbad)
3985		this->block_markbad = onenand_default_block_markbad;
3986	if (!this->scan_bbt)
3987		this->scan_bbt = onenand_default_bbt;
3988
3989	if (onenand_probe(mtd))
3990		return -ENXIO;
3991
3992	/* Set Sync. Burst Read after probing */
3993	if (this->mmcontrol) {
3994		printk(KERN_INFO "OneNAND Sync. Burst Read support\n");
3995		this->read_bufferram = onenand_sync_read_bufferram;
3996	}
3997
3998	/* Allocate buffers, if necessary */
3999	if (!this->page_buf) {
4000		this->page_buf = kzalloc(mtd->writesize, GFP_KERNEL);
4001		if (!this->page_buf) {
4002			printk(KERN_ERR "%s: Can't allocate page_buf\n",
4003				__func__);
4004			return -ENOMEM;
4005		}
4006#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4007		this->verify_buf = kzalloc(mtd->writesize, GFP_KERNEL);
4008		if (!this->verify_buf) {
4009			kfree(this->page_buf);
4010			return -ENOMEM;
4011		}
4012#endif
4013		this->options |= ONENAND_PAGEBUF_ALLOC;
4014	}
4015	if (!this->oob_buf) {
4016		this->oob_buf = kzalloc(mtd->oobsize, GFP_KERNEL);
4017		if (!this->oob_buf) {
4018			printk(KERN_ERR "%s: Can't allocate oob_buf\n",
4019				__func__);
4020			if (this->options & ONENAND_PAGEBUF_ALLOC) {
4021				this->options &= ~ONENAND_PAGEBUF_ALLOC;
4022				kfree(this->page_buf);
4023			}
4024			return -ENOMEM;
4025		}
4026		this->options |= ONENAND_OOBBUF_ALLOC;
4027	}
4028
4029	this->state = FL_READY;
4030	init_waitqueue_head(&this->wq);
4031	spin_lock_init(&this->chip_lock);
4032
4033	/*
4034	 * Allow subpage writes up to oobsize.
4035	 */
4036	switch (mtd->oobsize) {
4037	case 128:
4038		if (FLEXONENAND(this)) {
4039			this->ecclayout = &flexonenand_oob_128;
4040			mtd->subpage_sft = 0;
4041		} else {
4042			this->ecclayout = &onenand_oob_128;
4043			mtd->subpage_sft = 2;
4044		}
4045		if (ONENAND_IS_NOP_1(this))
4046			mtd->subpage_sft = 0;
4047		break;
4048	case 64:
4049		this->ecclayout = &onenand_oob_64;
4050		mtd->subpage_sft = 2;
4051		break;
4052
4053	case 32:
4054		this->ecclayout = &onenand_oob_32;
4055		mtd->subpage_sft = 1;
4056		break;
4057
4058	default:
4059		printk(KERN_WARNING "%s: No OOB scheme defined for oobsize %d\n",
4060			__func__, mtd->oobsize);
4061		mtd->subpage_sft = 0;
4062		/* To prevent kernel oops */
4063		this->ecclayout = &onenand_oob_32;
4064		break;
4065	}
4066
4067	this->subpagesize = mtd->writesize >> mtd->subpage_sft;
4068
4069	/*
4070	 * The number of bytes available for a client to place data into
4071	 * the out of band area
4072	 */
4073	this->ecclayout->oobavail = 0;
4074	for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES &&
4075	    this->ecclayout->oobfree[i].length; i++)
4076		this->ecclayout->oobavail +=
4077			this->ecclayout->oobfree[i].length;
4078	mtd->oobavail = this->ecclayout->oobavail;
4079
4080	mtd->ecclayout = this->ecclayout;
4081	mtd->ecc_strength = 1;
4082
4083	/* Fill in remaining MTD driver data */
4084	mtd->type = ONENAND_IS_MLC(this) ? MTD_MLCNANDFLASH : MTD_NANDFLASH;
4085	mtd->flags = MTD_CAP_NANDFLASH;
4086	mtd->_erase = onenand_erase;
4087	mtd->_point = NULL;
4088	mtd->_unpoint = NULL;
4089	mtd->_read = onenand_read;
4090	mtd->_write = onenand_write;
4091	mtd->_read_oob = onenand_read_oob;
4092	mtd->_write_oob = onenand_write_oob;
4093	mtd->_panic_write = onenand_panic_write;
4094#ifdef CONFIG_MTD_ONENAND_OTP
4095	mtd->_get_fact_prot_info = onenand_get_fact_prot_info;
4096	mtd->_read_fact_prot_reg = onenand_read_fact_prot_reg;
4097	mtd->_get_user_prot_info = onenand_get_user_prot_info;
4098	mtd->_read_user_prot_reg = onenand_read_user_prot_reg;
4099	mtd->_write_user_prot_reg = onenand_write_user_prot_reg;
4100	mtd->_lock_user_prot_reg = onenand_lock_user_prot_reg;
4101#endif
4102	mtd->_sync = onenand_sync;
4103	mtd->_lock = onenand_lock;
4104	mtd->_unlock = onenand_unlock;
4105	mtd->_suspend = onenand_suspend;
4106	mtd->_resume = onenand_resume;
4107	mtd->_block_isbad = onenand_block_isbad;
4108	mtd->_block_markbad = onenand_block_markbad;
4109	mtd->owner = THIS_MODULE;
4110	mtd->writebufsize = mtd->writesize;
4111
4112	/* Unlock whole block */
4113	if (!(this->options & ONENAND_SKIP_INITIAL_UNLOCKING))
4114		this->unlock_all(mtd);
4115
4116	ret = this->scan_bbt(mtd);
4117	if ((!FLEXONENAND(this)) || ret)
4118		return ret;
4119
4120	/* Change Flex-OneNAND boundaries if required */
4121	for (i = 0; i < MAX_DIES; i++)
4122		flexonenand_set_boundary(mtd, i, flex_bdry[2 * i],
4123						 flex_bdry[(2 * i) + 1]);
4124
4125	return 0;
4126}
4127
4128/**
4129 * onenand_release - [OneNAND Interface] Free resources held by the OneNAND device
4130 * @param mtd		MTD device structure
4131 */
4132void onenand_release(struct mtd_info *mtd)
4133{
4134	struct onenand_chip *this = mtd->priv;
4135
4136	/* Deregister partitions */
4137	mtd_device_unregister(mtd);
4138
4139	/* Free bad block table memory, if allocated */
4140	if (this->bbm) {
4141		struct bbm_info *bbm = this->bbm;
4142		kfree(bbm->bbt);
4143		kfree(this->bbm);
4144	}
4145	/* Buffers allocated by onenand_scan */
4146	if (this->options & ONENAND_PAGEBUF_ALLOC) {
4147		kfree(this->page_buf);
4148#ifdef CONFIG_MTD_ONENAND_VERIFY_WRITE
4149		kfree(this->verify_buf);
4150#endif
4151	}
4152	if (this->options & ONENAND_OOBBUF_ALLOC)
4153		kfree(this->oob_buf);
4154	kfree(mtd->eraseregions);
4155}
4156
4157EXPORT_SYMBOL_GPL(onenand_scan);
4158EXPORT_SYMBOL_GPL(onenand_release);
4159
4160MODULE_LICENSE("GPL");
4161MODULE_AUTHOR("Kyungmin Park <kyungmin.park@samsung.com>");
4162MODULE_DESCRIPTION("Generic OneNAND flash driver code");
4163