nand_base.c 58.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
/*
 *  drivers/mtd/nand.c
 *
 *  Overview:
 *   This is the generic MTD driver for NAND flash devices. It should be
 *   capable of working with almost all NAND chips currently available.
 *   Basic support for AG-AND chips is provided.
8
 *
L
Linus Torvalds 已提交
9 10
 *	Additional technical information is available on
 *	http://www.linux-mtd.infradead.org/tech/nand.html
11
 *
L
Linus Torvalds 已提交
12
 *  Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com)
13
 *		  2002-2006 Thomas Gleixner (tglx@linutronix.de)
L
Linus Torvalds 已提交
14
 *
15
 *  Credits:
16 17
 *	David Woodhouse for adding multichip support
 *
L
Linus Torvalds 已提交
18 19 20
 *	Aleph One Ltd. and Toby Churchill Ltd. for supporting the
 *	rework for 2K page size chips
 *
21
 *  TODO:
L
Linus Torvalds 已提交
22 23 24 25 26 27 28 29 30 31 32 33
 *	Enable cached programming for 2k page size chips
 *	Check, if mtd->ecctype should be set to MTD_ECC_HW
 *	if we have HW ecc support.
 *	The AG-AND chips have nice features for speed improvement,
 *	which are not supported yet. Read / program 4 pages in one go.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 */

34
#include <linux/module.h>
L
Linus Torvalds 已提交
35 36
#include <linux/delay.h>
#include <linux/errno.h>
T
Thomas Gleixner 已提交
37
#include <linux/err.h>
L
Linus Torvalds 已提交
38 39 40 41 42 43 44 45 46
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/compatmac.h>
#include <linux/interrupt.h>
#include <linux/bitops.h>
47
#include <linux/leds.h>
L
Linus Torvalds 已提交
48 49 50 51 52 53 54 55 56 57 58
#include <asm/io.h>

#ifdef CONFIG_MTD_PARTITIONS
#include <linux/mtd/partitions.h>
#endif

/* Define default oob placement schemes for large and small page devices */
static struct nand_oobinfo nand_oob_8 = {
	.useecc = MTD_NANDECC_AUTOPLACE,
	.eccbytes = 3,
	.eccpos = {0, 1, 2},
59
	.oobfree = {{3, 2}, {6, 2}}
L
Linus Torvalds 已提交
60 61 62 63 64 65
};

static struct nand_oobinfo nand_oob_16 = {
	.useecc = MTD_NANDECC_AUTOPLACE,
	.eccbytes = 6,
	.eccpos = {0, 1, 2, 3, 6, 7},
66
	.oobfree = {{8, 8}}
L
Linus Torvalds 已提交
67 68 69 70 71 72
};

static struct nand_oobinfo nand_oob_64 = {
	.useecc = MTD_NANDECC_AUTOPLACE,
	.eccbytes = 24,
	.eccpos = {
73 74 75 76
		   40, 41, 42, 43, 44, 45, 46, 47,
		   48, 49, 50, 51, 52, 53, 54, 55,
		   56, 57, 58, 59, 60, 61, 62, 63},
	.oobfree = {{2, 38}}
L
Linus Torvalds 已提交
77 78 79
};

/* This is used for padding purposes in nand_write_oob */
80
static uint8_t ffchars[] = {
L
Linus Torvalds 已提交
81 82 83 84 85 86 87 88 89 90
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
};

91
static int nand_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
92
			  size_t *retlen, const uint8_t *buf);
93
static int nand_get_device(struct nand_chip *chip, struct mtd_info *mtd,
94
			   int new_state);
L
Linus Torvalds 已提交
95

T
Thomas Gleixner 已提交
96 97 98 99 100 101
/*
 * For devices which display every fart in the system on a seperate LED. Is
 * compiled away when LED support is disabled.
 */
DEFINE_LED_TRIGGER(nand_led_trigger);

L
Linus Torvalds 已提交
102 103 104
/**
 * nand_release_device - [GENERIC] release chip
 * @mtd:	MTD device structure
105 106
 *
 * Deselect, release chip lock and wake up anyone waiting on the device
L
Linus Torvalds 已提交
107
 */
108
static void nand_release_device(struct mtd_info *mtd)
L
Linus Torvalds 已提交
109
{
110
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
111 112

	/* De-select the NAND device */
113
	chip->select_chip(mtd, -1);
114

T
Thomas Gleixner 已提交
115
	/* Release the controller and the chip */
116 117 118 119 120
	spin_lock(&chip->controller->lock);
	chip->controller->active = NULL;
	chip->state = FL_READY;
	wake_up(&chip->controller->wq);
	spin_unlock(&chip->controller->lock);
L
Linus Torvalds 已提交
121 122 123 124 125 126 127 128
}

/**
 * nand_read_byte - [DEFAULT] read one byte from the chip
 * @mtd:	MTD device structure
 *
 * Default read function for 8bit buswith
 */
129
static uint8_t nand_read_byte(struct mtd_info *mtd)
L
Linus Torvalds 已提交
130
{
131 132
	struct nand_chip *chip = mtd->priv;
	return readb(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
133 134 135 136 137 138
}

/**
 * nand_read_byte16 - [DEFAULT] read one byte endianess aware from the chip
 * @mtd:	MTD device structure
 *
139
 * Default read function for 16bit buswith with
L
Linus Torvalds 已提交
140 141
 * endianess conversion
 */
142
static uint8_t nand_read_byte16(struct mtd_info *mtd)
L
Linus Torvalds 已提交
143
{
144 145
	struct nand_chip *chip = mtd->priv;
	return (uint8_t) cpu_to_le16(readw(chip->IO_ADDR_R));
L
Linus Torvalds 已提交
146 147 148 149 150 151
}

/**
 * nand_read_word - [DEFAULT] read one word from the chip
 * @mtd:	MTD device structure
 *
152
 * Default read function for 16bit buswith without
L
Linus Torvalds 已提交
153 154 155 156
 * endianess conversion
 */
static u16 nand_read_word(struct mtd_info *mtd)
{
157 158
	struct nand_chip *chip = mtd->priv;
	return readw(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
159 160 161 162 163 164 165 166 167
}

/**
 * nand_select_chip - [DEFAULT] control CE line
 * @mtd:	MTD device structure
 * @chip:	chipnumber to select, -1 for deselect
 *
 * Default select function for 1 chip devices.
 */
168
static void nand_select_chip(struct mtd_info *mtd, int chipnr)
L
Linus Torvalds 已提交
169
{
170 171 172
	struct nand_chip *chip = mtd->priv;

	switch (chipnr) {
L
Linus Torvalds 已提交
173
	case -1:
174
		chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
L
Linus Torvalds 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
		break;
	case 0:
		break;

	default:
		BUG();
	}
}

/**
 * nand_write_buf - [DEFAULT] write buffer to chip
 * @mtd:	MTD device structure
 * @buf:	data buffer
 * @len:	number of bytes to write
 *
 * Default write function for 8bit buswith
 */
192
static void nand_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
193 194
{
	int i;
195
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
196

197
	for (i = 0; i < len; i++)
198
		writeb(buf[i], chip->IO_ADDR_W);
L
Linus Torvalds 已提交
199 200 201
}

/**
202
 * nand_read_buf - [DEFAULT] read chip data into buffer
L
Linus Torvalds 已提交
203 204 205 206 207 208
 * @mtd:	MTD device structure
 * @buf:	buffer to store date
 * @len:	number of bytes to read
 *
 * Default read function for 8bit buswith
 */
209
static void nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
L
Linus Torvalds 已提交
210 211
{
	int i;
212
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
213

214
	for (i = 0; i < len; i++)
215
		buf[i] = readb(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
216 217 218
}

/**
219
 * nand_verify_buf - [DEFAULT] Verify chip data against buffer
L
Linus Torvalds 已提交
220 221 222 223 224 225
 * @mtd:	MTD device structure
 * @buf:	buffer containing the data to compare
 * @len:	number of bytes to compare
 *
 * Default verify function for 8bit buswith
 */
226
static int nand_verify_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
227 228
{
	int i;
229
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
230

231
	for (i = 0; i < len; i++)
232
		if (buf[i] != readb(chip->IO_ADDR_R))
L
Linus Torvalds 已提交
233 234 235 236 237 238 239 240 241 242 243 244
			return -EFAULT;
	return 0;
}

/**
 * nand_write_buf16 - [DEFAULT] write buffer to chip
 * @mtd:	MTD device structure
 * @buf:	data buffer
 * @len:	number of bytes to write
 *
 * Default write function for 16bit buswith
 */
245
static void nand_write_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
246 247
{
	int i;
248
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
249 250
	u16 *p = (u16 *) buf;
	len >>= 1;
251

252
	for (i = 0; i < len; i++)
253
		writew(p[i], chip->IO_ADDR_W);
254

L
Linus Torvalds 已提交
255 256 257
}

/**
258
 * nand_read_buf16 - [DEFAULT] read chip data into buffer
L
Linus Torvalds 已提交
259 260 261 262 263 264
 * @mtd:	MTD device structure
 * @buf:	buffer to store date
 * @len:	number of bytes to read
 *
 * Default read function for 16bit buswith
 */
265
static void nand_read_buf16(struct mtd_info *mtd, uint8_t *buf, int len)
L
Linus Torvalds 已提交
266 267
{
	int i;
268
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
269 270 271
	u16 *p = (u16 *) buf;
	len >>= 1;

272
	for (i = 0; i < len; i++)
273
		p[i] = readw(chip->IO_ADDR_R);
L
Linus Torvalds 已提交
274 275 276
}

/**
277
 * nand_verify_buf16 - [DEFAULT] Verify chip data against buffer
L
Linus Torvalds 已提交
278 279 280 281 282 283
 * @mtd:	MTD device structure
 * @buf:	buffer containing the data to compare
 * @len:	number of bytes to compare
 *
 * Default verify function for 16bit buswith
 */
284
static int nand_verify_buf16(struct mtd_info *mtd, const uint8_t *buf, int len)
L
Linus Torvalds 已提交
285 286
{
	int i;
287
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
288 289 290
	u16 *p = (u16 *) buf;
	len >>= 1;

291
	for (i = 0; i < len; i++)
292
		if (p[i] != readw(chip->IO_ADDR_R))
L
Linus Torvalds 已提交
293 294 295 296 297 298 299 300 301 302 303
			return -EFAULT;

	return 0;
}

/**
 * nand_block_bad - [DEFAULT] Read bad block marker from the chip
 * @mtd:	MTD device structure
 * @ofs:	offset from device start
 * @getchip:	0, if the chip is already selected
 *
304
 * Check, if the block is bad.
L
Linus Torvalds 已提交
305 306 307 308
 */
static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
{
	int page, chipnr, res = 0;
309
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
310 311 312
	u16 bad;

	if (getchip) {
313 314
		page = (int)(ofs >> chip->page_shift);
		chipnr = (int)(ofs >> chip->chip_shift);
L
Linus Torvalds 已提交
315

316
		nand_get_device(chip, mtd, FL_READING);
L
Linus Torvalds 已提交
317 318

		/* Select the NAND device */
319
		chip->select_chip(mtd, chipnr);
320
	} else
321
		page = (int)ofs;
L
Linus Torvalds 已提交
322

323 324 325 326 327
	if (chip->options & NAND_BUSWIDTH_16) {
		chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos & 0xFE,
			      page & chip->pagemask);
		bad = cpu_to_le16(chip->read_word(mtd));
		if (chip->badblockpos & 0x1)
328
			bad >>= 8;
L
Linus Torvalds 已提交
329 330 331
		if ((bad & 0xFF) != 0xff)
			res = 1;
	} else {
332 333 334
		chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos,
			      page & chip->pagemask);
		if (chip->read_byte(mtd) != 0xff)
L
Linus Torvalds 已提交
335 336
			res = 1;
	}
337

338
	if (getchip)
L
Linus Torvalds 已提交
339
		nand_release_device(mtd);
340

L
Linus Torvalds 已提交
341 342 343 344 345 346 347 348 349 350 351 352 353
	return res;
}

/**
 * nand_default_block_markbad - [DEFAULT] mark a block bad
 * @mtd:	MTD device structure
 * @ofs:	offset from device start
 *
 * This is the default implementation, which can be overridden by
 * a hardware specific driver.
*/
static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
{
354
	struct nand_chip *chip = mtd->priv;
355
	uint8_t buf[2] = { 0, 0 };
356
	size_t retlen;
L
Linus Torvalds 已提交
357
	int block;
358

L
Linus Torvalds 已提交
359
	/* Get block number */
360 361 362
	block = ((int)ofs) >> chip->bbt_erase_shift;
	if (chip->bbt)
		chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
L
Linus Torvalds 已提交
363 364

	/* Do we have a flash based bad block table ? */
365
	if (chip->options & NAND_USE_FLASH_BBT)
366
		return nand_update_bbt(mtd, ofs);
367

L
Linus Torvalds 已提交
368
	/* We write two bytes, so we dont have to mess with 16 bit access */
369
	ofs += mtd->oobsize + (chip->badblockpos & ~0x01);
370
	return nand_write_oob(mtd, ofs, 2, &retlen, buf);
L
Linus Torvalds 已提交
371 372
}

373
/**
L
Linus Torvalds 已提交
374 375
 * nand_check_wp - [GENERIC] check if the chip is write protected
 * @mtd:	MTD device structure
376
 * Check, if the device is write protected
L
Linus Torvalds 已提交
377
 *
378
 * The function expects, that the device is already selected
L
Linus Torvalds 已提交
379
 */
380
static int nand_check_wp(struct mtd_info *mtd)
L
Linus Torvalds 已提交
381
{
382
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
383
	/* Check the WP bit */
384 385
	chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
	return (chip->read_byte(mtd) & NAND_STATUS_WP) ? 0 : 1;
L
Linus Torvalds 已提交
386 387 388 389 390 391 392 393 394 395 396 397
}

/**
 * nand_block_checkbad - [GENERIC] Check if a block is marked bad
 * @mtd:	MTD device structure
 * @ofs:	offset from device start
 * @getchip:	0, if the chip is already selected
 * @allowbbt:	1, if its allowed to access the bbt area
 *
 * Check, if the block is bad. Either by reading the bad block table or
 * calling of the scan function.
 */
398 399
static int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip,
			       int allowbbt)
