mxc_nand.c 24.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
/*
 * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
 * Copyright 2008 Sascha Hauer, kernel@pengutronix.de
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 */

#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
#include <linux/interrupt.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/io.h>

#include <asm/mach/flash.h>
#include <mach/mxc_nand.h>
S
Sascha Hauer 已提交
36
#include <mach/hardware.h>
37 38 39

#define DRIVER_NAME "mxc_nand"

S
Sascha Hauer 已提交
40
#define nfc_is_v21()		(cpu_is_mx25() || cpu_is_mx35())
I
Ivo Clarysse 已提交
41
#define nfc_is_v1()		(cpu_is_mx31() || cpu_is_mx27() || cpu_is_mx21())
S
Sascha Hauer 已提交
42

43
/* Addresses for NFC registers */
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
#define NFC_V1_V2_BUF_SIZE		(host->regs + 0x00)
#define NFC_V1_V2_BUF_ADDR		(host->regs + 0x04)
#define NFC_V1_V2_FLASH_ADDR		(host->regs + 0x06)
#define NFC_V1_V2_FLASH_CMD		(host->regs + 0x08)
#define NFC_V1_V2_CONFIG		(host->regs + 0x0a)
#define NFC_V1_V2_ECC_STATUS_RESULT	(host->regs + 0x0c)
#define NFC_V1_V2_RSLTMAIN_AREA		(host->regs + 0x0e)
#define NFC_V1_V2_RSLTSPARE_AREA	(host->regs + 0x10)
#define NFC_V1_V2_WRPROT		(host->regs + 0x12)
#define NFC_V1_UNLOCKSTART_BLKADDR	(host->regs + 0x14)
#define NFC_V1_UNLOCKEND_BLKADDR	(host->regs + 0x16)
#define NFC_V21_UNLOCKSTART_BLKADDR	(host->regs + 0x20)
#define NFC_V21_UNLOCKEND_BLKADDR	(host->regs + 0x22)
#define NFC_V1_V2_NF_WRPRST		(host->regs + 0x18)
#define NFC_V1_V2_CONFIG1		(host->regs + 0x1a)
#define NFC_V1_V2_CONFIG2		(host->regs + 0x1c)

S
Sascha Hauer 已提交
61
#define NFC_V2_CONFIG1_ECC_MODE_4	(1 << 0)
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
#define NFC_V1_V2_CONFIG1_SP_EN		(1 << 2)
#define NFC_V1_V2_CONFIG1_ECC_EN	(1 << 3)
#define NFC_V1_V2_CONFIG1_INT_MSK	(1 << 4)
#define NFC_V1_V2_CONFIG1_BIG		(1 << 5)
#define NFC_V1_V2_CONFIG1_RST		(1 << 6)
#define NFC_V1_V2_CONFIG1_CE		(1 << 7)
#define NFC_V1_V2_CONFIG1_ONE_CYCLE	(1 << 8)

#define NFC_V1_V2_CONFIG2_INT		(1 << 15)

/*
 * Operation modes for the NFC. Valid for v1, v2 and v3
 * type controllers.
 */
#define NFC_CMD				(1 << 0)
#define NFC_ADDR			(1 << 1)
#define NFC_INPUT			(1 << 2)
#define NFC_OUTPUT			(1 << 3)
#define NFC_ID				(1 << 4)
#define NFC_STATUS			(1 << 5)
82 83 84 85 86 87 88

struct mxc_nand_host {
	struct mtd_info		mtd;
	struct nand_chip	nand;
	struct mtd_partition	*parts;
	struct device		*dev;

89 90 91 92
	void			*spare0;
	void			*main_area0;

	void __iomem		*base;
93 94 95 96 97
	void __iomem		*regs;
	int			status_request;
	struct clk		*clk;
	int			clk_act;
	int			irq;
98
	int			eccsize;
99 100 101

	wait_queue_head_t	irq_waitq;

S
Sascha Hauer 已提交
102 103 104
	uint8_t			*data_buf;
	unsigned int		buf_start;
	int			spare_len;
105 106 107 108 109 110 111

	void			(*preset)(struct mtd_info *);
	void			(*send_cmd)(struct mxc_nand_host *, uint16_t, int);
	void			(*send_addr)(struct mxc_nand_host *, uint16_t, int);
	void			(*send_page)(struct mtd_info *, unsigned int);
	void			(*send_read_id)(struct mxc_nand_host *);
	uint16_t		(*get_dev_status)(struct mxc_nand_host *);
112
	int			(*check_int)(struct mxc_nand_host *);
113 114 115
};

