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