pxa3xx_nand.c 35.9 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 29 30 31 32
#if defined(CONFIG_ARCH_PXA) || defined(CONFIG_ARCH_MMP)
#define ARCH_HAS_DMA
#endif

#ifdef ARCH_HAS_DMA
33
#include <mach/dma.h>
34 35
#endif

36
#include <linux/platform_data/mtd-nand-pxa3xx.h>
E
eric miao 已提交
37 38

#define	CHIP_DELAY_TIMEOUT	(2 * HZ/10)
L
Lei Wen 已提交
39
#define NAND_STOP_DELAY		(2 * HZ/50)
40
#define PAGE_CHUNK_SIZE		(2048)
E
eric miao 已提交
41

42 43 44 45 46 47 48
/*
 * Define a buffer size for the initial command that detects the flash device:
 * STATUS, READID and PARAM. The largest of these is the PARAM command,
 * needing 256 bytes.
 */
#define INIT_BUFFER_SIZE	256

E
eric miao 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
/* 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 已提交
73
#define NDCR_STOP_ON_UNCOR	(0x1 << 19)
E
eric miao 已提交
74 75 76 77 78 79
#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 已提交
80
#define NDCR_INT_MASK           (0xFFF)
E
eric miao 已提交
81 82

#define NDSR_MASK		(0xfff)
L
Lei Wen 已提交
83 84
#define NDSR_RDY                (0x1 << 12)
#define NDSR_FLASH_RDY          (0x1 << 11)
E
eric miao 已提交
85 86 87 88 89 90 91 92 93 94 95 96
#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)

97
#define NDCB0_LEN_OVRD		(0x1 << 28)
98
#define NDCB0_ST_ROW_EN         (0x1 << 26)
E
eric miao 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
#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,
125
	ERR_SBERR	= -5,
E
eric miao 已提交
126 127 128
};

enum {
L
Lei Wen 已提交
129
	STATE_IDLE = 0,
130
	STATE_PREPARED,
E
eric miao 已提交
131 132 133 134 135 136
	STATE_CMD_HANDLE,
	STATE_DMA_READING,
	STATE_DMA_WRITING,
	STATE_DMA_DONE,
	STATE_PIO_READING,
	STATE_PIO_WRITING,
L
Lei Wen 已提交
137 138
	STATE_CMD_DONE,
	STATE_READY,
E
eric miao 已提交
139 140
};

141 142 143 144 145
enum pxa3xx_nand_variant {
	PXA3XX_NAND_VARIANT_PXA,
	PXA3XX_NAND_VARIANT_ARMADA370,
};

146 147 148 149 150 151 152 153
struct pxa3xx_nand_host {
	struct nand_chip	chip;
	struct mtd_info         *mtd;
	void			*info_data;

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

156 157 158 159 160 161 162 163
	/* calculated from pxa3xx_nand_flash data */
	unsigned int		col_addr_cycles;
	unsigned int		row_addr_cycles;
	size_t			read_id_bytes;

};

struct pxa3xx_nand_info {
164
	struct nand_hw_control	controller;
E
eric miao 已提交
165 166 167 168
	struct platform_device	 *pdev;

	struct clk		*clk;
	void __iomem		*mmio_base;
169
	unsigned long		mmio_phys;
170
	struct completion	cmd_complete;
E
eric miao 已提交
171 172 173

	unsigned int 		buf_start;
	unsigned int		buf_count;
174
	unsigned int		buf_size;
E
eric miao 已提交
175 176 177 178 179 180

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

	unsigned char		*data_buff;
181
	unsigned char		*oob_buff;
E
eric miao 已提交
182 183 184 185 186
	dma_addr_t 		data_buff_phys;
	int 			data_dma_ch;
	struct pxa_dma_desc	*data_desc;
	dma_addr_t 		data_desc_addr;

187
	struct pxa3xx_nand_host *host[NUM_CHIP_SELECT];
E
eric miao 已提交
188 189
	unsigned int		state;

190 191 192 193 194 195
	/*
	 * This driver supports NFCv1 (as found in PXA SoC)
	 * and NFCv2 (as found in Armada 370/XP SoC).
	 */
	enum pxa3xx_nand_variant variant;

196
	int			cs;
E
eric miao 已提交
197 198
	int			use_ecc;	/* use HW ECC ? */
	int			use_dma;	/* use DMA ? */
199
	int			use_spare;	/* use spare ? */
200
	int			is_ready;
E
eric miao 已提交
201

202 203
	unsigned int		page_size;	/* page size of attached chip */
	unsigned int		data_size;	/* data size in FIFO */
204
	unsigned int		oob_size;
E
eric miao 已提交
205 206
	int 			retcode;

207 208 209 210 211
	/* cached register value */
	uint32_t		reg_ndcr;
	uint32_t		ndtr0cs0;
	uint32_t		ndtr1cs0;

E
eric miao 已提交
212 213 214 215
	/* generated NDCBx register values */
	uint32_t		ndcb0;
	uint32_t		ndcb1;
	uint32_t		ndcb2;
216
	uint32_t		ndcb3;
E
eric miao 已提交
217 218
};

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

223
static struct pxa3xx_nand_timing timing[] = {
224 225 226 227
	{ 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, },
228 229
};