/* OOB placement block for use with hardware ecc generation */
S
Sascha Hauer 已提交
116
static struct nand_ecclayout nandv1_hw_eccoob_smallpage = {
117 118
	.eccbytes = 5,
	.eccpos = {6, 7, 8, 9, 10},
119
	.oobfree = {{0, 5}, {12, 4}, }
120 121
};

S
Sascha Hauer 已提交
122
static struct nand_ecclayout nandv1_hw_eccoob_largepage = {
123 124 125 126
	.eccbytes = 20,
	.eccpos = {6, 7, 8, 9, 10, 22, 23, 24, 25, 26,
		   38, 39, 40, 41, 42, 54, 55, 56, 57, 58},
	.oobfree = {{2, 4}, {11, 10}, {27, 10}, {43, 10}, {59, 5}, }
127 128
};

S
Sascha Hauer 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
/* OOB description for 512 byte pages with 16 byte OOB */
static struct nand_ecclayout nandv2_hw_eccoob_smallpage = {
	.eccbytes = 1 * 9,
	.eccpos = {
		 7,  8,  9, 10, 11, 12, 13, 14, 15
	},
	.oobfree = {
		{.offset = 0, .length = 5}
	}
};

/* OOB description for 2048 byte pages with 64 byte OOB */
static struct nand_ecclayout nandv2_hw_eccoob_largepage = {
	.eccbytes = 4 * 9,
	.eccpos = {
		 7,  8,  9, 10, 11, 12, 13, 14, 15,
		23, 24, 25, 26, 27, 28, 29, 30, 31,
		39, 40, 41, 42, 43, 44, 45, 46, 47,
		55, 56, 57, 58, 59, 60, 61, 62, 63
	},
	.oobfree = {
		{.offset = 2, .length = 4},
		{.offset = 16, .length = 7},
		{.offset = 32, .length = 7},
		{.offset = 48, .length = 7}
	}
};

157 158 159 160 161 162 163 164
#ifdef CONFIG_MTD_PARTITIONS
static const char *part_probes[] = { "RedBoot", "cmdlinepart", NULL };
#endif

static irqreturn_t mxc_nfc_irq(int irq, void *dev_id)
{
	struct mxc_nand_host *host = dev_id;

I
Ivo Clarysse 已提交
165
	disable_irq_nosync(irq);
166 167 168 169 170 171

	wake_up(&host->irq_waitq);

	return IRQ_HANDLED;
}

172 173 174 175
static int check_int_v1_v2(struct mxc_nand_host *host)
{
	uint32_t tmp;

176 177
	tmp = readw(NFC_V1_V2_CONFIG2);
	if (!(tmp & NFC_V1_V2_CONFIG2_INT))
178 179
		return 0;

180
	writew(tmp & ~NFC_V1_V2_CONFIG2_INT, NFC_V1_V2_CONFIG2);
181 182 183 184

	return 1;
}

185 186 187
/* This function polls the NANDFC to wait for the basic operation to
 * complete by checking the INT bit of config2 register.
 */
S
Sascha Hauer 已提交
188
static void wait_op_done(struct mxc_nand_host *host, int useirq)
189
{
I
Ivo Clarysse 已提交
190
	int max_retries = 8000;
191 192

	if (useirq) {
193
		if (!host->check_int(host)) {
194

I
Ivo Clarysse 已提交
195
			enable_irq(host->irq);
196

197
			wait_event(host->irq_waitq, host->check_int(host));
198 199 200
		}
	} else {
		while (max_retries-- > 0) {
201
			if (host->check_int(host))
202
				break;
203

204 205
			udelay(1);
		}
206
		if (max_retries < 0)
S
Sascha Hauer 已提交
207 208
			DEBUG(MTD_DEBUG_LEVEL0, "%s: INT not set\n",
			      __func__);
209 210 211 212 213
	}
}

/* This function issues the specified command to the NAND device and
 * waits for completion. */