L
Linus Torvalds 已提交
400
{
401
	struct nand_chip *chip = mtd->priv;
402

403 404
	if (!chip->bbt)
		return chip->block_bad(mtd, ofs, getchip);
405

L
Linus Torvalds 已提交
406
	/* Return info from the table */
407
	return nand_isbad_bbt(mtd, ofs, allowbbt);
L
Linus Torvalds 已提交
408 409
}

410
/*
411 412 413 414 415
 * Wait for the ready pin, after a command
 * The timeout is catched later.
 */
static void nand_wait_ready(struct mtd_info *mtd)
{
416
	struct nand_chip *chip = mtd->priv;
417
	unsigned long timeo = jiffies + 2;
418

419
	led_trigger_event(nand_led_trigger, LED_FULL);
420 421
	/* wait until command is processed or timeout occures */
	do {
422
		if (chip->dev_ready(mtd))
423
			break;
I
Ingo Molnar 已提交
424
		touch_softlockup_watchdog();
425
	} while (time_before(jiffies, timeo));
426
	led_trigger_event(nand_led_trigger, LED_OFF);
427 428
}

L
Linus Torvalds 已提交
429 430 431 432 433 434 435 436 437 438
/**
 * nand_command - [DEFAULT] Send command to NAND device
 * @mtd:	MTD device structure
 * @command:	the command to be sent
 * @column:	the column address for this command, -1 if none
 * @page_addr:	the page address for this command, -1 if none
 *
 * Send command to NAND device. This function is used for small page
 * devices (256/512 Bytes per page)
 */
439 440
static void nand_command(struct mtd_info *mtd, unsigned int command,
			 int column, int page_addr)
L
Linus Torvalds 已提交
441
{
442
	register struct nand_chip *chip = mtd->priv;
443
	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
L
Linus Torvalds 已提交
444 445 446 447 448 449 450

	/*
	 * Write out the command to the device.
	 */
	if (command == NAND_CMD_SEQIN) {
		int readcmd;

J
Joern Engel 已提交
451
		if (column >= mtd->writesize) {
L
Linus Torvalds 已提交
452
			/* OOB area */
J
Joern Engel 已提交
453
			column -= mtd->writesize;
L
Linus Torvalds 已提交
454 455 456 457 458 459 460 461
			readcmd = NAND_CMD_READOOB;
		} else if (column < 256) {
			/* First 256 bytes --> READ0 */
			readcmd = NAND_CMD_READ0;
		} else {
			column -= 256;
			readcmd = NAND_CMD_READ1;
		}
462
		chip->cmd_ctrl(mtd, readcmd, ctrl);
463
		ctrl &= ~NAND_CTRL_CHANGE;
L
Linus Torvalds 已提交
464
	}
465
	chip->cmd_ctrl(mtd, command, ctrl);
L
Linus Torvalds 已提交
466

467 468 469 470 471 472 473
	/*
	 * Address cycle, when necessary
	 */
	ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;
	/* Serially input address */
	if (column != -1) {
		/* Adjust columns for 16 bit buswidth */
474
		if (chip->options & NAND_BUSWIDTH_16)
475
			column >>= 1;
476
		chip->cmd_ctrl(mtd, column, ctrl);
477 478 479
		ctrl &= ~NAND_CTRL_CHANGE;
	}
	if (page_addr != -1) {
480
		chip->cmd_ctrl(mtd, page_addr, ctrl);
481
		ctrl &= ~NAND_CTRL_CHANGE;
482
		chip->cmd_ctrl(mtd, page_addr >> 8, ctrl);
483
		/* One more address cycle for devices > 32MiB */
484 485
		if (chip->chipsize > (32 << 20))
			chip->cmd_ctrl(mtd, page_addr >> 16, ctrl);
L
Linus Torvalds 已提交
486
	}
487
	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
488 489 490

	/*
	 * program and erase have their own busy handlers
L
Linus Torvalds 已提交
491
	 * status and sequential in needs no delay
492
	 */
L
Linus Torvalds 已提交
493
	switch (command) {
494

L
Linus Torvalds 已提交
495 496 497 498 499
	case NAND_CMD_PAGEPROG:
	case NAND_CMD_ERASE1:
	case NAND_CMD_ERASE2:
	case NAND_CMD_SEQIN:
	case NAND_CMD_STATUS:
500
		chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE);
L
Linus Torvalds 已提交
501 502 503
		return;

	case NAND_CMD_RESET:
504
		if (chip->dev_ready)
L
Linus Torvalds 已提交
505
			break;
506 507
		udelay(chip->chip_delay);
		chip->cmd_ctrl(mtd, NAND_CMD_STATUS,
508
			       NAND_CTRL_CLE | NAND_CTRL_CHANGE);
509 510
		chip->cmd_ctrl(mtd,
			       NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
511
		while (!(chip->read_byte(mtd) & NAND_STATUS_READY)) ;
L
Linus Torvalds 已提交
512 513
		return;

514
		/* This applies to read commands */
L
Linus Torvalds 已提交
515
	default:
516
		/*
L
Linus Torvalds 已提交
517 518
		 * If we don't have access to the busy pin, we apply the given
		 * command delay
519
		 */
520 521
		if (!chip->dev_ready) {
			udelay(chip->chip_delay);
L
Linus Torvalds 已提交
522
			return;
523
		}
L
Linus Torvalds 已提交
524 525 526
	}
	/* Apply this short delay always to ensure that we do wait tWB in
	 * any case on any machine. */
527
	ndelay(100);
528 529

	nand_wait_ready(mtd);
L
Linus Torvalds 已提交
530 531 532 533 534 535 536 537 538
}

/**
 * nand_command_lp - [DEFAULT] Send command to NAND large page device
 * @mtd:	MTD device structure
 * @command:	the command to be sent
 * @column:	the column address for this command, -1 if none
 * @page_addr:	the page address for this command, -1 if none
 *
539 540 541
 * Send command to NAND device. This is the version for the new large page
 * devices We dont have the separate regions as we have in the small page
 * devices.  We must emulate NAND_CMD_READOOB to keep the code compatible.
L
Linus Torvalds 已提交
542 543
 *
 */
544 545
static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
			    int column, int page_addr)