230
static struct pxa3xx_nand_flash builtin_flash_types[] = {
231 232 233 234 235 236 237 238 239
{ "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] },
240 241
};

242 243 244
/* Define a default flash type setting serve as flash detecting only */
#define DEFAULT_FLASH_TYPE (&builtin_flash_types[0])

E
eric miao 已提交
245 246 247 248 249 250 251 252 253 254 255 256
#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 已提交
257
#define ns2cycle(ns, clk)	(int)((ns) * (clk / 1000000) / 1000)
E
eric miao 已提交
258

259
static void pxa3xx_nand_set_timing(struct pxa3xx_nand_host *host,
260
				   const struct pxa3xx_nand_timing *t)
E
eric miao 已提交
261
{
262
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
263 264 265 266 267 268 269 270 271 272 273 274 275 276
	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));

277 278
	info->ndtr0cs0 = ndtr0;
	info->ndtr1cs0 = ndtr1;
E
eric miao 已提交
279 280 281 282
	nand_writel(info, NDTR0CS0, ndtr0);
	nand_writel(info, NDTR1CS0, ndtr1);
}

283
static void pxa3xx_set_datasize(struct pxa3xx_nand_info *info)
E
eric miao 已提交
284
{
285
	struct pxa3xx_nand_host *host = info->host[info->cs];
286
	int oob_enable = info->reg_ndcr & NDCR_SPARE_EN;
287

288
	info->data_size = host->page_size;
289 290 291 292 293
	if (!oob_enable) {
		info->oob_size = 0;
		return;
	}

294
	switch (host->page_size) {
E
eric miao 已提交
295
	case 2048:
296
		info->oob_size = (info->use_ecc) ? 40 : 64;
E
eric miao 已提交
297 298
		break;
	case 512:
299
		info->oob_size = (info->use_ecc) ? 8 : 16;
E
eric miao 已提交
300 301
		break;
	}
302 303
}

L
Lei Wen 已提交
304 305 306 307 308 309 310 311 312 313
/**
 * 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)
{
	uint32_t ndcr;

314
	ndcr = info->reg_ndcr;
315 316 317 318 319 320 321 322 323 324 325

	if (info->use_ecc)
		ndcr |= NDCR_ECC_EN;
	else
		ndcr &= ~NDCR_ECC_EN;

	if (info->use_dma)
		ndcr |= NDCR_DMA_EN;
	else
		ndcr &= ~NDCR_DMA_EN;

326 327 328 329 330
	if (info->use_spare)
		ndcr |= NDCR_SPARE_EN;
	else
		ndcr &= ~NDCR_SPARE_EN;

L
Lei Wen 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
	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);
}

359 360
static void __maybe_unused
enable_int(struct pxa3xx_nand_info *info, uint32_t int_mask)
E
eric miao 已提交
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375
{
	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 已提交
376
static void handle_data_pio(struct pxa3xx_nand_info *info)
E
eric miao 已提交
377 378 379 380
{
	switch (info->state) {
	case STATE_PIO_WRITING:
		__raw_writesl(info->mmio_base + NDDB, info->data_buff,
381
				DIV_ROUND_UP(info->data_size, 4));
382 383 384
		if (info->oob_size > 0)
			__raw_writesl(info->mmio_base + NDDB, info->oob_buff,
					DIV_ROUND_UP(info->oob_size, 4));
E
eric miao 已提交
385 386 387
		break;
	case STATE_PIO_READING:
		__raw_readsl(info->mmio_base + NDDB, info->data_buff,
388
				DIV_ROUND_UP(info->data_size, 4));
389 390 391
		if (info->oob_size > 0)
			__raw_readsl(info->mmio_base + NDDB, info->oob_buff,
					DIV_ROUND_UP(info->oob_size, 4));
E
eric miao 已提交
392 393
		break;
	default:
394
		dev_err(&info->pdev->dev, "%s: invalid state %d\n", __func__,
E
eric miao 已提交
395
				info->state);
L
Lei Wen 已提交
396
		BUG();
E
eric miao 已提交
397 398 399
	}
}

400
#ifdef ARCH_HAS_DMA
L
Lei Wen 已提交
401
static void start_data_dma(struct pxa3xx_nand_info *info)
E
eric miao 已提交
402 403
{
	struct pxa_dma_desc *desc = info->data_desc;
404
	int dma_len = ALIGN(info->data_size + info->oob_size, 32);
E
eric miao 已提交
405 406 407 408

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

L
Lei Wen 已提交
409 410
	switch (info->state) {
	case STATE_DMA_WRITING:
E
eric miao 已提交
411
		desc->dsadr = info->data_buff_phys;
412
		desc->dtadr = info->mmio_phys + NDDB;
E
eric miao 已提交
413
		desc->dcmd |= DCMD_INCSRCADDR | DCMD_FLOWTRG;
L
Lei Wen 已提交
414 415
		break;
	case STATE_DMA_READING:
E
eric miao 已提交
416
		desc->dtadr = info->data_buff_phys;
417
		desc->dsadr = info->mmio_phys + NDDB;
E
eric miao 已提交
418
		desc->dcmd |= DCMD_INCTRGADDR | DCMD_FLOWSRC;
L
Lei Wen 已提交
419 420
		break;
	default:
421
		dev_err(&info->pdev->dev, "%s: invalid state %d\n", __func__,
L
Lei Wen 已提交
422 423
				info->state);
		BUG();
E
eric miao 已提交
424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
	}

	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 已提交
443 444 445
	info->state = STATE_DMA_DONE;
	enable_int(info, NDCR_INT_MASK);
	nand_writel(info, NDSR, NDSR_WRDREQ | NDSR_RDDREQ);
E
eric miao 已提交
446
}
447 448 449 450
#else
static void start_data_dma(struct pxa3xx_nand_info *info)
{}
#endif
E
eric miao 已提交
451 452 453 454

static irqreturn_t pxa3xx_nand_irq(int irq, void *devid)
{
	struct pxa3xx_nand_info *info = devid;
L
Lei Wen 已提交
455
	unsigned int status, is_completed = 0;
456 457 458 459 460 461 462 463 464
	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 已提交
465 466 467

	status = nand_readl(info, NDSR);

L
Lei Wen 已提交
468 469 470 471 472 473
	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 已提交
474
		if (info->use_dma) {
L
Lei Wen 已提交
475 476 477 478 479
			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 已提交
480
		} else {
L
Lei Wen 已提交
481 482 483
			info->state = (status & NDSR_RDDREQ) ?
				      STATE_PIO_READING : STATE_PIO_WRITING;
			handle_data_pio(info);
E
eric miao 已提交
484 485
		}
	}
486
	if (status & cmd_done) {
L
Lei Wen 已提交
487 488
		info->state = STATE_CMD_DONE;
		is_completed = 1;
E
eric miao 已提交
489
	}
490
	if (status & ready) {
491
		info->is_ready = 1;
L
Lei Wen 已提交
492
		info->state = STATE_READY;
493
	}
E
eric miao 已提交
494

L
Lei Wen 已提交
495 496 497 498
	if (status & NDSR_WRCMDREQ) {
		nand_writel(info, NDSR, NDSR_WRCMDREQ);
		status &= ~NDSR_WRCMDREQ;
		info->state = STATE_CMD_HANDLE;
499 500 501 502 503 504 505 506 507

		/*
		 * Command buffer registers NDCB{0-2} (and optionally NDCB3)
		 * must be loaded by writing directly either 12 or 16
		 * bytes directly to NDCB0, four bytes at a time.
		 *
		 * Direct write access to NDCB1, NDCB2 and NDCB3 is ignored
		 * but each NDCBx register can be read.
		 */
