atmel_nand.c 19.1 KB
Newer Older
A
Andrew Victor 已提交
1 2 3 4 5 6 7 8 9
/*
 *  Copyright (C) 2003 Rick Bronson
 *
 *  Derived from drivers/mtd/nand/autcpu12.c
 *	 Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de)
 *
 *  Derived from drivers/mtd/spia.c
 *	 Copyright (C) 2000 Steven J. Hill (sjhill@cotw.com)
 *
10 11 12 13 14 15 16 17 18
 *
 *  Add Hardware ECC support for AT91SAM9260 / AT91SAM9263
 *     Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright (C) 2007
 *
 *     Derived from Das U-Boot source code
 *     		(u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c)
 *     (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas
 *
 *
A
Andrew Victor 已提交
19 20 21 22 23 24
 * 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.
 *
 */

25
#include <linux/dma-mapping.h>
A
Andrew Victor 已提交
26 27
#include <linux/slab.h>
#include <linux/module.h>
28
#include <linux/moduleparam.h>
A
Andrew Victor 已提交
29
#include <linux/platform_device.h>
30 31 32 33
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/of_mtd.h>
A
Andrew Victor 已提交
34 35 36 37
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>

38
#include <linux/dmaengine.h>
39 40
#include <linux/gpio.h>
#include <linux/io.h>
41
#include <linux/platform_data/atmel.h>
A
Andrew Victor 已提交
42

43
#include <mach/cpu.h>
A
Andrew Victor 已提交
44

45 46 47
static int use_dma = 1;
module_param(use_dma, int, 0);

48 49 50
static int on_flash_bbt = 0;
module_param(on_flash_bbt, int, 0);