214
static void send_cmd_v1_v2(struct mxc_nand_host *host, uint16_t cmd, int useirq)
215 216 217
{
	DEBUG(MTD_DEBUG_LEVEL3, "send_cmd(host, 0x%x, %d)\n", cmd, useirq);

218 219
	writew(cmd, NFC_V1_V2_FLASH_CMD);
	writew(NFC_CMD, NFC_V1_V2_CONFIG2);
220

I
Ivo Clarysse 已提交
221 222 223 224 225
	if (cpu_is_mx21() && (cmd == NAND_CMD_RESET)) {
		int max_retries = 100;
		/* Reset completion is indicated by NFC_CONFIG2 */
		/* being set to 0 */
		while (max_retries-- > 0) {
226
			if (readw(NFC_V1_V2_CONFIG2) == 0) {
I
Ivo Clarysse 已提交
227 228 229 230 231 232 233 234 235 236 237
				break;
			}
			udelay(1);
		}
		if (max_retries < 0)
			DEBUG(MTD_DEBUG_LEVEL0, "%s: RESET failed\n",
			      __func__);
	} else {
		/* Wait for operation to complete */
		wait_op_done(host, useirq);
	}
238 239 240 241 242
}

/* This function sends an address (or partial address) to the
 * NAND device. The address is used to select the source/destination for
 * a NAND command. */
243
static void send_addr_v1_v2(struct mxc_nand_host *host, uint16_t addr, int islast)
244 245 246
{
	DEBUG(MTD_DEBUG_LEVEL3, "send_addr(host, 0x%x %d)\n", addr, islast);

247 248
	writew(addr, NFC_V1_V2_FLASH_ADDR);
	writew(NFC_ADDR, NFC_V1_V2_CONFIG2);
249 250

	/* Wait for operation to complete */
S
Sascha Hauer 已提交
251
	wait_op_done(host, islast);
252 253
}

254
static void send_page_v1_v2(struct mtd_info *mtd, unsigned int ops)
255
{
256 257
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;
258
	int bufs, i;
259

S
Sascha Hauer 已提交
260
	if (nfc_is_v1() && mtd->writesize > 512)
261 262 263
		bufs = 4;
	else
		bufs = 1;
264

265
	for (i = 0; i < bufs; i++) {
266

267
		/* NANDFC buffer 0 is used for page read/write */
268
		writew(i, NFC_V1_V2_BUF_ADDR);
269

270
		writew(ops, NFC_V1_V2_CONFIG2);
271

272
		/* Wait for operation to complete */
S
Sascha Hauer 已提交
273
		wait_op_done(host, true);
274 275 276 277
	}
}

/* Request the NANDFC to perform a read of the NAND device ID. */
278
static void send_read_id_v1_v2(struct mxc_nand_host *host)
279 280 281 282
{
	struct nand_chip *this = &host->nand;

	/* NANDFC buffer 0 is used for device ID output */
283
	writew(0x0, NFC_V1_V2_BUF_ADDR);
284

285
	writew(NFC_ID, NFC_V1_V2_CONFIG2);
286 287

	/* Wait for operation to complete */
S
Sascha Hauer 已提交
288
	wait_op_done(host, true);
289 290

	if (this->options & NAND_BUSWIDTH_16) {
291
		void __iomem *main_buf = host->main_area0;
292 293 294 295 296 297 298
		/* compress the ID info */
		writeb(readb(main_buf + 2), main_buf + 1);
		writeb(readb(main_buf + 4), main_buf + 2);
		writeb(readb(main_buf + 6), main_buf + 3);
		writeb(readb(main_buf + 8), main_buf + 4);
		writeb(readb(main_buf + 10), main_buf + 5);
	}
299
	memcpy(host->data_buf, host->main_area0, 16);
300 301 302 303
}

/* This function requests the NANDFC to perform a read of the
 * NAND device status and returns the current status. */
304
static uint16_t get_dev_status_v1_v2(struct mxc_nand_host *host)
305
{
S
Sascha Hauer 已提交
306
	void __iomem *main_buf = host->main_area0;
307
	uint32_t store;
308
	uint16_t ret;
309

S
Sascha Hauer 已提交
310 311 312 313 314 315 316
	writew(0x0, NFC_V1_V2_BUF_ADDR);

	/*
	 * The device status is stored in main_area0. To
	 * prevent corruption of the buffer save the value
	 * and restore it afterwards.
	 */
317 318
	store = readl(main_buf);

319
	writew(NFC_STATUS, NFC_V1_V2_CONFIG2);
S
Sascha Hauer 已提交
320
	wait_op_done(host, true);
321 322

	ret = readw(main_buf);
S
Sascha Hauer 已提交
323

324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
	writel(store, main_buf);

	return ret;
}

/* This functions is used by upper layer to checks if device is ready */
static int mxc_nand_dev_ready(struct mtd_info *mtd)
{
	/*
	 * NFC handles R/B internally. Therefore, this function
	 * always returns status as ready.
	 */
	return 1;
}

static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
{
	/*
	 * If HW ECC is enabled, we turn it on during init. There is
	 * no need to enable again here.
	 */
}

