1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Freescale Integrated Flash Controller NAND driver
4 *
5 * Copyright 2011-2012 Freescale Semiconductor, Inc
6 *
7 * Author: Dipen Dudhat <Dipen.Dudhat@freescale.com>
8 */
9
10#include <linux/module.h>
11#include <linux/platform_device.h>
12#include <linux/types.h>
13#include <linux/kernel.h>
14#include <linux/of_address.h>
15#include <linux/slab.h>
16#include <linux/mtd/mtd.h>
17#include <linux/mtd/rawnand.h>
18#include <linux/mtd/partitions.h>
19#include <linux/fsl_ifc.h>
20#include <linux/iopoll.h>
21
22#define ERR_BYTE		0xFF /* Value returned for read
23					bytes when read failed	*/
24#define IFC_TIMEOUT_MSECS	1000 /* Maximum timeout to wait
25					for IFC NAND Machine	*/
26
27struct fsl_ifc_ctrl;
28
29/* mtd information per set */
30struct fsl_ifc_mtd {
31	struct nand_chip chip;
32	struct fsl_ifc_ctrl *ctrl;
33
34	struct device *dev;
35	int bank;		/* Chip select bank number		*/
36	unsigned int bufnum_mask; /* bufnum = page & bufnum_mask */
37	u8 __iomem *vbase;      /* Chip select base virtual address	*/
38};
39
40/* overview of the fsl ifc controller */
41struct fsl_ifc_nand_ctrl {
42	struct nand_controller controller;
43	struct fsl_ifc_mtd *chips[FSL_IFC_BANK_COUNT];
44
45	void __iomem *addr;	/* Address of assigned IFC buffer	*/
46	unsigned int page;	/* Last page written to / read from	*/
47	unsigned int read_bytes;/* Number of bytes read during command	*/
48	unsigned int column;	/* Saved column from SEQIN		*/
49	unsigned int index;	/* Pointer to next byte to 'read'	*/
50	unsigned int oob;	/* Non zero if operating on OOB data	*/
51	unsigned int eccread;	/* Non zero for a full-page ECC read	*/
52	unsigned int counter;	/* counter for the initializations	*/
53	unsigned int max_bitflips;  /* Saved during READ0 cmd		*/
54};
55
56static struct fsl_ifc_nand_ctrl *ifc_nand_ctrl;
57
58/*
59 * Generic flash bbt descriptors
60 */
61static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
62static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
63
64static struct nand_bbt_descr bbt_main_descr = {
65	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
66		   NAND_BBT_2BIT | NAND_BBT_VERSION,
67	.offs =	2, /* 0 on 8-bit small page */
68	.len = 4,
69	.veroffs = 6,
70	.maxblocks = 4,
71	.pattern = bbt_pattern,
72};
73
74static struct nand_bbt_descr bbt_mirror_descr = {
75	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
76		   NAND_BBT_2BIT | NAND_BBT_VERSION,
77	.offs =	2, /* 0 on 8-bit small page */
78	.len = 4,
79	.veroffs = 6,
80	.maxblocks = 4,
81	.pattern = mirror_pattern,
82};
83
84static int fsl_ifc_ooblayout_ecc(struct mtd_info *mtd, int section,
85				 struct mtd_oob_region *oobregion)
86{
87	struct nand_chip *chip = mtd_to_nand(mtd);
88
89	if (section)
90		return -ERANGE;
91
92	oobregion->offset = 8;
93	oobregion->length = chip->ecc.total;
94
95	return 0;
96}
97
98static int fsl_ifc_ooblayout_free(struct mtd_info *mtd, int section,
99				  struct mtd_oob_region *oobregion)
100{
101	struct nand_chip *chip = mtd_to_nand(mtd);
102
103	if (section > 1)
104		return -ERANGE;
105
106	if (mtd->writesize == 512 &&
107	    !(chip->options & NAND_BUSWIDTH_16)) {
108		if (!section) {
109			oobregion->offset = 0;
110			oobregion->length = 5;
111		} else {
112			oobregion->offset = 6;
113			oobregion->length = 2;
114		}
115
116		return 0;
117	}
118
119	if (!section) {
120		oobregion->offset = 2;
121		oobregion->length = 6;
122	} else {
123		oobregion->offset = chip->ecc.total + 8;
124		oobregion->length = mtd->oobsize - oobregion->offset;
125	}
126
127	return 0;
128}
129
130static const struct mtd_ooblayout_ops fsl_ifc_ooblayout_ops = {
131	.ecc = fsl_ifc_ooblayout_ecc,
132	.free = fsl_ifc_ooblayout_free,
133};
134
135/*
136 * Set up the IFC hardware block and page address fields, and the ifc nand
137 * structure addr field to point to the correct IFC buffer in memory
138 */
139static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
140{
141	struct nand_chip *chip = mtd_to_nand(mtd);
142	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
143	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
144	struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
145	int buf_num;
146
147	ifc_nand_ctrl->page = page_addr;
148	/* Program ROW0/COL0 */
149	ifc_out32(page_addr, &ifc->ifc_nand.row0);
150	ifc_out32((oob ? IFC_NAND_COL_MS : 0) | column, &ifc->ifc_nand.col0);
151
152	buf_num = page_addr & priv->bufnum_mask;
153
154	ifc_nand_ctrl->addr = priv->vbase + buf_num * (mtd->writesize * 2);
155	ifc_nand_ctrl->index = column;
156
157	/* for OOB data point to the second half of the buffer */
158	if (oob)
159		ifc_nand_ctrl->index += mtd->writesize;
160}
161
162/* returns nonzero if entire page is blank */
163static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
164			  u32 eccstat, unsigned int bufnum)
165{
166	return  (eccstat >> ((3 - bufnum % 4) * 8)) & 15;
167}
168
169/*
170 * execute IFC NAND command and wait for it to complete
171 */
172static void fsl_ifc_run_command(struct mtd_info *mtd)
173{
174	struct nand_chip *chip = mtd_to_nand(mtd);
175	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
176	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
177	struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl;
178	struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
179	u32 eccstat;
180	int i;
181
182	/* set the chip select for NAND Transaction */
183	ifc_out32(priv->bank << IFC_NAND_CSEL_SHIFT,
184		  &ifc->ifc_nand.nand_csel);
185
186	dev_vdbg(priv->dev,
187			"%s: fir0=%08x fcr0=%08x\n",
188			__func__,
189			ifc_in32(&ifc->ifc_nand.nand_fir0),
190			ifc_in32(&ifc->ifc_nand.nand_fcr0));
191
192	ctrl->nand_stat = 0;
193
194	/* start read/write seq */
195	ifc_out32(IFC_NAND_SEQ_STRT_FIR_STRT, &ifc->ifc_nand.nandseq_strt);
196
197	/* wait for command complete flag or timeout */
198	wait_event_timeout(ctrl->nand_wait, ctrl->nand_stat,
199			   msecs_to_jiffies(IFC_TIMEOUT_MSECS));
200
201	/* ctrl->nand_stat will be updated from IRQ context */
202	if (!ctrl->nand_stat)
203		dev_err(priv->dev, "Controller is not responding\n");
204	if (ctrl->nand_stat & IFC_NAND_EVTER_STAT_FTOER)
205		dev_err(priv->dev, "NAND Flash Timeout Error\n");
206	if (ctrl->nand_stat & IFC_NAND_EVTER_STAT_WPER)
207		dev_err(priv->dev, "NAND Flash Write Protect Error\n");
208
209	nctrl->max_bitflips = 0;
210
211	if (nctrl->eccread) {
212		int errors;
213		int bufnum = nctrl->page & priv->bufnum_mask;
214		int sector_start = bufnum * chip->ecc.steps;
215		int sector_end = sector_start + chip->ecc.steps - 1;
216		__be32 __iomem *eccstat_regs;
217
218		eccstat_regs = ifc->ifc_nand.nand_eccstat;
219		eccstat = ifc_in32(&eccstat_regs[sector_start / 4]);
220
221		for (i = sector_start; i <= sector_end; i++) {
222			if (i != sector_start && !(i % 4))
223				eccstat = ifc_in32(&eccstat_regs[i / 4]);
224
225			errors = check_read_ecc(mtd, ctrl, eccstat, i);
226
227			if (errors == 15) {
228				/*
229				 * Uncorrectable error.
230				 * We'll check for blank pages later.
231				 *
232				 * We disable ECCER reporting due to...
233				 * erratum IFC-A002770 -- so report it now if we
234				 * see an uncorrectable error in ECCSTAT.
235				 */
236				ctrl->nand_stat |= IFC_NAND_EVTER_STAT_ECCER;
237				continue;
238			}
239
240			mtd->ecc_stats.corrected += errors;
241			nctrl->max_bitflips = max_t(unsigned int,
242						    nctrl->max_bitflips,
243						    errors);
244		}
245
246		nctrl->eccread = 0;
247	}
248}
249
250static void fsl_ifc_do_read(struct nand_chip *chip,
251			    int oob,
252			    struct mtd_info *mtd)
253{
254	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
255	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
256	struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
257
258	/* Program FIR/IFC_NAND_FCR0 for Small/Large page */
259	if (mtd->writesize > 512) {
260		ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
261			  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
262			  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
263			  (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP3_SHIFT) |
264			  (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP4_SHIFT),
265			  &ifc->ifc_nand.nand_fir0);
266		ifc_out32(0x0, &ifc->ifc_nand.nand_fir1);
267
268		ifc_out32((NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT) |
269			  (NAND_CMD_READSTART << IFC_NAND_FCR0_CMD1_SHIFT),
270			  &ifc->ifc_nand.nand_fcr0);
271	} else {
272		ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
273			  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
274			  (IFC_FIR_OP_RA0  << IFC_NAND_FIR0_OP2_SHIFT) |
275			  (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP3_SHIFT),
276			  &ifc->ifc_nand.nand_fir0);
277		ifc_out32(0x0, &ifc->ifc_nand.nand_fir1);
278
279		if (oob)
280			ifc_out32(NAND_CMD_READOOB <<
281				  IFC_NAND_FCR0_CMD0_SHIFT,
282				  &ifc->ifc_nand.nand_fcr0);
283		else
284			ifc_out32(NAND_CMD_READ0 <<
285				  IFC_NAND_FCR0_CMD0_SHIFT,
286				  &ifc->ifc_nand.nand_fcr0);
287	}
288}
289
290/* cmdfunc send commands to the IFC NAND Machine */
291static void fsl_ifc_cmdfunc(struct nand_chip *chip, unsigned int command,
292			    int column, int page_addr) {
293	struct mtd_info *mtd = nand_to_mtd(chip);
294	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
295	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
296	struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
297
298	/* clear the read buffer */
299	ifc_nand_ctrl->read_bytes = 0;
300	if (command != NAND_CMD_PAGEPROG)
301		ifc_nand_ctrl->index = 0;
302
303	switch (command) {
304	/* READ0 read the entire buffer to use hardware ECC. */
305	case NAND_CMD_READ0:
306		ifc_out32(0, &ifc->ifc_nand.nand_fbcr);
307		set_addr(mtd, 0, page_addr, 0);
308
309		ifc_nand_ctrl->read_bytes = mtd->writesize + mtd->oobsize;
310		ifc_nand_ctrl->index += column;
311
312		if (chip->ecc.engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST)
313			ifc_nand_ctrl->eccread = 1;
314
315		fsl_ifc_do_read(chip, 0, mtd);
316		fsl_ifc_run_command(mtd);
317		return;
318
319	/* READOOB reads only the OOB because no ECC is performed. */
320	case NAND_CMD_READOOB:
321		ifc_out32(mtd->oobsize - column, &ifc->ifc_nand.nand_fbcr);
322		set_addr(mtd, column, page_addr, 1);
323
324		ifc_nand_ctrl->read_bytes = mtd->writesize + mtd->oobsize;
325
326		fsl_ifc_do_read(chip, 1, mtd);
327		fsl_ifc_run_command(mtd);
328
329		return;
330
331	case NAND_CMD_READID:
332	case NAND_CMD_PARAM: {
333		/*
334		 * For READID, read 8 bytes that are currently used.
335		 * For PARAM, read all 3 copies of 256-bytes pages.
336		 */
337		int len = 8;
338		int timing = IFC_FIR_OP_RB;
339		if (command == NAND_CMD_PARAM) {
340			timing = IFC_FIR_OP_RBCD;
341			len = 256 * 3;
342		}
343
344		ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
345			  (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
346			  (timing << IFC_NAND_FIR0_OP2_SHIFT),
347			  &ifc->ifc_nand.nand_fir0);
348		ifc_out32(command << IFC_NAND_FCR0_CMD0_SHIFT,
349			  &ifc->ifc_nand.nand_fcr0);
350		ifc_out32(column, &ifc->ifc_nand.row3);
351
352		ifc_out32(len, &ifc->ifc_nand.nand_fbcr);
353		ifc_nand_ctrl->read_bytes = len;
354
355		set_addr(mtd, 0, 0, 0);
356		fsl_ifc_run_command(mtd);
357		return;
358	}
359
360	/* ERASE1 stores the block and page address */
361	case NAND_CMD_ERASE1:
362		set_addr(mtd, 0, page_addr, 0);
363		return;
364
365	/* ERASE2 uses the block and page address from ERASE1 */
366	case NAND_CMD_ERASE2:
367		ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
368			  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP1_SHIFT) |
369			  (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP2_SHIFT),
370			  &ifc->ifc_nand.nand_fir0);
371
372		ifc_out32((NAND_CMD_ERASE1 << IFC_NAND_FCR0_CMD0_SHIFT) |
373			  (NAND_CMD_ERASE2 << IFC_NAND_FCR0_CMD1_SHIFT),
374			  &ifc->ifc_nand.nand_fcr0);
375
376		ifc_out32(0, &ifc->ifc_nand.nand_fbcr);
377		ifc_nand_ctrl->read_bytes = 0;
378		fsl_ifc_run_command(mtd);
379		return;
380
381	/* SEQIN sets up the addr buffer and all registers except the length */
382	case NAND_CMD_SEQIN: {
383		u32 nand_fcr0;
384		ifc_nand_ctrl->column = column;
385		ifc_nand_ctrl->oob = 0;
386
387		if (mtd->writesize > 512) {
388			nand_fcr0 =
389				(NAND_CMD_SEQIN << IFC_NAND_FCR0_CMD0_SHIFT) |
390				(NAND_CMD_STATUS << IFC_NAND_FCR0_CMD1_SHIFT) |
391				(NAND_CMD_PAGEPROG << IFC_NAND_FCR0_CMD2_SHIFT);
392
393			ifc_out32(
394				(IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
395				(IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
396				(IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
397				(IFC_FIR_OP_WBCD << IFC_NAND_FIR0_OP3_SHIFT) |
398				(IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP4_SHIFT),
399				&ifc->ifc_nand.nand_fir0);
400			ifc_out32(
401				(IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT) |
402				(IFC_FIR_OP_RDSTAT << IFC_NAND_FIR1_OP6_SHIFT) |
403				(IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP7_SHIFT),
404				&ifc->ifc_nand.nand_fir1);
405		} else {
406			nand_fcr0 = ((NAND_CMD_PAGEPROG <<
407					IFC_NAND_FCR0_CMD1_SHIFT) |
408				    (NAND_CMD_SEQIN <<
409					IFC_NAND_FCR0_CMD2_SHIFT) |
410				    (NAND_CMD_STATUS <<
411					IFC_NAND_FCR0_CMD3_SHIFT));
412
413			ifc_out32(
414				(IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
415				(IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP1_SHIFT) |
416				(IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP2_SHIFT) |
417				(IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP3_SHIFT) |
418				(IFC_FIR_OP_WBCD << IFC_NAND_FIR0_OP4_SHIFT),
419				&ifc->ifc_nand.nand_fir0);
420			ifc_out32(
421				(IFC_FIR_OP_CMD1 << IFC_NAND_FIR1_OP5_SHIFT) |
422				(IFC_FIR_OP_CW3 << IFC_NAND_FIR1_OP6_SHIFT) |
423				(IFC_FIR_OP_RDSTAT << IFC_NAND_FIR1_OP7_SHIFT) |
424				(IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP8_SHIFT),
425				&ifc->ifc_nand.nand_fir1);
426
427			if (column >= mtd->writesize)
428				nand_fcr0 |=
429				NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT;
430			else
431				nand_fcr0 |=
432				NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
433		}
434
435		if (column >= mtd->writesize) {
436			/* OOB area --> READOOB */
437			column -= mtd->writesize;
438			ifc_nand_ctrl->oob = 1;
439		}
440		ifc_out32(nand_fcr0, &ifc->ifc_nand.nand_fcr0);
441		set_addr(mtd, column, page_addr, ifc_nand_ctrl->oob);
442		return;
443	}
444
445	/* PAGEPROG reuses all of the setup from SEQIN and adds the length */
446	case NAND_CMD_PAGEPROG: {
447		if (ifc_nand_ctrl->oob) {
448			ifc_out32(ifc_nand_ctrl->index -
449				  ifc_nand_ctrl->column,
450				  &ifc->ifc_nand.nand_fbcr);
451		} else {
452			ifc_out32(0, &ifc->ifc_nand.nand_fbcr);
453		}
454
455		fsl_ifc_run_command(mtd);
456		return;
457	}
458
459	case NAND_CMD_STATUS: {
460		void __iomem *addr;
461
462		ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
463			  (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP1_SHIFT),
464			  &ifc->ifc_nand.nand_fir0);
465		ifc_out32(NAND_CMD_STATUS << IFC_NAND_FCR0_CMD0_SHIFT,
466			  &ifc->ifc_nand.nand_fcr0);
467		ifc_out32(1, &ifc->ifc_nand.nand_fbcr);
468		set_addr(mtd, 0, 0, 0);
469		ifc_nand_ctrl->read_bytes = 1;
470
471		fsl_ifc_run_command(mtd);
472
473		/*
474		 * The chip always seems to report that it is
475		 * write-protected, even when it is not.
476		 */
477		addr = ifc_nand_ctrl->addr;
478		if (chip->options & NAND_BUSWIDTH_16)
479			ifc_out16(ifc_in16(addr) | (NAND_STATUS_WP), addr);
480		else
481			ifc_out8(ifc_in8(addr) | (NAND_STATUS_WP), addr);
482		return;
483	}
484
485	case NAND_CMD_RESET:
486		ifc_out32(IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT,
487			  &ifc->ifc_nand.nand_fir0);
488		ifc_out32(NAND_CMD_RESET << IFC_NAND_FCR0_CMD0_SHIFT,
489			  &ifc->ifc_nand.nand_fcr0);
490		fsl_ifc_run_command(mtd);
491		return;
492
493	default:
494		dev_err(priv->dev, "%s: error, unsupported command 0x%x.\n",
495					__func__, command);
496	}
497}
498
499static void fsl_ifc_select_chip(struct nand_chip *chip, int cs)
500{
501	/* The hardware does not seem to support multiple
502	 * chips per bank.
503	 */
504}
505
506/*
507 * Write buf to the IFC NAND Controller Data Buffer
508 */
509static void fsl_ifc_write_buf(struct nand_chip *chip, const u8 *buf, int len)
510{
511	struct mtd_info *mtd = nand_to_mtd(chip);
512	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
513	unsigned int bufsize = mtd->writesize + mtd->oobsize;
514
515	if (len <= 0) {
516		dev_err(priv->dev, "%s: len %d bytes", __func__, len);
517		return;
518	}
519
520	if ((unsigned int)len > bufsize - ifc_nand_ctrl->index) {
521		dev_err(priv->dev,
522			"%s: beyond end of buffer (%d requested, %u available)\n",
523			__func__, len, bufsize - ifc_nand_ctrl->index);
524		len = bufsize - ifc_nand_ctrl->index;
525	}
526
527	memcpy_toio(ifc_nand_ctrl->addr + ifc_nand_ctrl->index, buf, len);
528	ifc_nand_ctrl->index += len;
529}
530
531/*
532 * Read a byte from either the IFC hardware buffer
533 * read function for 8-bit buswidth
534 */
535static uint8_t fsl_ifc_read_byte(struct nand_chip *chip)
536{
537	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
538	unsigned int offset;
539
540	/*
541	 * If there are still bytes in the IFC buffer, then use the
542	 * next byte.
543	 */
544	if (ifc_nand_ctrl->index < ifc_nand_ctrl->read_bytes) {
545		offset = ifc_nand_ctrl->index++;
546		return ifc_in8(ifc_nand_ctrl->addr + offset);
547	}
548
549	dev_err(priv->dev, "%s: beyond end of buffer\n", __func__);
550	return ERR_BYTE;
551}
552
553/*
554 * Read two bytes from the IFC hardware buffer
555 * read function for 16-bit buswith
556 */
557static uint8_t fsl_ifc_read_byte16(struct nand_chip *chip)
558{
559	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
560	uint16_t data;
561
562	/*
563	 * If there are still bytes in the IFC buffer, then use the
564	 * next byte.
565	 */
566	if (ifc_nand_ctrl->index < ifc_nand_ctrl->read_bytes) {
567		data = ifc_in16(ifc_nand_ctrl->addr + ifc_nand_ctrl->index);
568		ifc_nand_ctrl->index += 2;
569		return (uint8_t) data;
570	}
571
572	dev_err(priv->dev, "%s: beyond end of buffer\n", __func__);
573	return ERR_BYTE;
574}
575
576/*
577 * Read from the IFC Controller Data Buffer
578 */
579static void fsl_ifc_read_buf(struct nand_chip *chip, u8 *buf, int len)
580{
581	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
582	int avail;
583
584	if (len < 0) {
585		dev_err(priv->dev, "%s: len %d bytes", __func__, len);
586		return;
587	}
588
589	avail = min((unsigned int)len,
590			ifc_nand_ctrl->read_bytes - ifc_nand_ctrl->index);
591	memcpy_fromio(buf, ifc_nand_ctrl->addr + ifc_nand_ctrl->index, avail);
592	ifc_nand_ctrl->index += avail;
593
594	if (len > avail)
595		dev_err(priv->dev,
596			"%s: beyond end of buffer (%d requested, %d available)\n",
597			__func__, len, avail);
598}
599
600/*
601 * This function is called after Program and Erase Operations to
602 * check for success or failure.
603 */
604static int fsl_ifc_wait(struct nand_chip *chip)
605{
606	struct mtd_info *mtd = nand_to_mtd(chip);
607	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
608	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
609	struct fsl_ifc_runtime __iomem *ifc = ctrl->rregs;
610	u32 nand_fsr;
611	int status;
612
613	/* Use READ_STATUS command, but wait for the device to be ready */
614	ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
615		  (IFC_FIR_OP_RDSTAT << IFC_NAND_FIR0_OP1_SHIFT),
616		  &ifc->ifc_nand.nand_fir0);
617	ifc_out32(NAND_CMD_STATUS << IFC_NAND_FCR0_CMD0_SHIFT,
618		  &ifc->ifc_nand.nand_fcr0);
619	ifc_out32(1, &ifc->ifc_nand.nand_fbcr);
620	set_addr(mtd, 0, 0, 0);
621	ifc_nand_ctrl->read_bytes = 1;
622
623	fsl_ifc_run_command(mtd);
624
625	nand_fsr = ifc_in32(&ifc->ifc_nand.nand_fsr);
626	status = nand_fsr >> 24;
627	/*
628	 * The chip always seems to report that it is
629	 * write-protected, even when it is not.
630	 */
631	return status | NAND_STATUS_WP;
632}
633
634/*
635 * The controller does not check for bitflips in erased pages,
636 * therefore software must check instead.
637 */
638static int check_erased_page(struct nand_chip *chip, u8 *buf)
639{
640	struct mtd_info *mtd = nand_to_mtd(chip);
641	u8 *ecc = chip->oob_poi;
642	const int ecc_size = chip->ecc.bytes;
643	const int pkt_size = chip->ecc.size;
644	int i, res, bitflips = 0;
645	struct mtd_oob_region oobregion = { };
646
647	mtd_ooblayout_ecc(mtd, 0, &oobregion);
648	ecc += oobregion.offset;
649
650	for (i = 0; i < chip->ecc.steps; ++i) {
651		res = nand_check_erased_ecc_chunk(buf, pkt_size, ecc, ecc_size,
652						  NULL, 0,
653						  chip->ecc.strength);
654		if (res < 0)
655			mtd->ecc_stats.failed++;
656		else
657			mtd->ecc_stats.corrected += res;
658
659		bitflips = max(res, bitflips);
660		buf += pkt_size;
661		ecc += ecc_size;
662	}
663
664	return bitflips;
665}
666
667static int fsl_ifc_read_page(struct nand_chip *chip, uint8_t *buf,
668			     int oob_required, int page)
669{
670	struct mtd_info *mtd = nand_to_mtd(chip);
671	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
672	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
673	struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl;
674
675	nand_read_page_op(chip, page, 0, buf, mtd->writesize);
676	if (oob_required)
677		fsl_ifc_read_buf(chip, chip->oob_poi, mtd->oobsize);
678
679	if (ctrl->nand_stat & IFC_NAND_EVTER_STAT_ECCER) {
680		if (!oob_required)
681			fsl_ifc_read_buf(chip, chip->oob_poi, mtd->oobsize);
682
683		return check_erased_page(chip, buf);
684	}
685
686	if (ctrl->nand_stat != IFC_NAND_EVTER_STAT_OPC)
687		mtd->ecc_stats.failed++;
688
689	return nctrl->max_bitflips;
690}
691
692/* ECC will be calculated automatically, and errors will be detected in
693 * waitfunc.
694 */
695static int fsl_ifc_write_page(struct nand_chip *chip, const uint8_t *buf,
696			      int oob_required, int page)
697{
698	struct mtd_info *mtd = nand_to_mtd(chip);
699
700	nand_prog_page_begin_op(chip, page, 0, buf, mtd->writesize);
701	fsl_ifc_write_buf(chip, chip->oob_poi, mtd->oobsize);
702
703	return nand_prog_page_end_op(chip);
704}
705
706static int fsl_ifc_attach_chip(struct nand_chip *chip)
707{
708	struct mtd_info *mtd = nand_to_mtd(chip);
709	struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
710	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
711	struct fsl_ifc_global __iomem *ifc_global = ctrl->gregs;
712	u32 csor;
713
714	csor = ifc_in32(&ifc_global->csor_cs[priv->bank].csor);
715
716	/* Must also set CSOR_NAND_ECC_ENC_EN if DEC_EN set */
717	if (csor & CSOR_NAND_ECC_DEC_EN) {
718		chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST;
719		mtd_set_ooblayout(mtd, &fsl_ifc_ooblayout_ops);
720
721		/* Hardware generates ECC per 512 Bytes */
722		chip->ecc.size = 512;
723		if ((csor & CSOR_NAND_ECC_MODE_MASK) == CSOR_NAND_ECC_MODE_4) {
724			chip->ecc.bytes = 8;
725			chip->ecc.strength = 4;
726		} else {
727			chip->ecc.bytes = 16;
728			chip->ecc.strength = 8;
729		}
730	} else {
731		chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
732		chip->ecc.algo = NAND_ECC_ALGO_HAMMING;
733	}
734
735	dev_dbg(priv->dev, "%s: nand->numchips = %d\n", __func__,
736		nanddev_ntargets(&chip->base));
737	dev_dbg(priv->dev, "%s: nand->chipsize = %lld\n", __func__,
738	        nanddev_target_size(&chip->base));
739	dev_dbg(priv->dev, "%s: nand->pagemask = %8x\n", __func__,
740							chip->pagemask);
741	dev_dbg(priv->dev, "%s: nand->legacy.chip_delay = %d\n", __func__,
742		chip->legacy.chip_delay);
743	dev_dbg(priv->dev, "%s: nand->badblockpos = %d\n", __func__,
744							chip->badblockpos);
745	dev_dbg(priv->dev, "%s: nand->chip_shift = %d\n", __func__,
746							chip->chip_shift);
747	dev_dbg(priv->dev, "%s: nand->page_shift = %d\n", __func__,
748							chip->page_shift);
749	dev_dbg(priv->dev, "%s: nand->phys_erase_shift = %d\n", __func__,
750							chip->phys_erase_shift);
751	dev_dbg(priv->dev, "%s: nand->ecc.engine_type = %d\n", __func__,
752							chip->ecc.engine_type);
753	dev_dbg(priv->dev, "%s: nand->ecc.steps = %d\n", __func__,
754							chip->ecc.steps);
755	dev_dbg(priv->dev, "%s: nand->ecc.bytes = %d\n", __func__,
756							chip->ecc.bytes);
757	dev_dbg(priv->dev, "%s: nand->ecc.total = %d\n", __func__,
758							chip->ecc.total);
759	dev_dbg(priv->dev, "%s: mtd->ooblayout = %p\n", __func__,
760							mtd->ooblayout);
761	dev_dbg(priv->dev, "%s: mtd->flags = %08x\n", __func__, mtd->flags);
762	dev_dbg(priv->dev, "%s: mtd->size = %lld\n", __func__, mtd->size);
763	dev_dbg(priv->dev, "%s: mtd->erasesize = %d\n", __func__,
764							mtd->erasesize);
765	dev_dbg(priv->dev, "%s: mtd->writesize = %d\n", __func__,
766							mtd->writesize);
767	dev_dbg(priv->dev, "%s: mtd->oobsize = %d\n", __func__,
768							mtd->oobsize);
769
770	return 0;
771}
772
773static const struct nand_controller_ops fsl_ifc_controller_ops = {
774	.attach_chip = fsl_ifc_attach_chip,
775};
776
777static int fsl_ifc_sram_init(struct fsl_ifc_mtd *priv)
778{
779	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
780	struct fsl_ifc_runtime __iomem *ifc_runtime = ctrl->rregs;
781	struct fsl_ifc_global __iomem *ifc_global = ctrl->gregs;
782	uint32_t csor = 0, csor_8k = 0, csor_ext = 0;
783	uint32_t cs = priv->bank;
784
785	if (ctrl->version < FSL_IFC_VERSION_1_1_0)
786		return 0;
787
788	if (ctrl->version > FSL_IFC_VERSION_1_1_0) {
789		u32 ncfgr, status;
790		int ret;
791
792		/* Trigger auto initialization */
793		ncfgr = ifc_in32(&ifc_runtime->ifc_nand.ncfgr);
794		ifc_out32(ncfgr | IFC_NAND_NCFGR_SRAM_INIT_EN, &ifc_runtime->ifc_nand.ncfgr);
795
796		/* Wait until done */
797		ret = readx_poll_timeout(ifc_in32, &ifc_runtime->ifc_nand.ncfgr,
798					 status, !(status & IFC_NAND_NCFGR_SRAM_INIT_EN),
799					 10, IFC_TIMEOUT_MSECS * 1000);
800		if (ret)
801			dev_err(priv->dev, "Failed to initialize SRAM!\n");
802
803		return ret;
804	}
805
806	/* Save CSOR and CSOR_ext */
807	csor = ifc_in32(&ifc_global->csor_cs[cs].csor);
808	csor_ext = ifc_in32(&ifc_global->csor_cs[cs].csor_ext);
809
810	/* chage PageSize 8K and SpareSize 1K*/
811	csor_8k = (csor & ~(CSOR_NAND_PGS_MASK)) | 0x0018C000;
812	ifc_out32(csor_8k, &ifc_global->csor_cs[cs].csor);
813	ifc_out32(0x0000400, &ifc_global->csor_cs[cs].csor_ext);
814
815	/* READID */
816	ifc_out32((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
817		    (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
818		    (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT),
819		    &ifc_runtime->ifc_nand.nand_fir0);
820	ifc_out32(NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT,
821		    &ifc_runtime->ifc_nand.nand_fcr0);
822	ifc_out32(0x0, &ifc_runtime->ifc_nand.row3);
823
824	ifc_out32(0x0, &ifc_runtime->ifc_nand.nand_fbcr);
825
826	/* Program ROW0/COL0 */
827	ifc_out32(0x0, &ifc_runtime->ifc_nand.row0);
828	ifc_out32(0x0, &ifc_runtime->ifc_nand.col0);
829
830	/* set the chip select for NAND Transaction */
831	ifc_out32(cs << IFC_NAND_CSEL_SHIFT,
832		&ifc_runtime->ifc_nand.nand_csel);
833
834	/* start read seq */
835	ifc_out32(IFC_NAND_SEQ_STRT_FIR_STRT,
836		&ifc_runtime->ifc_nand.nandseq_strt);
837
838	/* wait for command complete flag or timeout */
839	wait_event_timeout(ctrl->nand_wait, ctrl->nand_stat,
840			   msecs_to_jiffies(IFC_TIMEOUT_MSECS));
841
842	if (ctrl->nand_stat != IFC_NAND_EVTER_STAT_OPC) {
843		pr_err("fsl-ifc: Failed to Initialise SRAM\n");
844		return -ETIMEDOUT;
845	}
846
847	/* Restore CSOR and CSOR_ext */
848	ifc_out32(csor, &ifc_global->csor_cs[cs].csor);
849	ifc_out32(csor_ext, &ifc_global->csor_cs[cs].csor_ext);
850
851	return 0;
852}
853
854static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)
855{
856	struct fsl_ifc_ctrl *ctrl = priv->ctrl;
857	struct fsl_ifc_global __iomem *ifc_global = ctrl->gregs;
858	struct fsl_ifc_runtime __iomem *ifc_runtime = ctrl->rregs;
859	struct nand_chip *chip = &priv->chip;
860	struct mtd_info *mtd = nand_to_mtd(&priv->chip);
861	u32 csor;
862	int ret;
863
864	/* Fill in fsl_ifc_mtd structure */
865	mtd->dev.parent = priv->dev;
866	nand_set_flash_node(chip, priv->dev->of_node);
867
868	/* fill in nand_chip structure */
869	/* set up function call table */
870	if ((ifc_in32(&ifc_global->cspr_cs[priv->bank].cspr))
871		& CSPR_PORT_SIZE_16)
872		chip->legacy.read_byte = fsl_ifc_read_byte16;
873	else
874		chip->legacy.read_byte = fsl_ifc_read_byte;
875
876	chip->legacy.write_buf = fsl_ifc_write_buf;
877	chip->legacy.read_buf = fsl_ifc_read_buf;
878	chip->legacy.select_chip = fsl_ifc_select_chip;
879	chip->legacy.cmdfunc = fsl_ifc_cmdfunc;
880	chip->legacy.waitfunc = fsl_ifc_wait;
881	chip->legacy.set_features = nand_get_set_features_notsupp;
882	chip->legacy.get_features = nand_get_set_features_notsupp;
883
884	chip->bbt_td = &bbt_main_descr;
885	chip->bbt_md = &bbt_mirror_descr;
886
887	ifc_out32(0x0, &ifc_runtime->ifc_nand.ncfgr);
888
889	/* set up nand options */
890	chip->bbt_options = NAND_BBT_USE_FLASH;
891	chip->options = NAND_NO_SUBPAGE_WRITE;
892
893	if (ifc_in32(&ifc_global->cspr_cs[priv->bank].cspr)
894		& CSPR_PORT_SIZE_16) {
895		chip->legacy.read_byte = fsl_ifc_read_byte16;
896		chip->options |= NAND_BUSWIDTH_16;
897	} else {
898		chip->legacy.read_byte = fsl_ifc_read_byte;
899	}
900
901	chip->controller = &ifc_nand_ctrl->controller;
902	nand_set_controller_data(chip, priv);
903
904	chip->ecc.read_page = fsl_ifc_read_page;
905	chip->ecc.write_page = fsl_ifc_write_page;
906
907	csor = ifc_in32(&ifc_global->csor_cs[priv->bank].csor);
908
909	switch (csor & CSOR_NAND_PGS_MASK) {
910	case CSOR_NAND_PGS_512:
911		if (!(chip->options & NAND_BUSWIDTH_16)) {
912			/* Avoid conflict with bad block marker */
913			bbt_main_descr.offs = 0;
914			bbt_mirror_descr.offs = 0;
915		}
916
917		priv->bufnum_mask = 15;
918		break;
919
920	case CSOR_NAND_PGS_2K:
921		priv->bufnum_mask = 3;
922		break;
923
924	case CSOR_NAND_PGS_4K:
925		priv->bufnum_mask = 1;
926		break;
927
928	case CSOR_NAND_PGS_8K:
929		priv->bufnum_mask = 0;
930		break;
931
932	default:
933		dev_err(priv->dev, "bad csor %#x: bad page size\n", csor);
934		return -ENODEV;
935	}
936
937	ret = fsl_ifc_sram_init(priv);
938	if (ret)
939		return ret;
940
941	/*
942	 * As IFC version 2.0.0 has 16KB of internal SRAM as compared to older
943	 * versions which had 8KB. Hence bufnum mask needs to be updated.
944	 */
945	if (ctrl->version >= FSL_IFC_VERSION_2_0_0)
946		priv->bufnum_mask = (priv->bufnum_mask * 2) + 1;
947
948	return 0;
949}
950
951static int fsl_ifc_chip_remove(struct fsl_ifc_mtd *priv)
952{
953	struct mtd_info *mtd = nand_to_mtd(&priv->chip);
954
955	kfree(mtd->name);
956
957	if (priv->vbase)
958		iounmap(priv->vbase);
959
960	ifc_nand_ctrl->chips[priv->bank] = NULL;
961
962	return 0;
963}
964
965static int match_bank(struct fsl_ifc_global __iomem *ifc_global, int bank,
966		      phys_addr_t addr)
967{
968	u32 cspr = ifc_in32(&ifc_global->cspr_cs[bank].cspr);
969
970	if (!(cspr & CSPR_V))
971		return 0;
972	if ((cspr & CSPR_MSEL) != CSPR_MSEL_NAND)
973		return 0;
974
975	return (cspr & CSPR_BA) == convert_ifc_address(addr);
976}
977
978static DEFINE_MUTEX(fsl_ifc_nand_mutex);
979
980static int fsl_ifc_nand_probe(struct platform_device *dev)
981{
982	struct fsl_ifc_runtime __iomem *ifc;
983	struct fsl_ifc_mtd *priv;
984	struct resource res;
985	static const char *part_probe_types[]
986		= { "cmdlinepart", "RedBoot", "ofpart", NULL };
987	int ret;
988	int bank;
989	struct device_node *node = dev->dev.of_node;
990	struct mtd_info *mtd;
991
992	if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->rregs)
993		return -ENODEV;
994	ifc = fsl_ifc_ctrl_dev->rregs;
995
996	/* get, allocate and map the memory resource */
997	ret = of_address_to_resource(node, 0, &res);
998	if (ret) {
999		dev_err(&dev->dev, "%s: failed to get resource\n", __func__);
1000		return ret;
1001	}
1002
1003	/* find which chip select it is connected to */
1004	for (bank = 0; bank < fsl_ifc_ctrl_dev->banks; bank++) {
1005		if (match_bank(fsl_ifc_ctrl_dev->gregs, bank, res.start))
1006			break;
1007	}
1008
1009	if (bank >= fsl_ifc_ctrl_dev->banks) {
1010		dev_err(&dev->dev, "%s: address did not match any chip selects\n",
1011			__func__);
1012		return -ENODEV;
1013	}
1014
1015	priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL);
1016	if (!priv)
1017		return -ENOMEM;
1018
1019	mutex_lock(&fsl_ifc_nand_mutex);
1020	if (!fsl_ifc_ctrl_dev->nand) {
1021		ifc_nand_ctrl = kzalloc(sizeof(*ifc_nand_ctrl), GFP_KERNEL);
1022		if (!ifc_nand_ctrl) {
1023			mutex_unlock(&fsl_ifc_nand_mutex);
1024			return -ENOMEM;
1025		}
1026
1027		ifc_nand_ctrl->read_bytes = 0;
1028		ifc_nand_ctrl->index = 0;
1029		ifc_nand_ctrl->addr = NULL;
1030		fsl_ifc_ctrl_dev->nand = ifc_nand_ctrl;
1031
1032		nand_controller_init(&ifc_nand_ctrl->controller);
1033	} else {
1034		ifc_nand_ctrl = fsl_ifc_ctrl_dev->nand;
1035	}
1036	mutex_unlock(&fsl_ifc_nand_mutex);
1037
1038	ifc_nand_ctrl->chips[bank] = priv;
1039	priv->bank = bank;
1040	priv->ctrl = fsl_ifc_ctrl_dev;
1041	priv->dev = &dev->dev;
1042
1043	priv->vbase = ioremap(res.start, resource_size(&res));
1044	if (!priv->vbase) {
1045		dev_err(priv->dev, "%s: failed to map chip region\n", __func__);
1046		ret = -ENOMEM;
1047		goto err;
1048	}
1049
1050	dev_set_drvdata(priv->dev, priv);
1051
1052	ifc_out32(IFC_NAND_EVTER_EN_OPC_EN |
1053		  IFC_NAND_EVTER_EN_FTOER_EN |
1054		  IFC_NAND_EVTER_EN_WPER_EN,
1055		  &ifc->ifc_nand.nand_evter_en);
1056
1057	/* enable NAND Machine Interrupts */
1058	ifc_out32(IFC_NAND_EVTER_INTR_OPCIR_EN |
1059		  IFC_NAND_EVTER_INTR_FTOERIR_EN |
1060		  IFC_NAND_EVTER_INTR_WPERIR_EN,
1061		  &ifc->ifc_nand.nand_evter_intr_en);
1062
1063	mtd = nand_to_mtd(&priv->chip);
1064	mtd->name = kasprintf(GFP_KERNEL, "%llx.flash", (u64)res.start);
1065	if (!mtd->name) {
1066		ret = -ENOMEM;
1067		goto err;
1068	}
1069
1070	ret = fsl_ifc_chip_init(priv);
1071	if (ret)
1072		goto err;
1073
1074	priv->chip.controller->ops = &fsl_ifc_controller_ops;
1075	ret = nand_scan(&priv->chip, 1);
1076	if (ret)
1077		goto err;
1078
1079	/* First look for RedBoot table or partitions on the command
1080	 * line, these take precedence over device tree information */
1081	ret = mtd_device_parse_register(mtd, part_probe_types, NULL, NULL, 0);
1082	if (ret)
1083		goto cleanup_nand;
1084
1085	dev_info(priv->dev, "IFC NAND device at 0x%llx, bank %d\n",
1086		 (unsigned long long)res.start, priv->bank);
1087
1088	return 0;
1089
1090cleanup_nand:
1091	nand_cleanup(&priv->chip);
1092err:
1093	fsl_ifc_chip_remove(priv);
1094
1095	return ret;
1096}
1097
1098static void fsl_ifc_nand_remove(struct platform_device *dev)
1099{
1100	struct fsl_ifc_mtd *priv = dev_get_drvdata(&dev->dev);
1101	struct nand_chip *chip = &priv->chip;
1102	int ret;
1103
1104	ret = mtd_device_unregister(nand_to_mtd(chip));
1105	WARN_ON(ret);
1106	nand_cleanup(chip);
1107
1108	fsl_ifc_chip_remove(priv);
1109
1110	mutex_lock(&fsl_ifc_nand_mutex);
1111	ifc_nand_ctrl->counter--;
1112	if (!ifc_nand_ctrl->counter) {
1113		fsl_ifc_ctrl_dev->nand = NULL;
1114		kfree(ifc_nand_ctrl);
1115	}
1116	mutex_unlock(&fsl_ifc_nand_mutex);
1117}
1118
1119static const struct of_device_id fsl_ifc_nand_match[] = {
1120	{
1121		.compatible = "fsl,ifc-nand",
1122	},
1123	{}
1124};
1125MODULE_DEVICE_TABLE(of, fsl_ifc_nand_match);
1126
1127static struct platform_driver fsl_ifc_nand_driver = {
1128	.driver = {
1129		.name	= "fsl,ifc-nand",
1130		.of_match_table = fsl_ifc_nand_match,
1131	},
1132	.probe       = fsl_ifc_nand_probe,
1133	.remove_new  = fsl_ifc_nand_remove,
1134};
1135
1136module_platform_driver(fsl_ifc_nand_driver);
1137
1138MODULE_LICENSE("GPL");
1139MODULE_AUTHOR("Freescale");
1140MODULE_DESCRIPTION("Freescale Integrated Flash Controller MTD NAND driver");
1141