pxa3xx_nand.c 33.6 KB
Newer Older
E
eric miao 已提交
1 2 3 4 5 6 7 8 9 10 11
/*
 * drivers/mtd/nand/pxa3xx_nand.c
 *
 * Copyright © 2005 Intel Corporation
 * Copyright © 2006 Marvell International Ltd.
 *
 * 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.
 */

12
#include <linux/kernel.h>
E
eric miao 已提交
13 14 15 16 17 18 19 20 21
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
22 23
#include <linux/io.h>
#include <linux/irq.h>
24
#include <linux/slab.h>
25 26
#include <linux/of.h>
#include <linux/of_device.h>
E
eric miao 已提交
27

28
#include <mach/dma.h>
29
#include <linux/platform_data/mtd-nand-pxa3xx.h>
E
eric miao 已提交
30 31

#define	CHIP_DELAY_TIMEOUT	(2 * HZ/10)
L
Lei Wen 已提交
32
#define NAND_STOP_DELAY		(2 * HZ/50)
33
#define PAGE_CHUNK_SIZE		(2048)
E
eric miao 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

/* registers and bit definitions */
#define NDCR		(0x00) /* Control register */
#define NDTR0CS0	(0x04) /* Timing Parameter 0 for CS0 */
#define NDTR1CS0	(0x0C) /* Timing Parameter 1 for CS0 */
#define NDSR		(0x14) /* Status Register */
#define NDPCR		(0x18) /* Page Count Register */
#define NDBDR0		(0x1C) /* Bad Block Register 0 */
#define NDBDR1		(0x20) /* Bad Block Register 1 */
#define NDDB		(0x40) /* Data Buffer */
#define NDCB0		(0x48) /* Command Buffer0 */
#define NDCB1		(0x4C) /* Command Buffer1 */
#define NDCB2		(0x50) /* Command Buffer2 */

#define NDCR_SPARE_EN		(0x1 << 31)
#define NDCR_ECC_EN		(0x1 << 30)
#define NDCR_DMA_EN		(0x1 << 29)
#define NDCR_ND_RUN		(0x1 << 28)
#define NDCR_DWIDTH_C		(0x1 << 27)
#define NDCR_DWIDTH_M		(0x1 << 26)
#define NDCR_PAGE_SZ		(0x1 << 24)
#define NDCR_NCSX		(0x1 << 23)
#define NDCR_ND_MODE		(0x3 << 21)
#define NDCR_NAND_MODE   	(0x0)
#define NDCR_CLR_PG_CNT		(0x1 << 20)
L
Lei Wen 已提交
59
#define NDCR_STOP_ON_UNCOR	(0x1 << 19)
E
eric miao 已提交
60 61 62 63 64 65
#define NDCR_RD_ID_CNT_MASK	(0x7 << 16)
#define NDCR_RD_ID_CNT(x)	(((x) << 16) & NDCR_RD_ID_CNT_MASK)

#define NDCR_RA_START		(0x1 << 15)
#define NDCR_PG_PER_BLK		(0x1 << 14)
#define NDCR_ND_ARB_EN		(0x1 << 12)
L
Lei Wen 已提交
66
#define NDCR_INT_MASK           (0xFFF)
E
eric miao 已提交
67 68

#define NDSR_MASK		(0xfff)
L
Lei Wen 已提交
69 70
#define NDSR_RDY                (0x1 << 12)
#define NDSR_FLASH_RDY          (0x1 << 11)
E
eric miao 已提交
71 72 73 74 75 76 77 78 79 80 81 82
#define NDSR_CS0_PAGED		(0x1 << 10)
#define NDSR_CS1_PAGED		(0x1 << 9)
#define NDSR_CS0_CMDD		(0x1 << 8)
#define NDSR_CS1_CMDD		(0x1 << 7)
#define NDSR_CS0_BBD		(0x1 << 6)
#define NDSR_CS1_BBD		(0x1 << 5)
#define NDSR_DBERR		(0x1 << 4)
#define NDSR_SBERR		(0x1 << 3)
#define NDSR_WRDREQ		(0x1 << 2)
#define NDSR_RDDREQ		(0x1 << 1)
#define NDSR_WRCMDREQ		(0x1)

83
#define NDCB0_ST_ROW_EN         (0x1 << 26)
E
eric miao 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
#define NDCB0_AUTO_RS		(0x1 << 25)
#define NDCB0_CSEL		(0x1 << 24)
#define NDCB0_CMD_TYPE_MASK	(0x7 << 21)
#define NDCB0_CMD_TYPE(x)	(((x) << 21) & NDCB0_CMD_TYPE_MASK)
#define NDCB0_NC		(0x1 << 20)
#define NDCB0_DBC		(0x1 << 19)
#define NDCB0_ADDR_CYC_MASK	(0x7 << 16)
#define NDCB0_ADDR_CYC(x)	(((x) << 16) & NDCB0_ADDR_CYC_MASK)
#define NDCB0_CMD2_MASK		(0xff << 8)
#define NDCB0_CMD1_MASK		(0xff)
#define NDCB0_ADDR_CYC_SHIFT	(16)

/* macros for registers read/write */
#define nand_writel(info, off, val)	\
	__raw_writel((val), (info)->mmio_base + (off))

#define nand_readl(info, off)		\
	__raw_readl((info)->mmio_base + (off))

/* error code and state */
enum {
	ERR_NONE	= 0,
	ERR_DMABUSERR	= -1,
	ERR_SENDCMD	= -2,
	ERR_DBERR	= -3,
	ERR_BBERR	= -4,
110
	ERR_SBERR	= -5,
E
eric miao 已提交
111 112 113
};

enum {
L
Lei Wen 已提交
114
	STATE_IDLE = 0,
115
	STATE_PREPARED,
E
eric miao 已提交
116 117 118 119 120 121
	STATE_CMD_HANDLE,
	STATE_DMA_READING,
	STATE_DMA_WRITING,
	STATE_DMA_DONE,
	STATE_PIO_READING,
	STATE_PIO_WRITING,
L
Lei Wen 已提交
122 123
	STATE_CMD_DONE,
	STATE_READY,
E
eric miao 已提交
124 125
};

126 127 128 129 130 131 132 133 134
struct pxa3xx_nand_host {
	struct nand_chip	chip;
	struct pxa3xx_nand_cmdset *cmdset;
	struct mtd_info         *mtd;
	void			*info_data;

	/* page size of attached chip */
	unsigned int		page_size;
	int			use_ecc;
135
	int			cs;
E
eric miao 已提交
136

137 138 139 140 141 142 143 144 145 146 147 148
	/* calculated from pxa3xx_nand_flash data */
	unsigned int		col_addr_cycles;
	unsigned int		row_addr_cycles;
	size_t			read_id_bytes;

	/* cached register value */
	uint32_t		reg_ndcr;
	uint32_t		ndtr0cs0;
	uint32_t		ndtr1cs0;
};

struct pxa3xx_nand_info {
149
	struct nand_hw_control	controller;
E
eric miao 已提交
150 151 152 153
	struct platform_device	 *pdev;