347
static int mxc_nand_correct_data_v1(struct mtd_info *mtd, u_char *dat,
348 349 350 351 352 353 354 355 356 357
				 u_char *read_ecc, u_char *calc_ecc)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;

	/*
	 * 1-Bit errors are automatically corrected in HW.  No need for
	 * additional correction.  2-Bit errors cannot be corrected by
	 * HW ECC, so we need to return failure
	 */
358
	uint16_t ecc_status = readw(NFC_V1_V2_ECC_STATUS_RESULT);
359 360 361 362 363 364 365 366 367 368

	if (((ecc_status & 0x3) == 2) || ((ecc_status >> 2) == 2)) {
		DEBUG(MTD_DEBUG_LEVEL0,
		      "MXC_NAND: HWECC uncorrectable 2-bit ECC error\n");
		return -1;
	}

	return 0;
}

369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
static int mxc_nand_correct_data_v2_v3(struct mtd_info *mtd, u_char *dat,
				 u_char *read_ecc, u_char *calc_ecc)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;
	u32 ecc_stat, err;
	int no_subpages = 1;
	int ret = 0;
	u8 ecc_bit_mask, err_limit;

	ecc_bit_mask = (host->eccsize == 4) ? 0x7 : 0xf;
	err_limit = (host->eccsize == 4) ? 0x4 : 0x8;

	no_subpages = mtd->writesize >> 9;

	ecc_stat = readl(NFC_V1_V2_ECC_STATUS_RESULT);

	do {
		err = ecc_stat & ecc_bit_mask;
		if (err > err_limit) {
			printk(KERN_WARNING "UnCorrectable RS-ECC Error\n");
			return -1;
		} else {
			ret += err;
		}
		ecc_stat >>= 4;
	} while (--no_subpages);

	mtd->ecc_stats.corrected += ret;
	pr_debug("%d Symbol Correctable RS-ECC Error\n", ret);

	return ret;
}

403 404 405 406 407 408 409 410 411 412
static int mxc_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
				  u_char *ecc_code)
{
	return 0;
}

static u_char mxc_nand_read_byte(struct mtd_info *mtd)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;
S
Sascha Hauer 已提交
413
	uint8_t ret;
414 415 416

	/* Check for status request */
	if (host->status_request)
417
		return host->get_dev_status(host) & 0xFF;
418

S
Sascha Hauer 已提交
419 420
	ret = *(uint8_t *)(host->data_buf + host->buf_start);
	host->buf_start++;
421 422 423 424 425 426 427 428

	return ret;
}

static uint16_t mxc_nand_read_word(struct mtd_info *mtd)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;
S
Sascha Hauer 已提交
429
	uint16_t ret;
430

S
Sascha Hauer 已提交
431 432
	ret = *(uint16_t *)(host->data_buf + host->buf_start);
	host->buf_start += 2;
433 434 435 436 437 438 439 440 441 442 443 444

	return ret;
}

/* Write data of length len to buffer buf. The data to be
 * written on NAND Flash is first copied to RAMbuffer. After the Data Input
 * Operation by the NFC, the data is written to NAND Flash */
static void mxc_nand_write_buf(struct mtd_info *mtd,
				const u_char *buf, int len)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;
S
Sascha Hauer 已提交
445 446
	u16 col = host->buf_start;
	int n = mtd->oobsize + mtd->writesize - col;
447

S
Sascha Hauer 已提交
448
	n = min(n, len);
449

S
Sascha Hauer 已提交
450
	memcpy(host->data_buf + col, buf, n);
451

S
Sascha Hauer 已提交
452
	host->buf_start += n;
453 454 455 456 457 458 459 460 461 462
}

/* Read the data buffer from the NAND Flash. To read the data from NAND
 * Flash first the data output cycle is initiated by the NFC, which copies
 * the data to RAMbuffer. This data of length len is then copied to buffer buf.
 */
static void mxc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;
S
Sascha Hauer 已提交
463 464
	u16 col = host->buf_start;
	int n = mtd->oobsize + mtd->writesize - col;
465

S
Sascha Hauer 已提交
466
	n = min(n, len);
467

S
Sascha Hauer 已提交
468
	memcpy(buf, host->data_buf + col, len);
469

S
Sascha Hauer 已提交
470
	host->buf_start += len;
471 472 473 474 475 476 477 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
}

/* Used by the upper layer to verify the data in NAND Flash
 * with the data in the buf. */
static int mxc_nand_verify_buf(struct mtd_info *mtd,
				const u_char *buf, int len)
{
	return -EFAULT;
}