L
Linus Torvalds 已提交
546
{
547
	register struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
548 549 550

	/* Emulate NAND_CMD_READOOB */
	if (command == NAND_CMD_READOOB) {
J
Joern Engel 已提交
551
		column += mtd->writesize;
L
Linus Torvalds 已提交
552 553
		command = NAND_CMD_READ0;
	}
554

555
	/* Command latch cycle */
556
	chip->cmd_ctrl(mtd, command & 0xff,
557
		       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
L
Linus Torvalds 已提交
558 559

	if (column != -1 || page_addr != -1) {
560
		int ctrl = NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE;
L
Linus Torvalds 已提交
561 562 563 564

		/* Serially input address */
		if (column != -1) {
			/* Adjust columns for 16 bit buswidth */
565
			if (chip->options & NAND_BUSWIDTH_16)
L
Linus Torvalds 已提交
566
				column >>= 1;
567
			chip->cmd_ctrl(mtd, column, ctrl);
568
			ctrl &= ~NAND_CTRL_CHANGE;
569
			chip->cmd_ctrl(mtd, column >> 8, ctrl);
570
		}
L
Linus Torvalds 已提交
571
		if (page_addr != -1) {
572 573
			chip->cmd_ctrl(mtd, page_addr, ctrl);
			chip->cmd_ctrl(mtd, page_addr >> 8,
574
				       NAND_NCE | NAND_ALE);
L
Linus Torvalds 已提交
575
			/* One more address cycle for devices > 128MiB */
576 577
			if (chip->chipsize > (128 << 20))
				chip->cmd_ctrl(mtd, page_addr >> 16,
578
					       NAND_NCE | NAND_ALE);
L
Linus Torvalds 已提交
579 580
		}
	}
581
	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
582 583 584

	/*
	 * program and erase have their own busy handlers
585 586
	 * status, sequential in, and deplete1 need no delay
	 */
L
Linus Torvalds 已提交
587
	switch (command) {
588

L
Linus Torvalds 已提交
589 590 591 592 593 594
	case NAND_CMD_CACHEDPROG:
	case NAND_CMD_PAGEPROG:
	case NAND_CMD_ERASE1:
	case NAND_CMD_ERASE2:
	case NAND_CMD_SEQIN:
	case NAND_CMD_STATUS:
595
	case NAND_CMD_DEPLETE1:
L
Linus Torvalds 已提交
596 597
		return;

598 599 600
		/*
		 * read error status commands require only a short delay
		 */
601 602 603 604 605
	case NAND_CMD_STATUS_ERROR:
	case NAND_CMD_STATUS_ERROR0:
	case NAND_CMD_STATUS_ERROR1:
	case NAND_CMD_STATUS_ERROR2:
	case NAND_CMD_STATUS_ERROR3:
606
		udelay(chip->chip_delay);
607
		return;
L
Linus Torvalds 已提交
608 609

	case NAND_CMD_RESET:
610
		if (chip->dev_ready)
L
Linus Torvalds 已提交
611
			break;
612
		udelay(chip->chip_delay);
613 614 615 616
		chip->cmd_ctrl(mtd, NAND_CMD_STATUS,
			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
		chip->cmd_ctrl(mtd, NAND_CMD_NONE,
			       NAND_NCE | NAND_CTRL_CHANGE);
617
		while (!(chip->read_byte(mtd) & NAND_STATUS_READY)) ;
L
Linus Torvalds 已提交
618 619 620
		return;

	case NAND_CMD_READ0:
621 622 623 624
		chip->cmd_ctrl(mtd, NAND_CMD_READSTART,
			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
		chip->cmd_ctrl(mtd, NAND_CMD_NONE,
			       NAND_NCE | NAND_CTRL_CHANGE);
625

626
		/* This applies to read commands */
L
Linus Torvalds 已提交
627
	default:
628
		/*
L
Linus Torvalds 已提交
629 630
		 * If we don't have access to the busy pin, we apply the given
		 * command delay
631
		 */
632 633
		if (!chip->dev_ready) {
			udelay(chip->chip_delay);
L
Linus Torvalds 已提交
634
			return;
635
		}
L
Linus Torvalds 已提交
636
	}
637

L
Linus Torvalds 已提交
638 639
	/* Apply this short delay always to ensure that we do wait tWB in
	 * any case on any machine. */
640
	ndelay(100);
641 642

	nand_wait_ready(mtd);
L
Linus Torvalds 已提交
643 644 645 646 647 648
}

/**
 * nand_get_device - [GENERIC] Get chip for selected access
 * @this:	the nand chip descriptor
 * @mtd:	MTD device structure
649
 * @new_state:	the state which is requested
L
Linus Torvalds 已提交
650 651 652
 *
 * Get the device and lock it for exclusive access
 */
653
static int
654
nand_get_device(struct nand_chip *chip, struct mtd_info *mtd, int new_state)
L
Linus Torvalds 已提交
655
{
656 657
	spinlock_t *lock = &chip->controller->lock;
	wait_queue_head_t *wq = &chip->controller->wq;
658 659
	DECLARE_WAITQUEUE(wait, current);
 retry:
660 661
	spin_lock(lock);

L
Linus Torvalds 已提交
662
	/* Hardware controller shared among independend devices */
T
Thomas Gleixner 已提交
663
	/* Hardware controller shared among independend devices */
664 665
	if (!chip->controller->active)
		chip->controller->active = chip;
T
Thomas Gleixner 已提交
666

667 668
	if (chip->controller->active == chip && chip->state == FL_READY) {
		chip->state = new_state;
669
		spin_unlock(lock);
670 671 672 673
		return 0;
	}
	if (new_state == FL_PM_SUSPENDED) {
		spin_unlock(lock);
674
		return (chip->state == FL_PM_SUSPENDED) ? 0 : -EAGAIN;
675 676 677 678 679 680
	}
	set_current_state(TASK_UNINTERRUPTIBLE);
	add_wait_queue(wq, &wait);
	spin_unlock(lock);
	schedule();
	remove_wait_queue(wq, &wait);
L
Linus Torvalds 已提交
681 682 683 684 685 686 687 688 689 690
	goto retry;
}

/**
 * nand_wait - [DEFAULT]  wait until the command is done
 * @mtd:	MTD device structure
 * @this:	NAND chip structure
 * @state:	state to select the max. timeout value
 *
 * Wait for command done. This applies to erase and program only
691
 * Erase can take up to 400ms and program up to 20ms according to
L
Linus Torvalds 已提交
692 693 694
 * general NAND and SmartMedia specs
 *
*/
695
static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip, int state)
L
Linus Torvalds 已提交
696 697
{

698 699
	unsigned long timeo = jiffies;
	int status;
700

L
Linus Torvalds 已提交
701
	if (state == FL_ERASING)
702
		timeo += (HZ * 400) / 1000;
L
Linus Torvalds 已提交
703
	else
704
		timeo += (HZ * 20) / 1000;
L
Linus Torvalds 已提交
705

706 707
	led_trigger_event(nand_led_trigger, LED_FULL);

L
Linus Torvalds 已提交
708 709
	/* Apply this short delay always to ensure that we do wait tWB in
	 * any case on any machine. */
710
	ndelay(100);
L
Linus Torvalds 已提交
711

712 713
	if ((state == FL_ERASING) && (chip->options & NAND_IS_AND))
		chip->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1);
714
	else
715
		chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
L
Linus Torvalds 已提交
716

717
	while (time_before(jiffies, timeo)) {
L
Linus Torvalds 已提交
718
		/* Check, if we were interrupted */
719
		if (chip->state != state)
L
Linus Torvalds 已提交
720 721
			return 0;

722 723
		if (chip->dev_ready) {
			if (chip->dev_ready(mtd))
724
				break;
L
Linus Torvalds 已提交
725
		} else {
726
			if (chip->read_byte(mtd) & NAND_STATUS_READY)
L
Linus Torvalds 已提交
727 728
				break;
		}
729
		cond_resched();
L
Linus Torvalds 已提交
730
	}
731 732
	led_trigger_event(nand_led_trigger, LED_OFF);

733
	status = (int)chip->read_byte(mtd);
L
Linus Torvalds 已提交
734 735 736 737
	return status;
}

/**
738 739 740 741
 * nand_read_page_swecc - {REPLACABLE] software ecc based page read function
 * @mtd:	mtd info structure
 * @chip:	nand chip info structure
 * @buf:	buffer to store read data
742
 */
743 744
static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
				uint8_t *buf)
L
Linus Torvalds 已提交
745
{
746 747 748 749
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
750 751
	uint8_t *ecc_calc = chip->buffers.ecccalc;
	uint8_t *ecc_code = chip->buffers.ecccode;
752 753 754
	int *eccpos = chip->autooob->eccpos;

	chip->read_buf(mtd, buf, mtd->writesize);
755
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
756 757 758 759 760 761 762 763

	if (chip->ecc.mode == NAND_ECC_NONE)
		return 0;

	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);

	for (i = 0; i < chip->ecc.total; i++)
764
		ecc_code[i] = chip->oob_poi[eccpos[i]];
765 766 767 768 769 770 771 772 773 774 775 776 777 778

	eccsteps = chip->ecc.steps;
	p = buf;

	for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		int stat;

		stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
		if (stat == -1)
			mtd->ecc_stats.failed++;
		else
			mtd->ecc_stats.corrected += stat;
	}
	return 0;
779
}
L
Linus Torvalds 已提交
780

781
/**
782 783 784 785
 * nand_read_page_hwecc - {REPLACABLE] hardware ecc based page read function
 * @mtd:	mtd info structure
 * @chip:	nand chip info structure
 * @buf:	buffer to store read data
786
 *
787
 * Not for syndrome calculating ecc controllers which need a special oob layout
788
 */
789 790
static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
				uint8_t *buf)
L
Linus Torvalds 已提交
791
{
792 793 794 795
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
796 797
	uint8_t *ecc_calc = chip->buffers.ecccalc;
	uint8_t *ecc_code = chip->buffers.ecccode;
798 799 800 801 802 803
	int *eccpos = chip->autooob->eccpos;

	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		chip->ecc.hwctl(mtd, NAND_ECC_READ);
		chip->read_buf(mtd, p, eccsize);
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
L
Linus Torvalds 已提交
804
	}
805
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
L
Linus Torvalds 已提交
806

807
	for (i = 0; i < chip->ecc.total; i++)
808
		ecc_code[i] = chip->oob_poi[eccpos[i]];
L
Linus Torvalds 已提交
809

810 811
	eccsteps = chip->ecc.steps;
	p = buf;
812

813 814
	for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		int stat;
L
Linus Torvalds 已提交
815

816 817 818 819 820 821 822 823
		stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
		if (stat == -1)
			mtd->ecc_stats.failed++;
		else
			mtd->ecc_stats.corrected += stat;
	}
	return 0;
}
L
Linus Torvalds 已提交
824

825 826 827 828 829 830 831
/**
 * nand_read_page_syndrome - {REPLACABLE] hardware ecc syndrom based page read
 * @mtd:	mtd info structure
 * @chip:	nand chip info structure
 * @buf:	buffer to store read data
 *
 * The hw generator calculates the error syndrome automatically. Therefor
832
 * we need a special oob layout and handling.
833 834 835 836 837 838 839 840
 */
static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
				   uint8_t *buf)
{
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *p = buf;
841
	uint8_t *oob = chip->oob_poi;
L
Linus Torvalds 已提交
842

843 844
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		int stat;
845

846 847
		chip->ecc.hwctl(mtd, NAND_ECC_READ);
		chip->read_buf(mtd, p, eccsize);
L
Linus Torvalds 已提交
848

849 850 851 852
		if (chip->ecc.prepad) {
			chip->read_buf(mtd, oob, chip->ecc.prepad);
			oob += chip->ecc.prepad;
		}
L
Linus Torvalds 已提交
853

854 855 856
		chip->ecc.hwctl(mtd, NAND_ECC_READSYN);
		chip->read_buf(mtd, oob, eccbytes);
		stat = chip->ecc.correct(mtd, p, oob, NULL);
857

858 859
		if (stat == -1)
			mtd->ecc_stats.failed++;
860
		else
861
			mtd->ecc_stats.corrected += stat;
862

863
		oob += eccbytes;
L
Linus Torvalds 已提交
864

865 866 867
		if (chip->ecc.postpad) {
			chip->read_buf(mtd, oob, chip->ecc.postpad);
			oob += chip->ecc.postpad;
868
		}
869
	}
L
Linus Torvalds 已提交
870

871
	/* Calculate remaining oob bytes */
872
	i = oob - chip->oob_poi;
873 874
	if (i)
		chip->read_buf(mtd, oob, i);
875

876 877
	return 0;
}
L
Linus Torvalds 已提交
878

879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900
/**
 * nand_do_read - [Internal] Read data with ECC
 *
 * @mtd:	MTD device structure
 * @from:	offset to read from
 * @len:	number of bytes to read
 * @retlen:	pointer to variable to store the number of read bytes
 * @buf:	the databuffer to put data
 *
 * Internal function. Called with chip held.
 */