	struct clk		*clk;
	void __iomem		*mmio_base;
154
	unsigned long		mmio_phys;
155
	struct completion	cmd_complete;
E
eric miao 已提交
156 157 158 159 160 161 162 163 164

	unsigned int 		buf_start;
	unsigned int		buf_count;

	/* DMA information */
	int			drcmr_dat;
	int			drcmr_cmd;

	unsigned char		*data_buff;
165
	unsigned char		*oob_buff;
E
eric miao 已提交
166 167 168 169 170
	dma_addr_t 		data_buff_phys;
	int 			data_dma_ch;
	struct pxa_dma_desc	*data_desc;
	dma_addr_t 		data_desc_addr;

171
	struct pxa3xx_nand_host *host[NUM_CHIP_SELECT];
E
eric miao 已提交
172 173
	unsigned int		state;

174
	int			cs;
E
eric miao 已提交
175 176
	int			use_ecc;	/* use HW ECC ? */
	int			use_dma;	/* use DMA ? */
177
	int			is_ready;
E
eric miao 已提交
178

179 180
	unsigned int		page_size;	/* page size of attached chip */
	unsigned int		data_size;	/* data size in FIFO */
181
	unsigned int		oob_size;
E
eric miao 已提交
182 183 184 185 186 187 188 189
	int 			retcode;

	/* generated NDCBx register values */
	uint32_t		ndcb0;
	uint32_t		ndcb1;
	uint32_t		ndcb2;
};

190
static bool use_dma = 1;
E
eric miao 已提交
191
module_param(use_dma, bool, 0444);
L
Lucas De Marchi 已提交
192
MODULE_PARM_DESC(use_dma, "enable DMA for data transferring to/from NAND HW");
E
eric miao 已提交
193

194 195 196 197
/*
 * Default NAND flash controller configuration setup by the
 * bootloader. This configuration is used only when pdata->keep_config is set
 */
198
static struct pxa3xx_nand_cmdset default_cmdset = {
E
eric miao 已提交
199 200 201 202 203 204 205 206 207 208 209 210
	.read1		= 0x3000,
	.read2		= 0x0050,
	.program	= 0x1080,
	.read_status	= 0x0070,
	.read_id	= 0x0090,
	.erase		= 0xD060,
	.reset		= 0x00FF,
	.lock		= 0x002A,
	.unlock		= 0x2423,
	.lock_status	= 0x007A,
};

211
static struct pxa3xx_nand_timing timing[] = {
212 213 214 215
	{ 40, 80, 60, 100, 80, 100, 90000, 400, 40, },
	{ 10,  0, 20,  40, 30,  40, 11123, 110, 10, },
	{ 10, 25, 15,  25, 15,  30, 25000,  60, 10, },
	{ 10, 35, 15,  25, 15,  25, 25000,  60, 10, },
216 217
};

218
static struct pxa3xx_nand_flash builtin_flash_types[] = {
219 220 221 222 223 224 225 226 227
{ "DEFAULT FLASH",      0,   0, 2048,  8,  8,    0, &timing[0] },
{ "64MiB 16-bit",  0x46ec,  32,  512, 16, 16, 4096, &timing[1] },
{ "256MiB 8-bit",  0xdaec,  64, 2048,  8,  8, 2048, &timing[1] },
{ "4GiB 8-bit",    0xd7ec, 128, 4096,  8,  8, 8192, &timing[1] },
{ "128MiB 8-bit",  0xa12c,  64, 2048,  8,  8, 1024, &timing[2] },
{ "128MiB 16-bit", 0xb12c,  64, 2048, 16, 16, 1024, &timing[2] },
{ "512MiB 8-bit",  0xdc2c,  64, 2048,  8,  8, 4096, &timing[2] },
{ "512MiB 16-bit", 0xcc2c,  64, 2048, 16, 16, 4096, &timing[2] },
{ "256MiB 16-bit", 0xba20,  64, 2048, 16, 16, 2048, &timing[3] },
228 229
};

230 231 232
/* Define a default flash type setting serve as flash detecting only */
#define DEFAULT_FLASH_TYPE (&builtin_flash_types[0])

233
const char *mtd_names[] = {"pxa3xx_nand-0", "pxa3xx_nand-1", NULL};
234

E
eric miao 已提交
235 236 237 238 239 240 241 242 243 244 245 246
#define NDTR0_tCH(c)	(min((c), 7) << 19)
#define NDTR0_tCS(c)	(min((c), 7) << 16)
#define NDTR0_tWH(c)	(min((c), 7) << 11)
#define NDTR0_tWP(c)	(min((c), 7) << 8)
#define NDTR0_tRH(c)	(min((c), 7) << 3)
#define NDTR0_tRP(c)	(min((c), 7) << 0)

#define NDTR1_tR(c)	(min((c), 65535) << 16)
#define NDTR1_tWHR(c)	(min((c), 15) << 4)
#define NDTR1_tAR(c)	(min((c), 15) << 0)

/* convert nano-seconds to nand flash controller clock cycles */
A
Axel Lin 已提交
247
#define ns2cycle(ns, clk)	(int)((ns) * (clk / 1000000) / 1000)
E
eric miao 已提交
248

249
static void pxa3xx_nand_set_timing(struct pxa3xx_nand_host *host,
250
				   const struct pxa3xx_nand_timing *t)
E
eric miao 已提交
251
{
252
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
253 254 255 256 257 258 259 260 261 262 263 264 265 266
	unsigned long nand_clk = clk_get_rate(info->clk);
	uint32_t ndtr0, ndtr1;

	ndtr0 = NDTR0_tCH(ns2cycle(t->tCH, nand_clk)) |
		NDTR0_tCS(ns2cycle(t->tCS, nand_clk)) |
		NDTR0_tWH(ns2cycle(t->tWH, nand_clk)) |
		NDTR0_tWP(ns2cycle(t->tWP, nand_clk)) |
		NDTR0_tRH(ns2cycle(t->tRH, nand_clk)) |
		NDTR0_tRP(ns2cycle(t->tRP, nand_clk));

	ndtr1 = NDTR1_tR(ns2cycle(t->tR, nand_clk)) |
		NDTR1_tWHR(ns2cycle(t->tWHR, nand_clk)) |
		NDTR1_tAR(ns2cycle(t->tAR, nand_clk));

267 268
	host->ndtr0cs0 = ndtr0;
	host->ndtr1cs0 = ndtr1;
E
eric miao 已提交
269 270 271 272
	nand_writel(info, NDTR0CS0, ndtr0);
	nand_writel(info, NDTR1CS0, ndtr1);
}

273
static void pxa3xx_set_datasize(struct pxa3xx_nand_info *info)
E
eric miao 已提交
274
{
275
	struct pxa3xx_nand_host *host = info->host[info->cs];
276
	int oob_enable = host->reg_ndcr & NDCR_SPARE_EN;
277

278
	info->data_size = host->page_size;
279 280 281 282 283
	if (!oob_enable) {
		info->oob_size = 0;
		return;
	}

284
	switch (host->page_size) {
E
eric miao 已提交
285
	case 2048:
286
		info->oob_size = (info->use_ecc) ? 40 : 64;
E
eric miao 已提交
287 288
		break;
	case 512:
289
		info->oob_size = (info->use_ecc) ? 8 : 16;
E
eric miao 已提交
290 291
		break;
	}
292 293
}