/* This function is used by upper layer for select and
 * deselect of the NAND chip */
static void mxc_nand_select_chip(struct mtd_info *mtd, int chip)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;

	switch (chip) {
	case -1:
		/* Disable the NFC clock */
		if (host->clk_act) {
			clk_disable(host->clk);
			host->clk_act = 0;
		}
		break;
	case 0:
		/* Enable the NFC clock */
		if (!host->clk_act) {
			clk_enable(host->clk);
			host->clk_act = 1;
		}
		break;

	default:
		break;
	}
}

S
Sascha Hauer 已提交
509 510 511 512
/*
 * Function to transfer data to/from spare area.
 */
static void copy_spare(struct mtd_info *mtd, bool bfrom)
513
{
S
Sascha Hauer 已提交
514 515 516 517 518
	struct nand_chip *this = mtd->priv;
	struct mxc_nand_host *host = this->priv;
	u16 i, j;
	u16 n = mtd->writesize >> 9;
	u8 *d = host->data_buf + mtd->writesize;
519
	u8 *s = host->spare0;
S
Sascha Hauer 已提交
520 521 522 523 524 525 526 527 528 529 530 531 532
	u16 t = host->spare_len;

	j = (mtd->oobsize / n >> 1) << 1;

	if (bfrom) {
		for (i = 0; i < n - 1; i++)
			memcpy(d + i * j, s + i * t, j);

		/* the last section */
		memcpy(d + i * j, s + i * t, mtd->oobsize - i * j);
	} else {
		for (i = 0; i < n - 1; i++)
			memcpy(&s[i * t], &d[i * j], j);
533

S
Sascha Hauer 已提交
534 535
		/* the last section */
		memcpy(&s[i * t], &d[i * j], mtd->oobsize - i * j);
536
	}
S
Sascha Hauer 已提交
537
}
538

539 540 541 542
static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;
543 544 545 546 547 548 549

	/* Write out column address, if necessary */
	if (column != -1) {
		/*
		 * MXC NANDFC can only perform full page+spare or
		 * spare-only read/write.  When the upper layers
		 * layers perform a read/write buf operation,
D
Daniel Mack 已提交
550
		 * we will used the saved column address to index into
551 552
		 * the full page.
		 */
553
		host->send_addr(host, 0, page_addr == -1);
554
		if (mtd->writesize > 512)
555
			/* another col addr cycle for 2k page */
556
			host->send_addr(host, 0, false);
557 558 559 560 561
	}

	/* Write out page address, if necessary */
	if (page_addr != -1) {
		/* paddr_0 - p_addr_7 */
562
		host->send_addr(host, (page_addr & 0xff), false);
563

564
		if (mtd->writesize > 512) {
565 566
			if (mtd->size >= 0x10000000) {
				/* paddr_8 - paddr_15 */
567 568
				host->send_addr(host, (page_addr >> 8) & 0xff, false);
				host->send_addr(host, (page_addr >> 16) & 0xff, true);
569 570
			} else
				/* paddr_8 - paddr_15 */
571
				host->send_addr(host, (page_addr >> 8) & 0xff, true);
572 573 574 575
		} else {
			/* One more address cycle for higher density devices */
			if (mtd->size >= 0x4000000) {
				/* paddr_8 - paddr_15 */
576 577
				host->send_addr(host, (page_addr >> 8) & 0xff, false);
				host->send_addr(host, (page_addr >> 16) & 0xff, true);
578 579
			} else
				/* paddr_8 - paddr_15 */
580
				host->send_addr(host, (page_addr >> 8) & 0xff, true);
581 582
		}
	}
583 584
}

S
Sascha Hauer 已提交
585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
/*
 * v2 and v3 type controllers can do 4bit or 8bit ecc depending
 * on how much oob the nand chip has. For 8bit ecc we need at least
 * 26 bytes of oob data per 512 byte block.
 */
static int get_eccsize(struct mtd_info *mtd)
{
	int oobbytes_per_512 = 0;

	oobbytes_per_512 = mtd->oobsize * 512 / mtd->writesize;

	if (oobbytes_per_512 < 26)
		return 4;
	else
		return 8;
}

602
static void preset_v1_v2(struct mtd_info *mtd)
603 604 605 606 607
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;
	uint16_t tmp;

I
Ivo Clarysse 已提交
608
	/* enable interrupt, disable spare enable */