L
Lei Wen 已提交
508 509 510
		nand_writel(info, NDCB0, info->ndcb0);
		nand_writel(info, NDCB0, info->ndcb1);
		nand_writel(info, NDCB0, info->ndcb2);
511 512 513 514

		/* NDCB3 register is available in NFCv2 (Armada 370/XP SoC) */
		if (info->variant == PXA3XX_NAND_VARIANT_ARMADA370)
			nand_writel(info, NDCB0, info->ndcb3);
E
eric miao 已提交
515 516
	}

L
Lei Wen 已提交
517 518 519 520 521 522
	/* 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 已提交
523 524 525 526 527 528 529 530 531 532
}

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

533 534
static int prepare_command_pool(struct pxa3xx_nand_info *info, int command,
		uint16_t column, int page_addr)
E
eric miao 已提交
535
{
536
	int addr_cycle, exec_cmd;
537 538
	struct pxa3xx_nand_host *host;
	struct mtd_info *mtd;
E
eric miao 已提交
539

540 541
	host = info->host[info->cs];
	mtd = host->mtd;
542 543 544 545
	addr_cycle = 0;
	exec_cmd = 1;

	/* reset data and oob column point to handle data */
546 547
	info->buf_start		= 0;
	info->buf_count		= 0;
548 549
	info->oob_size		= 0;
	info->use_ecc		= 0;
550
	info->use_spare		= 1;
551
	info->is_ready		= 0;
552
	info->retcode		= ERR_NONE;
553 554 555 556
	if (info->cs != 0)
		info->ndcb0 = NDCB0_CSEL;
	else
		info->ndcb0 = 0;
E
eric miao 已提交
557 558

	switch (command) {
559 560 561
	case NAND_CMD_READ0:
	case NAND_CMD_PAGEPROG:
		info->use_ecc = 1;
E
eric miao 已提交
562
	case NAND_CMD_READOOB:
563
		pxa3xx_set_datasize(info);
E
eric miao 已提交
564
		break;
565 566 567
	case NAND_CMD_PARAM:
		info->use_spare = 0;
		break;
568 569 570 571 572 573
	case NAND_CMD_SEQIN:
		exec_cmd = 0;
		break;
	default:
		info->ndcb1 = 0;
		info->ndcb2 = 0;
574
		info->ndcb3 = 0;
575 576 577
		break;
	}

578 579
	addr_cycle = NDCB0_ADDR_CYC(host->row_addr_cycles
				    + host->col_addr_cycles);
E
eric miao 已提交
580