L
Lei Wen 已提交
294 295 296 297 298 299 300 301
/**
 * NOTE: it is a must to set ND_RUN firstly, then write
 * command buffer, otherwise, it does not work.
 * We enable all the interrupt at the same time, and
 * let pxa3xx_nand_irq to handle all logic.
 */
static void pxa3xx_nand_start(struct pxa3xx_nand_info *info)
{
302
	struct pxa3xx_nand_host *host = info->host[info->cs];
L
Lei Wen 已提交
303 304
	uint32_t ndcr;

305
	ndcr = host->reg_ndcr;
L
Lei Wen 已提交
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335
	ndcr |= info->use_ecc ? NDCR_ECC_EN : 0;
	ndcr |= info->use_dma ? NDCR_DMA_EN : 0;
	ndcr |= NDCR_ND_RUN;

	/* clear status bits and run */
	nand_writel(info, NDCR, 0);
	nand_writel(info, NDSR, NDSR_MASK);
	nand_writel(info, NDCR, ndcr);
}

static void pxa3xx_nand_stop(struct pxa3xx_nand_info *info)
{
	uint32_t ndcr;
	int timeout = NAND_STOP_DELAY;

	/* wait RUN bit in NDCR become 0 */
	ndcr = nand_readl(info, NDCR);
	while ((ndcr & NDCR_ND_RUN) && (timeout-- > 0)) {
		ndcr = nand_readl(info, NDCR);
		udelay(1);
	}

	if (timeout <= 0) {
		ndcr &= ~NDCR_ND_RUN;
		nand_writel(info, NDCR, ndcr);
	}
	/* clear status bits */
	nand_writel(info, NDSR, NDSR_MASK);
}

E
eric miao 已提交
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
static void enable_int(struct pxa3xx_nand_info *info, uint32_t int_mask)
{
	uint32_t ndcr;

	ndcr = nand_readl(info, NDCR);
	nand_writel(info, NDCR, ndcr & ~int_mask);
}

static void disable_int(struct pxa3xx_nand_info *info, uint32_t int_mask)
{
	uint32_t ndcr;

	ndcr = nand_readl(info, NDCR);
	nand_writel(info, NDCR, ndcr | int_mask);
}

L
Lei Wen 已提交
352
static void handle_data_pio(struct pxa3xx_nand_info *info)
E
eric miao 已提交
353 354 355 356
{
	switch (info->state) {
	case STATE_PIO_WRITING:
		__raw_writesl(info->mmio_base + NDDB, info->data_buff,
357
				DIV_ROUND_UP(info->data_size, 4));
358 359 360
		if (info->oob_size > 0)
			__raw_writesl(info->mmio_base + NDDB, info->oob_buff,
					DIV_ROUND_UP(info->oob_size, 4));
E
eric miao 已提交
361 362 363
		break;
	case STATE_PIO_READING:
		__raw_readsl(info->mmio_base + NDDB, info->data_buff,
364
				DIV_ROUND_UP(info->data_size, 4));
365 366 367
		if (info->oob_size > 0)
			__raw_readsl(info->mmio_base + NDDB, info->oob_buff,
					DIV_ROUND_UP(info->oob_size, 4));
E
eric miao 已提交
368 369
		break;
	default:
370
		dev_err(&info->pdev->dev, "%s: invalid state %d\n", __func__,
E
eric miao 已提交
371
				info->state);
L
Lei Wen 已提交
372
		BUG();
E
eric miao 已提交
373 374 375
	}
}

L
Lei Wen 已提交
376
static void start_data_dma(struct pxa3xx_nand_info *info)
E
eric miao 已提交
377 378
{
	struct pxa_dma_desc *desc = info->data_desc;
379
	int dma_len = ALIGN(info->data_size + info->oob_size, 32);
E
eric miao 已提交
380 381 382 383

	desc->ddadr = DDADR_STOP;
	desc->dcmd = DCMD_ENDIRQEN | DCMD_WIDTH4 | DCMD_BURST32 | dma_len;

L
Lei Wen 已提交
384 385
	switch (info->state) {
	case STATE_DMA_WRITING:
E
eric miao 已提交
386
		desc->dsadr = info->data_buff_phys;
387
		desc->dtadr = info->mmio_phys + NDDB;
E
eric miao 已提交
388
		desc->dcmd |= DCMD_INCSRCADDR | DCMD_FLOWTRG;
L
Lei Wen 已提交
389 390
		break;
	case STATE_DMA_READING:
E
eric miao 已提交
391
		desc->dtadr = info->data_buff_phys;
392
		desc->dsadr = info->mmio_phys + NDDB;
E
eric miao 已提交
393
		desc->dcmd |= DCMD_INCTRGADDR | DCMD_FLOWSRC;
L
Lei Wen 已提交
394 395
		break;
	default:
396
		dev_err(&info->pdev->dev, "%s: invalid state %d\n", __func__,
L
Lei Wen 已提交
397 398
				info->state);
		BUG();
E
eric miao 已提交
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417
	}

	DRCMR(info->drcmr_dat) = DRCMR_MAPVLD | info->data_dma_ch;
	DDADR(info->data_dma_ch) = info->data_desc_addr;
	DCSR(info->data_dma_ch) |= DCSR_RUN;
}

static void pxa3xx_nand_data_dma_irq(int channel, void *data)
{
	struct pxa3xx_nand_info *info = data;
	uint32_t dcsr;

	dcsr = DCSR(channel);
	DCSR(channel) = dcsr;

	if (dcsr & DCSR_BUSERR) {
		info->retcode = ERR_DMABUSERR;
	}

L
Lei Wen 已提交
418 419 420
	info->state = STATE_DMA_DONE;
	enable_int(info, NDCR_INT_MASK);
	nand_writel(info, NDSR, NDSR_WRDREQ | NDSR_RDDREQ);
E
eric miao 已提交
421 422 423 424 425
}