51 52
/* Register access macros */
#define ecc_readl(add, reg)				\
53
	__raw_readl(add + ATMEL_ECC_##reg)
54
#define ecc_writel(add, reg, value)			\
55
	__raw_writel((value), add + ATMEL_ECC_##reg)
56

57
#include "atmel_nand_ecc.h"	/* Hardware ECC registers */
58 59 60 61 62 63

/* oob layout for large page size
 * bad block info is on bytes 0 and 1
 * the bytes have to be consecutives to avoid
 * several NAND_CMD_RNDOUT during read
 */
64
static struct nand_ecclayout atmel_oobinfo_large = {
65 66 67 68 69 70 71 72 73 74 75 76
	.eccbytes = 4,
	.eccpos = {60, 61, 62, 63},
	.oobfree = {
		{2, 58}
	},
};

/* oob layout for small page size
 * bad block info is on bytes 4 and 5
 * the bytes have to be consecutives to avoid
 * several NAND_CMD_RNDOUT during read
 */
77
static struct nand_ecclayout atmel_oobinfo_small = {
78 79 80 81 82 83 84
	.eccbytes = 4,
	.eccpos = {0, 1, 2, 3},
	.oobfree = {
		{6, 10}
	},
};

85
struct atmel_nand_host {
A
Andrew Victor 已提交
86 87 88
	struct nand_chip	nand_chip;
	struct mtd_info		mtd;
	void __iomem		*io_base;
89
	dma_addr_t		io_phys;
90
	struct atmel_nand_data	board;
91 92
	struct device		*dev;
	void __iomem		*ecc;
93 94 95

	struct completion	comp;
	struct dma_chan		*dma_chan;
A
Andrew Victor 已提交
96 97
};

98 99 100 101 102
static int cpu_has_dma(void)
{
	return cpu_is_at91sam9rl() || cpu_is_at91sam9g45();
}

103 104 105
/*
 * Enable NAND.
 */
106
static void atmel_nand_enable(struct atmel_nand_host *host)
107
{
108 109
	if (gpio_is_valid(host->board.enable_pin))
		gpio_set_value(host->board.enable_pin, 0);
110 111 112 113 114
}

/*
 * Disable NAND.
 */
115
static void atmel_nand_disable(struct atmel_nand_host *host)
116
{
117 118
	if (gpio_is_valid(host->board.enable_pin))
		gpio_set_value(host->board.enable_pin, 1);
119 120
}

A
Andrew Victor 已提交
121 122 123
/*
 * Hardware specific access to control-lines
 */
124
static void atmel_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
A
Andrew Victor 已提交
125 126
{
	struct nand_chip *nand_chip = mtd->priv;
127
	struct atmel_nand_host *host = nand_chip->priv;
A
Andrew Victor 已提交
128

129
	if (ctrl & NAND_CTRL_CHANGE) {
130
		if (ctrl & NAND_NCE)
131
			atmel_nand_enable(host);
132
		else
133
			atmel_nand_disable(host);
134
	}
A
Andrew Victor 已提交
135 136 137 138
	if (cmd == NAND_CMD_NONE)
		return;

	if (ctrl & NAND_CLE)
139
		writeb(cmd, host->io_base + (1 << host->board.cle));
A
Andrew Victor 已提交
140
	else
141
		writeb(cmd, host->io_base + (1 << host->board.ale));
A
Andrew Victor 已提交
142 143 144 145 146
}

/*
 * Read the Device Ready pin.
 */
147
static int atmel_nand_device_ready(struct mtd_info *mtd)
A
Andrew Victor 已提交
148 149
{
	struct nand_chip *nand_chip = mtd->priv;
150
	struct atmel_nand_host *host = nand_chip->priv;
A
Andrew Victor 已提交
151

152 153
	return gpio_get_value(host->board.rdy_pin) ^
                !!host->board.rdy_pin_active_low;
A
Andrew Victor 已提交
154 155
}

156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
/*
 * Minimal-overhead PIO for data access.
 */
static void atmel_read_buf8(struct mtd_info *mtd, u8 *buf, int len)
{
	struct nand_chip	*nand_chip = mtd->priv;

	__raw_readsb(nand_chip->IO_ADDR_R, buf, len);
}

static void atmel_read_buf16(struct mtd_info *mtd, u8 *buf, int len)
{
	struct nand_chip	*nand_chip = mtd->priv;

	__raw_readsw(nand_chip->IO_ADDR_R, buf, len / 2);
}

static void atmel_write_buf8(struct mtd_info *mtd, const u8 *buf, int len)
{
	struct nand_chip	*nand_chip = mtd->priv;

	__raw_writesb(nand_chip->IO_ADDR_W, buf, len);
}

static void atmel_write_buf16(struct mtd_info *mtd, const u8 *buf, int len)
{
	struct nand_chip	*nand_chip = mtd->priv;

	__raw_writesw(nand_chip->IO_ADDR_W, buf, len / 2);
}

187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
static void dma_complete_func(void *completion)
{
	complete(completion);
}

static int atmel_nand_dma_op(struct mtd_info *mtd, void *buf, int len,
			       int is_read)
{
	struct dma_device *dma_dev;
	enum dma_ctrl_flags flags;
	dma_addr_t dma_src_addr, dma_dst_addr, phys_addr;
	struct dma_async_tx_descriptor *tx = NULL;
	dma_cookie_t cookie;
	struct nand_chip *chip = mtd->priv;
	struct atmel_nand_host *host = chip->priv;
	void *p = buf;
	int err = -EIO;
	enum dma_data_direction dir = is_read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;

206 207
	if (buf >= high_memory)
		goto err_buf;
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260

	dma_dev = host->dma_chan->device;

	flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT | DMA_COMPL_SKIP_SRC_UNMAP |
		DMA_COMPL_SKIP_DEST_UNMAP;

	phys_addr = dma_map_single(dma_dev->dev, p, len, dir);
	if (dma_mapping_error(dma_dev->dev, phys_addr)) {
		dev_err(host->dev, "Failed to dma_map_single\n");
		goto err_buf;
	}

	if (is_read) {
		dma_src_addr = host->io_phys;
		dma_dst_addr = phys_addr;
	} else {
		dma_src_addr = phys_addr;
		dma_dst_addr = host->io_phys;
	}

	tx = dma_dev->device_prep_dma_memcpy(host->dma_chan, dma_dst_addr,
					     dma_src_addr, len, flags);
	if (!tx) {
		dev_err(host->dev, "Failed to prepare DMA memcpy\n");
		goto err_dma;
	}

	init_completion(&host->comp);
	tx->callback = dma_complete_func;
	tx->callback_param = &host->comp;

	cookie = tx->tx_submit(tx);
	if (dma_submit_error(cookie)) {
		dev_err(host->dev, "Failed to do DMA tx_submit\n");
		goto err_dma;
	}

	dma_async_issue_pending(host->dma_chan);
	wait_for_completion(&host->comp);

	err = 0;

err_dma:
	dma_unmap_single(dma_dev->dev, phys_addr, len, dir);
err_buf:
	if (err != 0)
		dev_warn(host->dev, "Fall back to CPU I/O\n");
	return err;
}

static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len)
{
	struct nand_chip *chip = mtd->priv;
261
	struct atmel_nand_host *host = chip->priv;
262

263 264
	if (use_dma && len > mtd->oobsize)
		/* only use DMA for bigger than oob size: better performances */
265 266 267
		if (atmel_nand_dma_op(mtd, buf, len, 1) == 0)
			return;

268
	if (host->board.bus_width_16)
269 270 271
		atmel_read_buf16(mtd, buf, len);
	else
		atmel_read_buf8(mtd, buf, len);
272 273 274 275 276
}

static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
{
	struct nand_chip *chip = mtd->priv;
277
	struct atmel_nand_host *host = chip->priv;
278

279 280
	if (use_dma && len > mtd->oobsize)
		/* only use DMA for bigger than oob size: better performances */
281 282 283
		if (atmel_nand_dma_op(mtd, (void *)buf, len, 0) == 0)
			return;

284
	if (host->board.bus_width_16)
285 286 287
		atmel_write_buf16(mtd, buf, len);
	else
		atmel_write_buf8(mtd, buf, len);
288 289
}

290 291 292 293 294 295 296 297 298
/*
 * Calculate HW ECC
 *
 * function called after a write
 *
 * mtd:        MTD block structure
 * dat:        raw data (unused)
 * ecc_code:   buffer for ECC
 */
299
static int atmel_nand_calculate(struct mtd_info *mtd,
300 301 302
		const u_char *dat, unsigned char *ecc_code)
{
	struct nand_chip *nand_chip = mtd->priv;
303
	struct atmel_nand_host *host = nand_chip->priv;
304 305 306
	unsigned int ecc_value;

	/* get the first 2 ECC bytes */
307
	ecc_value = ecc_readl(host->ecc, PR);
308

309 310
	ecc_code[0] = ecc_value & 0xFF;
	ecc_code[1] = (ecc_value >> 8) & 0xFF;
311 312

	/* get the last 2 ECC bytes */
313
	ecc_value = ecc_readl(host->ecc, NPR) & ATMEL_ECC_NPARITY;
314

315 316
	ecc_code[2] = ecc_value & 0xFF;
	ecc_code[3] = (ecc_value >> 8) & 0xFF;
317 318 319 320 321 322 323 324 325 326 327

	return 0;
}

/*
 * HW ECC read page function
 *
 * mtd:        mtd info structure
 * chip:       nand chip info structure
 * buf:        buffer to store read data
 */
328
static int atmel_nand_read_page(struct mtd_info *mtd,
329
		struct nand_chip *chip, uint8_t *buf, int page)
330 331 332 333 334 335 336 337
{
	int eccsize = chip->ecc.size;
	int eccbytes = chip->ecc.bytes;
	uint32_t *eccpos = chip->ecc.layout->eccpos;
	uint8_t *p = buf;
	uint8_t *oob = chip->oob_poi;
	uint8_t *ecc_pos;
	int stat;
338
	unsigned int max_bitflips = 0;
339

340 341 342 343 344 345 346 347 348 349 350 351 352
	/*
	 * Errata: ALE is incorrectly wired up to the ECC controller
	 * on the AP7000, so it will include the address cycles in the
	 * ECC calculation.
	 *
	 * Workaround: Reset the parity registers before reading the
	 * actual data.
	 */
	if (cpu_is_at32ap7000()) {
		struct atmel_nand_host *host = chip->priv;
		ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
	}

353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
	/* read the page */
	chip->read_buf(mtd, p, eccsize);

	/* move to ECC position if needed */
	if (eccpos[0] != 0) {
		/* This only works on large pages
		 * because the ECC controller waits for
		 * NAND_CMD_RNDOUTSTART after the
		 * NAND_CMD_RNDOUT.
		 * anyway, for small pages, the eccpos[0] == 0
		 */
		chip->cmdfunc(mtd, NAND_CMD_RNDOUT,
				mtd->writesize + eccpos[0], -1);
	}

	/* the ECC controller needs to read the ECC just after the data */
	ecc_pos = oob + eccpos[0];
	chip->read_buf(mtd, ecc_pos, eccbytes);

	/* check if there's an error */
	stat = chip->ecc.correct(mtd, p, oob, NULL);

375
	if (stat < 0) {
376
		mtd->ecc_stats.failed++;
377
	} else {
378
		mtd->ecc_stats.corrected += stat;
379 380
		max_bitflips = max_t(unsigned int, max_bitflips, stat);
	}
381 382 383 384 385 386 387

	/* get back to oob start (end of page) */
	chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1);

	/* read the oob */
	chip->read_buf(mtd, oob, mtd->oobsize);

388
	return max_bitflips;
389 390 391 392 393 394 395 396 397 398 399 400 401 402
}