581 582
	switch (command) {
	case NAND_CMD_READOOB:
E
eric miao 已提交
583
	case NAND_CMD_READ0:
584 585 586 587 588
		info->buf_start = column;
		info->ndcb0 |= NDCB0_CMD_TYPE(0)
				| addr_cycle
				| NAND_CMD_READ0;

589
		if (command == NAND_CMD_READOOB)
590
			info->buf_start += mtd->writesize;
591

592 593 594
		/* Second command setting for large pages */
		if (host->page_size >= PAGE_CHUNK_SIZE)
			info->ndcb0 |= NDCB0_DBC | (NAND_CMD_READSTART << 8);
E
eric miao 已提交
595 596

	case NAND_CMD_SEQIN:
597
		/* small page addr setting */
598
		if (unlikely(host->page_size < PAGE_CHUNK_SIZE)) {
599 600 601 602 603 604 605 606 607 608 609 610 611 612
			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 已提交
613
		info->buf_count = mtd->writesize + mtd->oobsize;
614
		memset(info->data_buff, 0xFF, info->buf_count);
E
eric miao 已提交
615 616

		break;
617

E
eric miao 已提交
618
	case NAND_CMD_PAGEPROG:
619 620 621 622 623
		if (is_buf_blank(info->data_buff,
					(mtd->writesize + mtd->oobsize))) {
			exec_cmd = 0;
			break;
		}
E
eric miao 已提交
624

625 626 627 628
		info->ndcb0 |= NDCB0_CMD_TYPE(0x1)
				| NDCB0_AUTO_RS
				| NDCB0_ST_ROW_EN
				| NDCB0_DBC
629 630
				| (NAND_CMD_PAGEPROG << 8)
				| NAND_CMD_SEQIN
631
				| addr_cycle;
E
eric miao 已提交
632
		break;
633

634 635 636 637
	case NAND_CMD_PARAM:
		info->buf_count = 256;
		info->ndcb0 |= NDCB0_CMD_TYPE(0)
				| NDCB0_ADDR_CYC(1)
638
				| NDCB0_LEN_OVRD
639
				| command;
640
		info->ndcb1 = (column & 0xFF);
641
		info->ndcb3 = 256;
642 643 644
		info->data_size = 256;
		break;

E
eric miao 已提交
645
	case NAND_CMD_READID:
646
		info->buf_count = host->read_id_bytes;
647 648
		info->ndcb0 |= NDCB0_CMD_TYPE(3)
				| NDCB0_ADDR_CYC(1)
649
				| command;
650
		info->ndcb1 = (column & 0xFF);
651 652 653

		info->data_size = 8;
		break;
E
eric miao 已提交
654
	case NAND_CMD_STATUS:
655 656 657
		info->buf_count = 1;
		info->ndcb0 |= NDCB0_CMD_TYPE(4)
				| NDCB0_ADDR_CYC(1)
658
				| command;
659 660 661 662 663 664 665 666 667

		info->data_size = 8;
		break;

	case NAND_CMD_ERASE1:
		info->ndcb0 |= NDCB0_CMD_TYPE(2)
				| NDCB0_AUTO_RS
				| NDCB0_ADDR_CYC(3)
				| NDCB0_DBC
668 669
				| (NAND_CMD_ERASE2 << 8)
				| NAND_CMD_ERASE1;
670 671 672
		info->ndcb1 = page_addr;
		info->ndcb2 = 0;

E
eric miao 已提交
673 674
		break;
	case NAND_CMD_RESET:
675
		info->ndcb0 |= NDCB0_CMD_TYPE(5)
676
				| command;
677 678 679 680 681

		break;

	case NAND_CMD_ERASE2:
		exec_cmd = 0;
E
eric miao 已提交
682
		break;
683

E
eric miao 已提交
684
	default:
685
		exec_cmd = 0;
686 687
		dev_err(&info->pdev->dev, "non-supported command %x\n",
				command);
E
eric miao 已提交
688 689 690
		break;
	}

691 692 693 694 695 696
	return exec_cmd;
}

static void pxa3xx_nand_cmdfunc(struct mtd_info *mtd, unsigned command,
				int column, int page_addr)
{
697 698
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
699 700 701 702 703 704 705
	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
	 */
706
	if (info->reg_ndcr & NDCR_DWIDTH_M)
707 708
		column /= 2;

709 710 711 712 713 714 715
	/*
	 * 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;
716 717
		nand_writel(info, NDTR0CS0, info->ndtr0cs0);
		nand_writel(info, NDTR1CS0, info->ndtr1cs0);
718 719
	}

720
	info->state = STATE_PREPARED;
721
	exec_cmd = prepare_command_pool(info, command, column, page_addr);
L
Lei Wen 已提交
722 723 724 725 726 727 728
	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) {
729
			dev_err(&info->pdev->dev, "Wait time out!!!\n");
L
Lei Wen 已提交
730 731 732 733
			/* Stop State Machine for next command cycle */
			pxa3xx_nand_stop(info);
		}
	}
734
	info->state = STATE_IDLE;
L
Lei Wen 已提交
735 736
}

737
static int pxa3xx_nand_write_page_hwecc(struct mtd_info *mtd,
738
		struct nand_chip *chip, const uint8_t *buf, int oob_required)
L
Lei Wen 已提交
739 740 741
{
	chip->write_buf(mtd, buf, mtd->writesize);
	chip->write_buf(mtd, chip->oob_poi, mtd->oobsize);
742 743

	return 0;
L
Lei Wen 已提交
744 745 746
}

static int pxa3xx_nand_read_page_hwecc(struct mtd_info *mtd,
747 748
		struct nand_chip *chip, uint8_t *buf, int oob_required,
		int page)