int nand_do_read(struct mtd_info *mtd, loff_t from, size_t len,
		 size_t *retlen, uint8_t *buf)
{
	int chipnr, page, realpage, col, bytes, aligned;
	struct nand_chip *chip = mtd->priv;
	struct mtd_ecc_stats stats;
	int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
	int sndcmd = 1;
	int ret = 0;
	uint32_t readlen = len;
	uint8_t *bufpoi;
L
Linus Torvalds 已提交
901

902
	stats = mtd->ecc_stats;
L
Linus Torvalds 已提交
903

904 905
	chipnr = (int)(from >> chip->chip_shift);
	chip->select_chip(mtd, chipnr);
906

907 908
	realpage = (int)(from >> chip->page_shift);
	page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
909

910
	col = (int)(from & (mtd->writesize - 1));
911
	chip->oob_poi = chip->buffers.oobrbuf;
912

913 914 915
	while(1) {
		bytes = min(mtd->writesize - col, readlen);
		aligned = (bytes == mtd->writesize);
916

917 918
		/* Is the current page in the buffer ? */
		if (realpage != chip->pagebuf) {
919
			bufpoi = aligned ? buf : chip->buffers.databuf;
920

921 922 923
			if (likely(sndcmd)) {
				chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
				sndcmd = 0;
L
Linus Torvalds 已提交
924 925
			}

926 927 928
			/* Now read the page into the buffer */
			ret = chip->ecc.read_page(mtd, chip, bufpoi);
			if (ret < 0)
L
Linus Torvalds 已提交
929
				break;
930 931 932 933

			/* Transfer not aligned data */
			if (!aligned) {
				chip->pagebuf = realpage;
934
				memcpy(buf, chip->buffers.databuf + col, bytes);
935 936 937 938 939 940 941 942 943 944 945 946 947 948
			}

			if (!(chip->options & NAND_NO_READRDY)) {
				/*
				 * Apply delay or wait for ready/busy pin. Do
				 * this before the AUTOINCR check, so no
				 * problems arise if a chip which does auto
				 * increment is marked as NOAUTOINCR by the
				 * board driver.
				 */
				if (!chip->dev_ready)
					udelay(chip->chip_delay);
				else
					nand_wait_ready(mtd);
L
Linus Torvalds 已提交
949
			}
950
		} else
951
			memcpy(buf, chip->buffers.databuf + col, bytes);
L
Linus Torvalds 已提交
952

953 954
		buf += bytes;
		readlen -= bytes;
955

956
		if (!readlen)
957
			break;
L
Linus Torvalds 已提交
958 959 960 961 962 963

		/* For subsequent reads align to page boundary. */
		col = 0;
		/* Increment page address */
		realpage++;

964
		page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
965 966 967
		/* Check, if we cross a chip boundary */
		if (!page) {
			chipnr++;
968 969
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
970
		}
971

972 973
		/* Check, if the chip supports auto page increment
		 * or if we have hit a block boundary.
974
		 */
975
		if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))
976
			sndcmd = 1;
L
Linus Torvalds 已提交
977 978
	}

979
	*retlen = len - (size_t) readlen;
L
Linus Torvalds 已提交
980

981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
	if (ret)
		return ret;

	return mtd->ecc_stats.failed - stats.failed ? -EBADMSG : 0;
}

/**
 * nand_read - [MTD Interface] MTD compability function for nand_do_read_ecc
 * @mtd:	MTD device structure
 * @from:	offset to read from
 * @len:	number of bytes to read
 * @retlen:	pointer to variable to store the number of read bytes
 * @buf:	the databuffer to put data
 *
 * Get hold of the chip and call nand_do_read
 */
static int nand_read(struct mtd_info *mtd, loff_t from, size_t len,
		     size_t *retlen, uint8_t *buf)
{
	int ret;

	*retlen = 0;
	/* Do not allow reads past end of device */
	if ((from + len) > mtd->size)
		return -EINVAL;
	if (!len)
		return 0;

	nand_get_device(mtd->priv, mtd, FL_READING);

	ret = nand_do_read(mtd, from, len, retlen, buf);

	nand_release_device(mtd);

	return ret;
L
Linus Torvalds 已提交
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
}

/**
 * nand_read_oob - [MTD Interface] NAND read out-of-band
 * @mtd:	MTD device structure
 * @from:	offset to read from
 * @len:	number of bytes to read
 * @retlen:	pointer to variable to store the number of read bytes
 * @buf:	the databuffer to put data
 *
 * NAND read out-of-band data from the spare area
 */
1028 1029
static int nand_read_oob(struct mtd_info *mtd, loff_t from, size_t len,
			 size_t *retlen, uint8_t *buf)
L
Linus Torvalds 已提交
1030
{
1031
	int col, page, realpage, chipnr, sndcmd = 1;
1032
	struct nand_chip *chip = mtd->priv;
1033 1034
	int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
	int readlen = len;
1035

1036 1037
	DEBUG(MTD_DEBUG_LEVEL3, "nand_read_oob: from = 0x%08x, len = %i\n",
	      (unsigned int)from, (int)len);
L
Linus Torvalds 已提交
1038 1039 1040 1041 1042 1043

	/* Initialize return length value */
	*retlen = 0;

	/* Do not allow reads past end of device */
	if ((from + len) > mtd->size) {
1044 1045
		DEBUG(MTD_DEBUG_LEVEL0, "nand_read_oob: "
		      "Attempt read beyond end of device\n");
L
Linus Torvalds 已提交
1046 1047 1048
		return -EINVAL;
	}

1049
	nand_get_device(chip, mtd, FL_READING);
L
Linus Torvalds 已提交
1050

1051
	chipnr = (int)(from >> chip->chip_shift);
1052
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1053

1054 1055 1056
	/* Shift to get page */
	realpage = (int)(from >> chip->page_shift);
	page = realpage & chip->pagemask;
L
Linus Torvalds 已提交
1057

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
	/* Mask to get column */
	col = from & (mtd->oobsize - 1);

	while(1) {
		int bytes = min((int)(mtd->oobsize - col), readlen);

		if (likely(sndcmd)) {
			chip->cmdfunc(mtd, NAND_CMD_READOOB, col, page);
			sndcmd = 0;
		}

		chip->read_buf(mtd, buf, bytes);
1070

1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
		readlen -= bytes;
		if (!readlen)
			break;

		if (!(chip->options & NAND_NO_READRDY)) {
			/*
			 * Apply delay or wait for ready/busy pin. Do this
			 * before the AUTOINCR check, so no problems arise if a
			 * chip which does auto increment is marked as
			 * NOAUTOINCR by the board driver.
1081
			 */
1082 1083
			if (!chip->dev_ready)
				udelay(chip->chip_delay);
1084 1085
			else
				nand_wait_ready(mtd);
1086
		}
1087

1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
		buf += bytes;
		bytes = mtd->oobsize;
		col = 0;

		/* Increment page address */
		realpage++;

		page = realpage & chip->pagemask;
		/* Check, if we cross a chip boundary */
		if (!page) {
			chipnr++;
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1101
		}
1102 1103 1104 1105 1106 1107

		/* Check, if the chip supports auto page increment
		 * or if we have hit a block boundary.
		 */
		if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))
			sndcmd = 1;
L
Linus Torvalds 已提交
1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
	}

	/* Deselect and wake up anyone waiting on the device */
	nand_release_device(mtd);

	*retlen = len;
	return 0;
}

/**
 * nand_read_raw - [GENERIC] Read raw data including oob into buffer
 * @mtd:	MTD device structure
 * @buf:	temporary buffer
 * @from:	offset to read from
 * @len:	number of bytes to read
 * @ooblen:	number of oob data bytes to read
 *
 * Read raw data including oob into buffer
 */
1127 1128
int nand_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t from, size_t len,
		  size_t ooblen)
L
Linus Torvalds 已提交
1129
{
1130 1131 1132
	struct nand_chip *chip = mtd->priv;
	int page = (int)(from >> chip->page_shift);
	int chipnr = (int)(from >> chip->chip_shift);
L
Linus Torvalds 已提交
1133 1134
	int sndcmd = 1;
	int cnt = 0;
J
Joern Engel 已提交
1135
	int pagesize = mtd->writesize + mtd->oobsize;
1136
	int blockcheck;
L
Linus Torvalds 已提交
1137 1138 1139

	/* Do not allow reads past end of device */
	if ((from + len) > mtd->size) {
1140 1141
		DEBUG(MTD_DEBUG_LEVEL0, "nand_read_raw: "
		      "Attempt read beyond end of device\n");
L
Linus Torvalds 已提交
1142 1143 1144 1145
		return -EINVAL;
	}

	/* Grab the lock and see if the device is available */
1146
	nand_get_device(chip, mtd, FL_READING);
L
Linus Torvalds 已提交
1147

1148
	chip->select_chip(mtd, chipnr);
1149

L
Linus Torvalds 已提交
1150 1151
	/* Add requested oob length */
	len += ooblen;
1152
	blockcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
1153

L
Linus Torvalds 已提交
1154
	while (len) {
1155
		if (likely(sndcmd)) {
1156 1157
			chip->cmdfunc(mtd, NAND_CMD_READ0, 0,
				      page & chip->pagemask);
1158 1159
			sndcmd = 0;
		}
L
Linus Torvalds 已提交
1160

1161
		chip->read_buf(mtd, &buf[cnt], pagesize);
L
Linus Torvalds 已提交
1162 1163 1164 1165

		len -= pagesize;
		cnt += pagesize;
		page++;
1166

1167 1168 1169 1170 1171 1172
		if (!(chip->options & NAND_NO_READRDY)) {
			if (!chip->dev_ready)
				udelay(chip->chip_delay);
			else
				nand_wait_ready(mtd);
		}
1173

1174 1175 1176 1177 1178
		/*
		 * Check, if the chip supports auto page increment or if we
		 * cross a block boundary.
		 */
		if (!NAND_CANAUTOINCR(chip) || !(page & blockcheck))
L
Linus Torvalds 已提交
1179 1180 1181 1182 1183 1184 1185 1186
			sndcmd = 1;
	}

	/* Deselect and wake up anyone waiting on the device */
	nand_release_device(mtd);
	return 0;
}

1187
/**
1188 1189 1190 1191
 * nand_write_page_swecc - {REPLACABLE] software ecc based page write function
 * @mtd:	mtd info structure
 * @chip:	nand chip info structure
 * @buf:	data buffer
1192
 */
1193 1194
static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
				  const uint8_t *buf)
1195
{
1196 1197 1198 1199 1200 1201
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *ecc_calc = chip->buffers.ecccalc;
	const uint8_t *p = buf;
	int *eccpos = chip->autooob->eccpos;
1202

1203 1204 1205 1206
	if (chip->ecc.mode != NAND_ECC_NONE) {
		/* Software ecc calculation */
		for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
			chip->ecc.calculate(mtd, p, &ecc_calc[i]);
1207

1208 1209
		for (i = 0; i < chip->ecc.total; i++)
			chip->oob_poi[eccpos[i]] = ecc_calc[i];
1210 1211
	}

1212 1213 1214
	chip->write_buf(mtd, buf, mtd->writesize);
	chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
}
1215

1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230
/**
 * nand_write_page_hwecc - {REPLACABLE] hardware ecc based page write function
 * @mtd:	mtd info structure
 * @chip:	nand chip info structure
 * @buf:	data buffer
 */
static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
				  const uint8_t *buf)
{
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	uint8_t *ecc_calc = chip->buffers.ecccalc;
	const uint8_t *p = buf;
	int *eccpos = chip->autooob->eccpos;
1231

1232 1233
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
		chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
1234
		chip->write_buf(mtd, p, eccsize);
1235
		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
1236 1237
	}

1238 1239 1240 1241
	for (i = 0; i < chip->ecc.total; i++)
		chip->oob_poi[eccpos[i]] = ecc_calc[i];

	chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
1242 1243
}

1244
/**
1245 1246 1247 1248
 * nand_write_page_syndrome - {REPLACABLE] hardware ecc syndrom based page write
 * @mtd:	mtd info structure
 * @chip:	nand chip info structure
 * @buf:	data buffer
L
Linus Torvalds 已提交
1249
 *
1250 1251 1252 1253 1254
 * The hw generator calculates the error syndrome automatically. Therefor
 * we need a special oob layout and handling.
 */