/*
 * HW ECC Correction
 *
 * function called after a read
 *
 * mtd:        MTD block structure
 * dat:        raw data read from the chip
 * read_ecc:   ECC from the chip (unused)
 * isnull:     unused
 *
 * Detect and correct a 1 bit error for a page
 */
403
static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat,
404 405 406
		u_char *read_ecc, u_char *isnull)
{
	struct nand_chip *nand_chip = mtd->priv;
407
	struct atmel_nand_host *host = nand_chip->priv;
408 409 410 411 412 413 414
	unsigned int ecc_status;
	unsigned int ecc_word, ecc_bit;

	/* get the status from the Status Register */
	ecc_status = ecc_readl(host->ecc, SR);

	/* if there's no error */
415
	if (likely(!(ecc_status & ATMEL_ECC_RECERR)))
416 417 418
		return 0;

	/* get error bit offset (4 bits) */
419
	ecc_bit = ecc_readl(host->ecc, PR) & ATMEL_ECC_BITADDR;
420
	/* get word address (12 bits) */
421
	ecc_word = ecc_readl(host->ecc, PR) & ATMEL_ECC_WORDADDR;
422 423 424
	ecc_word >>= 4;

	/* if there are multiple errors */
425
	if (ecc_status & ATMEL_ECC_MULERR) {
426 427
		/* check if it is a freshly erased block
		 * (filled with 0xff) */
428 429
		if ((ecc_bit == ATMEL_ECC_BITADDR)
				&& (ecc_word == (ATMEL_ECC_WORDADDR >> 4))) {
430 431 432 433 434 435
			/* the block has just been erased, return OK */
			return 0;
		}
		/* it doesn't seems to be a freshly
		 * erased block.
		 * We can't correct so many errors */
436
		dev_dbg(host->dev, "atmel_nand : multiple errors detected."
437 438 439 440 441
				" Unable to correct.\n");
		return -EIO;
	}

	/* if there's a single bit error : we can correct it */
442
	if (ecc_status & ATMEL_ECC_ECCERR) {
443 444 445
		/* there's nothing much to do here.
		 * the bit error is on the ECC itself.
		 */
446
		dev_dbg(host->dev, "atmel_nand : one bit error on ECC code."
447 448 449 450
				" Nothing to correct\n");
		return 0;
	}

451
	dev_dbg(host->dev, "atmel_nand : one bit error on data."
452 453 454 455 456 457 458 459 460 461 462
			" (word offset in the page :"
			" 0x%x bit offset : 0x%x)\n",
			ecc_word, ecc_bit);
	/* correct the error */
	if (nand_chip->options & NAND_BUSWIDTH_16) {
		/* 16 bits words */
		((unsigned short *) dat)[ecc_word] ^= (1 << ecc_bit);
	} else {
		/* 8 bits words */
		dat[ecc_word] ^= (1 << ecc_bit);
	}
463
	dev_dbg(host->dev, "atmel_nand : error corrected\n");
464 465 466 467
	return 1;
}