L
Lei Wen 已提交
749
{
750 751
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
L
Lei Wen 已提交
752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771

	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))
772 773
			info->retcode = ERR_NONE;
		else
L
Lei Wen 已提交
774
			mtd->ecc_stats.failed++;
E
eric miao 已提交
775
	}
L
Lei Wen 已提交
776 777

	return 0;
E
eric miao 已提交
778 779 780 781
}

static uint8_t pxa3xx_nand_read_byte(struct mtd_info *mtd)
{
782 783
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
784 785 786 787 788 789 790 791 792 793 794
	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)
{
795 796
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
797 798 799 800 801 802 803 804 805 806 807
	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)
{
808 809
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
810 811 812 813 814 815 816 817 818
	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)
{
819 820
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
821 822 823 824 825 826 827 828 829 830 831 832 833
	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)
{
834 835
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
E
eric miao 已提交
836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853

	/* 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,
854
				    const struct pxa3xx_nand_flash *f)
E
eric miao 已提交
855 856
{
	struct platform_device *pdev = info->pdev;
J
Jingoo Han 已提交
857
	struct pxa3xx_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
858
	struct pxa3xx_nand_host *host = info->host[info->cs];
L
Lei Wen 已提交
859
	uint32_t ndcr = 0x0; /* enable all interrupts */
E
eric miao 已提交
860

861 862
	if (f->page_size != 2048 && f->page_size != 512) {
		dev_err(&pdev->dev, "Current only support 2048 and 512 size\n");
E
eric miao 已提交
863
		return -EINVAL;
864
	}
E
eric miao 已提交
865

866 867
	if (f->flash_width != 16 && f->flash_width != 8) {
		dev_err(&pdev->dev, "Only support 8bit and 16 bit!\n");
E
eric miao 已提交
868
		return -EINVAL;
869
	}
E
eric miao 已提交
870 871

	/* calculate flash information */
872 873
	host->page_size = f->page_size;
	host->read_id_bytes = (f->page_size == 2048) ? 4 : 2;
E
eric miao 已提交
874 875

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

	if (f->num_blocks * f->page_per_block > 65536)
879
		host->row_addr_cycles = 3;
E
eric miao 已提交
880
	else
881
		host->row_addr_cycles = 2;
E
eric miao 已提交
882 883

	ndcr |= (pdata->enable_arbiter) ? NDCR_ND_ARB_EN : 0;
884
	ndcr |= (host->col_addr_cycles == 2) ? NDCR_RA_START : 0;
E
eric miao 已提交
885 886 887 888 889
	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;

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

893
	info->reg_ndcr = ndcr;
E
eric miao 已提交
894

895
	pxa3xx_nand_set_timing(host, f->timing);
E
eric miao 已提交
896 897 898
	return 0;
}

899 900
static int pxa3xx_nand_detect_config(struct pxa3xx_nand_info *info)
{
901 902 903 904 905
	/*
	 * 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];
906 907
	uint32_t ndcr = nand_readl(info, NDCR);

908 909 910 911 912 913 914 915
	if (ndcr & NDCR_PAGE_SZ) {
		host->page_size = 2048;
		host->read_id_bytes = 4;
	} else {
		host->page_size = 512;
		host->read_id_bytes = 2;
	}

916 917 918
	info->reg_ndcr = ndcr & ~NDCR_INT_MASK;
	info->ndtr0cs0 = nand_readl(info, NDTR0CS0);
	info->ndtr1cs0 = nand_readl(info, NDTR1CS0);
919 920 921
	return 0;
}

922
#ifdef ARCH_HAS_DMA
E
eric miao 已提交
923 924 925
static int pxa3xx_nand_init_buff(struct pxa3xx_nand_info *info)
{
	struct platform_device *pdev = info->pdev;
926
	int data_desc_offset = info->buf_size - sizeof(struct pxa_dma_desc);
E
eric miao 已提交
927 928

	if (use_dma == 0) {
929
		info->data_buff = kmalloc(info->buf_size, GFP_KERNEL);
E
eric miao 已提交
930 931 932 933 934
		if (info->data_buff == NULL)
			return -ENOMEM;
		return 0;
	}

935
	info->data_buff = dma_alloc_coherent(&pdev->dev, info->buf_size,
E
eric miao 已提交
936 937 938 939 940 941 942 943 944 945 946 947 948
				&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");
949
		dma_free_coherent(&pdev->dev, info->buf_size,
E
eric miao 已提交
950 951 952 953
				info->data_buff, info->data_buff_phys);
		return info->data_dma_ch;
	}

954 955 956 957 958
	/*
	 * Now that DMA buffers are allocated we turn on
	 * DMA proper for I/O operations.
	 */
	info->use_dma = 1;
E
eric miao 已提交
959 960 961
	return 0;
}

962 963 964 965 966
static void pxa3xx_nand_free_buff(struct pxa3xx_nand_info *info)
{
	struct platform_device *pdev = info->pdev;
	if (use_dma) {
		pxa_free_dma(info->data_dma_ch);
967
		dma_free_coherent(&pdev->dev, info->buf_size,
968 969 970 971 972
				  info->data_buff, info->data_buff_phys);
	} else {
		kfree(info->data_buff);
	}
}
973 974 975
#else
static int pxa3xx_nand_init_buff(struct pxa3xx_nand_info *info)
{
976
	info->data_buff = kmalloc(info->buf_size, GFP_KERNEL);
977 978 979 980 981 982 983 984 985 986
	if (info->data_buff == NULL)
		return -ENOMEM;
	return 0;
}