static void nand_write_page_syndrome(struct mtd_info *mtd,
				    struct nand_chip *chip, const uint8_t *buf)
L
Linus Torvalds 已提交
1255
{
1256 1257 1258 1259 1260
	int i, eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	int eccsteps = chip->ecc.steps;
	const uint8_t *p = buf;
	uint8_t *oob = chip->oob_poi;
L
Linus Torvalds 已提交
1261

1262
	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
L
Linus Torvalds 已提交
1263

1264 1265
		chip->ecc.hwctl(mtd, NAND_ECC_WRITE);
		chip->write_buf(mtd, p, eccsize);
1266

1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278
		if (chip->ecc.prepad) {
			chip->write_buf(mtd, oob, chip->ecc.prepad);
			oob += chip->ecc.prepad;
		}

		chip->ecc.calculate(mtd, p, oob);
		chip->write_buf(mtd, oob, eccbytes);
		oob += eccbytes;

		if (chip->ecc.postpad) {
			chip->write_buf(mtd, oob, chip->ecc.postpad);
			oob += chip->ecc.postpad;
L
Linus Torvalds 已提交
1279 1280
		}
	}
1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337

	/* Calculate remaining oob bytes */
	i = oob - chip->oob_poi;
	if (i)
		chip->write_buf(mtd, oob, i);
}

/**
 * nand_write_page - [INTERNAL] write one page
 * @mtd:	MTD device structure
 * @chip:	NAND chip descriptor
 * @buf:	the data to write
 * @page:	page number to write
 * @cached:	cached programming
 */
static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
			   const uint8_t *buf, int page, int cached)
{
	int status;

	chip->cmdfunc(mtd, NAND_CMD_SEQIN, 0x00, page);

	chip->ecc.write_page(mtd, chip, buf);

	/*
	 * Cached progamming disabled for now, Not sure if its worth the
	 * trouble. The speed gain is not very impressive. (2.3->2.6Mib/s)
	 */
	cached = 0;

	if (!cached || !(chip->options & NAND_CACHEPRG)) {

		chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
		status = chip->waitfunc(mtd, chip, FL_WRITING);
		/*
		 * See if operation failed and additional status checks are
		 * available
		 */
		if ((status & NAND_STATUS_FAIL) && (chip->errstat))
			status = chip->errstat(mtd, chip, FL_WRITING, status,
					       page);

		if (status & NAND_STATUS_FAIL)
			return -EIO;
	} else {
		chip->cmdfunc(mtd, NAND_CMD_CACHEDPROG, -1, -1);
		status = chip->waitfunc(mtd, chip, FL_WRITING);
	}

#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
	/* Send command to read back the data */
	chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);

	if (chip->verify_buf(mtd, buf, mtd->writesize))
		return -EIO;
#endif
	return 0;
L
Linus Torvalds 已提交
1338 1339
}

J
Joern Engel 已提交
1340
#define NOTALIGNED(x) (x & (mtd->writesize-1)) != 0
L
Linus Torvalds 已提交
1341 1342

/**
1343
 * nand_write - [MTD Interface] NAND write with ECC
L
Linus Torvalds 已提交
1344 1345 1346 1347 1348 1349 1350 1351
 * @mtd:	MTD device structure
 * @to:		offset to write to
 * @len:	number of bytes to write
 * @retlen:	pointer to variable to store the number of written bytes
 * @buf:	the data to write
 *
 * NAND write with ECC
 */
1352 1353
static int nand_write(struct mtd_info *mtd, loff_t to, size_t len,
			  size_t *retlen, const uint8_t *buf)
L
Linus Torvalds 已提交
1354
{
1355
	int chipnr, realpage, page, blockmask;
1356
	struct nand_chip *chip = mtd->priv;
1357 1358 1359
	uint32_t writelen = len;
	int bytes = mtd->writesize;
	int ret = -EIO;
L
Linus Torvalds 已提交
1360 1361 1362 1363 1364

	*retlen = 0;

	/* Do not allow write past end of device */
	if ((to + len) > mtd->size) {
1365 1366
		DEBUG(MTD_DEBUG_LEVEL0, "nand_write: "
		      "Attempt to write past end of page\n");
L
Linus Torvalds 已提交
1367 1368 1369
		return -EINVAL;
	}

1370
	/* reject writes, which are not page aligned */
1371
	if (NOTALIGNED(to) || NOTALIGNED(len)) {
1372 1373
		printk(KERN_NOTICE "nand_write: "
		       "Attempt to write not page aligned data\n");
L
Linus Torvalds 已提交
1374 1375 1376
		return -EINVAL;
	}

1377 1378
	if (!len)
		return 0;
L
Linus Torvalds 已提交
1379

1380
	nand_get_device(chip, mtd, FL_WRITING);
L
Linus Torvalds 已提交
1381 1382 1383 1384 1385

	/* Check, if it is write protected */
	if (nand_check_wp(mtd))
		goto out;

1386 1387
	chipnr = (int)(to >> chip->chip_shift);
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1388

1389 1390 1391 1392 1393 1394 1395
	realpage = (int)(to >> chip->page_shift);
	page = realpage & chip->pagemask;
	blockmask = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;

	/* Invalidate the page cache, when we write to the cached page */
	if (to <= (chip->pagebuf << chip->page_shift) &&
	    (chip->pagebuf << chip->page_shift) < (to + len))
1396
		chip->pagebuf = -1;
1397

1398
	chip->oob_poi = chip->buffers.oobwbuf;
1399

1400 1401
	while(1) {
		int cached = writelen > bytes && page != blockmask;
L
Linus Torvalds 已提交
1402

1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
		ret = nand_write_page(mtd, chip, buf, page, cached);
		if (ret)
			break;

		writelen -= bytes;
		if (!writelen)
			break;

		buf += bytes;
		realpage++;

		page = realpage & chip->pagemask;
		/* Check, if we cross a chip boundary */
		if (!page) {
			chipnr++;
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1420 1421
		}
	}
1422
 out:
1423
	*retlen = len - writelen;
L
Linus Torvalds 已提交
1424 1425 1426 1427
	nand_release_device(mtd);
	return ret;
}

1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476
/**
 * nand_write_raw - [GENERIC] Write raw data including oob
 * @mtd:	MTD device structure
 * @buf:	source buffer
 * @to:		offset to write to
 * @len:	number of bytes to write
 * @buf:	source buffer
 * @oob:	oob buffer
 *
 * Write raw data including oob
 */
int nand_write_raw(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen,
		   const uint8_t *buf, uint8_t *oob)
{
	struct nand_chip *chip = mtd->priv;
	int page = (int)(to >> chip->page_shift);
	int chipnr = (int)(to >> chip->chip_shift);
	int ret;

	*retlen = 0;

	/* Do not allow writes past end of device */
	if ((to + len) > mtd->size) {
		DEBUG(MTD_DEBUG_LEVEL0, "nand_read_raw: Attempt write "
		      "beyond end of device\n");
		return -EINVAL;
	}

	/* Grab the lock and see if the device is available */
	nand_get_device(chip, mtd, FL_WRITING);

	chip->select_chip(mtd, chipnr);
	chip->oob_poi = oob;

	while (len != *retlen) {
		ret = nand_write_page(mtd, chip, buf, page, 0);
		if (ret)
			return ret;
		page++;
		*retlen += mtd->writesize;
		buf += mtd->writesize;
		chip->oob_poi += mtd->oobsize;
	}

	/* Deselect and wake up anyone waiting on the device */
	nand_release_device(mtd);
	return 0;
}
EXPORT_SYMBOL_GPL(nand_write_raw);
1477

L
Linus Torvalds 已提交
1478 1479 1480 1481 1482 1483 1484 1485 1486 1487
/**
 * nand_write_oob - [MTD Interface] NAND write out-of-band
 * @mtd:	MTD device structure
 * @to:		offset to write to
 * @len:	number of bytes to write
 * @retlen:	pointer to variable to store the number of written bytes
 * @buf:	the data to write
 *
 * NAND write out-of-band
 */
1488 1489
static int nand_write_oob(struct mtd_info *mtd, loff_t to, size_t len,
			  size_t *retlen, const uint8_t *buf)
L
Linus Torvalds 已提交
1490 1491
{
	int column, page, status, ret = -EIO, chipnr;
1492
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
1493

1494 1495
	DEBUG(MTD_DEBUG_LEVEL3, "nand_write_oob: to = 0x%08x, len = %i\n",
	      (unsigned int)to, (int)len);
L
Linus Torvalds 已提交
1496 1497 1498 1499 1500

	/* Initialize return length value */
	*retlen = 0;

	/* Do not allow write past end of page */
1501
	column = to & (mtd->oobsize - 1);
L
Linus Torvalds 已提交
1502
	if ((column + len) > mtd->oobsize) {
1503 1504
		DEBUG(MTD_DEBUG_LEVEL0, "nand_write_oob: "
		      "Attempt to write past end of page\n");
L
Linus Torvalds 已提交
1505 1506 1507
		return -EINVAL;
	}

1508
	nand_get_device(chip, mtd, FL_WRITING);
L
Linus Torvalds 已提交
1509

1510
	chipnr = (int)(to >> chip->chip_shift);
1511
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1512

1513 1514 1515 1516 1517 1518 1519 1520 1521
	/* Shift to get page */
	page = (int)(to >> chip->page_shift);

	/*
	 * Reset the chip. Some chips (like the Toshiba TC5832DC found in one
	 * of my DiskOnChip 2000 test units) will clear the whole data page too
	 * if we don't do this. I have no clue why, but I seem to have 'fixed'
	 * it in the doc2000 driver in August 1999.  dwmw2.
	 */
1522
	chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
L
Linus Torvalds 已提交
1523 1524 1525 1526

	/* Check, if it is write protected */
	if (nand_check_wp(mtd))
		goto out;
1527

L
Linus Torvalds 已提交
1528
	/* Invalidate the page cache, if we write to the cached page */
1529 1530
	if (page == chip->pagebuf)
		chip->pagebuf = -1;
L
Linus Torvalds 已提交
1531

1532
	if (NAND_MUST_PAD(chip)) {
1533 1534
		chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize,
			      page & chip->pagemask);
L
Linus Torvalds 已提交
1535
		/* prepad 0xff for partial programming */
1536
		chip->write_buf(mtd, ffchars, column);
L
Linus Torvalds 已提交
1537
		/* write data */
1538
		chip->write_buf(mtd, buf, len);
L
Linus Torvalds 已提交
1539
		/* postpad 0xff for partial programming */
1540
		chip->write_buf(mtd, ffchars, mtd->oobsize - (len + column));
L
Linus Torvalds 已提交
1541
	} else {
1542 1543
		chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize + column,
			      page & chip->pagemask);
1544
		chip->write_buf(mtd, buf, len);
L
Linus Torvalds 已提交
1545 1546
	}
	/* Send command to program the OOB data */
1547
	chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
L
Linus Torvalds 已提交
1548

1549
	status = chip->waitfunc(mtd, chip, FL_WRITING);
L
Linus Torvalds 已提交
1550 1551

	/* See if device thinks it succeeded */
1552
	if (status & NAND_STATUS_FAIL) {
1553 1554
		DEBUG(MTD_DEBUG_LEVEL0, "nand_write_oob: "
		      "Failed write, page 0x%08x\n", page);
L
Linus Torvalds 已提交
1555 1556 1557 1558 1559 1560 1561
		ret = -EIO;
		goto out;
	}
	*retlen = len;