/*
468
 * Enable HW ECC : unused on most chips
469
 */
470 471 472 473 474 475 476 477
static void atmel_nand_hwctl(struct mtd_info *mtd, int mode)
{
	if (cpu_is_at32ap7000()) {
		struct nand_chip *nand_chip = mtd->priv;
		struct atmel_nand_host *host = nand_chip->priv;
		ecc_writel(host->ecc, CR, ATMEL_ECC_RST);
	}
}
478

479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
#if defined(CONFIG_OF)
static int __devinit atmel_of_init_port(struct atmel_nand_host *host,
					 struct device_node *np)
{
	u32 val;
	int ecc_mode;
	struct atmel_nand_data *board = &host->board;
	enum of_gpio_flags flags;

	if (of_property_read_u32(np, "atmel,nand-addr-offset", &val) == 0) {
		if (val >= 32) {
			dev_err(host->dev, "invalid addr-offset %u\n", val);
			return -EINVAL;
		}
		board->ale = val;
	}

	if (of_property_read_u32(np, "atmel,nand-cmd-offset", &val) == 0) {
		if (val >= 32) {
			dev_err(host->dev, "invalid cmd-offset %u\n", val);
			return -EINVAL;
		}
		board->cle = val;
	}

	ecc_mode = of_get_nand_ecc_mode(np);