static void pxa3xx_nand_free_buff(struct pxa3xx_nand_info *info)
{
	kfree(info->data_buff);
}
#endif
987

988 989
static int pxa3xx_nand_sensing(struct pxa3xx_nand_info *info)
{
990
	struct mtd_info *mtd;
991
	int ret;
992
	mtd = info->host[info->cs]->mtd;
993
	/* use the common timing to make a try */
994 995 996 997 998
	ret = pxa3xx_nand_config_flash(info, &builtin_flash_types[0]);
	if (ret)
		return ret;

	pxa3xx_nand_cmdfunc(mtd, NAND_CMD_RESET, 0, 0);
999 1000
	if (info->is_ready)
		return 0;
1001 1002

	return -ENODEV;
1003
}
E
eric miao 已提交
1004

1005
static int pxa3xx_nand_scan(struct mtd_info *mtd)
E
eric miao 已提交
1006
{
1007 1008
	struct pxa3xx_nand_host *host = mtd->priv;
	struct pxa3xx_nand_info *info = host->info_data;
1009
	struct platform_device *pdev = info->pdev;
J
Jingoo Han 已提交
1010
	struct pxa3xx_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
1011
	struct nand_flash_dev pxa3xx_flash_ids[2], *def = NULL;
1012 1013 1014
	const struct pxa3xx_nand_flash *f = NULL;
	struct nand_chip *chip = mtd->priv;
	uint32_t id = -1;
1015
	uint64_t chipsize;
1016 1017 1018
	int i, ret, num;

	if (pdata->keep_config && !pxa3xx_nand_detect_config(info))
1019
		goto KEEP_CONFIG;
1020 1021

	ret = pxa3xx_nand_sensing(info);
1022
	if (ret) {
1023 1024
		dev_info(&info->pdev->dev, "There is no chip on cs %d!\n",
			 info->cs);
1025

1026
		return ret;
1027 1028 1029 1030 1031
	}

	chip->cmdfunc(mtd, NAND_CMD_READID, 0, 0);
	id = *((uint16_t *)(info->data_buff));
	if (id != 0)
1032
		dev_info(&info->pdev->dev, "Detect a flash id %x\n", id);
1033
	else {
1034 1035
		dev_warn(&info->pdev->dev,
			 "Read out ID 0, potential timing set wrong!!\n");
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047

		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 */
1048
		if (f->chip_id == id)
1049 1050 1051
			break;
	}

1052
	if (i >= (ARRAY_SIZE(builtin_flash_types) + pdata->num_flash - 1)) {
1053
		dev_err(&info->pdev->dev, "ERROR!! flash not defined!!!\n");
1054 1055 1056 1057

		return -EINVAL;
	}

1058 1059 1060 1061 1062 1063
	ret = pxa3xx_nand_config_flash(info, f);
	if (ret) {
		dev_err(&info->pdev->dev, "ERROR! Configure failed\n");
		return ret;
	}

1064
	pxa3xx_flash_ids[0].name = f->name;
1065
	pxa3xx_flash_ids[0].dev_id = (f->chip_id >> 8) & 0xffff;
1066 1067 1068 1069 1070 1071
	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;
1072 1073
	pxa3xx_flash_ids[1].name = NULL;
	def = pxa3xx_flash_ids;
1074
KEEP_CONFIG:
1075 1076
	chip->ecc.mode = NAND_ECC_HW;
	chip->ecc.size = host->page_size;
M
Mike Dunn 已提交
1077
	chip->ecc.strength = 1;
1078

1079
	if (info->reg_ndcr & NDCR_DWIDTH_M)
1080 1081
		chip->options |= NAND_BUSWIDTH_16;

1082
	if (nand_scan_ident(mtd, 1, def))
1083 1084
		return -ENODEV;
	/* calculate addressing information */
1085 1086 1087 1088 1089
	if (mtd->writesize >= 2048)
		host->col_addr_cycles = 2;
	else
		host->col_addr_cycles = 1;

1090 1091 1092 1093 1094 1095 1096 1097
	/* release the initial buffer */
	kfree(info->data_buff);

	/* allocate the real data + oob buffer */
	info->buf_size = mtd->writesize + mtd->oobsize;
	ret = pxa3xx_nand_init_buff(info);
	if (ret)
		return ret;
1098
	info->oob_buff = info->data_buff + mtd->writesize;
1099

1100
	if ((mtd->size >> chip->page_shift) > 65536)
1101
		host->row_addr_cycles = 3;
1102
	else
1103
		host->row_addr_cycles = 2;
1104
	return nand_scan_tail(mtd);
E
eric miao 已提交
1105 1106
}