609 610 611
	tmp = readw(NFC_V1_V2_CONFIG1);
	tmp &= ~NFC_V1_V2_CONFIG1_INT_MSK;
	tmp &= ~NFC_V1_V2_CONFIG1_SP_EN;
612
	if (nand_chip->ecc.mode == NAND_ECC_HW) {
613
		tmp |= NFC_V1_V2_CONFIG1_ECC_EN;
614
	} else {
615
		tmp &= ~NFC_V1_V2_CONFIG1_ECC_EN;
616
	}
S
Sascha Hauer 已提交
617 618 619 620 621 622 623 624 625

	if (nfc_is_v21() && mtd->writesize) {
		host->eccsize = get_eccsize(mtd);
		if (host->eccsize == 4)
			tmp |= NFC_V2_CONFIG1_ECC_MODE_4;
	} else {
		host->eccsize = 1;
	}

626
	writew(tmp, NFC_V1_V2_CONFIG1);
627 628 629
	/* preset operation */

	/* Unlock the internal RAM Buffer */
630
	writew(0x2, NFC_V1_V2_CONFIG);
631 632 633

	/* Blocks to be unlocked */
	if (nfc_is_v21()) {
634 635
		writew(0x0, NFC_V21_UNLOCKSTART_BLKADDR);
		writew(0xffff, NFC_V21_UNLOCKEND_BLKADDR);
636
	} else if (nfc_is_v1()) {
637 638
		writew(0x0, NFC_V1_UNLOCKSTART_BLKADDR);
		writew(0x4000, NFC_V1_UNLOCKEND_BLKADDR);
639 640 641 642
	} else
		BUG();

	/* Unlock Block Command for given address range */
643
	writew(0x4, NFC_V1_V2_WRPROT);
644 645
}

646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
/* Used by the upper layer to write command to NAND Flash for
 * different operations to be carried out on NAND Flash */
static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
				int column, int page_addr)
{
	struct nand_chip *nand_chip = mtd->priv;
	struct mxc_nand_host *host = nand_chip->priv;

	DEBUG(MTD_DEBUG_LEVEL3,
	      "mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n",
	      command, column, page_addr);

	/* Reset command state information */
	host->status_request = false;

	/* Command pre-processing step */
	switch (command) {
663
	case NAND_CMD_RESET:
664 665
		host->preset(mtd);
		host->send_cmd(host, command, false);
666
		break;
667 668

	case NAND_CMD_STATUS:
S
Sascha Hauer 已提交
669
		host->buf_start = 0;
670 671
		host->status_request = true;

672
		host->send_cmd(host, command, true);
673
		mxc_do_addr_cycle(mtd, column, page_addr);
674 675 676 677
		break;

	case NAND_CMD_READ0:
	case NAND_CMD_READOOB:
678 679 680 681
		if (command == NAND_CMD_READ0)
			host->buf_start = column;
		else
			host->buf_start = column + mtd->writesize;
S
Sascha Hauer 已提交
682

683
		command = NAND_CMD_READ0; /* only READ0 is valid */
684

685
		host->send_cmd(host, command, false);
686 687
		mxc_do_addr_cycle(mtd, column, page_addr);

688
		if (mtd->writesize > 512)
689
			host->send_cmd(host, NAND_CMD_READSTART, true);
690

691
		host->send_page(mtd, NFC_OUTPUT);
692

693
		memcpy(host->data_buf, host->main_area0, mtd->writesize);
694
		copy_spare(mtd, true);
695 696 697
		break;

	case NAND_CMD_SEQIN:
698 699 700
		if (column >= mtd->writesize)
			/* call ourself to read a page */
			mxc_nand_command(mtd, NAND_CMD_READ0, 0, page_addr);
701

702
		host->buf_start = column;
703

704
		host->send_cmd(host, command, false);
705
		mxc_do_addr_cycle(mtd, column, page_addr);
706 707 708
		break;

	case NAND_CMD_PAGEPROG:
709
		memcpy(host->main_area0, host->data_buf, mtd->writesize);
S
Sascha Hauer 已提交
710
		copy_spare(mtd, false);
711 712
		host->send_page(mtd, NFC_INPUT);
		host->send_cmd(host, command, true);
713
		mxc_do_addr_cycle(mtd, column, page_addr);
714 715 716
		break;

	case NAND_CMD_READID:
717
		host->send_cmd(host, command, true);
718
		mxc_do_addr_cycle(mtd, column, page_addr);
719
		host->send_read_id(host);
S
Sascha Hauer 已提交
720
		host->buf_start = column;
721 722
		break;

723
	case NAND_CMD_ERASE1:
724
	case NAND_CMD_ERASE2:
725
		host->send_cmd(host, command, false);
726 727
		mxc_do_addr_cycle(mtd, column, page_addr);

728 729 730 731
		break;
	}
}