	board->ecc_mode = ecc_mode < 0 ? NAND_ECC_SOFT : ecc_mode;

	board->on_flash_bbt = of_get_nand_on_flash_bbt(np);

	if (of_get_nand_bus_width(np) == 16)
		board->bus_width_16 = 1;

	board->rdy_pin = of_get_gpio_flags(np, 0, &flags);
	board->rdy_pin_active_low = (flags == OF_GPIO_ACTIVE_LOW);

	board->enable_pin = of_get_gpio(np, 1);
	board->det_pin = of_get_gpio(np, 2);

	return 0;
}
#else
static int __devinit atmel_of_init_port(struct atmel_nand_host *host,
					 struct device_node *np)
{
	return -EINVAL;
}
#endif

A
Andrew Victor 已提交
529 530 531
/*
 * Probe for the NAND device.
 */
532
static int __init atmel_nand_probe(struct platform_device *pdev)
A
Andrew Victor 已提交
533
{
534
	struct atmel_nand_host *host;
A
Andrew Victor 已提交
535 536
	struct mtd_info *mtd;
	struct nand_chip *nand_chip;
537 538
	struct resource *regs;
	struct resource *mem;
539
	struct mtd_part_parser_data ppdata = {};
A
Andrew Victor 已提交
540 541
	int res;

542 543 544 545 546 547
	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem) {
		printk(KERN_ERR "atmel_nand: can't get I/O resource mem\n");
		return -ENXIO;
	}

A
Andrew Victor 已提交
548
	/* Allocate memory for the device structure (and zero it) */
549
	host = kzalloc(sizeof(struct atmel_nand_host), GFP_KERNEL);
A
Andrew Victor 已提交
550
	if (!host) {
551
		printk(KERN_ERR "atmel_nand: failed to allocate device structure.\n");
A
Andrew Victor 已提交
552 553 554
		return -ENOMEM;
	}

555 556
	host->io_phys = (dma_addr_t)mem->start;

557
	host->io_base = ioremap(mem->start, resource_size(mem));
A
Andrew Victor 已提交
558
	if (host->io_base == NULL) {
559
		printk(KERN_ERR "atmel_nand: ioremap failed\n");
560 561
		res = -EIO;
		goto err_nand_ioremap;
A
Andrew Victor 已提交
562 563 564 565
	}

	mtd = &host->mtd;
	nand_chip = &host->nand_chip;
566
	host->dev = &pdev->dev;
567 568 569 570 571 572 573 574
	if (pdev->dev.of_node) {
		res = atmel_of_init_port(host, pdev->dev.of_node);
		if (res)
			goto err_nand_ioremap;
	} else {
		memcpy(&host->board, pdev->dev.platform_data,
		       sizeof(struct atmel_nand_data));
	}
A
Andrew Victor 已提交
575 576 577 578 579 580 581 582

	nand_chip->priv = host;		/* link the private data structures */
	mtd->priv = nand_chip;
	mtd->owner = THIS_MODULE;

	/* Set address of NAND IO lines */
	nand_chip->IO_ADDR_R = host->io_base;
	nand_chip->IO_ADDR_W = host->io_base;
583
	nand_chip->cmd_ctrl = atmel_nand_cmd_ctrl;
I
Ivan Kuten 已提交
584