static irqreturn_t pxa3xx_nand_irq(int irq, void *devid)
{
	struct pxa3xx_nand_info *info = devid;
L
Lei Wen 已提交
426
	unsigned int status, is_completed = 0;
427 428 429 430 431 432 433 434 435
	unsigned int ready, cmd_done;

	if (info->cs == 0) {
		ready           = NDSR_FLASH_RDY;
		cmd_done        = NDSR_CS0_CMDD;
	} else {
		ready           = NDSR_RDY;
		cmd_done        = NDSR_CS1_CMDD;
	}
E
eric miao 已提交
436 437 438

	status = nand_readl(info, NDSR);

L
Lei Wen 已提交
439 440 441 442 443 444
	if (status & NDSR_DBERR)
		info->retcode = ERR_DBERR;
	if (status & NDSR_SBERR)
		info->retcode = ERR_SBERR;
	if (status & (NDSR_RDDREQ | NDSR_WRDREQ)) {
		/* whether use dma to transfer data */
E
eric miao 已提交
445
		if (info->use_dma) {
L
Lei Wen 已提交
446 447 448 449 450
			disable_int(info, NDCR_INT_MASK);
			info->state = (status & NDSR_RDDREQ) ?
				      STATE_DMA_READING : STATE_DMA_WRITING;
			start_data_dma(info);
			goto NORMAL_IRQ_EXIT;
E
eric miao 已提交
451
		} else {
L
Lei Wen 已提交
452 453 454
			info->state = (status & NDSR_RDDREQ) ?
				      STATE_PIO_READING : STATE_PIO_WRITING;
			handle_data_pio(info);
E
eric miao 已提交
455 456
		}
	}
457
	if (status & cmd_done) {
L
Lei Wen 已提交
458 459
		info->state = STATE_CMD_DONE;
		is_completed = 1;
E
eric miao 已提交
460
	}
461
	if (status & ready) {
462
		info->is_ready = 1;
L
Lei Wen 已提交
463
		info->state = STATE_READY;
464
	}
E
eric miao 已提交
465

L
Lei Wen 已提交
466 467 468 469 470 471 472
	if (status & NDSR_WRCMDREQ) {
		nand_writel(info, NDSR, NDSR_WRCMDREQ);
		status &= ~NDSR_WRCMDREQ;
		info->state = STATE_CMD_HANDLE;
		nand_writel(info, NDCB0, info->ndcb0);
		nand_writel(info, NDCB0, info->ndcb1);
		nand_writel(info, NDCB0, info->ndcb2);
E
eric miao 已提交
473 474
	}

L
Lei Wen 已提交
475 476 477 478 479 480
	/* clear NDSR to let the controller exit the IRQ */
	nand_writel(info, NDSR, status);
	if (is_completed)
		complete(&info->cmd_complete);
NORMAL_IRQ_EXIT:
	return IRQ_HANDLED;
E
eric miao 已提交
481 482 483 484 485 486 487 488 489 490
}

static inline int is_buf_blank(uint8_t *buf, size_t len)
{
	for (; len > 0; len--)
		if (*buf++ != 0xff)
			return 0;
	return 1;
}

491 492
static int prepare_command_pool(struct pxa3xx_nand_info *info, int command,
		uint16_t column, int page_addr)
E
eric miao 已提交
493
{
494
	uint16_t cmd;
495
	int addr_cycle, exec_cmd;
496 497
	struct pxa3xx_nand_host *host;
	struct mtd_info *mtd;
E
eric miao 已提交
498

499 500
	host = info->host[info->cs];
	mtd = host->mtd;
501 502 503 504
	addr_cycle = 0;
	exec_cmd = 1;

	/* reset data and oob column point to handle data */
505 506
	info->buf_start		= 0;
	info->buf_count		= 0;
507 508
	info->oob_size		= 0;
	info->use_ecc		= 0;
509
	info->is_ready		= 0;
510
	info->retcode		= ERR_NONE;
511 512 513 514
	if (info->cs != 0)
		info->ndcb0 = NDCB0_CSEL;
	else
		info->ndcb0 = 0;
E
eric miao 已提交
515 516

	switch (command) {
517 518 519
	case NAND_CMD_READ0:
	case NAND_CMD_PAGEPROG:
		info->use_ecc = 1;
E
eric miao 已提交
520
	case NAND_CMD_READOOB:
521
		pxa3xx_set_datasize(info);
E
eric miao 已提交
522
		break;
523 524 525 526 527 528 529 530 531
	case NAND_CMD_SEQIN:
		exec_cmd = 0;
		break;
	default:
		info->ndcb1 = 0;
		info->ndcb2 = 0;
		break;
	}

532 533
	addr_cycle = NDCB0_ADDR_CYC(host->row_addr_cycles
				    + host->col_addr_cycles);
E
eric miao 已提交
534

535 536
	switch (command) {
	case NAND_CMD_READOOB:
E
eric miao 已提交
537
	case NAND_CMD_READ0:
538
		cmd = host->cmdset->read1;
539 540 541 542 543
		if (command == NAND_CMD_READOOB)
			info->buf_start = mtd->writesize + column;
		else
			info->buf_start = column;

544
		if (unlikely(host->page_size < PAGE_CHUNK_SIZE))
545 546 547 548 549 550 551 552
			info->ndcb0 |= NDCB0_CMD_TYPE(0)
					| addr_cycle
					| (cmd & NDCB0_CMD1_MASK);
		else
			info->ndcb0 |= NDCB0_CMD_TYPE(0)
					| NDCB0_DBC
					| addr_cycle
					| cmd;
E
eric miao 已提交
553 554

	case NAND_CMD_SEQIN:
555
		/* small page addr setting */
556
		if (unlikely(host->page_size < PAGE_CHUNK_SIZE)) {
557 558 559 560 561 562 563 564 565 566 567 568 569 570
			info->ndcb1 = ((page_addr & 0xFFFFFF) << 8)
					| (column & 0xFF);

			info->ndcb2 = 0;
		} else {
			info->ndcb1 = ((page_addr & 0xFFFF) << 16)
					| (column & 0xFFFF);

			if (page_addr & 0xFF0000)
				info->ndcb2 = (page_addr & 0xFF0000) >> 16;
			else
				info->ndcb2 = 0;
		}

E
eric miao 已提交
571
		info->buf_count = mtd->writesize + mtd->oobsize;
572
		memset(info->data_buff, 0xFF, info->buf_count);
E
eric miao 已提交
573 574

		break;
575

E
eric miao 已提交
576
	case NAND_CMD_PAGEPROG:
577 578 579 580 581
		if (is_buf_blank(info->data_buff,
					(mtd->writesize + mtd->oobsize))) {
			exec_cmd = 0;
			break;
		}
E
eric miao 已提交
582

583
		cmd = host->cmdset->program;
584 585 586 587 588 589
		info->ndcb0 |= NDCB0_CMD_TYPE(0x1)
				| NDCB0_AUTO_RS
				| NDCB0_ST_ROW_EN
				| NDCB0_DBC
				| cmd
				| addr_cycle;
E
eric miao 已提交
590
		break;
591

E
eric miao 已提交
592
	case NAND_CMD_READID:
593 594
		cmd = host->cmdset->read_id;
		info->buf_count = host->read_id_bytes;
595 596 597 598 599 600
		info->ndcb0 |= NDCB0_CMD_TYPE(3)
				| NDCB0_ADDR_CYC(1)
				| cmd;

		info->data_size = 8;
		break;
E
eric miao 已提交
601
	case NAND_CMD_STATUS:
602
		cmd = host->cmdset->read_status;
603 604 605 606 607 608 609 610 611
		info->buf_count = 1;
		info->ndcb0 |= NDCB0_CMD_TYPE(4)
				| NDCB0_ADDR_CYC(1)
				| cmd;

		info->data_size = 8;
		break;

	case NAND_CMD_ERASE1:
612
		cmd = host->cmdset->erase;
613 614 615 616 617 618 619 620
		info->ndcb0 |= NDCB0_CMD_TYPE(2)
				| NDCB0_AUTO_RS
				| NDCB0_ADDR_CYC(3)
				| NDCB0_DBC
				| cmd;
		info->ndcb1 = page_addr;
		info->ndcb2 = 0;

E
eric miao 已提交
621 622
		break;
	case NAND_CMD_RESET:
623
		cmd = host->cmdset->reset;
624 625 626 627 628 629 630
		info->ndcb0 |= NDCB0_CMD_TYPE(5)
				| cmd;

		break;

	case NAND_CMD_ERASE2:
		exec_cmd = 0;
E
eric miao 已提交
631
		break;
632

E
eric miao 已提交
633
	default:
634
		exec_cmd = 0;
635 636
		dev_err(&info->pdev->dev, "non-supported command %x\n",
				command);
E
eric miao 已提交
637 638 639
		break;
	}

640 641 642 643 644 645
	return exec_cmd;
}

