2 * Freescale Integrated Flash Controller NAND driver
4 * Copyright 2011-2012 Freescale Semiconductor, Inc
6 * Author: Dipen Dudhat <Dipen.Dudhat@freescale.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <linux/module.h>
24 #include <linux/types.h>
25 #include <linux/kernel.h>
26 #include <linux/of_address.h>
27 #include <linux/slab.h>
28 #include <linux/mtd/mtd.h>
29 #include <linux/mtd/nand.h>
30 #include <linux/mtd/partitions.h>
31 #include <linux/mtd/nand_ecc.h>
32 #include <linux/fsl_ifc.h>
34 #define FSL_IFC_V1_1_0 0x01010000
35 #define ERR_BYTE 0xFF /* Value returned for read
36 bytes when read failed */
37 #define IFC_TIMEOUT_MSECS 500 /* Maximum number of mSecs to wait
38 for IFC NAND Machine */
42 /* mtd information per set */
45 struct nand_chip chip
;
46 struct fsl_ifc_ctrl
*ctrl
;
49 int bank
; /* Chip select bank number */
50 unsigned int bufnum_mask
; /* bufnum = page & bufnum_mask */
51 u8 __iomem
*vbase
; /* Chip select base virtual address */
54 /* overview of the fsl ifc controller */
55 struct fsl_ifc_nand_ctrl
{
56 struct nand_hw_control controller
;
57 struct fsl_ifc_mtd
*chips
[FSL_IFC_BANK_COUNT
];
59 u8 __iomem
*addr
; /* Address of assigned IFC buffer */
60 unsigned int page
; /* Last page written to / read from */
61 unsigned int read_bytes
;/* Number of bytes read during command */
62 unsigned int column
; /* Saved column from SEQIN */
63 unsigned int index
; /* Pointer to next byte to 'read' */
64 unsigned int oob
; /* Non zero if operating on OOB data */
65 unsigned int eccread
; /* Non zero for a full-page ECC read */
66 unsigned int counter
; /* counter for the initializations */
67 unsigned int max_bitflips
; /* Saved during READ0 cmd */
70 static struct fsl_ifc_nand_ctrl
*ifc_nand_ctrl
;
72 /* 512-byte page with 4-bit ECC, 8-bit */
73 static struct nand_ecclayout oob_512_8bit_ecc4
= {
75 .eccpos
= {8, 9, 10, 11, 12, 13, 14, 15},
76 .oobfree
= { {0, 5}, {6, 2} },
79 /* 512-byte page with 4-bit ECC, 16-bit */
80 static struct nand_ecclayout oob_512_16bit_ecc4
= {
82 .eccpos
= {8, 9, 10, 11, 12, 13, 14, 15},
83 .oobfree
= { {2, 6}, },
86 /* 2048-byte page size with 4-bit ECC */
87 static struct nand_ecclayout oob_2048_ecc4
= {
90 8, 9, 10, 11, 12, 13, 14, 15,
91 16, 17, 18, 19, 20, 21, 22, 23,
92 24, 25, 26, 27, 28, 29, 30, 31,
93 32, 33, 34, 35, 36, 37, 38, 39,
95 .oobfree
= { {2, 6}, {40, 24} },
98 /* 4096-byte page size with 4-bit ECC */
99 static struct nand_ecclayout oob_4096_ecc4
= {
102 8, 9, 10, 11, 12, 13, 14, 15,
103 16, 17, 18, 19, 20, 21, 22, 23,
104 24, 25, 26, 27, 28, 29, 30, 31,
105 32, 33, 34, 35, 36, 37, 38, 39,
106 40, 41, 42, 43, 44, 45, 46, 47,
107 48, 49, 50, 51, 52, 53, 54, 55,
108 56, 57, 58, 59, 60, 61, 62, 63,
109 64, 65, 66, 67, 68, 69, 70, 71,
111 .oobfree
= { {2, 6}, {72, 56} },
114 /* 4096-byte page size with 8-bit ECC -- requires 218-byte OOB */
115 static struct nand_ecclayout oob_4096_ecc8
= {
118 8, 9, 10, 11, 12, 13, 14, 15,
119 16, 17, 18, 19, 20, 21, 22, 23,
120 24, 25, 26, 27, 28, 29, 30, 31,
121 32, 33, 34, 35, 36, 37, 38, 39,
122 40, 41, 42, 43, 44, 45, 46, 47,
123 48, 49, 50, 51, 52, 53, 54, 55,
124 56, 57, 58, 59, 60, 61, 62, 63,
125 64, 65, 66, 67, 68, 69, 70, 71,
126 72, 73, 74, 75, 76, 77, 78, 79,
127 80, 81, 82, 83, 84, 85, 86, 87,
128 88, 89, 90, 91, 92, 93, 94, 95,
129 96, 97, 98, 99, 100, 101, 102, 103,
130 104, 105, 106, 107, 108, 109, 110, 111,
131 112, 113, 114, 115, 116, 117, 118, 119,
132 120, 121, 122, 123, 124, 125, 126, 127,
133 128, 129, 130, 131, 132, 133, 134, 135,
135 .oobfree
= { {2, 6}, {136, 82} },
138 /* 8192-byte page size with 4-bit ECC */
139 static struct nand_ecclayout oob_8192_ecc4
= {
142 8, 9, 10, 11, 12, 13, 14, 15,
143 16, 17, 18, 19, 20, 21, 22, 23,
144 24, 25, 26, 27, 28, 29, 30, 31,
145 32, 33, 34, 35, 36, 37, 38, 39,
146 40, 41, 42, 43, 44, 45, 46, 47,
147 48, 49, 50, 51, 52, 53, 54, 55,
148 56, 57, 58, 59, 60, 61, 62, 63,
149 64, 65, 66, 67, 68, 69, 70, 71,
150 72, 73, 74, 75, 76, 77, 78, 79,
151 80, 81, 82, 83, 84, 85, 86, 87,
152 88, 89, 90, 91, 92, 93, 94, 95,
153 96, 97, 98, 99, 100, 101, 102, 103,
154 104, 105, 106, 107, 108, 109, 110, 111,
155 112, 113, 114, 115, 116, 117, 118, 119,
156 120, 121, 122, 123, 124, 125, 126, 127,
157 128, 129, 130, 131, 132, 133, 134, 135,
159 .oobfree
= { {2, 6}, {136, 208} },
162 /* 8192-byte page size with 8-bit ECC -- requires 218-byte OOB */
163 static struct nand_ecclayout oob_8192_ecc8
= {
166 8, 9, 10, 11, 12, 13, 14, 15,
167 16, 17, 18, 19, 20, 21, 22, 23,
168 24, 25, 26, 27, 28, 29, 30, 31,
169 32, 33, 34, 35, 36, 37, 38, 39,
170 40, 41, 42, 43, 44, 45, 46, 47,
171 48, 49, 50, 51, 52, 53, 54, 55,
172 56, 57, 58, 59, 60, 61, 62, 63,
173 64, 65, 66, 67, 68, 69, 70, 71,
174 72, 73, 74, 75, 76, 77, 78, 79,
175 80, 81, 82, 83, 84, 85, 86, 87,
176 88, 89, 90, 91, 92, 93, 94, 95,
177 96, 97, 98, 99, 100, 101, 102, 103,
178 104, 105, 106, 107, 108, 109, 110, 111,
179 112, 113, 114, 115, 116, 117, 118, 119,
180 120, 121, 122, 123, 124, 125, 126, 127,
181 128, 129, 130, 131, 132, 133, 134, 135,
182 136, 137, 138, 139, 140, 141, 142, 143,
183 144, 145, 146, 147, 148, 149, 150, 151,
184 152, 153, 154, 155, 156, 157, 158, 159,
185 160, 161, 162, 163, 164, 165, 166, 167,
186 168, 169, 170, 171, 172, 173, 174, 175,
187 176, 177, 178, 179, 180, 181, 182, 183,
188 184, 185, 186, 187, 188, 189, 190, 191,
189 192, 193, 194, 195, 196, 197, 198, 199,
190 200, 201, 202, 203, 204, 205, 206, 207,
191 208, 209, 210, 211, 212, 213, 214, 215,
192 216, 217, 218, 219, 220, 221, 222, 223,
193 224, 225, 226, 227, 228, 229, 230, 231,
194 232, 233, 234, 235, 236, 237, 238, 239,
195 240, 241, 242, 243, 244, 245, 246, 247,
196 248, 249, 250, 251, 252, 253, 254, 255,
197 256, 257, 258, 259, 260, 261, 262, 263,
199 .oobfree
= { {2, 6}, {264, 80} },
203 * Generic flash bbt descriptors
205 static u8 bbt_pattern
[] = {'B', 'b', 't', '0' };
206 static u8 mirror_pattern
[] = {'1', 't', 'b', 'B' };
208 static struct nand_bbt_descr bbt_main_descr
= {
209 .options
= NAND_BBT_LASTBLOCK
| NAND_BBT_CREATE
| NAND_BBT_WRITE
|
210 NAND_BBT_2BIT
| NAND_BBT_VERSION
,
211 .offs
= 2, /* 0 on 8-bit small page */
215 .pattern
= bbt_pattern
,
218 static struct nand_bbt_descr bbt_mirror_descr
= {
219 .options
= NAND_BBT_LASTBLOCK
| NAND_BBT_CREATE
| NAND_BBT_WRITE
|
220 NAND_BBT_2BIT
| NAND_BBT_VERSION
,
221 .offs
= 2, /* 0 on 8-bit small page */
225 .pattern
= mirror_pattern
,
229 * Set up the IFC hardware block and page address fields, and the ifc nand
230 * structure addr field to point to the correct IFC buffer in memory
232 static void set_addr(struct mtd_info
*mtd
, int column
, int page_addr
, int oob
)
234 struct nand_chip
*chip
= mtd
->priv
;
235 struct fsl_ifc_mtd
*priv
= chip
->priv
;
236 struct fsl_ifc_ctrl
*ctrl
= priv
->ctrl
;
237 struct fsl_ifc_regs __iomem
*ifc
= ctrl
->regs
;
240 ifc_nand_ctrl
->page
= page_addr
;
241 /* Program ROW0/COL0 */
242 iowrite32be(page_addr
, &ifc
->ifc_nand
.row0
);
243 iowrite32be((oob
? IFC_NAND_COL_MS
: 0) | column
, &ifc
->ifc_nand
.col0
);
245 buf_num
= page_addr
& priv
->bufnum_mask
;
247 ifc_nand_ctrl
->addr
= priv
->vbase
+ buf_num
* (mtd
->writesize
* 2);
248 ifc_nand_ctrl
->index
= column
;
250 /* for OOB data point to the second half of the buffer */
252 ifc_nand_ctrl
->index
+= mtd
->writesize
;
255 static int is_blank(struct mtd_info
*mtd
, unsigned int bufnum
)
257 struct nand_chip
*chip
= mtd
->priv
;
258 struct fsl_ifc_mtd
*priv
= chip
->priv
;
259 u8 __iomem
*addr
= priv
->vbase
+ bufnum
* (mtd
->writesize
* 2);
260 u32 __iomem
*mainarea
= (u32 __iomem
*)addr
;
261 u8 __iomem
*oob
= addr
+ mtd
->writesize
;
264 for (i
= 0; i
< mtd
->writesize
/ 4; i
++) {
265 if (__raw_readl(&mainarea
[i
]) != 0xffffffff)
269 for (i
= 0; i
< chip
->ecc
.layout
->eccbytes
; i
++) {
270 int pos
= chip
->ecc
.layout
->eccpos
[i
];
272 if (__raw_readb(&oob
[pos
]) != 0xff)
279 /* returns nonzero if entire page is blank */
280 static int check_read_ecc(struct mtd_info
*mtd
, struct fsl_ifc_ctrl
*ctrl
,
281 u32
*eccstat
, unsigned int bufnum
)
283 u32 reg
= eccstat
[bufnum
/ 4];
286 errors
= (reg
>> ((3 - bufnum
% 4) * 8)) & 15;
292 * execute IFC NAND command and wait for it to complete
294 static void fsl_ifc_run_command(struct mtd_info
*mtd
)
296 struct nand_chip
*chip
= mtd
->priv
;
297 struct fsl_ifc_mtd
*priv
= chip
->priv
;
298 struct fsl_ifc_ctrl
*ctrl
= priv
->ctrl
;
299 struct fsl_ifc_nand_ctrl
*nctrl
= ifc_nand_ctrl
;
300 struct fsl_ifc_regs __iomem
*ifc
= ctrl
->regs
;
304 /* set the chip select for NAND Transaction */
305 iowrite32be(priv
->bank
<< IFC_NAND_CSEL_SHIFT
,
306 &ifc
->ifc_nand
.nand_csel
);
309 "%s: fir0=%08x fcr0=%08x\n",
311 ioread32be(&ifc
->ifc_nand
.nand_fir0
),
312 ioread32be(&ifc
->ifc_nand
.nand_fcr0
));
316 /* start read/write seq */
317 iowrite32be(IFC_NAND_SEQ_STRT_FIR_STRT
, &ifc
->ifc_nand
.nandseq_strt
);
319 /* wait for command complete flag or timeout */
320 wait_event_timeout(ctrl
->nand_wait
, ctrl
->nand_stat
,
321 IFC_TIMEOUT_MSECS
* HZ
/1000);
323 /* ctrl->nand_stat will be updated from IRQ context */
324 if (!ctrl
->nand_stat
)
325 dev_err(priv
->dev
, "Controller is not responding\n");
326 if (ctrl
->nand_stat
& IFC_NAND_EVTER_STAT_FTOER
)
327 dev_err(priv
->dev
, "NAND Flash Timeout Error\n");
328 if (ctrl
->nand_stat
& IFC_NAND_EVTER_STAT_WPER
)
329 dev_err(priv
->dev
, "NAND Flash Write Protect Error\n");
331 nctrl
->max_bitflips
= 0;
333 if (nctrl
->eccread
) {
335 int bufnum
= nctrl
->page
& priv
->bufnum_mask
;
336 int sector
= bufnum
* chip
->ecc
.steps
;
337 int sector_end
= sector
+ chip
->ecc
.steps
- 1;
339 for (i
= sector
/ 4; i
<= sector_end
/ 4; i
++)
340 eccstat
[i
] = ioread32be(&ifc
->ifc_nand
.nand_eccstat
[i
]);
342 for (i
= sector
; i
<= sector_end
; i
++) {
343 errors
= check_read_ecc(mtd
, ctrl
, eccstat
, i
);
347 * Uncorrectable error.
348 * OK only if the whole page is blank.
350 * We disable ECCER reporting due to...
351 * erratum IFC-A002770 -- so report it now if we
352 * see an uncorrectable error in ECCSTAT.
354 if (!is_blank(mtd
, bufnum
))
356 IFC_NAND_EVTER_STAT_ECCER
;
360 mtd
->ecc_stats
.corrected
+= errors
;
361 nctrl
->max_bitflips
= max_t(unsigned int,
370 static void fsl_ifc_do_read(struct nand_chip
*chip
,
372 struct mtd_info
*mtd
)
374 struct fsl_ifc_mtd
*priv
= chip
->priv
;
375 struct fsl_ifc_ctrl
*ctrl
= priv
->ctrl
;
376 struct fsl_ifc_regs __iomem
*ifc
= ctrl
->regs
;
378 /* Program FIR/IFC_NAND_FCR0 for Small/Large page */
379 if (mtd
->writesize
> 512) {
380 iowrite32be((IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
381 (IFC_FIR_OP_CA0
<< IFC_NAND_FIR0_OP1_SHIFT
) |
382 (IFC_FIR_OP_RA0
<< IFC_NAND_FIR0_OP2_SHIFT
) |
383 (IFC_FIR_OP_CMD1
<< IFC_NAND_FIR0_OP3_SHIFT
) |
384 (IFC_FIR_OP_RBCD
<< IFC_NAND_FIR0_OP4_SHIFT
),
385 &ifc
->ifc_nand
.nand_fir0
);
386 iowrite32be(0x0, &ifc
->ifc_nand
.nand_fir1
);
388 iowrite32be((NAND_CMD_READ0
<< IFC_NAND_FCR0_CMD0_SHIFT
) |
389 (NAND_CMD_READSTART
<< IFC_NAND_FCR0_CMD1_SHIFT
),
390 &ifc
->ifc_nand
.nand_fcr0
);
392 iowrite32be((IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
393 (IFC_FIR_OP_CA0
<< IFC_NAND_FIR0_OP1_SHIFT
) |
394 (IFC_FIR_OP_RA0
<< IFC_NAND_FIR0_OP2_SHIFT
) |
395 (IFC_FIR_OP_RBCD
<< IFC_NAND_FIR0_OP3_SHIFT
),
396 &ifc
->ifc_nand
.nand_fir0
);
397 iowrite32be(0x0, &ifc
->ifc_nand
.nand_fir1
);
400 iowrite32be(NAND_CMD_READOOB
<<
401 IFC_NAND_FCR0_CMD0_SHIFT
,
402 &ifc
->ifc_nand
.nand_fcr0
);
404 iowrite32be(NAND_CMD_READ0
<<
405 IFC_NAND_FCR0_CMD0_SHIFT
,
406 &ifc
->ifc_nand
.nand_fcr0
);
410 /* cmdfunc send commands to the IFC NAND Machine */
411 static void fsl_ifc_cmdfunc(struct mtd_info
*mtd
, unsigned int command
,
412 int column
, int page_addr
) {
413 struct nand_chip
*chip
= mtd
->priv
;
414 struct fsl_ifc_mtd
*priv
= chip
->priv
;
415 struct fsl_ifc_ctrl
*ctrl
= priv
->ctrl
;
416 struct fsl_ifc_regs __iomem
*ifc
= ctrl
->regs
;
418 /* clear the read buffer */
419 ifc_nand_ctrl
->read_bytes
= 0;
420 if (command
!= NAND_CMD_PAGEPROG
)
421 ifc_nand_ctrl
->index
= 0;
424 /* READ0 read the entire buffer to use hardware ECC. */
426 iowrite32be(0, &ifc
->ifc_nand
.nand_fbcr
);
427 set_addr(mtd
, 0, page_addr
, 0);
429 ifc_nand_ctrl
->read_bytes
= mtd
->writesize
+ mtd
->oobsize
;
430 ifc_nand_ctrl
->index
+= column
;
432 if (chip
->ecc
.mode
== NAND_ECC_HW
)
433 ifc_nand_ctrl
->eccread
= 1;
435 fsl_ifc_do_read(chip
, 0, mtd
);
436 fsl_ifc_run_command(mtd
);
439 /* READOOB reads only the OOB because no ECC is performed. */
440 case NAND_CMD_READOOB
:
441 iowrite32be(mtd
->oobsize
- column
, &ifc
->ifc_nand
.nand_fbcr
);
442 set_addr(mtd
, column
, page_addr
, 1);
444 ifc_nand_ctrl
->read_bytes
= mtd
->writesize
+ mtd
->oobsize
;
446 fsl_ifc_do_read(chip
, 1, mtd
);
447 fsl_ifc_run_command(mtd
);
451 case NAND_CMD_READID
:
452 case NAND_CMD_PARAM
: {
453 int timing
= IFC_FIR_OP_RB
;
454 if (command
== NAND_CMD_PARAM
)
455 timing
= IFC_FIR_OP_RBCD
;
457 iowrite32be((IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
458 (IFC_FIR_OP_UA
<< IFC_NAND_FIR0_OP1_SHIFT
) |
459 (timing
<< IFC_NAND_FIR0_OP2_SHIFT
),
460 &ifc
->ifc_nand
.nand_fir0
);
461 iowrite32be(command
<< IFC_NAND_FCR0_CMD0_SHIFT
,
462 &ifc
->ifc_nand
.nand_fcr0
);
463 iowrite32be(column
, &ifc
->ifc_nand
.row3
);
466 * although currently it's 8 bytes for READID, we always read
467 * the maximum 256 bytes(for PARAM)
469 iowrite32be(256, &ifc
->ifc_nand
.nand_fbcr
);
470 ifc_nand_ctrl
->read_bytes
= 256;
472 set_addr(mtd
, 0, 0, 0);
473 fsl_ifc_run_command(mtd
);
477 /* ERASE1 stores the block and page address */
478 case NAND_CMD_ERASE1
:
479 set_addr(mtd
, 0, page_addr
, 0);
482 /* ERASE2 uses the block and page address from ERASE1 */
483 case NAND_CMD_ERASE2
:
484 iowrite32be((IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
485 (IFC_FIR_OP_RA0
<< IFC_NAND_FIR0_OP1_SHIFT
) |
486 (IFC_FIR_OP_CMD1
<< IFC_NAND_FIR0_OP2_SHIFT
),
487 &ifc
->ifc_nand
.nand_fir0
);
489 iowrite32be((NAND_CMD_ERASE1
<< IFC_NAND_FCR0_CMD0_SHIFT
) |
490 (NAND_CMD_ERASE2
<< IFC_NAND_FCR0_CMD1_SHIFT
),
491 &ifc
->ifc_nand
.nand_fcr0
);
493 iowrite32be(0, &ifc
->ifc_nand
.nand_fbcr
);
494 ifc_nand_ctrl
->read_bytes
= 0;
495 fsl_ifc_run_command(mtd
);
498 /* SEQIN sets up the addr buffer and all registers except the length */
499 case NAND_CMD_SEQIN
: {
501 ifc_nand_ctrl
->column
= column
;
502 ifc_nand_ctrl
->oob
= 0;
504 if (mtd
->writesize
> 512) {
506 (NAND_CMD_SEQIN
<< IFC_NAND_FCR0_CMD0_SHIFT
) |
507 (NAND_CMD_STATUS
<< IFC_NAND_FCR0_CMD1_SHIFT
) |
508 (NAND_CMD_PAGEPROG
<< IFC_NAND_FCR0_CMD2_SHIFT
);
511 (IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
512 (IFC_FIR_OP_CA0
<< IFC_NAND_FIR0_OP1_SHIFT
) |
513 (IFC_FIR_OP_RA0
<< IFC_NAND_FIR0_OP2_SHIFT
) |
514 (IFC_FIR_OP_WBCD
<< IFC_NAND_FIR0_OP3_SHIFT
) |
515 (IFC_FIR_OP_CMD2
<< IFC_NAND_FIR0_OP4_SHIFT
),
516 &ifc
->ifc_nand
.nand_fir0
);
518 (IFC_FIR_OP_CW1
<< IFC_NAND_FIR1_OP5_SHIFT
) |
519 (IFC_FIR_OP_RDSTAT
<<
520 IFC_NAND_FIR1_OP6_SHIFT
) |
521 (IFC_FIR_OP_NOP
<< IFC_NAND_FIR1_OP7_SHIFT
),
522 &ifc
->ifc_nand
.nand_fir1
);
524 nand_fcr0
= ((NAND_CMD_PAGEPROG
<<
525 IFC_NAND_FCR0_CMD1_SHIFT
) |
527 IFC_NAND_FCR0_CMD2_SHIFT
) |
529 IFC_NAND_FCR0_CMD3_SHIFT
));
532 (IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
533 (IFC_FIR_OP_CMD2
<< IFC_NAND_FIR0_OP1_SHIFT
) |
534 (IFC_FIR_OP_CA0
<< IFC_NAND_FIR0_OP2_SHIFT
) |
535 (IFC_FIR_OP_RA0
<< IFC_NAND_FIR0_OP3_SHIFT
) |
536 (IFC_FIR_OP_WBCD
<< IFC_NAND_FIR0_OP4_SHIFT
),
537 &ifc
->ifc_nand
.nand_fir0
);
539 (IFC_FIR_OP_CMD1
<< IFC_NAND_FIR1_OP5_SHIFT
) |
540 (IFC_FIR_OP_CW3
<< IFC_NAND_FIR1_OP6_SHIFT
) |
541 (IFC_FIR_OP_RDSTAT
<<
542 IFC_NAND_FIR1_OP7_SHIFT
) |
543 (IFC_FIR_OP_NOP
<< IFC_NAND_FIR1_OP8_SHIFT
),
544 &ifc
->ifc_nand
.nand_fir1
);
546 if (column
>= mtd
->writesize
)
548 NAND_CMD_READOOB
<< IFC_NAND_FCR0_CMD0_SHIFT
;
551 NAND_CMD_READ0
<< IFC_NAND_FCR0_CMD0_SHIFT
;
554 if (column
>= mtd
->writesize
) {
555 /* OOB area --> READOOB */
556 column
-= mtd
->writesize
;
557 ifc_nand_ctrl
->oob
= 1;
559 iowrite32be(nand_fcr0
, &ifc
->ifc_nand
.nand_fcr0
);
560 set_addr(mtd
, column
, page_addr
, ifc_nand_ctrl
->oob
);
564 /* PAGEPROG reuses all of the setup from SEQIN and adds the length */
565 case NAND_CMD_PAGEPROG
: {
566 if (ifc_nand_ctrl
->oob
) {
567 iowrite32be(ifc_nand_ctrl
->index
-
568 ifc_nand_ctrl
->column
,
569 &ifc
->ifc_nand
.nand_fbcr
);
571 iowrite32be(0, &ifc
->ifc_nand
.nand_fbcr
);
574 fsl_ifc_run_command(mtd
);
578 case NAND_CMD_STATUS
:
579 iowrite32be((IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
580 (IFC_FIR_OP_RB
<< IFC_NAND_FIR0_OP1_SHIFT
),
581 &ifc
->ifc_nand
.nand_fir0
);
582 iowrite32be(NAND_CMD_STATUS
<< IFC_NAND_FCR0_CMD0_SHIFT
,
583 &ifc
->ifc_nand
.nand_fcr0
);
584 iowrite32be(1, &ifc
->ifc_nand
.nand_fbcr
);
585 set_addr(mtd
, 0, 0, 0);
586 ifc_nand_ctrl
->read_bytes
= 1;
588 fsl_ifc_run_command(mtd
);
591 * The chip always seems to report that it is
592 * write-protected, even when it is not.
594 setbits8(ifc_nand_ctrl
->addr
, NAND_STATUS_WP
);
598 iowrite32be(IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
,
599 &ifc
->ifc_nand
.nand_fir0
);
600 iowrite32be(NAND_CMD_RESET
<< IFC_NAND_FCR0_CMD0_SHIFT
,
601 &ifc
->ifc_nand
.nand_fcr0
);
602 fsl_ifc_run_command(mtd
);
606 dev_err(priv
->dev
, "%s: error, unsupported command 0x%x.\n",
611 static void fsl_ifc_select_chip(struct mtd_info
*mtd
, int chip
)
613 /* The hardware does not seem to support multiple
619 * Write buf to the IFC NAND Controller Data Buffer
621 static void fsl_ifc_write_buf(struct mtd_info
*mtd
, const u8
*buf
, int len
)
623 struct nand_chip
*chip
= mtd
->priv
;
624 struct fsl_ifc_mtd
*priv
= chip
->priv
;
625 unsigned int bufsize
= mtd
->writesize
+ mtd
->oobsize
;
628 dev_err(priv
->dev
, "%s: len %d bytes", __func__
, len
);
632 if ((unsigned int)len
> bufsize
- ifc_nand_ctrl
->index
) {
634 "%s: beyond end of buffer (%d requested, %u available)\n",
635 __func__
, len
, bufsize
- ifc_nand_ctrl
->index
);
636 len
= bufsize
- ifc_nand_ctrl
->index
;
639 memcpy_toio(&ifc_nand_ctrl
->addr
[ifc_nand_ctrl
->index
], buf
, len
);
640 ifc_nand_ctrl
->index
+= len
;
644 * Read a byte from either the IFC hardware buffer
645 * read function for 8-bit buswidth
647 static uint8_t fsl_ifc_read_byte(struct mtd_info
*mtd
)
649 struct nand_chip
*chip
= mtd
->priv
;
650 struct fsl_ifc_mtd
*priv
= chip
->priv
;
653 * If there are still bytes in the IFC buffer, then use the
656 if (ifc_nand_ctrl
->index
< ifc_nand_ctrl
->read_bytes
)
657 return in_8(&ifc_nand_ctrl
->addr
[ifc_nand_ctrl
->index
++]);
659 dev_err(priv
->dev
, "%s: beyond end of buffer\n", __func__
);
664 * Read two bytes from the IFC hardware buffer
665 * read function for 16-bit buswith
667 static uint8_t fsl_ifc_read_byte16(struct mtd_info
*mtd
)
669 struct nand_chip
*chip
= mtd
->priv
;
670 struct fsl_ifc_mtd
*priv
= chip
->priv
;
674 * If there are still bytes in the IFC buffer, then use the
677 if (ifc_nand_ctrl
->index
< ifc_nand_ctrl
->read_bytes
) {
678 data
= in_be16((uint16_t __iomem
*)&ifc_nand_ctrl
->
679 addr
[ifc_nand_ctrl
->index
]);
680 ifc_nand_ctrl
->index
+= 2;
681 return (uint8_t) data
;
684 dev_err(priv
->dev
, "%s: beyond end of buffer\n", __func__
);
689 * Read from the IFC Controller Data Buffer
691 static void fsl_ifc_read_buf(struct mtd_info
*mtd
, u8
*buf
, int len
)
693 struct nand_chip
*chip
= mtd
->priv
;
694 struct fsl_ifc_mtd
*priv
= chip
->priv
;
698 dev_err(priv
->dev
, "%s: len %d bytes", __func__
, len
);
702 avail
= min((unsigned int)len
,
703 ifc_nand_ctrl
->read_bytes
- ifc_nand_ctrl
->index
);
704 memcpy_fromio(buf
, &ifc_nand_ctrl
->addr
[ifc_nand_ctrl
->index
], avail
);
705 ifc_nand_ctrl
->index
+= avail
;
709 "%s: beyond end of buffer (%d requested, %d available)\n",
710 __func__
, len
, avail
);
714 * This function is called after Program and Erase Operations to
715 * check for success or failure.
717 static int fsl_ifc_wait(struct mtd_info
*mtd
, struct nand_chip
*chip
)
719 struct fsl_ifc_mtd
*priv
= chip
->priv
;
720 struct fsl_ifc_ctrl
*ctrl
= priv
->ctrl
;
721 struct fsl_ifc_regs __iomem
*ifc
= ctrl
->regs
;
724 /* Use READ_STATUS command, but wait for the device to be ready */
725 iowrite32be((IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
726 (IFC_FIR_OP_RDSTAT
<< IFC_NAND_FIR0_OP1_SHIFT
),
727 &ifc
->ifc_nand
.nand_fir0
);
728 iowrite32be(NAND_CMD_STATUS
<< IFC_NAND_FCR0_CMD0_SHIFT
,
729 &ifc
->ifc_nand
.nand_fcr0
);
730 iowrite32be(1, &ifc
->ifc_nand
.nand_fbcr
);
731 set_addr(mtd
, 0, 0, 0);
732 ifc_nand_ctrl
->read_bytes
= 1;
734 fsl_ifc_run_command(mtd
);
736 nand_fsr
= ioread32be(&ifc
->ifc_nand
.nand_fsr
);
739 * The chip always seems to report that it is
740 * write-protected, even when it is not.
742 return nand_fsr
| NAND_STATUS_WP
;
745 static int fsl_ifc_read_page(struct mtd_info
*mtd
, struct nand_chip
*chip
,
746 uint8_t *buf
, int oob_required
, int page
)
748 struct fsl_ifc_mtd
*priv
= chip
->priv
;
749 struct fsl_ifc_ctrl
*ctrl
= priv
->ctrl
;
750 struct fsl_ifc_nand_ctrl
*nctrl
= ifc_nand_ctrl
;
752 fsl_ifc_read_buf(mtd
, buf
, mtd
->writesize
);
754 fsl_ifc_read_buf(mtd
, chip
->oob_poi
, mtd
->oobsize
);
756 if (ctrl
->nand_stat
& IFC_NAND_EVTER_STAT_ECCER
)
757 dev_err(priv
->dev
, "NAND Flash ECC Uncorrectable Error\n");
759 if (ctrl
->nand_stat
!= IFC_NAND_EVTER_STAT_OPC
)
760 mtd
->ecc_stats
.failed
++;
762 return nctrl
->max_bitflips
;
765 /* ECC will be calculated automatically, and errors will be detected in
768 static int fsl_ifc_write_page(struct mtd_info
*mtd
, struct nand_chip
*chip
,
769 const uint8_t *buf
, int oob_required
)
771 fsl_ifc_write_buf(mtd
, buf
, mtd
->writesize
);
772 fsl_ifc_write_buf(mtd
, chip
->oob_poi
, mtd
->oobsize
);
777 static int fsl_ifc_chip_init_tail(struct mtd_info
*mtd
)
779 struct nand_chip
*chip
= mtd
->priv
;
780 struct fsl_ifc_mtd
*priv
= chip
->priv
;
782 dev_dbg(priv
->dev
, "%s: nand->numchips = %d\n", __func__
,
784 dev_dbg(priv
->dev
, "%s: nand->chipsize = %lld\n", __func__
,
786 dev_dbg(priv
->dev
, "%s: nand->pagemask = %8x\n", __func__
,
788 dev_dbg(priv
->dev
, "%s: nand->chip_delay = %d\n", __func__
,
790 dev_dbg(priv
->dev
, "%s: nand->badblockpos = %d\n", __func__
,
792 dev_dbg(priv
->dev
, "%s: nand->chip_shift = %d\n", __func__
,
794 dev_dbg(priv
->dev
, "%s: nand->page_shift = %d\n", __func__
,
796 dev_dbg(priv
->dev
, "%s: nand->phys_erase_shift = %d\n", __func__
,
797 chip
->phys_erase_shift
);
798 dev_dbg(priv
->dev
, "%s: nand->ecc.mode = %d\n", __func__
,
800 dev_dbg(priv
->dev
, "%s: nand->ecc.steps = %d\n", __func__
,
802 dev_dbg(priv
->dev
, "%s: nand->ecc.bytes = %d\n", __func__
,
804 dev_dbg(priv
->dev
, "%s: nand->ecc.total = %d\n", __func__
,
806 dev_dbg(priv
->dev
, "%s: nand->ecc.layout = %p\n", __func__
,
808 dev_dbg(priv
->dev
, "%s: mtd->flags = %08x\n", __func__
, mtd
->flags
);
809 dev_dbg(priv
->dev
, "%s: mtd->size = %lld\n", __func__
, mtd
->size
);
810 dev_dbg(priv
->dev
, "%s: mtd->erasesize = %d\n", __func__
,
812 dev_dbg(priv
->dev
, "%s: mtd->writesize = %d\n", __func__
,
814 dev_dbg(priv
->dev
, "%s: mtd->oobsize = %d\n", __func__
,
820 static void fsl_ifc_sram_init(struct fsl_ifc_mtd
*priv
)
822 struct fsl_ifc_ctrl
*ctrl
= priv
->ctrl
;
823 struct fsl_ifc_regs __iomem
*ifc
= ctrl
->regs
;
824 uint32_t csor
= 0, csor_8k
= 0, csor_ext
= 0;
825 uint32_t cs
= priv
->bank
;
827 /* Save CSOR and CSOR_ext */
828 csor
= ioread32be(&ifc
->csor_cs
[cs
].csor
);
829 csor_ext
= ioread32be(&ifc
->csor_cs
[cs
].csor_ext
);
831 /* chage PageSize 8K and SpareSize 1K*/
832 csor_8k
= (csor
& ~(CSOR_NAND_PGS_MASK
)) | 0x0018C000;
833 iowrite32be(csor_8k
, &ifc
->csor_cs
[cs
].csor
);
834 iowrite32be(0x0000400, &ifc
->csor_cs
[cs
].csor_ext
);
837 iowrite32be((IFC_FIR_OP_CW0
<< IFC_NAND_FIR0_OP0_SHIFT
) |
838 (IFC_FIR_OP_UA
<< IFC_NAND_FIR0_OP1_SHIFT
) |
839 (IFC_FIR_OP_RB
<< IFC_NAND_FIR0_OP2_SHIFT
),
840 &ifc
->ifc_nand
.nand_fir0
);
841 iowrite32be(NAND_CMD_READID
<< IFC_NAND_FCR0_CMD0_SHIFT
,
842 &ifc
->ifc_nand
.nand_fcr0
);
843 iowrite32be(0x0, &ifc
->ifc_nand
.row3
);
845 iowrite32be(0x0, &ifc
->ifc_nand
.nand_fbcr
);
847 /* Program ROW0/COL0 */
848 iowrite32be(0x0, &ifc
->ifc_nand
.row0
);
849 iowrite32be(0x0, &ifc
->ifc_nand
.col0
);
851 /* set the chip select for NAND Transaction */
852 iowrite32be(cs
<< IFC_NAND_CSEL_SHIFT
, &ifc
->ifc_nand
.nand_csel
);
855 iowrite32be(IFC_NAND_SEQ_STRT_FIR_STRT
, &ifc
->ifc_nand
.nandseq_strt
);
857 /* wait for command complete flag or timeout */
858 wait_event_timeout(ctrl
->nand_wait
, ctrl
->nand_stat
,
859 IFC_TIMEOUT_MSECS
* HZ
/1000);
861 if (ctrl
->nand_stat
!= IFC_NAND_EVTER_STAT_OPC
)
862 printk(KERN_ERR
"fsl-ifc: Failed to Initialise SRAM\n");
864 /* Restore CSOR and CSOR_ext */
865 iowrite32be(csor
, &ifc
->csor_cs
[cs
].csor
);
866 iowrite32be(csor_ext
, &ifc
->csor_cs
[cs
].csor_ext
);
869 static int fsl_ifc_chip_init(struct fsl_ifc_mtd
*priv
)
871 struct fsl_ifc_ctrl
*ctrl
= priv
->ctrl
;
872 struct fsl_ifc_regs __iomem
*ifc
= ctrl
->regs
;
873 struct nand_chip
*chip
= &priv
->chip
;
874 struct nand_ecclayout
*layout
;
877 /* Fill in fsl_ifc_mtd structure */
878 priv
->mtd
.priv
= chip
;
879 priv
->mtd
.owner
= THIS_MODULE
;
881 /* fill in nand_chip structure */
882 /* set up function call table */
883 if ((ioread32be(&ifc
->cspr_cs
[priv
->bank
].cspr
)) & CSPR_PORT_SIZE_16
)
884 chip
->read_byte
= fsl_ifc_read_byte16
;
886 chip
->read_byte
= fsl_ifc_read_byte
;
888 chip
->write_buf
= fsl_ifc_write_buf
;
889 chip
->read_buf
= fsl_ifc_read_buf
;
890 chip
->select_chip
= fsl_ifc_select_chip
;
891 chip
->cmdfunc
= fsl_ifc_cmdfunc
;
892 chip
->waitfunc
= fsl_ifc_wait
;
894 chip
->bbt_td
= &bbt_main_descr
;
895 chip
->bbt_md
= &bbt_mirror_descr
;
897 iowrite32be(0x0, &ifc
->ifc_nand
.ncfgr
);
899 /* set up nand options */
900 chip
->bbt_options
= NAND_BBT_USE_FLASH
;
901 chip
->options
= NAND_NO_SUBPAGE_WRITE
;
903 if (ioread32be(&ifc
->cspr_cs
[priv
->bank
].cspr
) & CSPR_PORT_SIZE_16
) {
904 chip
->read_byte
= fsl_ifc_read_byte16
;
905 chip
->options
|= NAND_BUSWIDTH_16
;
907 chip
->read_byte
= fsl_ifc_read_byte
;
910 chip
->controller
= &ifc_nand_ctrl
->controller
;
913 chip
->ecc
.read_page
= fsl_ifc_read_page
;
914 chip
->ecc
.write_page
= fsl_ifc_write_page
;
916 csor
= ioread32be(&ifc
->csor_cs
[priv
->bank
].csor
);
918 /* Hardware generates ECC per 512 Bytes */
919 chip
->ecc
.size
= 512;
921 chip
->ecc
.strength
= 4;
923 switch (csor
& CSOR_NAND_PGS_MASK
) {
924 case CSOR_NAND_PGS_512
:
925 if (chip
->options
& NAND_BUSWIDTH_16
) {
926 layout
= &oob_512_16bit_ecc4
;
928 layout
= &oob_512_8bit_ecc4
;
930 /* Avoid conflict with bad block marker */
931 bbt_main_descr
.offs
= 0;
932 bbt_mirror_descr
.offs
= 0;
935 priv
->bufnum_mask
= 15;
938 case CSOR_NAND_PGS_2K
:
939 layout
= &oob_2048_ecc4
;
940 priv
->bufnum_mask
= 3;
943 case CSOR_NAND_PGS_4K
:
944 if ((csor
& CSOR_NAND_ECC_MODE_MASK
) ==
945 CSOR_NAND_ECC_MODE_4
) {
946 layout
= &oob_4096_ecc4
;
948 layout
= &oob_4096_ecc8
;
949 chip
->ecc
.bytes
= 16;
950 chip
->ecc
.strength
= 8;
953 priv
->bufnum_mask
= 1;
956 case CSOR_NAND_PGS_8K
:
957 if ((csor
& CSOR_NAND_ECC_MODE_MASK
) ==
958 CSOR_NAND_ECC_MODE_4
) {
959 layout
= &oob_8192_ecc4
;
961 layout
= &oob_8192_ecc8
;
962 chip
->ecc
.bytes
= 16;
963 chip
->ecc
.strength
= 8;
966 priv
->bufnum_mask
= 0;
970 dev_err(priv
->dev
, "bad csor %#x: bad page size\n", csor
);
974 /* Must also set CSOR_NAND_ECC_ENC_EN if DEC_EN set */
975 if (csor
& CSOR_NAND_ECC_DEC_EN
) {
976 chip
->ecc
.mode
= NAND_ECC_HW
;
977 chip
->ecc
.layout
= layout
;
979 chip
->ecc
.mode
= NAND_ECC_SOFT
;
982 ver
= ioread32be(&ifc
->ifc_rev
);
983 if (ver
== FSL_IFC_V1_1_0
)
984 fsl_ifc_sram_init(priv
);
989 static int fsl_ifc_chip_remove(struct fsl_ifc_mtd
*priv
)
991 nand_release(&priv
->mtd
);
993 kfree(priv
->mtd
.name
);
996 iounmap(priv
->vbase
);
998 ifc_nand_ctrl
->chips
[priv
->bank
] = NULL
;
1003 static int match_bank(struct fsl_ifc_regs __iomem
*ifc
, int bank
,
1006 u32 cspr
= ioread32be(&ifc
->cspr_cs
[bank
].cspr
);
1008 if (!(cspr
& CSPR_V
))
1010 if ((cspr
& CSPR_MSEL
) != CSPR_MSEL_NAND
)
1013 return (cspr
& CSPR_BA
) == convert_ifc_address(addr
);
1016 static DEFINE_MUTEX(fsl_ifc_nand_mutex
);
1018 static int fsl_ifc_nand_probe(struct platform_device
*dev
)
1020 struct fsl_ifc_regs __iomem
*ifc
;
1021 struct fsl_ifc_mtd
*priv
;
1022 struct resource res
;
1023 static const char *part_probe_types
[]
1024 = { "cmdlinepart", "RedBoot", "ofpart", NULL
};
1027 struct device_node
*node
= dev
->dev
.of_node
;
1028 struct mtd_part_parser_data ppdata
;
1030 ppdata
.of_node
= dev
->dev
.of_node
;
1031 if (!fsl_ifc_ctrl_dev
|| !fsl_ifc_ctrl_dev
->regs
)
1033 ifc
= fsl_ifc_ctrl_dev
->regs
;
1035 /* get, allocate and map the memory resource */
1036 ret
= of_address_to_resource(node
, 0, &res
);
1038 dev_err(&dev
->dev
, "%s: failed to get resource\n", __func__
);
1042 /* find which chip select it is connected to */
1043 for (bank
= 0; bank
< FSL_IFC_BANK_COUNT
; bank
++) {
1044 if (match_bank(ifc
, bank
, res
.start
))
1048 if (bank
>= FSL_IFC_BANK_COUNT
) {
1049 dev_err(&dev
->dev
, "%s: address did not match any chip selects\n",
1054 priv
= devm_kzalloc(&dev
->dev
, sizeof(*priv
), GFP_KERNEL
);
1058 mutex_lock(&fsl_ifc_nand_mutex
);
1059 if (!fsl_ifc_ctrl_dev
->nand
) {
1060 ifc_nand_ctrl
= kzalloc(sizeof(*ifc_nand_ctrl
), GFP_KERNEL
);
1061 if (!ifc_nand_ctrl
) {
1062 mutex_unlock(&fsl_ifc_nand_mutex
);
1066 ifc_nand_ctrl
->read_bytes
= 0;
1067 ifc_nand_ctrl
->index
= 0;
1068 ifc_nand_ctrl
->addr
= NULL
;
1069 fsl_ifc_ctrl_dev
->nand
= ifc_nand_ctrl
;
1071 spin_lock_init(&ifc_nand_ctrl
->controller
.lock
);
1072 init_waitqueue_head(&ifc_nand_ctrl
->controller
.wq
);
1074 ifc_nand_ctrl
= fsl_ifc_ctrl_dev
->nand
;
1076 mutex_unlock(&fsl_ifc_nand_mutex
);
1078 ifc_nand_ctrl
->chips
[bank
] = priv
;
1080 priv
->ctrl
= fsl_ifc_ctrl_dev
;
1081 priv
->dev
= &dev
->dev
;
1083 priv
->vbase
= ioremap(res
.start
, resource_size(&res
));
1085 dev_err(priv
->dev
, "%s: failed to map chip region\n", __func__
);
1090 dev_set_drvdata(priv
->dev
, priv
);
1092 iowrite32be(IFC_NAND_EVTER_EN_OPC_EN
|
1093 IFC_NAND_EVTER_EN_FTOER_EN
|
1094 IFC_NAND_EVTER_EN_WPER_EN
,
1095 &ifc
->ifc_nand
.nand_evter_en
);
1097 /* enable NAND Machine Interrupts */
1098 iowrite32be(IFC_NAND_EVTER_INTR_OPCIR_EN
|
1099 IFC_NAND_EVTER_INTR_FTOERIR_EN
|
1100 IFC_NAND_EVTER_INTR_WPERIR_EN
,
1101 &ifc
->ifc_nand
.nand_evter_intr_en
);
1102 priv
->mtd
.name
= kasprintf(GFP_KERNEL
, "%llx.flash", (u64
)res
.start
);
1103 if (!priv
->mtd
.name
) {
1108 ret
= fsl_ifc_chip_init(priv
);
1112 ret
= nand_scan_ident(&priv
->mtd
, 1, NULL
);
1116 ret
= fsl_ifc_chip_init_tail(&priv
->mtd
);
1120 ret
= nand_scan_tail(&priv
->mtd
);
1124 /* First look for RedBoot table or partitions on the command
1125 * line, these take precedence over device tree information */
1126 mtd_device_parse_register(&priv
->mtd
, part_probe_types
, &ppdata
,
1129 dev_info(priv
->dev
, "IFC NAND device at 0x%llx, bank %d\n",
1130 (unsigned long long)res
.start
, priv
->bank
);
1134 fsl_ifc_chip_remove(priv
);
1138 static int fsl_ifc_nand_remove(struct platform_device
*dev
)
1140 struct fsl_ifc_mtd
*priv
= dev_get_drvdata(&dev
->dev
);
1142 fsl_ifc_chip_remove(priv
);
1144 mutex_lock(&fsl_ifc_nand_mutex
);
1145 ifc_nand_ctrl
->counter
--;
1146 if (!ifc_nand_ctrl
->counter
) {
1147 fsl_ifc_ctrl_dev
->nand
= NULL
;
1148 kfree(ifc_nand_ctrl
);
1150 mutex_unlock(&fsl_ifc_nand_mutex
);
1155 static const struct of_device_id fsl_ifc_nand_match
[] = {
1157 .compatible
= "fsl,ifc-nand",
1162 static struct platform_driver fsl_ifc_nand_driver
= {
1164 .name
= "fsl,ifc-nand",
1165 .owner
= THIS_MODULE
,
1166 .of_match_table
= fsl_ifc_nand_match
,
1168 .probe
= fsl_ifc_nand_probe
,
1169 .remove
= fsl_ifc_nand_remove
,
1172 module_platform_driver(fsl_ifc_nand_driver
);
1174 MODULE_LICENSE("GPL");
1175 MODULE_AUTHOR("Freescale");
1176 MODULE_DESCRIPTION("Freescale Integrated Flash Controller MTD NAND driver");