1107
static int alloc_nand_resource(struct platform_device *pdev)
E
eric miao 已提交
1108
{
1109
	struct pxa3xx_nand_platform_data *pdata;
E
eric miao 已提交
1110
	struct pxa3xx_nand_info *info;
1111
	struct pxa3xx_nand_host *host;
1112
	struct nand_chip *chip = NULL;
E
eric miao 已提交
1113 1114
	struct mtd_info *mtd;
	struct resource *r;
1115
	int ret, irq, cs;
E
eric miao 已提交
1116

J
Jingoo Han 已提交
1117
	pdata = dev_get_platdata(&pdev->dev);
1118 1119 1120
	info = devm_kzalloc(&pdev->dev, sizeof(*info) + (sizeof(*mtd) +
			    sizeof(*host)) * pdata->num_cs, GFP_KERNEL);
	if (!info)
1121
		return -ENOMEM;
E
eric miao 已提交
1122 1123

	info->pdev = pdev;
1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146
	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;
	}
1147 1148 1149

	spin_lock_init(&chip->controller->lock);
	init_waitqueue_head(&chip->controller->wq);
1150
	info->clk = devm_clk_get(&pdev->dev, NULL);
E
eric miao 已提交
1151 1152
	if (IS_ERR(info->clk)) {
		dev_err(&pdev->dev, "failed to get nand clock\n");
1153
		return PTR_ERR(info->clk);
E
eric miao 已提交
1154
	}
1155 1156 1157
	ret = clk_prepare_enable(info->clk);
	if (ret < 0)
		return ret;
E
eric miao 已提交
1158

1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
	if (use_dma) {
		/*
		 * 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 &&
		    of_machine_is_compatible("marvell,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;
				goto fail_disable_clk;
			}
			info->drcmr_dat = r->start;

			r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
			if (r == NULL) {
				dev_err(&pdev->dev,
					"no resource defined for cmd DMA\n");
				ret = -ENXIO;
				goto fail_disable_clk;
			}
			info->drcmr_cmd = r->start;
1187
		}
E
eric miao 已提交
1188 1189 1190 1191 1192 1193
	}

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

	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1198 1199 1200
	info->mmio_base = devm_ioremap_resource(&pdev->dev, r);
	if (IS_ERR(info->mmio_base)) {
		ret = PTR_ERR(info->mmio_base);
1201
		goto fail_disable_clk;
E
eric miao 已提交
1202
	}
1203
	info->mmio_phys = r->start;
E
eric miao 已提交
1204

1205 1206 1207 1208 1209
	/* Allocate a buffer to allow flash detection */
	info->buf_size = INIT_BUFFER_SIZE;
	info->data_buff = kmalloc(info->buf_size, GFP_KERNEL);
	if (info->data_buff == NULL) {
		ret = -ENOMEM;
1210
		goto fail_disable_clk;
1211
	}
E
eric miao 已提交
1212

1213 1214 1215
	/* initialize all interrupts to be disabled */
	disable_int(info, NDSR_MASK);

1216 1217
	ret = request_irq(irq, pxa3xx_nand_irq, IRQF_DISABLED,
			  pdev->name, info);
E
eric miao 已提交
1218 1219 1220 1221 1222
	if (ret < 0) {
		dev_err(&pdev->dev, "failed to request IRQ\n");
		goto fail_free_buf;
	}

1223
	platform_set_drvdata(pdev, info);
E
eric miao 已提交
1224

1225
	return 0;
E
eric miao 已提交
1226 1227

fail_free_buf:
1228
	free_irq(irq, info);
1229
	kfree(info->data_buff);
1230
fail_disable_clk:
1231
	clk_disable_unprepare(info->clk);
1232
	return ret;
E
eric miao 已提交
1233 1234 1235 1236
}

static int pxa3xx_nand_remove(struct platform_device *pdev)
{
1237
	struct pxa3xx_nand_info *info = platform_get_drvdata(pdev);
1238 1239
	struct pxa3xx_nand_platform_data *pdata;
	int irq, cs;
E
eric miao 已提交
1240

1241 1242 1243
	if (!info)
		return 0;

J
Jingoo Han 已提交
1244
	pdata = dev_get_platdata(&pdev->dev);
E
eric miao 已提交
1245

1246 1247 1248
	irq = platform_get_irq(pdev, 0);
	if (irq >= 0)
		free_irq(irq, info);
1249
	pxa3xx_nand_free_buff(info);
1250

1251
	clk_disable_unprepare(info->clk);
1252

1253 1254
	for (cs = 0; cs < pdata->num_cs; cs++)
		nand_release(info->host[cs]->mtd);
E
eric miao 已提交
1255 1256 1257
	return 0;
}

1258
static struct of_device_id pxa3xx_nand_dt_ids[] = {
1259 1260 1261 1262 1263 1264 1265 1266
	{
		.compatible = "marvell,pxa3xx-nand",
		.data       = (void *)PXA3XX_NAND_VARIANT_PXA,
	},
	{
		.compatible = "marvell,armada370-nand",
		.data       = (void *)PXA3XX_NAND_VARIANT_ARMADA370,
	},
1267 1268
	{}
};
1269
MODULE_DEVICE_TABLE(of, pxa3xx_nand_dt_ids);
1270

1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
static enum pxa3xx_nand_variant
pxa3xx_nand_get_variant(struct platform_device *pdev)
{
	const struct of_device_id *of_id =
			of_match_device(pxa3xx_nand_dt_ids, &pdev->dev);
	if (!of_id)
		return PXA3XX_NAND_VARIANT_PXA;
	return (enum pxa3xx_nand_variant)of_id->data;
}

1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305
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;
}