S
Sascha Hauer 已提交
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
/*
 * The generic flash bbt decriptors overlap with our ecc
 * hardware, so define some i.MX specific ones.
 */
static uint8_t bbt_pattern[] = { 'B', 'b', 't', '0' };
static uint8_t mirror_pattern[] = { '1', 't', 'b', 'B' };

static struct nand_bbt_descr bbt_main_descr = {
	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
	    | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
	.offs = 0,
	.len = 4,
	.veroffs = 4,
	.maxblocks = 4,
	.pattern = bbt_pattern,
};

static struct nand_bbt_descr bbt_mirror_descr = {
	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
	    | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
	.offs = 0,
	.len = 4,
	.veroffs = 4,
	.maxblocks = 4,
	.pattern = mirror_pattern,
};

759 760 761 762 763 764 765 766
static int __init mxcnd_probe(struct platform_device *pdev)
{
	struct nand_chip *this;
	struct mtd_info *mtd;
	struct mxc_nand_platform_data *pdata = pdev->dev.platform_data;
	struct mxc_nand_host *host;
	struct resource *res;
	int err = 0, nr_parts = 0;
S
Sascha Hauer 已提交
767
	struct nand_ecclayout *oob_smallpage, *oob_largepage;
768 769

	/* Allocate memory for MTD device structure and private data */
S
Sascha Hauer 已提交
770 771
	host = kzalloc(sizeof(struct mxc_nand_host) + NAND_MAX_PAGESIZE +
			NAND_MAX_OOBSIZE, GFP_KERNEL);
772 773 774
	if (!host)
		return -ENOMEM;

S
Sascha Hauer 已提交
775 776
	host->data_buf = (uint8_t *)(host + 1);

777 778 779 780 781 782
	host->dev = &pdev->dev;
	/* structures must be linked */
	this = &host->nand;
	mtd = &host->mtd;
	mtd->priv = this;
	mtd->owner = THIS_MODULE;
783
	mtd->dev.parent = &pdev->dev;
784
	mtd->name = DRIVER_NAME;
785 786 787 788 789 790 791 792 793 794 795 796 797 798

	/* 50 us command delay time */
	this->chip_delay = 5;

	this->priv = host;
	this->dev_ready = mxc_nand_dev_ready;
	this->cmdfunc = mxc_nand_command;
	this->select_chip = mxc_nand_select_chip;
	this->read_byte = mxc_nand_read_byte;
	this->read_word = mxc_nand_read_word;
	this->write_buf = mxc_nand_write_buf;
	this->read_buf = mxc_nand_read_buf;
	this->verify_buf = mxc_nand_verify_buf;

799
	host->clk = clk_get(&pdev->dev, "nfc");
800 801
	if (IS_ERR(host->clk)) {
		err = PTR_ERR(host->clk);
802
		goto eclk;
803
	}
804 805 806 807 808 809 810 811 812 813

	clk_enable(host->clk);
	host->clk_act = 1;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		err = -ENODEV;
		goto eres;
	}

814 815
	host->base = ioremap(res->start, resource_size(res));
	if (!host->base) {
816
		err = -ENOMEM;
817 818 819
		goto eres;
	}

820
	host->main_area0 = host->base;
S
Sascha Hauer 已提交
821

822 823 824 825 826 827 828
	if (nfc_is_v1() || nfc_is_v21()) {
		host->preset = preset_v1_v2;
		host->send_cmd = send_cmd_v1_v2;
		host->send_addr = send_addr_v1_v2;
		host->send_page = send_page_v1_v2;
		host->send_read_id = send_read_id_v1_v2;
		host->get_dev_status = get_dev_status_v1_v2;
829
		host->check_int = check_int_v1_v2;
830 831
	}

S
Sascha Hauer 已提交
832
	if (nfc_is_v21()) {
833
		host->regs = host->base + 0x1e00;
S
Sascha Hauer 已提交
834 835 836 837
		host->spare0 = host->base + 0x1000;
		host->spare_len = 64;
		oob_smallpage = &nandv2_hw_eccoob_smallpage;
		oob_largepage = &nandv2_hw_eccoob_largepage;
838
		this->ecc.bytes = 9;
S
Sascha Hauer 已提交
839
	} else if (nfc_is_v1()) {
840
		host->regs = host->base + 0xe00;
S
Sascha Hauer 已提交
841 842 843 844 845 846 847
		host->spare0 = host->base + 0x800;
		host->spare_len = 16;
		oob_smallpage = &nandv1_hw_eccoob_smallpage;
		oob_largepage = &nandv1_hw_eccoob_largepage;
		this->ecc.bytes = 3;
	} else
		BUG();
