blob: 51394e59901bbc11704b3bb9c6d9c978247ee01f [file] [log] [blame]
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301/*
2 * Freescale Integrated Flash Controller NAND driver
3 *
4 * Copyright 2011-2012 Freescale Semiconductor, Inc
5 *
6 * Author: Dipen Dudhat <Dipen.Dudhat@freescale.com>
7 *
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.
12 *
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.
17 *
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
21 */
22
23#include <linux/module.h>
24#include <linux/types.h>
Prabhakar Kushwaha82771882012-03-15 11:04:23 +053025#include <linux/kernel.h>
Rob Herring5af50732013-09-17 14:28:33 -050026#include <linux/of_address.h>
Prabhakar Kushwaha82771882012-03-15 11:04:23 +053027#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>
Prabhakar Kushwahad2ae2e22014-01-17 11:15:16 +053032#include <linux/fsl_ifc.h>
Prabhakar Kushwaha82771882012-03-15 11:04:23 +053033
34#define ERR_BYTE 0xFF /* Value returned for read
35 bytes when read failed */
36#define IFC_TIMEOUT_MSECS 500 /* Maximum number of mSecs to wait
37 for IFC NAND Machine */
38
39struct fsl_ifc_ctrl;
40
41/* mtd information per set */
42struct fsl_ifc_mtd {
43 struct mtd_info mtd;
44 struct nand_chip chip;
45 struct fsl_ifc_ctrl *ctrl;
46
47 struct device *dev;
48 int bank; /* Chip select bank number */
49 unsigned int bufnum_mask; /* bufnum = page & bufnum_mask */
50 u8 __iomem *vbase; /* Chip select base virtual address */
51};
52
53/* overview of the fsl ifc controller */
54struct fsl_ifc_nand_ctrl {
55 struct nand_hw_control controller;
56 struct fsl_ifc_mtd *chips[FSL_IFC_BANK_COUNT];
57
Aaron Sierra44544062014-04-07 11:58:12 -050058 void __iomem *addr; /* Address of assigned IFC buffer */
Prabhakar Kushwaha82771882012-03-15 11:04:23 +053059 unsigned int page; /* Last page written to / read from */
60 unsigned int read_bytes;/* Number of bytes read during command */
61 unsigned int column; /* Saved column from SEQIN */
62 unsigned int index; /* Pointer to next byte to 'read' */
63 unsigned int oob; /* Non zero if operating on OOB data */
64 unsigned int eccread; /* Non zero for a full-page ECC read */
65 unsigned int counter; /* counter for the initializations */
Mike Dunn3f91e942012-04-25 12:06:09 -070066 unsigned int max_bitflips; /* Saved during READ0 cmd */
Prabhakar Kushwaha82771882012-03-15 11:04:23 +053067};
68
69static struct fsl_ifc_nand_ctrl *ifc_nand_ctrl;
70
71/* 512-byte page with 4-bit ECC, 8-bit */
72static struct nand_ecclayout oob_512_8bit_ecc4 = {
73 .eccbytes = 8,
74 .eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
75 .oobfree = { {0, 5}, {6, 2} },
76};
77
78/* 512-byte page with 4-bit ECC, 16-bit */
79static struct nand_ecclayout oob_512_16bit_ecc4 = {
80 .eccbytes = 8,
81 .eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
82 .oobfree = { {2, 6}, },
83};
84
85/* 2048-byte page size with 4-bit ECC */
86static struct nand_ecclayout oob_2048_ecc4 = {
87 .eccbytes = 32,
88 .eccpos = {
89 8, 9, 10, 11, 12, 13, 14, 15,
90 16, 17, 18, 19, 20, 21, 22, 23,
91 24, 25, 26, 27, 28, 29, 30, 31,
92 32, 33, 34, 35, 36, 37, 38, 39,
93 },
94 .oobfree = { {2, 6}, {40, 24} },
95};
96
97/* 4096-byte page size with 4-bit ECC */
98static struct nand_ecclayout oob_4096_ecc4 = {
99 .eccbytes = 64,
100 .eccpos = {
101 8, 9, 10, 11, 12, 13, 14, 15,
102 16, 17, 18, 19, 20, 21, 22, 23,
103 24, 25, 26, 27, 28, 29, 30, 31,
104 32, 33, 34, 35, 36, 37, 38, 39,
105 40, 41, 42, 43, 44, 45, 46, 47,
106 48, 49, 50, 51, 52, 53, 54, 55,
107 56, 57, 58, 59, 60, 61, 62, 63,
108 64, 65, 66, 67, 68, 69, 70, 71,
109 },
110 .oobfree = { {2, 6}, {72, 56} },
111};
112
113/* 4096-byte page size with 8-bit ECC -- requires 218-byte OOB */
114static struct nand_ecclayout oob_4096_ecc8 = {
115 .eccbytes = 128,
116 .eccpos = {
117 8, 9, 10, 11, 12, 13, 14, 15,
118 16, 17, 18, 19, 20, 21, 22, 23,
119 24, 25, 26, 27, 28, 29, 30, 31,
120 32, 33, 34, 35, 36, 37, 38, 39,
121 40, 41, 42, 43, 44, 45, 46, 47,
122 48, 49, 50, 51, 52, 53, 54, 55,
123 56, 57, 58, 59, 60, 61, 62, 63,
124 64, 65, 66, 67, 68, 69, 70, 71,
125 72, 73, 74, 75, 76, 77, 78, 79,
126 80, 81, 82, 83, 84, 85, 86, 87,
127 88, 89, 90, 91, 92, 93, 94, 95,
128 96, 97, 98, 99, 100, 101, 102, 103,
129 104, 105, 106, 107, 108, 109, 110, 111,
130 112, 113, 114, 115, 116, 117, 118, 119,
131 120, 121, 122, 123, 124, 125, 126, 127,
132 128, 129, 130, 131, 132, 133, 134, 135,
133 },
134 .oobfree = { {2, 6}, {136, 82} },
135};
136
Prabhakar Kushwahaebff90b2013-09-24 16:41:23 +0530137/* 8192-byte page size with 4-bit ECC */
138static struct nand_ecclayout oob_8192_ecc4 = {
139 .eccbytes = 128,
140 .eccpos = {
141 8, 9, 10, 11, 12, 13, 14, 15,
142 16, 17, 18, 19, 20, 21, 22, 23,
143 24, 25, 26, 27, 28, 29, 30, 31,
144 32, 33, 34, 35, 36, 37, 38, 39,
145 40, 41, 42, 43, 44, 45, 46, 47,
146 48, 49, 50, 51, 52, 53, 54, 55,
147 56, 57, 58, 59, 60, 61, 62, 63,
148 64, 65, 66, 67, 68, 69, 70, 71,
149 72, 73, 74, 75, 76, 77, 78, 79,
150 80, 81, 82, 83, 84, 85, 86, 87,
151 88, 89, 90, 91, 92, 93, 94, 95,
152 96, 97, 98, 99, 100, 101, 102, 103,
153 104, 105, 106, 107, 108, 109, 110, 111,
154 112, 113, 114, 115, 116, 117, 118, 119,
155 120, 121, 122, 123, 124, 125, 126, 127,
156 128, 129, 130, 131, 132, 133, 134, 135,
157 },
158 .oobfree = { {2, 6}, {136, 208} },
159};
160
161/* 8192-byte page size with 8-bit ECC -- requires 218-byte OOB */
162static struct nand_ecclayout oob_8192_ecc8 = {
163 .eccbytes = 256,
164 .eccpos = {
165 8, 9, 10, 11, 12, 13, 14, 15,
166 16, 17, 18, 19, 20, 21, 22, 23,
167 24, 25, 26, 27, 28, 29, 30, 31,
168 32, 33, 34, 35, 36, 37, 38, 39,
169 40, 41, 42, 43, 44, 45, 46, 47,
170 48, 49, 50, 51, 52, 53, 54, 55,
171 56, 57, 58, 59, 60, 61, 62, 63,
172 64, 65, 66, 67, 68, 69, 70, 71,
173 72, 73, 74, 75, 76, 77, 78, 79,
174 80, 81, 82, 83, 84, 85, 86, 87,
175 88, 89, 90, 91, 92, 93, 94, 95,
176 96, 97, 98, 99, 100, 101, 102, 103,
177 104, 105, 106, 107, 108, 109, 110, 111,
178 112, 113, 114, 115, 116, 117, 118, 119,
179 120, 121, 122, 123, 124, 125, 126, 127,
180 128, 129, 130, 131, 132, 133, 134, 135,
181 136, 137, 138, 139, 140, 141, 142, 143,
182 144, 145, 146, 147, 148, 149, 150, 151,
183 152, 153, 154, 155, 156, 157, 158, 159,
184 160, 161, 162, 163, 164, 165, 166, 167,
185 168, 169, 170, 171, 172, 173, 174, 175,
186 176, 177, 178, 179, 180, 181, 182, 183,
187 184, 185, 186, 187, 188, 189, 190, 191,
188 192, 193, 194, 195, 196, 197, 198, 199,
189 200, 201, 202, 203, 204, 205, 206, 207,
190 208, 209, 210, 211, 212, 213, 214, 215,
191 216, 217, 218, 219, 220, 221, 222, 223,
192 224, 225, 226, 227, 228, 229, 230, 231,
193 232, 233, 234, 235, 236, 237, 238, 239,
194 240, 241, 242, 243, 244, 245, 246, 247,
195 248, 249, 250, 251, 252, 253, 254, 255,
196 256, 257, 258, 259, 260, 261, 262, 263,
197 },
198 .oobfree = { {2, 6}, {264, 80} },
199};
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530200
201/*
202 * Generic flash bbt descriptors
203 */
204static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
205static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
206
207static struct nand_bbt_descr bbt_main_descr = {
208 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
209 NAND_BBT_2BIT | NAND_BBT_VERSION,
210 .offs = 2, /* 0 on 8-bit small page */
211 .len = 4,
212 .veroffs = 6,
213 .maxblocks = 4,
214 .pattern = bbt_pattern,
215};
216
217static struct nand_bbt_descr bbt_mirror_descr = {
218 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
219 NAND_BBT_2BIT | NAND_BBT_VERSION,
220 .offs = 2, /* 0 on 8-bit small page */
221 .len = 4,
222 .veroffs = 6,
223 .maxblocks = 4,
224 .pattern = mirror_pattern,
225};
226
227/*
228 * Set up the IFC hardware block and page address fields, and the ifc nand
229 * structure addr field to point to the correct IFC buffer in memory
230 */
231static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
232{
233 struct nand_chip *chip = mtd->priv;
234 struct fsl_ifc_mtd *priv = chip->priv;
235 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
236 struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
237 int buf_num;
238
239 ifc_nand_ctrl->page = page_addr;
240 /* Program ROW0/COL0 */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600241 iowrite32be(page_addr, &ifc->ifc_nand.row0);
242 iowrite32be((oob ? IFC_NAND_COL_MS : 0) | column, &ifc->ifc_nand.col0);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530243
244 buf_num = page_addr & priv->bufnum_mask;
245
246 ifc_nand_ctrl->addr = priv->vbase + buf_num * (mtd->writesize * 2);
247 ifc_nand_ctrl->index = column;
248
249 /* for OOB data point to the second half of the buffer */
250 if (oob)
251 ifc_nand_ctrl->index += mtd->writesize;
252}
253
254static int is_blank(struct mtd_info *mtd, unsigned int bufnum)
255{
256 struct nand_chip *chip = mtd->priv;
257 struct fsl_ifc_mtd *priv = chip->priv;
258 u8 __iomem *addr = priv->vbase + bufnum * (mtd->writesize * 2);
Kim Phillips2caf87a2012-09-13 18:56:07 -0500259 u32 __iomem *mainarea = (u32 __iomem *)addr;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530260 u8 __iomem *oob = addr + mtd->writesize;
261 int i;
262
263 for (i = 0; i < mtd->writesize / 4; i++) {
264 if (__raw_readl(&mainarea[i]) != 0xffffffff)
265 return 0;
266 }
267
268 for (i = 0; i < chip->ecc.layout->eccbytes; i++) {
269 int pos = chip->ecc.layout->eccpos[i];
270
271 if (__raw_readb(&oob[pos]) != 0xff)
272 return 0;
273 }
274
275 return 1;
276}
277
278/* returns nonzero if entire page is blank */
279static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
280 u32 *eccstat, unsigned int bufnum)
281{
282 u32 reg = eccstat[bufnum / 4];
283 int errors;
284
285 errors = (reg >> ((3 - bufnum % 4) * 8)) & 15;
286
287 return errors;
288}
289
290/*
291 * execute IFC NAND command and wait for it to complete
292 */
293static void fsl_ifc_run_command(struct mtd_info *mtd)
294{
295 struct nand_chip *chip = mtd->priv;
296 struct fsl_ifc_mtd *priv = chip->priv;
297 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
298 struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl;
299 struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
300 u32 eccstat[4];
301 int i;
302
303 /* set the chip select for NAND Transaction */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600304 iowrite32be(priv->bank << IFC_NAND_CSEL_SHIFT,
305 &ifc->ifc_nand.nand_csel);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530306
307 dev_vdbg(priv->dev,
308 "%s: fir0=%08x fcr0=%08x\n",
309 __func__,
Kim Phillips0c69fb02013-01-11 16:23:59 -0600310 ioread32be(&ifc->ifc_nand.nand_fir0),
311 ioread32be(&ifc->ifc_nand.nand_fcr0));
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530312
313 ctrl->nand_stat = 0;
314
315 /* start read/write seq */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600316 iowrite32be(IFC_NAND_SEQ_STRT_FIR_STRT, &ifc->ifc_nand.nandseq_strt);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530317
318 /* wait for command complete flag or timeout */
319 wait_event_timeout(ctrl->nand_wait, ctrl->nand_stat,
Nicholas Mc Guire95d70662015-03-13 07:23:47 -0400320 msecs_to_jiffies(IFC_TIMEOUT_MSECS));
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530321
322 /* ctrl->nand_stat will be updated from IRQ context */
323 if (!ctrl->nand_stat)
324 dev_err(priv->dev, "Controller is not responding\n");
325 if (ctrl->nand_stat & IFC_NAND_EVTER_STAT_FTOER)
326 dev_err(priv->dev, "NAND Flash Timeout Error\n");
327 if (ctrl->nand_stat & IFC_NAND_EVTER_STAT_WPER)
328 dev_err(priv->dev, "NAND Flash Write Protect Error\n");
329
Mike Dunn3f91e942012-04-25 12:06:09 -0700330 nctrl->max_bitflips = 0;
331
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530332 if (nctrl->eccread) {
333 int errors;
334 int bufnum = nctrl->page & priv->bufnum_mask;
335 int sector = bufnum * chip->ecc.steps;
336 int sector_end = sector + chip->ecc.steps - 1;
337
338 for (i = sector / 4; i <= sector_end / 4; i++)
Kim Phillips0c69fb02013-01-11 16:23:59 -0600339 eccstat[i] = ioread32be(&ifc->ifc_nand.nand_eccstat[i]);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530340
341 for (i = sector; i <= sector_end; i++) {
342 errors = check_read_ecc(mtd, ctrl, eccstat, i);
343
344 if (errors == 15) {
345 /*
346 * Uncorrectable error.
347 * OK only if the whole page is blank.
348 *
349 * We disable ECCER reporting due to...
350 * erratum IFC-A002770 -- so report it now if we
351 * see an uncorrectable error in ECCSTAT.
352 */
353 if (!is_blank(mtd, bufnum))
354 ctrl->nand_stat |=
355 IFC_NAND_EVTER_STAT_ECCER;
356 break;
357 }
358
359 mtd->ecc_stats.corrected += errors;
Mike Dunn3f91e942012-04-25 12:06:09 -0700360 nctrl->max_bitflips = max_t(unsigned int,
361 nctrl->max_bitflips,
362 errors);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530363 }
364
365 nctrl->eccread = 0;
366 }
367}
368
369static void fsl_ifc_do_read(struct nand_chip *chip,
370 int oob,
371 struct mtd_info *mtd)
372{
373 struct fsl_ifc_mtd *priv = chip->priv;
374 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
375 struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
376
377 /* Program FIR/IFC_NAND_FCR0 for Small/Large page */
378 if (mtd->writesize > 512) {
Kim Phillips0c69fb02013-01-11 16:23:59 -0600379 iowrite32be((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
380 (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
381 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
382 (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP3_SHIFT) |
383 (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP4_SHIFT),
384 &ifc->ifc_nand.nand_fir0);
385 iowrite32be(0x0, &ifc->ifc_nand.nand_fir1);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530386
Kim Phillips0c69fb02013-01-11 16:23:59 -0600387 iowrite32be((NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT) |
388 (NAND_CMD_READSTART << IFC_NAND_FCR0_CMD1_SHIFT),
389 &ifc->ifc_nand.nand_fcr0);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530390 } else {
Kim Phillips0c69fb02013-01-11 16:23:59 -0600391 iowrite32be((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
392 (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
393 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
394 (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP3_SHIFT),
395 &ifc->ifc_nand.nand_fir0);
396 iowrite32be(0x0, &ifc->ifc_nand.nand_fir1);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530397
398 if (oob)
Kim Phillips0c69fb02013-01-11 16:23:59 -0600399 iowrite32be(NAND_CMD_READOOB <<
400 IFC_NAND_FCR0_CMD0_SHIFT,
401 &ifc->ifc_nand.nand_fcr0);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530402 else
Kim Phillips0c69fb02013-01-11 16:23:59 -0600403 iowrite32be(NAND_CMD_READ0 <<
404 IFC_NAND_FCR0_CMD0_SHIFT,
405 &ifc->ifc_nand.nand_fcr0);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530406 }
407}
408
409/* cmdfunc send commands to the IFC NAND Machine */
410static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
411 int column, int page_addr) {
412 struct nand_chip *chip = mtd->priv;
413 struct fsl_ifc_mtd *priv = chip->priv;
414 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
415 struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
416
417 /* clear the read buffer */
418 ifc_nand_ctrl->read_bytes = 0;
419 if (command != NAND_CMD_PAGEPROG)
420 ifc_nand_ctrl->index = 0;
421
422 switch (command) {
423 /* READ0 read the entire buffer to use hardware ECC. */
424 case NAND_CMD_READ0:
Kim Phillips0c69fb02013-01-11 16:23:59 -0600425 iowrite32be(0, &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530426 set_addr(mtd, 0, page_addr, 0);
427
428 ifc_nand_ctrl->read_bytes = mtd->writesize + mtd->oobsize;
429 ifc_nand_ctrl->index += column;
430
431 if (chip->ecc.mode == NAND_ECC_HW)
432 ifc_nand_ctrl->eccread = 1;
433
434 fsl_ifc_do_read(chip, 0, mtd);
435 fsl_ifc_run_command(mtd);
436 return;
437
438 /* READOOB reads only the OOB because no ECC is performed. */
439 case NAND_CMD_READOOB:
Kim Phillips0c69fb02013-01-11 16:23:59 -0600440 iowrite32be(mtd->oobsize - column, &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530441 set_addr(mtd, column, page_addr, 1);
442
443 ifc_nand_ctrl->read_bytes = mtd->writesize + mtd->oobsize;
444
445 fsl_ifc_do_read(chip, 1, mtd);
446 fsl_ifc_run_command(mtd);
447
448 return;
449
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530450 case NAND_CMD_READID:
Prabhakar Kushwaha59fdd5b2012-04-09 10:55:22 +0530451 case NAND_CMD_PARAM: {
452 int timing = IFC_FIR_OP_RB;
453 if (command == NAND_CMD_PARAM)
454 timing = IFC_FIR_OP_RBCD;
455
Kim Phillips0c69fb02013-01-11 16:23:59 -0600456 iowrite32be((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
457 (IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) |
458 (timing << IFC_NAND_FIR0_OP2_SHIFT),
459 &ifc->ifc_nand.nand_fir0);
460 iowrite32be(command << IFC_NAND_FCR0_CMD0_SHIFT,
461 &ifc->ifc_nand.nand_fcr0);
462 iowrite32be(column, &ifc->ifc_nand.row3);
Prabhakar Kushwaha59fdd5b2012-04-09 10:55:22 +0530463
464 /*
465 * although currently it's 8 bytes for READID, we always read
466 * the maximum 256 bytes(for PARAM)
467 */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600468 iowrite32be(256, &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha59fdd5b2012-04-09 10:55:22 +0530469 ifc_nand_ctrl->read_bytes = 256;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530470
471 set_addr(mtd, 0, 0, 0);
472 fsl_ifc_run_command(mtd);
473 return;
Prabhakar Kushwaha59fdd5b2012-04-09 10:55:22 +0530474 }
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530475
476 /* ERASE1 stores the block and page address */
477 case NAND_CMD_ERASE1:
478 set_addr(mtd, 0, page_addr, 0);
479 return;
480
481 /* ERASE2 uses the block and page address from ERASE1 */
482 case NAND_CMD_ERASE2:
Kim Phillips0c69fb02013-01-11 16:23:59 -0600483 iowrite32be((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
484 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP1_SHIFT) |
485 (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP2_SHIFT),
486 &ifc->ifc_nand.nand_fir0);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530487
Kim Phillips0c69fb02013-01-11 16:23:59 -0600488 iowrite32be((NAND_CMD_ERASE1 << IFC_NAND_FCR0_CMD0_SHIFT) |
489 (NAND_CMD_ERASE2 << IFC_NAND_FCR0_CMD1_SHIFT),
490 &ifc->ifc_nand.nand_fcr0);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530491
Kim Phillips0c69fb02013-01-11 16:23:59 -0600492 iowrite32be(0, &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530493 ifc_nand_ctrl->read_bytes = 0;
494 fsl_ifc_run_command(mtd);
495 return;
496
497 /* SEQIN sets up the addr buffer and all registers except the length */
498 case NAND_CMD_SEQIN: {
499 u32 nand_fcr0;
500 ifc_nand_ctrl->column = column;
501 ifc_nand_ctrl->oob = 0;
502
503 if (mtd->writesize > 512) {
504 nand_fcr0 =
505 (NAND_CMD_SEQIN << IFC_NAND_FCR0_CMD0_SHIFT) |
Prabhakar Kushwaha4af98742013-10-03 11:36:41 +0530506 (NAND_CMD_STATUS << IFC_NAND_FCR0_CMD1_SHIFT) |
507 (NAND_CMD_PAGEPROG << IFC_NAND_FCR0_CMD2_SHIFT);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530508
Kim Phillips0c69fb02013-01-11 16:23:59 -0600509 iowrite32be(
Prabhakar Kushwaha4af98742013-10-03 11:36:41 +0530510 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
511 (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
512 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
513 (IFC_FIR_OP_WBCD << IFC_NAND_FIR0_OP3_SHIFT) |
514 (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP4_SHIFT),
515 &ifc->ifc_nand.nand_fir0);
516 iowrite32be(
517 (IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT) |
518 (IFC_FIR_OP_RDSTAT <<
519 IFC_NAND_FIR1_OP6_SHIFT) |
520 (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP7_SHIFT),
521 &ifc->ifc_nand.nand_fir1);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530522 } else {
523 nand_fcr0 = ((NAND_CMD_PAGEPROG <<
524 IFC_NAND_FCR0_CMD1_SHIFT) |
525 (NAND_CMD_SEQIN <<
Prabhakar Kushwaha4af98742013-10-03 11:36:41 +0530526 IFC_NAND_FCR0_CMD2_SHIFT) |
527 (NAND_CMD_STATUS <<
528 IFC_NAND_FCR0_CMD3_SHIFT));
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530529
Kim Phillips0c69fb02013-01-11 16:23:59 -0600530 iowrite32be(
531 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
532 (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP1_SHIFT) |
533 (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP2_SHIFT) |
534 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP3_SHIFT) |
535 (IFC_FIR_OP_WBCD << IFC_NAND_FIR0_OP4_SHIFT),
536 &ifc->ifc_nand.nand_fir0);
Prabhakar Kushwaha4af98742013-10-03 11:36:41 +0530537 iowrite32be(
538 (IFC_FIR_OP_CMD1 << IFC_NAND_FIR1_OP5_SHIFT) |
539 (IFC_FIR_OP_CW3 << IFC_NAND_FIR1_OP6_SHIFT) |
540 (IFC_FIR_OP_RDSTAT <<
541 IFC_NAND_FIR1_OP7_SHIFT) |
542 (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP8_SHIFT),
543 &ifc->ifc_nand.nand_fir1);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530544
545 if (column >= mtd->writesize)
546 nand_fcr0 |=
547 NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT;
548 else
549 nand_fcr0 |=
550 NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
551 }
552
553 if (column >= mtd->writesize) {
554 /* OOB area --> READOOB */
555 column -= mtd->writesize;
556 ifc_nand_ctrl->oob = 1;
557 }
Kim Phillips0c69fb02013-01-11 16:23:59 -0600558 iowrite32be(nand_fcr0, &ifc->ifc_nand.nand_fcr0);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530559 set_addr(mtd, column, page_addr, ifc_nand_ctrl->oob);
560 return;
561 }
562
563 /* PAGEPROG reuses all of the setup from SEQIN and adds the length */
564 case NAND_CMD_PAGEPROG: {
565 if (ifc_nand_ctrl->oob) {
Kim Phillips0c69fb02013-01-11 16:23:59 -0600566 iowrite32be(ifc_nand_ctrl->index -
567 ifc_nand_ctrl->column,
568 &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530569 } else {
Kim Phillips0c69fb02013-01-11 16:23:59 -0600570 iowrite32be(0, &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530571 }
572
573 fsl_ifc_run_command(mtd);
574 return;
575 }
576
577 case NAND_CMD_STATUS:
Kim Phillips0c69fb02013-01-11 16:23:59 -0600578 iowrite32be((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
579 (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP1_SHIFT),
580 &ifc->ifc_nand.nand_fir0);
581 iowrite32be(NAND_CMD_STATUS << IFC_NAND_FCR0_CMD0_SHIFT,
582 &ifc->ifc_nand.nand_fcr0);
583 iowrite32be(1, &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530584 set_addr(mtd, 0, 0, 0);
585 ifc_nand_ctrl->read_bytes = 1;
586
587 fsl_ifc_run_command(mtd);
588
589 /*
590 * The chip always seems to report that it is
591 * write-protected, even when it is not.
592 */
Joe Schultz21704802014-04-07 11:58:18 -0500593 if (chip->options & NAND_BUSWIDTH_16)
594 setbits16(ifc_nand_ctrl->addr, NAND_STATUS_WP);
595 else
596 setbits8(ifc_nand_ctrl->addr, NAND_STATUS_WP);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530597 return;
598
599 case NAND_CMD_RESET:
Kim Phillips0c69fb02013-01-11 16:23:59 -0600600 iowrite32be(IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT,
601 &ifc->ifc_nand.nand_fir0);
602 iowrite32be(NAND_CMD_RESET << IFC_NAND_FCR0_CMD0_SHIFT,
603 &ifc->ifc_nand.nand_fcr0);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530604 fsl_ifc_run_command(mtd);
605 return;
606
607 default:
608 dev_err(priv->dev, "%s: error, unsupported command 0x%x.\n",
609 __func__, command);
610 }
611}
612
613static void fsl_ifc_select_chip(struct mtd_info *mtd, int chip)
614{
615 /* The hardware does not seem to support multiple
616 * chips per bank.
617 */
618}
619
620/*
621 * Write buf to the IFC NAND Controller Data Buffer
622 */
623static void fsl_ifc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
624{
625 struct nand_chip *chip = mtd->priv;
626 struct fsl_ifc_mtd *priv = chip->priv;
627 unsigned int bufsize = mtd->writesize + mtd->oobsize;
628
629 if (len <= 0) {
630 dev_err(priv->dev, "%s: len %d bytes", __func__, len);
631 return;
632 }
633
634 if ((unsigned int)len > bufsize - ifc_nand_ctrl->index) {
635 dev_err(priv->dev,
636 "%s: beyond end of buffer (%d requested, %u available)\n",
637 __func__, len, bufsize - ifc_nand_ctrl->index);
638 len = bufsize - ifc_nand_ctrl->index;
639 }
640
Aaron Sierra44544062014-04-07 11:58:12 -0500641 memcpy_toio(ifc_nand_ctrl->addr + ifc_nand_ctrl->index, buf, len);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530642 ifc_nand_ctrl->index += len;
643}
644
645/*
646 * Read a byte from either the IFC hardware buffer
647 * read function for 8-bit buswidth
648 */
649static uint8_t fsl_ifc_read_byte(struct mtd_info *mtd)
650{
651 struct nand_chip *chip = mtd->priv;
652 struct fsl_ifc_mtd *priv = chip->priv;
Aaron Sierra44544062014-04-07 11:58:12 -0500653 unsigned int offset;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530654
655 /*
656 * If there are still bytes in the IFC buffer, then use the
657 * next byte.
658 */
Aaron Sierra44544062014-04-07 11:58:12 -0500659 if (ifc_nand_ctrl->index < ifc_nand_ctrl->read_bytes) {
660 offset = ifc_nand_ctrl->index++;
661 return in_8(ifc_nand_ctrl->addr + offset);
662 }
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530663
664 dev_err(priv->dev, "%s: beyond end of buffer\n", __func__);
665 return ERR_BYTE;
666}
667
668/*
669 * Read two bytes from the IFC hardware buffer
670 * read function for 16-bit buswith
671 */
672static uint8_t fsl_ifc_read_byte16(struct mtd_info *mtd)
673{
674 struct nand_chip *chip = mtd->priv;
675 struct fsl_ifc_mtd *priv = chip->priv;
676 uint16_t data;
677
678 /*
679 * If there are still bytes in the IFC buffer, then use the
680 * next byte.
681 */
682 if (ifc_nand_ctrl->index < ifc_nand_ctrl->read_bytes) {
Aaron Sierra44544062014-04-07 11:58:12 -0500683 data = in_be16(ifc_nand_ctrl->addr + ifc_nand_ctrl->index);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530684 ifc_nand_ctrl->index += 2;
685 return (uint8_t) data;
686 }
687
688 dev_err(priv->dev, "%s: beyond end of buffer\n", __func__);
689 return ERR_BYTE;
690}
691
692/*
693 * Read from the IFC Controller Data Buffer
694 */
695static void fsl_ifc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
696{
697 struct nand_chip *chip = mtd->priv;
698 struct fsl_ifc_mtd *priv = chip->priv;
699 int avail;
700
701 if (len < 0) {
702 dev_err(priv->dev, "%s: len %d bytes", __func__, len);
703 return;
704 }
705
706 avail = min((unsigned int)len,
707 ifc_nand_ctrl->read_bytes - ifc_nand_ctrl->index);
Aaron Sierra44544062014-04-07 11:58:12 -0500708 memcpy_fromio(buf, ifc_nand_ctrl->addr + ifc_nand_ctrl->index, avail);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530709 ifc_nand_ctrl->index += avail;
710
711 if (len > avail)
712 dev_err(priv->dev,
713 "%s: beyond end of buffer (%d requested, %d available)\n",
714 __func__, len, avail);
715}
716
717/*
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530718 * This function is called after Program and Erase Operations to
719 * check for success or failure.
720 */
721static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
722{
723 struct fsl_ifc_mtd *priv = chip->priv;
724 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
725 struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
726 u32 nand_fsr;
727
728 /* Use READ_STATUS command, but wait for the device to be ready */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600729 iowrite32be((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
730 (IFC_FIR_OP_RDSTAT << IFC_NAND_FIR0_OP1_SHIFT),
731 &ifc->ifc_nand.nand_fir0);
732 iowrite32be(NAND_CMD_STATUS << IFC_NAND_FCR0_CMD0_SHIFT,
733 &ifc->ifc_nand.nand_fcr0);
734 iowrite32be(1, &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530735 set_addr(mtd, 0, 0, 0);
736 ifc_nand_ctrl->read_bytes = 1;
737
738 fsl_ifc_run_command(mtd);
739
Kim Phillips0c69fb02013-01-11 16:23:59 -0600740 nand_fsr = ioread32be(&ifc->ifc_nand.nand_fsr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530741
742 /*
743 * The chip always seems to report that it is
744 * write-protected, even when it is not.
745 */
746 return nand_fsr | NAND_STATUS_WP;
747}
748
Brian Norris1fbb9382012-05-02 10:14:55 -0700749static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
750 uint8_t *buf, int oob_required, int page)
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530751{
752 struct fsl_ifc_mtd *priv = chip->priv;
753 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
Mike Dunn3f91e942012-04-25 12:06:09 -0700754 struct fsl_ifc_nand_ctrl *nctrl = ifc_nand_ctrl;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530755
756 fsl_ifc_read_buf(mtd, buf, mtd->writesize);
Brian Norrisa6976cd2012-05-02 10:15:01 -0700757 if (oob_required)
758 fsl_ifc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530759
760 if (ctrl->nand_stat & IFC_NAND_EVTER_STAT_ECCER)
761 dev_err(priv->dev, "NAND Flash ECC Uncorrectable Error\n");
762
763 if (ctrl->nand_stat != IFC_NAND_EVTER_STAT_OPC)
764 mtd->ecc_stats.failed++;
765
Mike Dunn3f91e942012-04-25 12:06:09 -0700766 return nctrl->max_bitflips;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530767}
768
769/* ECC will be calculated automatically, and errors will be detected in
770 * waitfunc.
771 */
Josh Wufdbad98d2012-06-25 18:07:45 +0800772static int fsl_ifc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
Brian Norris1fbb9382012-05-02 10:14:55 -0700773 const uint8_t *buf, int oob_required)
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530774{
775 fsl_ifc_write_buf(mtd, buf, mtd->writesize);
776 fsl_ifc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
Josh Wufdbad98d2012-06-25 18:07:45 +0800777
778 return 0;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530779}
780
781static int fsl_ifc_chip_init_tail(struct mtd_info *mtd)
782{
783 struct nand_chip *chip = mtd->priv;
784 struct fsl_ifc_mtd *priv = chip->priv;
785
786 dev_dbg(priv->dev, "%s: nand->numchips = %d\n", __func__,
787 chip->numchips);
788 dev_dbg(priv->dev, "%s: nand->chipsize = %lld\n", __func__,
789 chip->chipsize);
790 dev_dbg(priv->dev, "%s: nand->pagemask = %8x\n", __func__,
791 chip->pagemask);
792 dev_dbg(priv->dev, "%s: nand->chip_delay = %d\n", __func__,
793 chip->chip_delay);
794 dev_dbg(priv->dev, "%s: nand->badblockpos = %d\n", __func__,
795 chip->badblockpos);
796 dev_dbg(priv->dev, "%s: nand->chip_shift = %d\n", __func__,
797 chip->chip_shift);
798 dev_dbg(priv->dev, "%s: nand->page_shift = %d\n", __func__,
799 chip->page_shift);
800 dev_dbg(priv->dev, "%s: nand->phys_erase_shift = %d\n", __func__,
801 chip->phys_erase_shift);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530802 dev_dbg(priv->dev, "%s: nand->ecc.mode = %d\n", __func__,
803 chip->ecc.mode);
804 dev_dbg(priv->dev, "%s: nand->ecc.steps = %d\n", __func__,
805 chip->ecc.steps);
806 dev_dbg(priv->dev, "%s: nand->ecc.bytes = %d\n", __func__,
807 chip->ecc.bytes);
808 dev_dbg(priv->dev, "%s: nand->ecc.total = %d\n", __func__,
809 chip->ecc.total);
810 dev_dbg(priv->dev, "%s: nand->ecc.layout = %p\n", __func__,
811 chip->ecc.layout);
812 dev_dbg(priv->dev, "%s: mtd->flags = %08x\n", __func__, mtd->flags);
813 dev_dbg(priv->dev, "%s: mtd->size = %lld\n", __func__, mtd->size);
814 dev_dbg(priv->dev, "%s: mtd->erasesize = %d\n", __func__,
815 mtd->erasesize);
816 dev_dbg(priv->dev, "%s: mtd->writesize = %d\n", __func__,
817 mtd->writesize);
818 dev_dbg(priv->dev, "%s: mtd->oobsize = %d\n", __func__,
819 mtd->oobsize);
820
821 return 0;
822}
823
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530824static void fsl_ifc_sram_init(struct fsl_ifc_mtd *priv)
825{
826 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
827 struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
828 uint32_t csor = 0, csor_8k = 0, csor_ext = 0;
829 uint32_t cs = priv->bank;
830
831 /* Save CSOR and CSOR_ext */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600832 csor = ioread32be(&ifc->csor_cs[cs].csor);
833 csor_ext = ioread32be(&ifc->csor_cs[cs].csor_ext);
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530834
835 /* chage PageSize 8K and SpareSize 1K*/
836 csor_8k = (csor & ~(CSOR_NAND_PGS_MASK)) | 0x0018C000;
Kim Phillips0c69fb02013-01-11 16:23:59 -0600837 iowrite32be(csor_8k, &ifc->csor_cs[cs].csor);
838 iowrite32be(0x0000400, &ifc->csor_cs[cs].csor_ext);
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530839
840 /* READID */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600841 iowrite32be((IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
842 (IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) |
843 (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT),
844 &ifc->ifc_nand.nand_fir0);
845 iowrite32be(NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT,
846 &ifc->ifc_nand.nand_fcr0);
847 iowrite32be(0x0, &ifc->ifc_nand.row3);
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530848
Kim Phillips0c69fb02013-01-11 16:23:59 -0600849 iowrite32be(0x0, &ifc->ifc_nand.nand_fbcr);
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530850
851 /* Program ROW0/COL0 */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600852 iowrite32be(0x0, &ifc->ifc_nand.row0);
853 iowrite32be(0x0, &ifc->ifc_nand.col0);
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530854
855 /* set the chip select for NAND Transaction */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600856 iowrite32be(cs << IFC_NAND_CSEL_SHIFT, &ifc->ifc_nand.nand_csel);
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530857
858 /* start read seq */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600859 iowrite32be(IFC_NAND_SEQ_STRT_FIR_STRT, &ifc->ifc_nand.nandseq_strt);
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530860
861 /* wait for command complete flag or timeout */
862 wait_event_timeout(ctrl->nand_wait, ctrl->nand_stat,
Nicholas Mc Guire95d70662015-03-13 07:23:47 -0400863 msecs_to_jiffies(IFC_TIMEOUT_MSECS));
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530864
865 if (ctrl->nand_stat != IFC_NAND_EVTER_STAT_OPC)
866 printk(KERN_ERR "fsl-ifc: Failed to Initialise SRAM\n");
867
868 /* Restore CSOR and CSOR_ext */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600869 iowrite32be(csor, &ifc->csor_cs[cs].csor);
870 iowrite32be(csor_ext, &ifc->csor_cs[cs].csor_ext);
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530871}
872
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530873static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)
874{
875 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
876 struct fsl_ifc_regs __iomem *ifc = ctrl->regs;
877 struct nand_chip *chip = &priv->chip;
878 struct nand_ecclayout *layout;
Aaron Sierra09691662014-08-26 18:18:33 -0500879 u32 csor;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530880
881 /* Fill in fsl_ifc_mtd structure */
882 priv->mtd.priv = chip;
883 priv->mtd.owner = THIS_MODULE;
884
885 /* fill in nand_chip structure */
886 /* set up function call table */
Kim Phillips0c69fb02013-01-11 16:23:59 -0600887 if ((ioread32be(&ifc->cspr_cs[priv->bank].cspr)) & CSPR_PORT_SIZE_16)
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530888 chip->read_byte = fsl_ifc_read_byte16;
889 else
890 chip->read_byte = fsl_ifc_read_byte;
891
892 chip->write_buf = fsl_ifc_write_buf;
893 chip->read_buf = fsl_ifc_read_buf;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530894 chip->select_chip = fsl_ifc_select_chip;
895 chip->cmdfunc = fsl_ifc_cmdfunc;
896 chip->waitfunc = fsl_ifc_wait;
897
898 chip->bbt_td = &bbt_main_descr;
899 chip->bbt_md = &bbt_mirror_descr;
900
Kim Phillips0c69fb02013-01-11 16:23:59 -0600901 iowrite32be(0x0, &ifc->ifc_nand.ncfgr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530902
903 /* set up nand options */
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530904 chip->bbt_options = NAND_BBT_USE_FLASH;
Scott Wood20cd0002013-04-10 17:34:37 -0500905 chip->options = NAND_NO_SUBPAGE_WRITE;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530906
Kim Phillips0c69fb02013-01-11 16:23:59 -0600907 if (ioread32be(&ifc->cspr_cs[priv->bank].cspr) & CSPR_PORT_SIZE_16) {
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530908 chip->read_byte = fsl_ifc_read_byte16;
909 chip->options |= NAND_BUSWIDTH_16;
910 } else {
911 chip->read_byte = fsl_ifc_read_byte;
912 }
913
914 chip->controller = &ifc_nand_ctrl->controller;
915 chip->priv = priv;
916
917 chip->ecc.read_page = fsl_ifc_read_page;
918 chip->ecc.write_page = fsl_ifc_write_page;
919
Kim Phillips0c69fb02013-01-11 16:23:59 -0600920 csor = ioread32be(&ifc->csor_cs[priv->bank].csor);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530921
922 /* Hardware generates ECC per 512 Bytes */
923 chip->ecc.size = 512;
924 chip->ecc.bytes = 8;
Mike Dunn44df4d12012-04-25 12:06:06 -0700925 chip->ecc.strength = 4;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530926
927 switch (csor & CSOR_NAND_PGS_MASK) {
928 case CSOR_NAND_PGS_512:
929 if (chip->options & NAND_BUSWIDTH_16) {
930 layout = &oob_512_16bit_ecc4;
931 } else {
932 layout = &oob_512_8bit_ecc4;
933
934 /* Avoid conflict with bad block marker */
935 bbt_main_descr.offs = 0;
936 bbt_mirror_descr.offs = 0;
937 }
938
939 priv->bufnum_mask = 15;
940 break;
941
942 case CSOR_NAND_PGS_2K:
943 layout = &oob_2048_ecc4;
944 priv->bufnum_mask = 3;
945 break;
946
947 case CSOR_NAND_PGS_4K:
948 if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
949 CSOR_NAND_ECC_MODE_4) {
950 layout = &oob_4096_ecc4;
951 } else {
952 layout = &oob_4096_ecc8;
953 chip->ecc.bytes = 16;
Prabhakar Kushwahaebff90b2013-09-24 16:41:23 +0530954 chip->ecc.strength = 8;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530955 }
956
957 priv->bufnum_mask = 1;
958 break;
959
Prabhakar Kushwahaebff90b2013-09-24 16:41:23 +0530960 case CSOR_NAND_PGS_8K:
961 if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
962 CSOR_NAND_ECC_MODE_4) {
963 layout = &oob_8192_ecc4;
964 } else {
965 layout = &oob_8192_ecc8;
966 chip->ecc.bytes = 16;
967 chip->ecc.strength = 8;
968 }
969
970 priv->bufnum_mask = 0;
971 break;
972
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530973 default:
974 dev_err(priv->dev, "bad csor %#x: bad page size\n", csor);
975 return -ENODEV;
976 }
977
978 /* Must also set CSOR_NAND_ECC_ENC_EN if DEC_EN set */
979 if (csor & CSOR_NAND_ECC_DEC_EN) {
980 chip->ecc.mode = NAND_ECC_HW;
981 chip->ecc.layout = layout;
982 } else {
983 chip->ecc.mode = NAND_ECC_SOFT;
984 }
985
Aaron Sierra09691662014-08-26 18:18:33 -0500986 if (ctrl->version == FSL_IFC_VERSION_1_1_0)
Prabhakar Kushwaha10bfa762012-09-13 14:24:49 +0530987 fsl_ifc_sram_init(priv);
988
Prabhakar Kushwaha82771882012-03-15 11:04:23 +0530989 return 0;
990}
991
992static int fsl_ifc_chip_remove(struct fsl_ifc_mtd *priv)
993{
994 nand_release(&priv->mtd);
995
996 kfree(priv->mtd.name);
997
998 if (priv->vbase)
999 iounmap(priv->vbase);
1000
1001 ifc_nand_ctrl->chips[priv->bank] = NULL;
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301002
1003 return 0;
1004}
1005
1006static int match_bank(struct fsl_ifc_regs __iomem *ifc, int bank,
1007 phys_addr_t addr)
1008{
Kim Phillips0c69fb02013-01-11 16:23:59 -06001009 u32 cspr = ioread32be(&ifc->cspr_cs[bank].cspr);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301010
1011 if (!(cspr & CSPR_V))
1012 return 0;
1013 if ((cspr & CSPR_MSEL) != CSPR_MSEL_NAND)
1014 return 0;
1015
1016 return (cspr & CSPR_BA) == convert_ifc_address(addr);
1017}
1018
1019static DEFINE_MUTEX(fsl_ifc_nand_mutex);
1020
Bill Pemberton06f25512012-11-19 13:23:07 -05001021static int fsl_ifc_nand_probe(struct platform_device *dev)
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301022{
1023 struct fsl_ifc_regs __iomem *ifc;
1024 struct fsl_ifc_mtd *priv;
1025 struct resource res;
1026 static const char *part_probe_types[]
1027 = { "cmdlinepart", "RedBoot", "ofpart", NULL };
1028 int ret;
1029 int bank;
1030 struct device_node *node = dev->dev.of_node;
1031 struct mtd_part_parser_data ppdata;
1032
1033 ppdata.of_node = dev->dev.of_node;
1034 if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->regs)
1035 return -ENODEV;
1036 ifc = fsl_ifc_ctrl_dev->regs;
1037
1038 /* get, allocate and map the memory resource */
1039 ret = of_address_to_resource(node, 0, &res);
1040 if (ret) {
1041 dev_err(&dev->dev, "%s: failed to get resource\n", __func__);
1042 return ret;
1043 }
1044
1045 /* find which chip select it is connected to */
Aaron Sierra09691662014-08-26 18:18:33 -05001046 for (bank = 0; bank < fsl_ifc_ctrl_dev->banks; bank++) {
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301047 if (match_bank(ifc, bank, res.start))
1048 break;
1049 }
1050
Aaron Sierra09691662014-08-26 18:18:33 -05001051 if (bank >= fsl_ifc_ctrl_dev->banks) {
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301052 dev_err(&dev->dev, "%s: address did not match any chip selects\n",
1053 __func__);
1054 return -ENODEV;
1055 }
1056
1057 priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL);
1058 if (!priv)
1059 return -ENOMEM;
1060
1061 mutex_lock(&fsl_ifc_nand_mutex);
1062 if (!fsl_ifc_ctrl_dev->nand) {
1063 ifc_nand_ctrl = kzalloc(sizeof(*ifc_nand_ctrl), GFP_KERNEL);
1064 if (!ifc_nand_ctrl) {
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301065 mutex_unlock(&fsl_ifc_nand_mutex);
1066 return -ENOMEM;
1067 }
1068
1069 ifc_nand_ctrl->read_bytes = 0;
1070 ifc_nand_ctrl->index = 0;
1071 ifc_nand_ctrl->addr = NULL;
1072 fsl_ifc_ctrl_dev->nand = ifc_nand_ctrl;
1073
1074 spin_lock_init(&ifc_nand_ctrl->controller.lock);
1075 init_waitqueue_head(&ifc_nand_ctrl->controller.wq);
1076 } else {
1077 ifc_nand_ctrl = fsl_ifc_ctrl_dev->nand;
1078 }
1079 mutex_unlock(&fsl_ifc_nand_mutex);
1080
1081 ifc_nand_ctrl->chips[bank] = priv;
1082 priv->bank = bank;
1083 priv->ctrl = fsl_ifc_ctrl_dev;
1084 priv->dev = &dev->dev;
1085
1086 priv->vbase = ioremap(res.start, resource_size(&res));
1087 if (!priv->vbase) {
1088 dev_err(priv->dev, "%s: failed to map chip region\n", __func__);
1089 ret = -ENOMEM;
1090 goto err;
1091 }
1092
1093 dev_set_drvdata(priv->dev, priv);
1094
Kim Phillips0c69fb02013-01-11 16:23:59 -06001095 iowrite32be(IFC_NAND_EVTER_EN_OPC_EN |
1096 IFC_NAND_EVTER_EN_FTOER_EN |
1097 IFC_NAND_EVTER_EN_WPER_EN,
1098 &ifc->ifc_nand.nand_evter_en);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301099
1100 /* enable NAND Machine Interrupts */
Kim Phillips0c69fb02013-01-11 16:23:59 -06001101 iowrite32be(IFC_NAND_EVTER_INTR_OPCIR_EN |
1102 IFC_NAND_EVTER_INTR_FTOERIR_EN |
1103 IFC_NAND_EVTER_INTR_WPERIR_EN,
1104 &ifc->ifc_nand.nand_evter_intr_en);
Prabhakar Kushwaha2fec386a92013-12-28 12:17:35 +05301105 priv->mtd.name = kasprintf(GFP_KERNEL, "%llx.flash", (u64)res.start);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301106 if (!priv->mtd.name) {
1107 ret = -ENOMEM;
1108 goto err;
1109 }
1110
1111 ret = fsl_ifc_chip_init(priv);
1112 if (ret)
1113 goto err;
1114
1115 ret = nand_scan_ident(&priv->mtd, 1, NULL);
1116 if (ret)
1117 goto err;
1118
1119 ret = fsl_ifc_chip_init_tail(&priv->mtd);
1120 if (ret)
1121 goto err;
1122
1123 ret = nand_scan_tail(&priv->mtd);
1124 if (ret)
1125 goto err;
1126
1127 /* First look for RedBoot table or partitions on the command
1128 * line, these take precedence over device tree information */
1129 mtd_device_parse_register(&priv->mtd, part_probe_types, &ppdata,
1130 NULL, 0);
1131
1132 dev_info(priv->dev, "IFC NAND device at 0x%llx, bank %d\n",
1133 (unsigned long long)res.start, priv->bank);
1134 return 0;
1135
1136err:
1137 fsl_ifc_chip_remove(priv);
1138 return ret;
1139}
1140
1141static int fsl_ifc_nand_remove(struct platform_device *dev)
1142{
1143 struct fsl_ifc_mtd *priv = dev_get_drvdata(&dev->dev);
1144
1145 fsl_ifc_chip_remove(priv);
1146
1147 mutex_lock(&fsl_ifc_nand_mutex);
1148 ifc_nand_ctrl->counter--;
1149 if (!ifc_nand_ctrl->counter) {
1150 fsl_ifc_ctrl_dev->nand = NULL;
1151 kfree(ifc_nand_ctrl);
1152 }
1153 mutex_unlock(&fsl_ifc_nand_mutex);
1154
1155 return 0;
1156}
1157
1158static const struct of_device_id fsl_ifc_nand_match[] = {
1159 {
1160 .compatible = "fsl,ifc-nand",
1161 },
1162 {}
1163};
1164
1165static struct platform_driver fsl_ifc_nand_driver = {
1166 .driver = {
1167 .name = "fsl,ifc-nand",
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301168 .of_match_table = fsl_ifc_nand_match,
1169 },
1170 .probe = fsl_ifc_nand_probe,
1171 .remove = fsl_ifc_nand_remove,
1172};
1173
Sachin Kamatc69ad0e2013-10-08 15:08:20 +05301174module_platform_driver(fsl_ifc_nand_driver);
Prabhakar Kushwaha82771882012-03-15 11:04:23 +05301175
1176MODULE_LICENSE("GPL");
1177MODULE_AUTHOR("Freescale");
1178MODULE_DESCRIPTION("Freescale Integrated Flash Controller MTD NAND driver");