static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command,
				int column, int page_addr)
{
646 647
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
648 649 650 651 652 653 654
	int ret, exec_cmd;

	/*
	 * if this is a x16 device ,then convert the input
	 * "byte" address into a "word" address appropriate
	 * for indexing a word-oriented device
	 */
655
	if (host->reg_ndcr & NDCR_DWIDTH_M)
656 657
		column /= 2;

658 659 660 661 662 663 664 665 666 667 668
	/*
	 * There may be different NAND chip hooked to
	 * different chip select, so check whether
	 * chip select has been changed, if yes, reset the timing
	 */
	if (info->cs != host->cs) {
		info->cs = host->cs;
		nand_writel(info, NDTR0CS0, host->ndtr0cs0);
		nand_writel(info, NDTR1CS0, host->ndtr1cs0);
	}

669
	info->state = STATE_PREPARED;
670
	exec_cmd = prepare_command_pool(info, command, column, page_addr);
L
Lei Wen 已提交
671 672 673 674 675 676 677
	if (exec_cmd) {
		init_completion(&info->cmd_complete);
		pxa3xx_nand_start(info);

		ret = wait_for_completion_timeout(&info->cmd_complete,
				CHIP_DELAY_TIMEOUT);
		if (!ret) {
678
			dev_err(&info->pdev->dev, "Wait time out!!!\n");
L
Lei Wen 已提交
679 680 681 682
			/* Stop State Machine for next command cycle */
			pxa3xx_nand_stop(info);
		}
	}
683
	info->state = STATE_IDLE;
L
Lei Wen 已提交
684 685
}

686
static int pxa3xx_nand_write_page_hwecc(struct mtd_info *mtd,
687
		struct nand_chip *chip, const uint8_t *buf, int oob_required)
L
Lei Wen 已提交
688 689 690
{
	chip->write_buf(mtd, buf, mtd->writesize);
	chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
691 692

	return 0;
L
Lei Wen 已提交
693 694 695
}

static int pxa3xx_nand_read_page_hwecc(struct mtd_info *mtd,
696 697
		struct nand_chip *chip, uint8_t *buf, int oob_required,
		int page)
L
Lei Wen 已提交
698
{
699 700
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
L
Lei Wen 已提交
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720

	chip->read_buf(mtd, buf, mtd->writesize);
	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);

	if (info->retcode == ERR_SBERR) {
		switch (info->use_ecc) {
		case 1:
			mtd->ecc_stats.corrected++;
			break;
		case 0:
		default:
			break;
		}
	} else if (info->retcode == ERR_DBERR) {
		/*
		 * for blank page (all 0xff), HW will calculate its ECC as
		 * 0, which is different from the ECC information within
		 * OOB, ignore such double bit errors
		 */
		if (is_buf_blank(buf, mtd->writesize))
721 722
			info->retcode = ERR_NONE;
		else
L
Lei Wen 已提交
723
			mtd->ecc_stats.failed++;
E
eric miao 已提交
724
	}
L
Lei Wen 已提交
725 726

	return 0;
E
eric miao 已提交
727 728 729 730
}

static uint8_t pxa3xx_nand_read_byte(struct mtd_info *mtd)
{
731 732
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
733 734 735 736 737 738 739 740 741 742 743
	char retval = 0xFF;

	if (info->buf_start < info->buf_count)
		/* Has just send a new command? */
		retval = info->data_buff[info->buf_start++];

	return retval;
}

static u16 pxa3xx_nand_read_word(struct mtd_info *mtd)
{
744 745
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
746 747 748 749 750 751 752 753 754 755 756
	u16 retval = 0xFFFF;

	if (!(info->buf_start & 0x01) && info->buf_start < info->buf_count) {
		retval = *((u16 *)(info->data_buff+info->buf_start));
		info->buf_start += 2;
	}
	return retval;
}

static void pxa3xx_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
{
757 758
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
759 760 761 762 763 764 765 766 767
	int real_len = min_t(size_t, len, info->buf_count - info->buf_start);

	memcpy(buf, info->data_buff + info->buf_start, real_len);
	info->buf_start += real_len;
}

static void pxa3xx_nand_write_buf(struct mtd_info *mtd,
		const uint8_t *buf, int len)
{
768 769
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
770 771 772 773 774 775 776 777 778 779 780 781 782
	int real_len = min_t(size_t, len, info->buf_count - info->buf_start);

	memcpy(info->data_buff + info->buf_start, buf, real_len);
	info->buf_start += real_len;
}

static void pxa3xx_nand_select_chip(struct mtd_info *mtd, int chip)
{
	return;
}

static int pxa3xx_nand_waitfunc(struct mtd_info *mtd, struct nand_chip *this)
{
783 784
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802

	/* pxa3xx_nand_send_command has waited for command complete */
	if (this->state == FL_WRITING || this->state == FL_ERASING) {
		if (info->retcode == ERR_NONE)
			return 0;
		else {
			/*
			 * any error make it return 0x01 which will tell
			 * the caller the erase and write fail
			 */
			return 0x01;
		}
	}

	return 0;
}

static int pxa3xx_nand_config_flash(struct pxa3xx_nand_info *info,
803
				    const struct pxa3xx_nand_flash *f)
E
eric miao 已提交
804 805 806
{
	struct platform_device *pdev = info->pdev;
	struct pxa3xx_nand_platform_data *pdata = pdev->dev.platform_data;
807
	struct pxa3xx_nand_host *host = info->host[info->cs];
L
Lei Wen 已提交
808
	uint32_t ndcr = 0x0; /* enable all interrupts */
E
eric miao 已提交
809

810 811
	if (f->page_size != 2048 && f->page_size != 512) {
		dev_err(&pdev->dev, "Current only support 2048 and 512 size\n");
E
eric miao 已提交
812
		return -EINVAL;
813
	}
E
eric miao 已提交
814

815 816
	if (f->flash_width != 16 && f->flash_width != 8) {
		dev_err(&pdev->dev, "Only support 8bit and 16 bit!\n");
E
eric miao 已提交
817
		return -EINVAL;
818
	}
E
eric miao 已提交
819 820

	/* calculate flash information */
821 822 823
	host->cmdset = &default_cmdset;
	host->page_size = f->page_size;
	host->read_id_bytes = (f->page_size == 2048) ? 4 : 2;
E
eric miao 已提交
824 825

	/* calculate addressing information */
826
	host->col_addr_cycles = (f->page_size == 2048) ? 2 : 1;
E
eric miao 已提交
827 828

	if (f->num_blocks * f->page_per_block > 65536)
829
		host->row_addr_cycles = 3;
E
eric miao 已提交
830
	else
831
		host->row_addr_cycles = 2;
E
eric miao 已提交
832 833

	ndcr |= (pdata->enable_arbiter) ? NDCR_ND_ARB_EN : 0;
834
	ndcr |= (host->col_addr_cycles == 2) ? NDCR_RA_START : 0;
E
eric miao 已提交
835 836 837 838 839
	ndcr |= (f->page_per_block == 64) ? NDCR_PG_PER_BLK : 0;
	ndcr |= (f->page_size == 2048) ? NDCR_PAGE_SZ : 0;
	ndcr |= (f->flash_width == 16) ? NDCR_DWIDTH_M : 0;
	ndcr |= (f->dfc_width == 16) ? NDCR_DWIDTH_C : 0;

840
	ndcr |= NDCR_RD_ID_CNT(host->read_id_bytes);
E
eric miao 已提交
841 842
	ndcr |= NDCR_SPARE_EN; /* enable spare by default */

843
	host->reg_ndcr = ndcr;
E
eric miao 已提交
844

845
	pxa3xx_nand_set_timing(host, f->timing);
E
eric miao 已提交
846 847 848
	return 0;
}