#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
	/* Send command to read back the data */
1562
	chip->cmdfunc(mtd, NAND_CMD_READOOB, column, page & chip->pagemask);
L
Linus Torvalds 已提交
1563

1564
	if (chip->verify_buf(mtd, buf, len)) {
1565 1566
		DEBUG(MTD_DEBUG_LEVEL0, "nand_write_oob: "
		      "Failed write verify, page 0x%08x\n", page);
L
Linus Torvalds 已提交
1567 1568 1569 1570 1571
		ret = -EIO;
		goto out;
	}
#endif
	ret = 0;
1572
 out:
L
Linus Torvalds 已提交
1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585
	/* Deselect and wake up anyone waiting on the device */
	nand_release_device(mtd);

	return ret;
}

/**
 * single_erease_cmd - [GENERIC] NAND standard block erase command function
 * @mtd:	MTD device structure
 * @page:	the page address of the block which will be erased
 *
 * Standard erase command for NAND chips
 */
1586
static void single_erase_cmd(struct mtd_info *mtd, int page)
L
Linus Torvalds 已提交
1587
{
1588
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
1589
	/* Send commands to erase a block */
1590 1591
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
	chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
L
Linus Torvalds 已提交
1592 1593 1594 1595 1596 1597 1598 1599 1600 1601
}

/**
 * multi_erease_cmd - [GENERIC] AND specific block erase command function
 * @mtd:	MTD device structure
 * @page:	the page address of the block which will be erased
 *
 * AND multi block erase command function
 * Erase 4 consecutive blocks
 */
1602
static void multi_erase_cmd(struct mtd_info *mtd, int page)
L
Linus Torvalds 已提交
1603
{
1604
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
1605
	/* Send commands to erase a block */
1606 1607 1608 1609 1610
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page++);
	chip->cmdfunc(mtd, NAND_CMD_ERASE1, -1, page);
	chip->cmdfunc(mtd, NAND_CMD_ERASE2, -1, -1);
L
Linus Torvalds 已提交
1611 1612 1613 1614 1615 1616 1617 1618 1619
}

/**
 * nand_erase - [MTD Interface] erase block(s)
 * @mtd:	MTD device structure
 * @instr:	erase instruction
 *
 * Erase one ore more blocks
 */
1620
static int nand_erase(struct mtd_info *mtd, struct erase_info *instr)
L
Linus Torvalds 已提交
1621
{
1622
	return nand_erase_nand(mtd, instr, 0);
L
Linus Torvalds 已提交
1623
}
1624

1625
#define BBT_PAGE_MASK	0xffffff3f
L
Linus Torvalds 已提交
1626
/**
1627
 * nand_erase_nand - [Internal] erase block(s)
L
Linus Torvalds 已提交
1628 1629 1630 1631 1632 1633
 * @mtd:	MTD device structure
 * @instr:	erase instruction
 * @allowbbt:	allow erasing the bbt area
 *
 * Erase one ore more blocks
 */
1634 1635
int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
		    int allowbbt)
L
Linus Torvalds 已提交
1636 1637
{
	int page, len, status, pages_per_block, ret, chipnr;
1638 1639 1640
	struct nand_chip *chip = mtd->priv;
	int rewrite_bbt[NAND_MAX_CHIPS]={0};
	unsigned int bbt_masked_page = 0xffffffff;
L
Linus Torvalds 已提交
1641

1642 1643
	DEBUG(MTD_DEBUG_LEVEL3, "nand_erase: start = 0x%08x, len = %i\n",
	      (unsigned int)instr->addr, (unsigned int)instr->len);
L
Linus Torvalds 已提交
1644 1645

	/* Start address must align on block boundary */
1646
	if (instr->addr & ((1 << chip->phys_erase_shift) - 1)) {
1647
		DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: Unaligned address\n");
L
Linus Torvalds 已提交
1648 1649 1650 1651
		return -EINVAL;
	}

	/* Length must align on block boundary */
1652 1653 1654
	if (instr->len & ((1 << chip->phys_erase_shift) - 1)) {
		DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: "
		      "Length not block aligned\n");
L
Linus Torvalds 已提交
1655 1656 1657 1658 1659
		return -EINVAL;
	}

	/* Do not allow erase past end of device */
	if ((instr->len + instr->addr) > mtd->size) {
1660 1661
		DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: "
		      "Erase past end of device\n");
L
Linus Torvalds 已提交
1662 1663 1664 1665 1666 1667
		return -EINVAL;
	}

	instr->fail_addr = 0xffffffff;

	/* Grab the lock and see if the device is available */
1668
	nand_get_device(chip, mtd, FL_ERASING);
L
Linus Torvalds 已提交
1669 1670

	/* Shift to get first page */
1671 1672
	page = (int)(instr->addr >> chip->page_shift);
	chipnr = (int)(instr->addr >> chip->chip_shift);
L
Linus Torvalds 已提交
1673 1674

	/* Calculate pages in each block */
1675
	pages_per_block = 1 << (chip->phys_erase_shift - chip->page_shift);
L
Linus Torvalds 已提交
1676 1677

	/* Select the NAND device */
1678
	chip->select_chip(mtd, chipnr);
L
Linus Torvalds 已提交
1679 1680 1681

	/* Check, if it is write protected */
	if (nand_check_wp(mtd)) {
1682 1683
		DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: "
		      "Device is write protected!!!\n");
L
Linus Torvalds 已提交
1684 1685 1686 1687
		instr->state = MTD_ERASE_FAILED;
		goto erase_exit;
	}

1688 1689 1690 1691 1692 1693 1694 1695
	/*
	 * If BBT requires refresh, set the BBT page mask to see if the BBT
	 * should be rewritten. Otherwise the mask is set to 0xffffffff which
	 * can not be matched. This is also done when the bbt is actually
	 * erased to avoid recusrsive updates
	 */
	if (chip->options & BBT_AUTO_REFRESH && !allowbbt)
		bbt_masked_page = chip->bbt_td->pages[chipnr] & BBT_PAGE_MASK;
1696

L
Linus Torvalds 已提交
1697 1698 1699 1700 1701 1702
	/* Loop through the pages */
	len = instr->len;

	instr->state = MTD_ERASING;

	while (len) {
1703 1704 1705 1706 1707 1708 1709
		/*
		 * heck if we have a bad block, we do not erase bad blocks !
		 */
		if (nand_block_checkbad(mtd, ((loff_t) page) <<
					chip->page_shift, 0, allowbbt)) {
			printk(KERN_WARNING "nand_erase: attempt to erase a "
			       "bad block at page 0x%08x\n", page);
L
Linus Torvalds 已提交
1710 1711 1712
			instr->state = MTD_ERASE_FAILED;
			goto erase_exit;
		}
1713

1714 1715 1716 1717 1718 1719 1720
		/*
		 * Invalidate the page cache, if we erase the block which
		 * contains the current cached page
		 */
		if (page <= chip->pagebuf && chip->pagebuf <
		    (page + pages_per_block))
			chip->pagebuf = -1;
L
Linus Torvalds 已提交
1721

1722
		chip->erase_cmd(mtd, page & chip->pagemask);
1723

1724
		status = chip->waitfunc(mtd, chip, FL_ERASING);
L
Linus Torvalds 已提交
1725

1726 1727 1728 1729 1730 1731 1732
		/*
		 * See if operation failed and additional status checks are
		 * available
		 */
		if ((status & NAND_STATUS_FAIL) && (chip->errstat))
			status = chip->errstat(mtd, chip, FL_ERASING,
					       status, page);
1733

L
Linus Torvalds 已提交
1734
		/* See if block erase succeeded */
1735
		if (status & NAND_STATUS_FAIL) {
1736 1737
			DEBUG(MTD_DEBUG_LEVEL0, "nand_erase: "
			      "Failed erase, page 0x%08x\n", page);
L
Linus Torvalds 已提交
1738
			instr->state = MTD_ERASE_FAILED;
1739
			instr->fail_addr = (page << chip->page_shift);
L
Linus Torvalds 已提交
1740 1741
			goto erase_exit;
		}
1742

1743 1744 1745 1746 1747 1748 1749
		/*
		 * If BBT requires refresh, set the BBT rewrite flag to the
		 * page being erased
		 */
		if (bbt_masked_page != 0xffffffff &&
		    (page & BBT_PAGE_MASK) == bbt_masked_page)
			    rewrite_bbt[chipnr] = (page << chip->page_shift);
1750

L
Linus Torvalds 已提交
1751
		/* Increment page address and decrement length */
1752
		len -= (1 << chip->phys_erase_shift);
L
Linus Torvalds 已提交
1753 1754 1755
		page += pages_per_block;

		/* Check, if we cross a chip boundary */
1756
		if (len && !(page & chip->pagemask)) {
L
Linus Torvalds 已提交
1757
			chipnr++;
1758 1759
			chip->select_chip(mtd, -1);
			chip->select_chip(mtd, chipnr);
1760

1761 1762 1763 1764 1765 1766 1767 1768
			/*
			 * If BBT requires refresh and BBT-PERCHIP, set the BBT
			 * page mask to see if this BBT should be rewritten
			 */
			if (bbt_masked_page != 0xffffffff &&
			    (chip->bbt_td->options & NAND_BBT_PERCHIP))
				bbt_masked_page = chip->bbt_td->pages[chipnr] &
					BBT_PAGE_MASK;
L
Linus Torvalds 已提交
1769 1770 1771 1772
		}
	}
	instr->state = MTD_ERASE_DONE;

1773
 erase_exit:
L
Linus Torvalds 已提交
1774 1775 1776 1777 1778 1779 1780 1781 1782

	ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO;
	/* Do call back function */
	if (!ret)
		mtd_erase_callback(instr);

	/* Deselect and wake up anyone waiting on the device */
	nand_release_device(mtd);

1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797
	/*
	 * If BBT requires refresh and erase was successful, rewrite any
	 * selected bad block tables
	 */
	if (bbt_masked_page == 0xffffffff || ret)
		return ret;

	for (chipnr = 0; chipnr < chip->numchips; chipnr++) {
		if (!rewrite_bbt[chipnr])
			continue;
		/* update the BBT for chip */
		DEBUG(MTD_DEBUG_LEVEL0, "nand_erase_nand: nand_update_bbt "
		      "(%d:0x%0x 0x%0x)\n", chipnr, rewrite_bbt[chipnr],
		      chip->bbt_td->pages[chipnr]);
		nand_update_bbt(mtd, rewrite_bbt[chipnr]);
1798 1799
	}

L
Linus Torvalds 已提交
1800 1801 1802 1803 1804 1805 1806 1807 1808 1809
	/* Return more or less happy */
	return ret;
}

/**
 * nand_sync - [MTD Interface] sync
 * @mtd:	MTD device structure
 *
 * Sync is actually a wait for chip ready function
 */
1810
static void nand_sync(struct mtd_info *mtd)
L
Linus Torvalds 已提交
1811
{
1812
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
1813

1814
	DEBUG(MTD_DEBUG_LEVEL3, "nand_sync: called\n");
L
Linus Torvalds 已提交
1815 1816

	/* Grab the lock and see if the device is available */
1817
	nand_get_device(chip, mtd, FL_SYNCING);
L
Linus Torvalds 已提交
1818
	/* Release it and go back */
1819
	nand_release_device(mtd);
L
Linus Torvalds 已提交
1820 1821 1822
}