S
Sascha Hauer 已提交
848 849

	this->ecc.size = 512;
S
Sascha Hauer 已提交
850
	this->ecc.layout = oob_smallpage;
S
Sascha Hauer 已提交
851

852 853 854
	if (pdata->hw_ecc) {
		this->ecc.calculate = mxc_nand_calculate_ecc;
		this->ecc.hwctl = mxc_nand_enable_hwecc;
855 856 857 858
		if (nfc_is_v1())
			this->ecc.correct = mxc_nand_correct_data_v1;
		else
			this->ecc.correct = mxc_nand_correct_data_v2_v3;
859 860 861 862 863 864
		this->ecc.mode = NAND_ECC_HW;
	} else {
		this->ecc.mode = NAND_ECC_SOFT;
	}

	/* NAND bus width determines access funtions used by upper layer */
S
Sascha Hauer 已提交
865
	if (pdata->width == 2)
866 867
		this->options |= NAND_BUSWIDTH_16;

S
Sascha Hauer 已提交
868 869 870 871 872
	if (pdata->flash_bbt) {
		this->bbt_td = &bbt_main_descr;
		this->bbt_md = &bbt_mirror_descr;
		/* update flash based bbt */
		this->options |= NAND_USE_FLASH_BBT;
873 874
	}

875 876 877 878
	init_waitqueue_head(&host->irq_waitq);

	host->irq = platform_get_irq(pdev, 0);

I
Ivo Clarysse 已提交
879
	err = request_irq(host->irq, mxc_nfc_irq, IRQF_DISABLED, DRIVER_NAME, host);
880 881 882
	if (err)
		goto eirq;

883
	/* first scan to find the device and get the page size */
884
	if (nand_scan_ident(mtd, 1, NULL)) {
885 886 887
		err = -ENXIO;
		goto escan;
	}
888

S
Sascha Hauer 已提交
889 890 891
	/* Call preset again, with correct writesize this time */
	host->preset(mtd);

892
	if (mtd->writesize == 2048)
S
Sascha Hauer 已提交
893
		this->ecc.layout = oob_largepage;
894 895 896

	/* second phase scan */
	if (nand_scan_tail(mtd)) {
897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918
		err = -ENXIO;
		goto escan;
	}

	/* Register the partitions */
#ifdef CONFIG_MTD_PARTITIONS
	nr_parts =
	    parse_mtd_partitions(mtd, part_probes, &host->parts, 0);
	if (nr_parts > 0)
		add_mtd_partitions(mtd, host->parts, nr_parts);
	else
#endif
	{
		pr_info("Registering %s as whole device\n", mtd->name);
		add_mtd_device(mtd);
	}

	platform_set_drvdata(pdev, host);

	return 0;

escan:
919
	free_irq(host->irq, host);
920
eirq:
921
	iounmap(host->base);
922 923 924 925 926 927 928 929
eres:
	clk_put(host->clk);
eclk:
	kfree(host);

	return err;
}

930
static int __devexit mxcnd_remove(struct platform_device *pdev)
931 932 933 934 935 936 937 938
{
	struct mxc_nand_host *host = platform_get_drvdata(pdev);

	clk_put(host->clk);

	platform_set_drvdata(pdev, NULL);

	nand_release(&host->mtd);
939
	free_irq(host->irq, host);
940
	iounmap(host->base);
941 942 943 944 945 946 947 948
	kfree(host);

	return 0;
}

static struct platform_driver mxcnd_driver = {
	.driver = {
		   .name = DRIVER_NAME,
949
	},
950
	.remove = __devexit_p(mxcnd_remove),
951 952 953 954
};

static int __init mxc_nd_init(void)
{
955
	return platform_driver_probe(&mxcnd_driver, mxcnd_probe);
956 957 958 959 960 961 962 963 964 965 966 967 968 969
}

static void __exit mxc_nd_cleanup(void)
{
	/* Unregister the device structure */
	platform_driver_unregister(&mxcnd_driver);
}

module_init(mxc_nd_init);
module_exit(mxc_nd_cleanup);

MODULE_AUTHOR("Freescale Semiconductor, Inc.");
MODULE_DESCRIPTION("MXC NAND MTD driver");
MODULE_LICENSE("GPL");