585
	if (gpio_is_valid(host->board.rdy_pin))
586
		nand_chip->dev_ready = atmel_nand_device_ready;
I
Ivan Kuten 已提交
587

588
	nand_chip->ecc.mode = host->board.ecc_mode;
589

590
	regs = platform_get_resource(pdev, IORESOURCE_MEM, 1);
591
	if (!regs && nand_chip->ecc.mode == NAND_ECC_HW) {
592
		printk(KERN_ERR "atmel_nand: can't get I/O resource "
593
				"regs\nFalling back on software ECC\n");
594
		nand_chip->ecc.mode = NAND_ECC_SOFT;
595 596
	}

597
	if (nand_chip->ecc.mode == NAND_ECC_HW) {
598
		host->ecc = ioremap(regs->start, resource_size(regs));
599
		if (host->ecc == NULL) {
600
			printk(KERN_ERR "atmel_nand: ioremap failed\n");
601 602 603
			res = -EIO;
			goto err_ecc_ioremap;
		}
604 605 606 607
		nand_chip->ecc.calculate = atmel_nand_calculate;
		nand_chip->ecc.correct = atmel_nand_correct;
		nand_chip->ecc.hwctl = atmel_nand_hwctl;
		nand_chip->ecc.read_page = atmel_nand_read_page;
608
		nand_chip->ecc.bytes = 4;
M
Mike Dunn 已提交
609
		nand_chip->ecc.strength = 1;
610 611
	}

A
Andrew Victor 已提交
612 613
	nand_chip->chip_delay = 20;		/* 20us command delay time */

614
	if (host->board.bus_width_16)	/* 16-bit bus width */
615
		nand_chip->options |= NAND_BUSWIDTH_16;
616 617 618

	nand_chip->read_buf = atmel_read_buf;
	nand_chip->write_buf = atmel_write_buf;
619

A
Andrew Victor 已提交
620
	platform_set_drvdata(pdev, host);
621
	atmel_nand_enable(host);
A
Andrew Victor 已提交
622

623 624
	if (gpio_is_valid(host->board.det_pin)) {
		if (gpio_get_value(host->board.det_pin)) {
625
			printk(KERN_INFO "No SmartMedia card inserted.\n");
R
Roel Kluin 已提交
626
			res = -ENXIO;
627
			goto err_no_card;
A
Andrew Victor 已提交
628 629 630
		}
	}

631
	if (host->board.on_flash_bbt || on_flash_bbt) {
632
		printk(KERN_INFO "atmel_nand: Use On Flash BBT\n");
633
		nand_chip->bbt_options |= NAND_BBT_USE_FLASH;
634 635
	}

636 637 638 639
	if (!cpu_has_dma())
		use_dma = 0;

	if (use_dma) {
640 641 642 643
		dma_cap_mask_t mask;

		dma_cap_zero(mask);
		dma_cap_set(DMA_MEMCPY, mask);
644
		host->dma_chan = dma_request_channel(mask, NULL, NULL);
645 646 647 648 649 650
		if (!host->dma_chan) {
			dev_err(host->dev, "Failed to request DMA channel\n");
			use_dma = 0;
		}
	}
	if (use_dma)
651 652
		dev_info(host->dev, "Using %s for DMA transfers.\n",
					dma_chan_name(host->dma_chan));
653 654 655
	else
		dev_info(host->dev, "No DMA support for NAND access.\n");

656
	/* first scan to find the device and get the page size */
657
	if (nand_scan_ident(mtd, 1, NULL)) {
658
		res = -ENXIO;
659
		goto err_scan_ident;
660 661
	}

662
	if (nand_chip->ecc.mode == NAND_ECC_HW) {
663 664 665 666 667 668
		/* ECC is calculated for the whole page (1 step) */
		nand_chip->ecc.size = mtd->writesize;

		/* set ECC page size and oob layout */
		switch (mtd->writesize) {
		case 512:
669 670
			nand_chip->ecc.layout = &atmel_oobinfo_small;
			ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_528);
671 672
			break;
		case 1024:
673 674
			nand_chip->ecc.layout = &atmel_oobinfo_large;
			ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_1056);
675 676
			break;
		case 2048:
677 678
			nand_chip->ecc.layout = &atmel_oobinfo_large;
			ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_2112);