849 850
static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info)
{
851 852 853 854 855
	/*
	 * We set 0 by hard coding here, for we don't support keep_config
	 * when there is more than one chip attached to the controller
	 */
	struct pxa3xx_nand_host *host = info->host[0];
856 857
	uint32_t ndcr = nand_readl(info, NDCR);

858 859 860 861 862 863 864 865 866 867 868 869 870
	if (ndcr & NDCR_PAGE_SZ) {
		host->page_size = 2048;
		host->read_id_bytes = 4;
	} else {
		host->page_size = 512;
		host->read_id_bytes = 2;
	}

	host->reg_ndcr = ndcr & ~NDCR_INT_MASK;
	host->cmdset = &default_cmdset;

	host->ndtr0cs0 = nand_readl(info, NDTR0CS0);
	host->ndtr1cs0 = nand_readl(info, NDTR1CS0);
871 872 873 874

	return 0;
}

E
eric miao 已提交
875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906
/* the maximum possible buffer size for large page with OOB data
 * is: 2048 + 64 = 2112 bytes, allocate a page here for both the
 * data buffer and the DMA descriptor
 */
#define MAX_BUFF_SIZE	PAGE_SIZE

static int pxa3xx_nand_init_buff(struct pxa3xx_nand_info *info)
{
	struct platform_device *pdev = info->pdev;
	int data_desc_offset = MAX_BUFF_SIZE - sizeof(struct pxa_dma_desc);

	if (use_dma == 0) {
		info->data_buff = kmalloc(MAX_BUFF_SIZE, GFP_KERNEL);
		if (info->data_buff == NULL)
			return -ENOMEM;
		return 0;
	}

	info->data_buff = dma_alloc_coherent(&pdev->dev, MAX_BUFF_SIZE,
				&info->data_buff_phys, GFP_KERNEL);
	if (info->data_buff == NULL) {
		dev_err(&pdev->dev, "failed to allocate dma buffer\n");
		return -ENOMEM;
	}

	info->data_desc = (void *)info->data_buff + data_desc_offset;
	info->data_desc_addr = info->data_buff_phys + data_desc_offset;

	info->data_dma_ch = pxa_request_dma("nand-data", DMA_PRIO_LOW,
				pxa3xx_nand_data_dma_irq, info);
	if (info->data_dma_ch < 0) {
		dev_err(&pdev->dev, "failed to request data dma\n");
907
		dma_free_coherent(&pdev->dev, MAX_BUFF_SIZE,
E
eric miao 已提交
908 909 910 911 912 913 914
				info->data_buff, info->data_buff_phys);
		return info->data_dma_ch;
	}

	return 0;
}

915 916
static int pxa3xx_nand_sensing(struct pxa3xx_nand_info *info)
{
917
	struct mtd_info *mtd;
918
	int ret;
919
	mtd = info->host[info->cs]->mtd;
920
	/* use the common timing to make a try */
921 922 923 924 925
	ret = pxa3xx_nand_config_flash(info, &builtin_flash_types[0]);
	if (ret)
		return ret;

	pxa3xx_nand_cmdfunc(mtd, NAND_CMD_RESET, 0, 0);
926 927
	if (info->is_ready)
		return 0;
928 929

	return -ENODEV;
930
}
E
eric miao 已提交
931

932
static int pxa3xx_nand_scan(struct mtd_info *mtd)
E
eric miao 已提交
933
{
934 935
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
936 937
	struct platform_device *pdev = info->pdev;
	struct pxa3xx_nand_platform_data *pdata = pdev->dev.platform_data;
938
	struct nand_flash_dev pxa3xx_flash_ids[2], *def = NULL;
939 940 941
	const struct pxa3xx_nand_flash *f = NULL;
	struct nand_chip *chip = mtd->priv;
	uint32_t id = -1;
942
	uint64_t chipsize;
943 944 945
	int i, ret, num;

	if (pdata->keep_config && !pxa3xx_nand_detect_config(info))
946
		goto KEEP_CONFIG;
947 948

	ret = pxa3xx_nand_sensing(info);
949
	if (ret) {
950 951
		dev_info(&info->pdev->dev, "There is no chip on cs %d!\n",
			 info->cs);
952

953
		return ret;
954 955 956 957 958
	}

	chip->cmdfunc(mtd, NAND_CMD_READID, 0, 0);
	id = *((uint16_t *)(info->data_buff));
	if (id != 0)
959
		dev_info(&info->pdev->dev, "Detect a flash id %x\n", id);
960
	else {
961 962
		dev_warn(&info->pdev->dev,
			 "Read out ID 0, potential timing set wrong!!\n");
963 964 965 966 967 968 969 970 971 972 973 974

		return -EINVAL;
	}

	num = ARRAY_SIZE(builtin_flash_types) + pdata->num_flash - 1;
	for (i = 0; i < num; i++) {
		if (i < pdata->num_flash)
			f = pdata->flash + i;
		else
			f = &builtin_flash_types[i - pdata->num_flash + 1];

		/* find the chip in default list */
975
		if (f->chip_id == id)
976 977 978
			break;
	}

979
	if (i >= (ARRAY_SIZE(builtin_flash_types) + pdata->num_flash - 1)) {
980
		dev_err(&info->pdev->dev, "ERROR!! flash not defined!!!\n");
981 982 983 984

		return -EINVAL;
	}

985 986 987 988 989 990
	ret = pxa3xx_nand_config_flash(info, f);
	if (ret) {
		dev_err(&info->pdev->dev, "ERROR! Configure failed\n");
		return ret;
	}

991
	pxa3xx_flash_ids[0].name = f->name;
992
	pxa3xx_flash_ids[0].dev_id = (f->chip_id >> 8) & 0xffff;
993 994 995 996 997 998
	pxa3xx_flash_ids[0].pagesize = f->page_size;
	chipsize = (uint64_t)f->num_blocks * f->page_per_block * f->page_size;
	pxa3xx_flash_ids[0].chipsize = chipsize >> 20;
	pxa3xx_flash_ids[0].erasesize = f->page_size * f->page_per_block;
	if (f->flash_width == 16)
		pxa3xx_flash_ids[0].options = NAND_BUSWIDTH_16;
999 1000
	pxa3xx_flash_ids[1].name = NULL;
	def = pxa3xx_flash_ids;
1001
KEEP_CONFIG:
1002 1003
	chip->ecc.mode = NAND_ECC_HW;
	chip->ecc.size = host->page_size;
M
Mike Dunn 已提交
1004
	chip->ecc.strength = 1;
1005 1006 1007 1008

	if (host->reg_ndcr & NDCR_DWIDTH_M)
		chip->options |= NAND_BUSWIDTH_16;

1009
	if (nand_scan_ident(mtd, 1, def))
1010 1011
		return -ENODEV;
	/* calculate addressing information */
1012 1013 1014 1015 1016
	if (mtd->writesize >= 2048)
		host->col_addr_cycles = 2;
	else
		host->col_addr_cycles = 1;

1017 1018
	info->oob_buff = info->data_buff + mtd->writesize;
	if ((mtd->size >> chip->page_shift) > 65536)
1019
		host->row_addr_cycles = 3;
1020
	else
1021
		host->row_addr_cycles = 2;
E
eric miao 已提交
1022

1023
	mtd->name = mtd_names[0];
1024
	return nand_scan_tail(mtd);
E
eric miao 已提交
1025 1026
}