/**
1823
 * nand_block_isbad - [MTD Interface] Check if block at offset is bad
L
Linus Torvalds 已提交
1824 1825 1826
 * @mtd:	MTD device structure
 * @ofs:	offset relative to mtd start
 */
1827
static int nand_block_isbad(struct mtd_info *mtd, loff_t offs)
L
Linus Torvalds 已提交
1828 1829
{
	/* Check for invalid offset */
1830
	if (offs > mtd->size)
L
Linus Torvalds 已提交
1831
		return -EINVAL;
1832

1833
	return nand_block_checkbad(mtd, offs, 1, 0);
L
Linus Torvalds 已提交
1834 1835 1836
}

/**
1837
 * nand_block_markbad - [MTD Interface] Mark block at the given offset as bad
L
Linus Torvalds 已提交
1838 1839 1840
 * @mtd:	MTD device structure
 * @ofs:	offset relative to mtd start
 */
1841
static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
L
Linus Torvalds 已提交
1842
{
1843
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
1844 1845
	int ret;

1846 1847
	if ((ret = nand_block_isbad(mtd, ofs))) {
		/* If it was bad already, return success and do nothing. */
L
Linus Torvalds 已提交
1848 1849
		if (ret > 0)
			return 0;
1850 1851
		return ret;
	}
L
Linus Torvalds 已提交
1852

1853
	return chip->block_markbad(mtd, ofs);
L
Linus Torvalds 已提交
1854 1855
}

1856 1857 1858 1859 1860 1861
/**
 * nand_suspend - [MTD Interface] Suspend the NAND flash
 * @mtd:	MTD device structure
 */
static int nand_suspend(struct mtd_info *mtd)
{
1862
	struct nand_chip *chip = mtd->priv;
1863

1864
	return nand_get_device(chip, mtd, FL_PM_SUSPENDED);
1865 1866 1867 1868 1869 1870 1871 1872
}

/**
 * nand_resume - [MTD Interface] Resume the NAND flash
 * @mtd:	MTD device structure
 */
static void nand_resume(struct mtd_info *mtd)
{
1873
	struct nand_chip *chip = mtd->priv;
1874

1875
	if (chip->state == FL_PM_SUSPENDED)
1876 1877
		nand_release_device(mtd);
	else
1878 1879
		printk(KERN_ERR "nand_resume() called for a chip which is not "
		       "in suspended state\n");
1880 1881
}

T
Thomas Gleixner 已提交
1882 1883 1884
/*
 * Set default functions
 */
1885
static void nand_set_defaults(struct nand_chip *chip, int busw)
T
Thomas Gleixner 已提交
1886
{
L
Linus Torvalds 已提交
1887
	/* check for proper chip_delay setup, set 20us if not */
1888 1889
	if (!chip->chip_delay)
		chip->chip_delay = 20;
L
Linus Torvalds 已提交
1890 1891

	/* check, if a user supplied command function given */
1892 1893
	if (chip->cmdfunc == NULL)
		chip->cmdfunc = nand_command;
L
Linus Torvalds 已提交
1894 1895

	/* check, if a user supplied wait function given */
1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916
	if (chip->waitfunc == NULL)
		chip->waitfunc = nand_wait;

	if (!chip->select_chip)
		chip->select_chip = nand_select_chip;
	if (!chip->read_byte)
		chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;
	if (!chip->read_word)
		chip->read_word = nand_read_word;
	if (!chip->block_bad)
		chip->block_bad = nand_block_bad;
	if (!chip->block_markbad)
		chip->block_markbad = nand_default_block_markbad;
	if (!chip->write_buf)
		chip->write_buf = busw ? nand_write_buf16 : nand_write_buf;
	if (!chip->read_buf)
		chip->read_buf = busw ? nand_read_buf16 : nand_read_buf;
	if (!chip->verify_buf)
		chip->verify_buf = busw ? nand_verify_buf16 : nand_verify_buf;
	if (!chip->scan_bbt)
		chip->scan_bbt = nand_default_bbt;
1917 1918 1919 1920 1921 1922 1923

	if (!chip->controller) {
		chip->controller = &chip->hwcontrol;
		spin_lock_init(&chip->controller->lock);
		init_waitqueue_head(&chip->controller->wq);
	}

T
Thomas Gleixner 已提交
1924 1925 1926
}

/*
1927
 * Get the flash and manufacturer id and lookup if the type is supported
T
Thomas Gleixner 已提交
1928 1929
 */
static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
1930
						  struct nand_chip *chip,
T
Thomas Gleixner 已提交
1931 1932 1933 1934
						  int busw, int *maf_id)
{
	struct nand_flash_dev *type = NULL;
	int i, dev_id, maf_idx;
L
Linus Torvalds 已提交
1935 1936

	/* Select the device */
1937
	chip->select_chip(mtd, 0);
L
Linus Torvalds 已提交
1938 1939

	/* Send the command for reading device ID */
1940
	chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
L
Linus Torvalds 已提交
1941 1942

	/* Read manufacturer and device IDs */
1943 1944
	*maf_id = chip->read_byte(mtd);
	dev_id = chip->read_byte(mtd);
L
Linus Torvalds 已提交
1945

T
Thomas Gleixner 已提交
1946
	/* Lookup the flash id */
L
Linus Torvalds 已提交
1947
	for (i = 0; nand_flash_ids[i].name != NULL; i++) {
T
Thomas Gleixner 已提交
1948 1949 1950 1951 1952
		if (dev_id == nand_flash_ids[i].id) {
			type =  &nand_flash_ids[i];
			break;
		}
	}
1953

T
Thomas Gleixner 已提交
1954 1955 1956
	if (!type)
		return ERR_PTR(-ENODEV);

1957
	chip->chipsize = nand_flash_ids[i].chipsize << 20;
T
Thomas Gleixner 已提交
1958 1959 1960 1961 1962

	/* Newer devices have all the information in additional id bytes */
	if (!nand_flash_ids[i].pagesize) {
		int extid;
		/* The 3rd id byte contains non relevant data ATM */
1963
		extid = chip->read_byte(mtd);
T
Thomas Gleixner 已提交
1964
		/* The 4th id byte is the important one */
1965
		extid = chip->read_byte(mtd);
T
Thomas Gleixner 已提交
1966
		/* Calc pagesize */
1967
		mtd->writesize = 1024 << (extid & 0x3);
T
Thomas Gleixner 已提交
1968 1969
		extid >>= 2;
		/* Calc oobsize */
1970
		mtd->oobsize = (8 << (extid & 0x01)) * (mtd->writesize >> 9);
T
Thomas Gleixner 已提交
1971 1972 1973 1974 1975 1976
		extid >>= 2;
		/* Calc blocksize. Blocksize is multiples of 64KiB */
		mtd->erasesize = (64 * 1024) << (extid & 0x03);
		extid >>= 2;
		/* Get buswidth information */
		busw = (extid & 0x01) ? NAND_BUSWIDTH_16 : 0;
1977

T
Thomas Gleixner 已提交
1978 1979
	} else {
		/*
1980
		 * Old devices have chip data hardcoded in the device id table
T
Thomas Gleixner 已提交
1981 1982
		 */
		mtd->erasesize = nand_flash_ids[i].erasesize;
1983 1984
		mtd->writesize = nand_flash_ids[i].pagesize;
		mtd->oobsize = mtd->writesize / 32;
T
Thomas Gleixner 已提交
1985 1986
		busw = nand_flash_ids[i].options & NAND_BUSWIDTH_16;
	}
L
Linus Torvalds 已提交
1987

T
Thomas Gleixner 已提交
1988 1989 1990 1991 1992
	/* Try to identify manufacturer */
	for (maf_idx = 0; nand_manuf_ids[maf_idx].id != 0x0; maf_id++) {
		if (nand_manuf_ids[maf_idx].id == *maf_id)
			break;
	}
1993

T
Thomas Gleixner 已提交
1994 1995
	/*
	 * Check, if buswidth is correct. Hardware drivers should set
1996
	 * chip correct !
T
Thomas Gleixner 已提交
1997
	 */
1998
	if (busw != (chip->options & NAND_BUSWIDTH_16)) {
T
Thomas Gleixner 已提交
1999 2000 2001 2002
		printk(KERN_INFO "NAND device: Manufacturer ID:"
		       " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id,
		       dev_id, nand_manuf_ids[maf_idx].name, mtd->name);
		printk(KERN_WARNING "NAND bus width %d instead %d bit\n",
2003
		       (chip->options & NAND_BUSWIDTH_16) ? 16 : 8,
T
Thomas Gleixner 已提交
2004 2005 2006
		       busw ? 16 : 8);
		return ERR_PTR(-EINVAL);
	}
2007

T
Thomas Gleixner 已提交
2008
	/* Calculate the address shift from the page size */
2009
	chip->page_shift = ffs(mtd->writesize) - 1;
T
Thomas Gleixner 已提交
2010
	/* Convert chipsize to number of pages per chip -1. */
2011
	chip->pagemask = (chip->chipsize >> chip->page_shift) - 1;
2012

2013
	chip->bbt_erase_shift = chip->phys_erase_shift =
T
Thomas Gleixner 已提交
2014
		ffs(mtd->erasesize) - 1;
2015
	chip->chip_shift = ffs(chip->chipsize) - 1;
L
Linus Torvalds 已提交
2016

T
Thomas Gleixner 已提交
2017
	/* Set the bad block position */
2018
	chip->badblockpos = mtd->writesize > 512 ?
T
Thomas Gleixner 已提交
2019
		NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS;
2020

T
Thomas Gleixner 已提交
2021
	/* Get chip options, preserve non chip based options */
2022 2023
	chip->options &= ~NAND_CHIPOPTIONS_MSK;
	chip->options |= nand_flash_ids[i].options & NAND_CHIPOPTIONS_MSK;
T
Thomas Gleixner 已提交
2024 2025

	/*
2026
	 * Set chip as a default. Board drivers can override it, if necessary
T
Thomas Gleixner 已提交
2027
	 */
2028
	chip->options |= NAND_NO_AUTOINCR;
T
Thomas Gleixner 已提交
2029

2030
	/* Check if chip is a not a samsung device. Do not clear the
T
Thomas Gleixner 已提交
2031 2032 2033
	 * options for chips which are not having an extended id.
	 */
	if (*maf_id != NAND_MFR_SAMSUNG && !nand_flash_ids[i].pagesize)
2034
		chip->options &= ~NAND_SAMSUNG_LP_OPTIONS;
T
Thomas Gleixner 已提交
2035 2036

	/* Check for AND chips with 4 page planes */
2037 2038
	if (chip->options & NAND_4PAGE_ARRAY)
		chip->erase_cmd = multi_erase_cmd;
T
Thomas Gleixner 已提交
2039
	else
2040
		chip->erase_cmd = single_erase_cmd;
T
Thomas Gleixner 已提交
2041 2042

	/* Do not replace user supplied command function ! */
2043 2044
	if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
		chip->cmdfunc = nand_command_lp;
T
Thomas Gleixner 已提交
2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070

	printk(KERN_INFO "NAND device: Manufacturer ID:"
	       " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, dev_id,
	       nand_manuf_ids[maf_idx].name, type->name);

	return type;
}

/* module_text_address() isn't exported, and it's mostly a pointless
   test if this is a module _anyway_ -- they'd have to try _really_ hard
   to call us from in-kernel code if the core NAND support is modular. */