679 680
			break;
		case 4096:
681 682
			nand_chip->ecc.layout = &atmel_oobinfo_large;
			ecc_writel(host->ecc, MR, ATMEL_ECC_PAGESIZE_4224);
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700
			break;
		default:
			/* page size not handled by HW ECC */
			/* switching back to soft ECC */
			nand_chip->ecc.mode = NAND_ECC_SOFT;
			nand_chip->ecc.calculate = NULL;
			nand_chip->ecc.correct = NULL;
			nand_chip->ecc.hwctl = NULL;
			nand_chip->ecc.read_page = NULL;
			nand_chip->ecc.postpad = 0;
			nand_chip->ecc.prepad = 0;
			nand_chip->ecc.bytes = 0;
			break;
		}
	}

	/* second phase scan */
	if (nand_scan_tail(mtd)) {
A
Andrew Victor 已提交
701
		res = -ENXIO;
702
		goto err_scan_tail;
A
Andrew Victor 已提交
703 704
	}

705
	mtd->name = "atmel_nand";
706 707 708
	ppdata.of_node = pdev->dev.of_node;
	res = mtd_device_parse_register(mtd, NULL, &ppdata,
			host->board.parts, host->board.num_parts);
A
Andrew Victor 已提交
709 710 711
	if (!res)
		return res;

712 713 714
err_scan_tail:
err_scan_ident:
err_no_card:
715
	atmel_nand_disable(host);
A
Andrew Victor 已提交
716
	platform_set_drvdata(pdev, NULL);
717 718
	if (host->dma_chan)
		dma_release_channel(host->dma_chan);
719 720 721
	if (host->ecc)
		iounmap(host->ecc);
err_ecc_ioremap:
A
Andrew Victor 已提交
722
	iounmap(host->io_base);
723
err_nand_ioremap:
A
Andrew Victor 已提交
724 725 726 727 728 729 730
	kfree(host);
	return res;
}

/*
 * Remove a NAND device.
 */
731
static int __exit atmel_nand_remove(struct platform_device *pdev)
A
Andrew Victor 已提交
732
{
733
	struct atmel_nand_host *host = platform_get_drvdata(pdev);
A
Andrew Victor 已提交
734 735 736 737
	struct mtd_info *mtd = &host->mtd;

	nand_release(mtd);

738
	atmel_nand_disable(host);
A
Andrew Victor 已提交
739

740 741
	if (host->ecc)
		iounmap(host->ecc);
742 743 744 745

	if (host->dma_chan)
		dma_release_channel(host->dma_chan);

A
Andrew Victor 已提交
746 747 748 749 750 751
	iounmap(host->io_base);
	kfree(host);

	return 0;
}

752 753 754 755 756 757 758 759 760
#if defined(CONFIG_OF)
static const struct of_device_id atmel_nand_dt_ids[] = {
	{ .compatible = "atmel,at91rm9200-nand" },
	{ /* sentinel */ }
};

MODULE_DEVICE_TABLE(of, atmel_nand_dt_ids);
#endif

761
static struct platform_driver atmel_nand_driver = {
762
	.remove		= __exit_p(atmel_nand_remove),
A
Andrew Victor 已提交
763
	.driver		= {
764
		.name	= "atmel_nand",
A
Andrew Victor 已提交
765
		.owner	= THIS_MODULE,
766
		.of_match_table	= of_match_ptr(atmel_nand_dt_ids),
A
Andrew Victor 已提交
767 768 769
	},
};

770
static int __init atmel_nand_init(void)
A
Andrew Victor 已提交
771
{
772
	return platform_driver_probe(&atmel_nand_driver, atmel_nand_probe);
A
Andrew Victor 已提交
773 774 775
}


776
static void __exit atmel_nand_exit(void)
A
Andrew Victor 已提交
777
{
778
	platform_driver_unregister(&atmel_nand_driver);
A
Andrew Victor 已提交
779 780 781
}


782 783
module_init(atmel_nand_init);
module_exit(atmel_nand_exit);
A
Andrew Victor 已提交
784 785 786

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Rick Bronson");
787
MODULE_DESCRIPTION("NAND/SmartMedia driver for AT91 / AVR32");
788
MODULE_ALIAS("platform:atmel_nand");