1027
static int alloc_nand_resource(struct platform_device *pdev)
E
eric miao 已提交
1028
{
1029
	struct pxa3xx_nand_platform_data *pdata;
E
eric miao 已提交
1030
	struct pxa3xx_nand_info *info;
1031
	struct pxa3xx_nand_host *host;
1032
	struct nand_chip *chip = NULL;
E
eric miao 已提交
1033 1034
	struct mtd_info *mtd;
	struct resource *r;
1035
	int ret, irq, cs;
E
eric miao 已提交
1036

1037
	pdata = pdev->dev.platform_data;
1038 1039 1040
	info = devm_kzalloc(&pdev->dev, sizeof(*info) + (sizeof(*mtd) +
			    sizeof(*host)) * pdata->num_cs, GFP_KERNEL);
	if (!info)
1041
		return -ENOMEM;
E
eric miao 已提交
1042 1043

	info->pdev = pdev;
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066
	for (cs = 0; cs < pdata->num_cs; cs++) {
		mtd = (struct mtd_info *)((unsigned int)&info[1] +
		      (sizeof(*mtd) + sizeof(*host)) * cs);
		chip = (struct nand_chip *)(&mtd[1]);
		host = (struct pxa3xx_nand_host *)chip;
		info->host[cs] = host;
		host->mtd = mtd;
		host->cs = cs;
		host->info_data = info;
		mtd->priv = host;
		mtd->owner = THIS_MODULE;

		chip->ecc.read_page	= pxa3xx_nand_read_page_hwecc;
		chip->ecc.write_page	= pxa3xx_nand_write_page_hwecc;
		chip->controller        = &info->controller;
		chip->waitfunc		= pxa3xx_nand_waitfunc;
		chip->select_chip	= pxa3xx_nand_select_chip;
		chip->cmdfunc		= pxa3xx_nand_cmdfunc;
		chip->read_word		= pxa3xx_nand_read_word;
		chip->read_byte		= pxa3xx_nand_read_byte;
		chip->read_buf		= pxa3xx_nand_read_buf;
		chip->write_buf		= pxa3xx_nand_write_buf;
	}
1067 1068 1069

	spin_lock_init(&chip->controller->lock);
	init_waitqueue_head(&chip->controller->wq);
1070
	info->clk = devm_clk_get(&pdev->dev, NULL);
E
eric miao 已提交
1071 1072
	if (IS_ERR(info->clk)) {
		dev_err(&pdev->dev, "failed to get nand clock\n");
1073
		return PTR_ERR(info->clk);
E
eric miao 已提交
1074 1075 1076
	}
	clk_enable(info->clk);

1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089
	/*
	 * This is a dirty hack to make this driver work from devicetree
	 * bindings. It can be removed once we have a prober DMA controller
	 * framework for DT.
	 */
	if (pdev->dev.of_node && cpu_is_pxa3xx()) {
		info->drcmr_dat = 97;
		info->drcmr_cmd = 99;
	} else {
		r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
		if (r == NULL) {
			dev_err(&pdev->dev, "no resource defined for data DMA\n");
			ret = -ENXIO;
1090
			goto fail_disable_clk;
1091 1092
		}
		info->drcmr_dat = r->start;
E
eric miao 已提交
1093

1094 1095 1096 1097
		r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
		if (r == NULL) {
			dev_err(&pdev->dev, "no resource defined for command DMA\n");
			ret = -ENXIO;
1098
			goto fail_disable_clk;
1099 1100
		}
		info->drcmr_cmd = r->start;
E
eric miao 已提交
1101 1102 1103 1104 1105 1106
	}

	irq = platform_get_irq(pdev, 0);
	if (irq < 0) {
		dev_err(&pdev->dev, "no IRQ resource defined\n");
		ret = -ENXIO;
1107
		goto fail_disable_clk;
E
eric miao 已提交
1108 1109 1110
	}

	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1111 1112 1113
	info->mmio_base = devm_ioremap_resource(&pdev->dev, r);
	if (IS_ERR(info->mmio_base)) {
		ret = PTR_ERR(info->mmio_base);
1114
		goto fail_disable_clk;
E
eric miao 已提交
1115
	}
1116
	info->mmio_phys = r->start;
E
eric miao 已提交
1117 1118 1119

	ret = pxa3xx_nand_init_buff(info);
	if (ret)
1120
		goto fail_disable_clk;
E
eric miao 已提交
1121

1122 1123 1124
	/* initialize all interrupts to be disabled */
	disable_int(info, NDSR_MASK);

1125 1126
	ret = request_irq(irq, pxa3xx_nand_irq, IRQF_DISABLED,
			  pdev->name, info);
E
eric miao 已提交
1127 1128 1129 1130 1131
	if (ret < 0) {
		dev_err(&pdev->dev, "failed to request IRQ\n");
		goto fail_free_buf;
	}

1132
	platform_set_drvdata(pdev, info);
E
eric miao 已提交
1133

1134
	return 0;
E
eric miao 已提交
1135 1136

fail_free_buf:
1137
	free_irq(irq, info);
E
eric miao 已提交
1138 1139
	if (use_dma) {
		pxa_free_dma(info->data_dma_ch);
1140
		dma_free_coherent(&pdev->dev, MAX_BUFF_SIZE,
E
eric miao 已提交
1141 1142 1143
			info->data_buff, info->data_buff_phys);
	} else
		kfree(info->data_buff);
1144
fail_disable_clk:
E
eric miao 已提交
1145
	clk_disable(info->clk);
1146
	return ret;
E
eric miao 已提交
1147 1148 1149 1150
}