1306 1307 1308
static int pxa3xx_nand_probe(struct platform_device *pdev)
{
	struct pxa3xx_nand_platform_data *pdata;
1309
	struct mtd_part_parser_data ppdata = {};
1310
	struct pxa3xx_nand_info *info;
1311
	int ret, cs, probe_success;
1312

1313 1314 1315 1316 1317 1318 1319
#ifndef ARCH_HAS_DMA
	if (use_dma) {
		use_dma = 0;
		dev_warn(&pdev->dev,
			 "This platform can't do DMA on this device\n");
	}
#endif
1320 1321 1322 1323
	ret = pxa3xx_nand_probe_dt(pdev);
	if (ret)
		return ret;

J
Jingoo Han 已提交
1324
	pdata = dev_get_platdata(&pdev->dev);
1325 1326 1327 1328 1329
	if (!pdata) {
		dev_err(&pdev->dev, "no platform data defined\n");
		return -ENODEV;
	}

1330 1331 1332 1333 1334
	ret = alloc_nand_resource(pdev);
	if (ret) {
		dev_err(&pdev->dev, "alloc nand resource failed\n");
		return ret;
	}
1335

1336
	info = platform_get_drvdata(pdev);
1337
	info->variant = pxa3xx_nand_get_variant(pdev);
1338 1339
	probe_success = 0;
	for (cs = 0; cs < pdata->num_cs; cs++) {
1340
		struct mtd_info *mtd = info->host[cs]->mtd;
1341

1342 1343 1344 1345 1346 1347
		/*
		 * The mtd name matches the one used in 'mtdparts' kernel
		 * parameter. This name cannot be changed or otherwise
		 * user's mtd partitions configuration would get broken.
		 */
		mtd->name = "pxa3xx_nand-0";
1348
		info->cs = cs;
1349
		ret = pxa3xx_nand_scan(mtd);
1350 1351 1352 1353 1354 1355
		if (ret) {
			dev_warn(&pdev->dev, "failed to scan nand at cs %d\n",
				cs);
			continue;
		}

1356
		ppdata.of_node = pdev->dev.of_node;
1357
		ret = mtd_device_parse_register(mtd, NULL,
1358
						&ppdata, pdata->parts[cs],
1359
						pdata->nr_parts[cs]);
1360 1361 1362 1363 1364
		if (!ret)
			probe_success = 1;
	}

	if (!probe_success) {
1365 1366 1367 1368
		pxa3xx_nand_remove(pdev);
		return -ENODEV;
	}

1369
	return 0;
1370 1371
}

E
eric miao 已提交
1372 1373 1374
#ifdef CONFIG_PM
static int pxa3xx_nand_suspend(struct platform_device *pdev, pm_message_t state)
{
1375
	struct pxa3xx_nand_info *info = platform_get_drvdata(pdev);
1376 1377 1378
	struct pxa3xx_nand_platform_data *pdata;
	struct mtd_info *mtd;
	int cs;
E
eric miao 已提交
1379

J
Jingoo Han 已提交
1380
	pdata = dev_get_platdata(&pdev->dev);
L
Lei Wen 已提交
1381
	if (info->state) {
E
eric miao 已提交
1382 1383 1384 1385
		dev_err(&pdev->dev, "driver busy, state = %d\n", info->state);
		return -EAGAIN;
	}

1386 1387
	for (cs = 0; cs < pdata->num_cs; cs++) {
		mtd = info->host[cs]->mtd;
1388
		mtd_suspend(mtd);
1389 1390
	}

E
eric miao 已提交
1391 1392 1393 1394 1395
	return 0;
}

static int pxa3xx_nand_resume(struct platform_device *pdev)
{
1396
	struct pxa3xx_nand_info *info = platform_get_drvdata(pdev);
1397 1398 1399
	struct pxa3xx_nand_platform_data *pdata;
	struct mtd_info *mtd;
	int cs;
1400

J
Jingoo Han 已提交
1401
	pdata = dev_get_platdata(&pdev->dev);
1402 1403
	/* We don't want to handle interrupt without calling mtd routine */
	disable_int(info, NDCR_INT_MASK);
E
eric miao 已提交
1404

1405 1406 1407 1408 1409 1410
	/*
	 * 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 已提交
1411

1412 1413 1414 1415 1416 1417 1418
	/*
	 * 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);
1419 1420
	for (cs = 0; cs < pdata->num_cs; cs++) {
		mtd = info->host[cs]->mtd;
1421
		mtd_resume(mtd);
1422 1423
	}

1424
	return 0;
E
eric miao 已提交
1425 1426 1427 1428 1429 1430 1431 1432 1433
}
#else
#define pxa3xx_nand_suspend	NULL
#define pxa3xx_nand_resume	NULL
#endif

static struct platform_driver pxa3xx_nand_driver = {
	.driver = {
		.name	= "pxa3xx-nand",
1434
		.of_match_table = pxa3xx_nand_dt_ids,
E
eric miao 已提交
1435 1436 1437 1438 1439 1440 1441
	},
	.probe		= pxa3xx_nand_probe,
	.remove		= pxa3xx_nand_remove,
	.suspend	= pxa3xx_nand_suspend,
	.resume		= pxa3xx_nand_resume,
};

1442
module_platform_driver(pxa3xx_nand_driver);
E
eric miao 已提交
1443 1444 1445

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