#ifdef MODULE
#define caller_is_module() (1)
#else
#define caller_is_module() \
	module_text_address((unsigned long)__builtin_return_address(0))
#endif

/**
 * nand_scan - [NAND Interface] Scan for the NAND device
 * @mtd:	MTD device structure
 * @maxchips:	Number of chips to scan for
 *
 * This fills out all the uninitialized function pointers
 * with the defaults.
 * The flash ID is read and the mtd/chip structures are
2071
 * filled with the appropriate values.
T
Thomas Gleixner 已提交
2072 2073 2074 2075 2076 2077
 * The mtd->owner field must be set to the module of the caller
 *
 */
int nand_scan(struct mtd_info *mtd, int maxchips)
{
	int i, busw, nand_maf_id;
2078
	struct nand_chip *chip = mtd->priv;
T
Thomas Gleixner 已提交
2079 2080 2081 2082 2083 2084
	struct nand_flash_dev *type;

	/* Many callers got this wrong, so check for it for a while... */
	if (!mtd->owner && caller_is_module()) {
		printk(KERN_CRIT "nand_scan() called with NULL mtd->owner!\n");
		BUG();
L
Linus Torvalds 已提交
2085 2086
	}

T
Thomas Gleixner 已提交
2087
	/* Get buswidth to select the correct functions */
2088
	busw = chip->options & NAND_BUSWIDTH_16;
T
Thomas Gleixner 已提交
2089
	/* Set the default functions */
2090
	nand_set_defaults(chip, busw);
T
Thomas Gleixner 已提交
2091 2092

	/* Read the flash type */
2093
	type = nand_get_flash_type(mtd, chip, busw, &nand_maf_id);
T
Thomas Gleixner 已提交
2094 2095

	if (IS_ERR(type)) {
2096
		printk(KERN_WARNING "No NAND device found!!!\n");
2097
		chip->select_chip(mtd, -1);
T
Thomas Gleixner 已提交
2098
		return PTR_ERR(type);
L
Linus Torvalds 已提交
2099 2100
	}

T
Thomas Gleixner 已提交
2101
	/* Check for a chip array */
2102
	for (i = 1; i < maxchips; i++) {
2103
		chip->select_chip(mtd, i);
L
Linus Torvalds 已提交
2104
		/* Send the command for reading device ID */
2105
		chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
L
Linus Torvalds 已提交
2106
		/* Read manufacturer and device IDs */
2107 2108
		if (nand_maf_id != chip->read_byte(mtd) ||
		    type->id != chip->read_byte(mtd))
L
Linus Torvalds 已提交
2109 2110 2111 2112
			break;
	}
	if (i > 1)
		printk(KERN_INFO "%d NAND chips detected\n", i);
2113

L
Linus Torvalds 已提交
2114
	/* Store the number of chips and calc total size for mtd */
2115 2116
	chip->numchips = i;
	mtd->size = i * chip->chipsize;
T
Thomas Gleixner 已提交
2117

2118 2119
	/* Preset the internal oob write buffer */
	memset(chip->buffers.oobwbuf, 0xff, mtd->oobsize);
L
Linus Torvalds 已提交
2120

T
Thomas Gleixner 已提交
2121 2122 2123
	/*
	 * If no default placement scheme is given, select an appropriate one
	 */
2124
	if (!chip->autooob) {
2125
		switch (mtd->oobsize) {
L
Linus Torvalds 已提交
2126
		case 8:
2127
			chip->autooob = &nand_oob_8;
L
Linus Torvalds 已提交
2128 2129
			break;
		case 16:
2130
			chip->autooob = &nand_oob_16;
L
Linus Torvalds 已提交
2131 2132
			break;
		case 64:
2133
			chip->autooob = &nand_oob_64;
L
Linus Torvalds 已提交
2134 2135
			break;
		default:
T
Thomas Gleixner 已提交
2136 2137
			printk(KERN_WARNING "No oob scheme defined for "
			       "oobsize %d\n", mtd->oobsize);
L
Linus Torvalds 已提交
2138 2139 2140
			BUG();
		}
	}
2141

T
Thomas Gleixner 已提交
2142 2143 2144 2145
	/*
	 * The number of bytes available for the filesystem to place fs
	 * dependend oob data
	 */
2146
	mtd->oobavail = 0;
2147 2148
	for (i = 0; chip->autooob->oobfree[i][1]; i++)
		mtd->oobavail += chip->autooob->oobfree[i][1];
L
Linus Torvalds 已提交
2149

2150
	/*
T
Thomas Gleixner 已提交
2151 2152
	 * check ECC mode, default to software if 3byte/512byte hardware ECC is
	 * selected and we have 256 byte pagesize fallback to software ECC
2153
	 */
2154
	switch (chip->ecc.mode) {
T
Thomas Gleixner 已提交
2155
	case NAND_ECC_HW:
2156 2157 2158
		/* Use standard hwecc read page function ? */
		if (!chip->ecc.read_page)
			chip->ecc.read_page = nand_read_page_hwecc;
2159 2160
		if (!chip->ecc.write_page)
			chip->ecc.write_page = nand_write_page_hwecc;
2161

T
Thomas Gleixner 已提交
2162
	case NAND_ECC_HW_SYNDROME:
2163 2164
		if (!chip->ecc.calculate || !chip->ecc.correct ||
		    !chip->ecc.hwctl) {
T
Thomas Gleixner 已提交
2165 2166 2167 2168
			printk(KERN_WARNING "No ECC functions supplied, "
			       "Hardware ECC not possible\n");
			BUG();
		}
2169
		/* Use standard syndrome read/write page function ? */
2170 2171
		if (!chip->ecc.read_page)
			chip->ecc.read_page = nand_read_page_syndrome;
2172 2173
		if (!chip->ecc.write_page)
			chip->ecc.write_page = nand_write_page_syndrome;
2174

2175
		if (mtd->writesize >= chip->ecc.size)
T
Thomas Gleixner 已提交
2176 2177 2178
			break;
		printk(KERN_WARNING "%d byte HW ECC not possible on "
		       "%d byte page size, fallback to SW ECC\n",
2179 2180
		       chip->ecc.size, mtd->writesize);
		chip->ecc.mode = NAND_ECC_SOFT;
2181

T
Thomas Gleixner 已提交
2182
	case NAND_ECC_SOFT:
2183 2184
		chip->ecc.calculate = nand_calculate_ecc;
		chip->ecc.correct = nand_correct_data;
2185
		chip->ecc.read_page = nand_read_page_swecc;
2186
		chip->ecc.write_page = nand_write_page_swecc;
2187 2188
		chip->ecc.size = 256;
		chip->ecc.bytes = 3;
L
Linus Torvalds 已提交
2189
		break;
2190 2191

	case NAND_ECC_NONE:
T
Thomas Gleixner 已提交
2192 2193
		printk(KERN_WARNING "NAND_ECC_NONE selected by board driver. "
		       "This is not recommended !!\n");
2194
		chip->ecc.read_page = nand_read_page_swecc;
2195
		chip->ecc.write_page = nand_write_page_swecc;
2196 2197
		chip->ecc.size = mtd->writesize;
		chip->ecc.bytes = 0;
L
Linus Torvalds 已提交
2198 2199
		break;
	default:
T
Thomas Gleixner 已提交
2200
		printk(KERN_WARNING "Invalid NAND_ECC_MODE %d\n",
2201
		       chip->ecc.mode);
2202
		BUG();
L
Linus Torvalds 已提交
2203
	}
2204

T
Thomas Gleixner 已提交
2205 2206 2207 2208
	/*
	 * Set the number of read / write steps for one page depending on ECC
	 * mode
	 */
2209 2210
	chip->ecc.steps = mtd->writesize / chip->ecc.size;
	if(chip->ecc.steps * chip->ecc.size != mtd->writesize) {
T
Thomas Gleixner 已提交
2211 2212
		printk(KERN_WARNING "Invalid ecc parameters\n");
		BUG();
L
Linus Torvalds 已提交
2213
	}
2214
	chip->ecc.total = chip->ecc.steps * chip->ecc.bytes;
2215

2216
	/* Initialize state */
2217
	chip->state = FL_READY;
L
Linus Torvalds 已提交
2218 2219

	/* De-select the device */
2220
	chip->select_chip(mtd, -1);
L
Linus Torvalds 已提交
2221 2222

	/* Invalidate the pagebuffer reference */
2223
	chip->pagebuf = -1;
L
Linus Torvalds 已提交
2224 2225 2226

	/* Fill in remaining MTD driver data */
	mtd->type = MTD_NANDFLASH;
J
Joern Engel 已提交
2227
	mtd->flags = MTD_CAP_NANDFLASH;
L
Linus Torvalds 已提交
2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238
	mtd->ecctype = MTD_ECC_SW;
	mtd->erase = nand_erase;
	mtd->point = NULL;
	mtd->unpoint = NULL;
	mtd->read = nand_read;
	mtd->write = nand_write;
	mtd->read_oob = nand_read_oob;
	mtd->write_oob = nand_write_oob;
	mtd->sync = nand_sync;
	mtd->lock = NULL;
	mtd->unlock = NULL;
2239 2240
	mtd->suspend = nand_suspend;
	mtd->resume = nand_resume;
L
Linus Torvalds 已提交
2241 2242 2243 2244
	mtd->block_isbad = nand_block_isbad;
	mtd->block_markbad = nand_block_markbad;

	/* and make the autooob the default one */
2245
	memcpy(&mtd->oobinfo, chip->autooob, sizeof(mtd->oobinfo));
L
Linus Torvalds 已提交
2246

2247
	/* Check, if we should skip the bad block table scan */
2248
	if (chip->options & NAND_SKIP_BBTSCAN)
2249
		return 0;
L
Linus Torvalds 已提交
2250 2251

	/* Build bad block table */
2252
	return chip->scan_bbt(mtd);
L
Linus Torvalds 已提交
2253 2254 2255
}

/**
2256
 * nand_release - [NAND Interface] Free resources held by the NAND device
L
Linus Torvalds 已提交
2257 2258
 * @mtd:	MTD device structure
*/
2259
void nand_release(struct mtd_info *mtd)
L
Linus Torvalds 已提交
2260
{
2261
	struct nand_chip *chip = mtd->priv;
L
Linus Torvalds 已提交
2262 2263 2264

#ifdef CONFIG_MTD_PARTITIONS
	/* Deregister partitions */
2265
	del_mtd_partitions(mtd);
L
Linus Torvalds 已提交
2266 2267
#endif
	/* Deregister the device */
2268
	del_mtd_device(mtd);
L
Linus Torvalds 已提交
2269

J
Jesper Juhl 已提交
2270
	/* Free bad block table memory */
2271
	kfree(chip->bbt);
L
Linus Torvalds 已提交
2272 2273
}

2274 2275
EXPORT_SYMBOL_GPL(nand_scan);
EXPORT_SYMBOL_GPL(nand_release);
2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290

static int __init nand_base_init(void)
{
	led_trigger_register_simple("nand-disk", &nand_led_trigger);
	return 0;
}

static void __exit nand_base_exit(void)
{
	led_trigger_unregister_simple(nand_led_trigger);
}

module_init(nand_base_init);
module_exit(nand_base_exit);

2291 2292 2293
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Steven J. Hill <sjhill@realitydiluted.com>, Thomas Gleixner <tglx@linutronix.de>");
MODULE_DESCRIPTION("Generic NAND flash driver code");