static int pxa3xx_nand_remove(struct platform_device *pdev)
{
1151
	struct pxa3xx_nand_info *info = platform_get_drvdata(pdev);
1152 1153
	struct pxa3xx_nand_platform_data *pdata;
	int irq, cs;
E
eric miao 已提交
1154

1155 1156 1157
	if (!info)
		return 0;

1158
	pdata = pdev->dev.platform_data;
E
eric miao 已提交
1159 1160
	platform_set_drvdata(pdev, NULL);

1161 1162 1163
	irq = platform_get_irq(pdev, 0);
	if (irq >= 0)
		free_irq(irq, info);
E
eric miao 已提交
1164 1165
	if (use_dma) {
		pxa_free_dma(info->data_dma_ch);
1166
		dma_free_writecombine(&pdev->dev, MAX_BUFF_SIZE,
E
eric miao 已提交
1167 1168 1169
				info->data_buff, info->data_buff_phys);
	} else
		kfree(info->data_buff);
1170 1171 1172

	clk_disable(info->clk);

1173 1174
	for (cs = 0; cs < pdata->num_cs; cs++)
		nand_release(info->host[cs]->mtd);
E
eric miao 已提交
1175 1176 1177
	return 0;
}

1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209
#ifdef CONFIG_OF
static struct of_device_id pxa3xx_nand_dt_ids[] = {
	{ .compatible = "marvell,pxa3xx-nand" },
	{}
};
MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids);

static int pxa3xx_nand_probe_dt(struct platform_device *pdev)
{
	struct pxa3xx_nand_platform_data *pdata;
	struct device_node *np = pdev->dev.of_node;
	const struct of_device_id *of_id =
			of_match_device(pxa3xx_nand_dt_ids, &pdev->dev);

	if (!of_id)
		return 0;

	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
		return -ENOMEM;

	if (of_get_property(np, "marvell,nand-enable-arbiter", NULL))
		pdata->enable_arbiter = 1;
	if (of_get_property(np, "marvell,nand-keep-config", NULL))
		pdata->keep_config = 1;
	of_property_read_u32(np, "num-cs", &pdata->num_cs);

	pdev->dev.platform_data = pdata;

	return 0;
}
#else
1210
static inline int pxa3xx_nand_probe_dt(struct platform_device *pdev)
1211 1212 1213 1214 1215
{
	return 0;
}
#endif

1216 1217 1218
static int pxa3xx_nand_probe(struct platform_device *pdev)
{
	struct pxa3xx_nand_platform_data *pdata;
1219
	struct mtd_part_parser_data ppdata = {};
1220
	struct pxa3xx_nand_info *info;
1221
	int ret, cs, probe_success;
1222

1223 1224 1225 1226
	ret = pxa3xx_nand_probe_dt(pdev);
	if (ret)
		return ret;

1227 1228 1229 1230 1231 1232
	pdata = pdev->dev.platform_data;
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data defined\n");
		return -ENODEV;
	}

1233 1234 1235 1236 1237
	ret = alloc_nand_resource(pdev);
	if (ret) {
		dev_err(&pdev->dev, "alloc nand resource failed\n");
		return ret;
	}
1238

1239
	info = platform_get_drvdata(pdev);
1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
	probe_success = 0;
	for (cs = 0; cs < pdata->num_cs; cs++) {
		info->cs = cs;
		ret = pxa3xx_nand_scan(info->host[cs]->mtd);
		if (ret) {
			dev_warn(&pdev->dev, "failed to scan nand at cs %d\n",
				cs);
			continue;
		}

1250
		ppdata.of_node = pdev->dev.of_node;
1251
		ret = mtd_device_parse_register(info->host[cs]->mtd, NULL,
1252
						&ppdata, pdata->parts[cs],
1253
						pdata->nr_parts[cs]);
1254 1255 1256 1257 1258
		if (!ret)
			probe_success = 1;
	}

	if (!probe_success) {
1259 1260 1261 1262
		pxa3xx_nand_remove(pdev);
		return -ENODEV;
	}

1263
	return 0;
1264 1265
}

E
eric miao 已提交
1266 1267 1268
#ifdef CONFIG_PM
static int pxa3xx_nand_suspend(struct platform_device *pdev, pm_message_t state)
{
1269
	struct pxa3xx_nand_info *info = platform_get_drvdata(pdev);
1270 1271 1272
	struct pxa3xx_nand_platform_data *pdata;
	struct mtd_info *mtd;
	int cs;
E
eric miao 已提交
1273

1274
	pdata = pdev->dev.platform_data;
L
Lei Wen 已提交
1275
	if (info->state) {
E
eric miao 已提交
1276 1277 1278 1279
		dev_err(&pdev->dev, "driver busy, state = %d\n", info->state);
		return -EAGAIN;
	}

1280 1281
	for (cs = 0; cs < pdata->num_cs; cs++) {
		mtd = info->host[cs]->mtd;
1282
		mtd_suspend(mtd);
1283 1284
	}

E
eric miao 已提交
1285 1286 1287 1288 1289
	return 0;
}

static int pxa3xx_nand_resume(struct platform_device *pdev)
{
1290
	struct pxa3xx_nand_info *info = platform_get_drvdata(pdev);
1291 1292 1293
	struct pxa3xx_nand_platform_data *pdata;
	struct mtd_info *mtd;
	int cs;
1294

1295
	pdata = pdev->dev.platform_data;
1296 1297
	/* We don't want to handle interrupt without calling mtd routine */
	disable_int(info, NDCR_INT_MASK);
E
eric miao 已提交
1298

1299 1300 1301 1302 1303 1304
	/*
	 * Directly set the chip select to a invalid value,
	 * then the driver would reset the timing according
	 * to current chip select at the beginning of cmdfunc
	 */
	info->cs = 0xff;
E
eric miao 已提交
1305

1306 1307 1308 1309 1310 1311 1312
	/*
	 * As the spec says, the NDSR would be updated to 0x1800 when
	 * doing the nand_clk disable/enable.
	 * To prevent it damaging state machine of the driver, clear
	 * all status before resume
	 */
	nand_writel(info, NDSR, NDSR_MASK);
1313 1314
	for (cs = 0; cs < pdata->num_cs; cs++) {
		mtd = info->host[cs]->mtd;
1315
		mtd_resume(mtd);
1316 1317
	}

1318
	return 0;
E
eric miao 已提交
1319 1320 1321 1322 1323 1324 1325 1326 1327
}
#else
#define pxa3xx_nand_suspend	NULL
#define pxa3xx_nand_resume	NULL
#endif

static struct platform_driver pxa3xx_nand_driver = {
	.driver = {
		.name	= "pxa3xx-nand",
1328
		.of_match_table = of_match_ptr(pxa3xx_nand_dt_ids),
E
eric miao 已提交
1329 1330 1331 1332 1333 1334 1335
	},
	.probe		= pxa3xx_nand_probe,
	.remove		= pxa3xx_nand_remove,
	.suspend	= pxa3xx_nand_suspend,
	.resume		= pxa3xx_nand_resume,
};

1336
module_platform_driver(pxa3xx_nand_driver);
E
eric miao 已提交
1337 1338 1339

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("PXA3xx NAND controller driver");