mtd: mxc_nand: Use managed resources
[deliverable/linux.git] / drivers / mtd / nand / mxc_nand.c
CommitLineData
34f6e157
SH
1/*
2 * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
3 * Copyright 2008 Sascha Hauer, kernel@pengutronix.de
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
17 * MA 02110-1301, USA.
18 */
19
20#include <linux/delay.h>
21#include <linux/slab.h>
22#include <linux/init.h>
23#include <linux/module.h>
24#include <linux/mtd/mtd.h>
25#include <linux/mtd/nand.h>
26#include <linux/mtd/partitions.h>
27#include <linux/interrupt.h>
28#include <linux/device.h>
29#include <linux/platform_device.h>
30#include <linux/clk.h>
31#include <linux/err.h>
32#include <linux/io.h>
63f1474c
SH
33#include <linux/irq.h>
34#include <linux/completion.h>
6436356b
UKK
35#include <linux/of_device.h>
36#include <linux/of_mtd.h>
34f6e157
SH
37
38#include <asm/mach/flash.h>
39#include <mach/mxc_nand.h>
9467114e 40#include <mach/hardware.h>
34f6e157
SH
41
42#define DRIVER_NAME "mxc_nand"
43
9467114e 44#define nfc_is_v21() (cpu_is_mx25() || cpu_is_mx35())
a47bfd2e 45#define nfc_is_v1() (cpu_is_mx31() || cpu_is_mx27() || cpu_is_mx21())
c97926dd 46#define nfc_is_v3_2() (cpu_is_mx51() || cpu_is_mx53())
71ec5155 47#define nfc_is_v3() nfc_is_v3_2()
9467114e 48
34f6e157 49/* Addresses for NFC registers */
1bc99180
SH
50#define NFC_V1_V2_BUF_SIZE (host->regs + 0x00)
51#define NFC_V1_V2_BUF_ADDR (host->regs + 0x04)
52#define NFC_V1_V2_FLASH_ADDR (host->regs + 0x06)
53#define NFC_V1_V2_FLASH_CMD (host->regs + 0x08)
54#define NFC_V1_V2_CONFIG (host->regs + 0x0a)
55#define NFC_V1_V2_ECC_STATUS_RESULT (host->regs + 0x0c)
56#define NFC_V1_V2_RSLTMAIN_AREA (host->regs + 0x0e)
57#define NFC_V1_V2_RSLTSPARE_AREA (host->regs + 0x10)
58#define NFC_V1_V2_WRPROT (host->regs + 0x12)
59#define NFC_V1_UNLOCKSTART_BLKADDR (host->regs + 0x14)
60#define NFC_V1_UNLOCKEND_BLKADDR (host->regs + 0x16)
d178e3e8
BS
61#define NFC_V21_UNLOCKSTART_BLKADDR0 (host->regs + 0x20)
62#define NFC_V21_UNLOCKSTART_BLKADDR1 (host->regs + 0x24)
63#define NFC_V21_UNLOCKSTART_BLKADDR2 (host->regs + 0x28)
64#define NFC_V21_UNLOCKSTART_BLKADDR3 (host->regs + 0x2c)
65#define NFC_V21_UNLOCKEND_BLKADDR0 (host->regs + 0x22)
66#define NFC_V21_UNLOCKEND_BLKADDR1 (host->regs + 0x26)
67#define NFC_V21_UNLOCKEND_BLKADDR2 (host->regs + 0x2a)
68#define NFC_V21_UNLOCKEND_BLKADDR3 (host->regs + 0x2e)
1bc99180
SH
69#define NFC_V1_V2_NF_WRPRST (host->regs + 0x18)
70#define NFC_V1_V2_CONFIG1 (host->regs + 0x1a)
71#define NFC_V1_V2_CONFIG2 (host->regs + 0x1c)
72
6e85dfdc 73#define NFC_V2_CONFIG1_ECC_MODE_4 (1 << 0)
1bc99180
SH
74#define NFC_V1_V2_CONFIG1_SP_EN (1 << 2)
75#define NFC_V1_V2_CONFIG1_ECC_EN (1 << 3)
76#define NFC_V1_V2_CONFIG1_INT_MSK (1 << 4)
77#define NFC_V1_V2_CONFIG1_BIG (1 << 5)
78#define NFC_V1_V2_CONFIG1_RST (1 << 6)
79#define NFC_V1_V2_CONFIG1_CE (1 << 7)
b8db2f51
SH
80#define NFC_V2_CONFIG1_ONE_CYCLE (1 << 8)
81#define NFC_V2_CONFIG1_PPB(x) (((x) & 0x3) << 9)
82#define NFC_V2_CONFIG1_FP_INT (1 << 11)
1bc99180
SH
83
84#define NFC_V1_V2_CONFIG2_INT (1 << 15)
85
86/*
87 * Operation modes for the NFC. Valid for v1, v2 and v3
88 * type controllers.
89 */
90#define NFC_CMD (1 << 0)
91#define NFC_ADDR (1 << 1)
92#define NFC_INPUT (1 << 2)
93#define NFC_OUTPUT (1 << 3)
94#define NFC_ID (1 << 4)
95#define NFC_STATUS (1 << 5)
34f6e157 96
71ec5155
SH
97#define NFC_V3_FLASH_CMD (host->regs_axi + 0x00)
98#define NFC_V3_FLASH_ADDR0 (host->regs_axi + 0x04)
99
100#define NFC_V3_CONFIG1 (host->regs_axi + 0x34)
101#define NFC_V3_CONFIG1_SP_EN (1 << 0)
102#define NFC_V3_CONFIG1_RBA(x) (((x) & 0x7 ) << 4)
103
104#define NFC_V3_ECC_STATUS_RESULT (host->regs_axi + 0x38)
105
106#define NFC_V3_LAUNCH (host->regs_axi + 0x40)
107
108#define NFC_V3_WRPROT (host->regs_ip + 0x0)
109#define NFC_V3_WRPROT_LOCK_TIGHT (1 << 0)
110#define NFC_V3_WRPROT_LOCK (1 << 1)
111#define NFC_V3_WRPROT_UNLOCK (1 << 2)
112#define NFC_V3_WRPROT_BLS_UNLOCK (2 << 6)
113
114#define NFC_V3_WRPROT_UNLOCK_BLK_ADD0 (host->regs_ip + 0x04)
115
116#define NFC_V3_CONFIG2 (host->regs_ip + 0x24)
117#define NFC_V3_CONFIG2_PS_512 (0 << 0)
118#define NFC_V3_CONFIG2_PS_2048 (1 << 0)
119#define NFC_V3_CONFIG2_PS_4096 (2 << 0)
120#define NFC_V3_CONFIG2_ONE_CYCLE (1 << 2)
121#define NFC_V3_CONFIG2_ECC_EN (1 << 3)
122#define NFC_V3_CONFIG2_2CMD_PHASES (1 << 4)
123#define NFC_V3_CONFIG2_NUM_ADDR_PHASE0 (1 << 5)
124#define NFC_V3_CONFIG2_ECC_MODE_8 (1 << 6)
125#define NFC_V3_CONFIG2_PPB(x) (((x) & 0x3) << 7)
126#define NFC_V3_CONFIG2_NUM_ADDR_PHASE1(x) (((x) & 0x3) << 12)
127#define NFC_V3_CONFIG2_INT_MSK (1 << 15)
128#define NFC_V3_CONFIG2_ST_CMD(x) (((x) & 0xff) << 24)
129#define NFC_V3_CONFIG2_SPAS(x) (((x) & 0xff) << 16)
130
131#define NFC_V3_CONFIG3 (host->regs_ip + 0x28)
132#define NFC_V3_CONFIG3_ADD_OP(x) (((x) & 0x3) << 0)
133#define NFC_V3_CONFIG3_FW8 (1 << 3)
134#define NFC_V3_CONFIG3_SBB(x) (((x) & 0x7) << 8)
135#define NFC_V3_CONFIG3_NUM_OF_DEVICES(x) (((x) & 0x7) << 12)
136#define NFC_V3_CONFIG3_RBB_MODE (1 << 15)
137#define NFC_V3_CONFIG3_NO_SDMA (1 << 20)
138
139#define NFC_V3_IPC (host->regs_ip + 0x2C)
140#define NFC_V3_IPC_CREQ (1 << 0)
141#define NFC_V3_IPC_INT (1 << 31)
142
143#define NFC_V3_DELAY_LINE (host->regs_ip + 0x34)
34f6e157 144
e4303b25
UKK
145struct mxc_nand_host;
146
147struct mxc_nand_devtype_data {
148 void (*preset)(struct mtd_info *);
149 void (*send_cmd)(struct mxc_nand_host *, uint16_t, int);
150 void (*send_addr)(struct mxc_nand_host *, uint16_t, int);
151 void (*send_page)(struct mtd_info *, unsigned int);
152 void (*send_read_id)(struct mxc_nand_host *);
153 uint16_t (*get_dev_status)(struct mxc_nand_host *);
154 int (*check_int)(struct mxc_nand_host *);
155 void (*irq_control)(struct mxc_nand_host *, int);
6d38af25 156 u32 (*get_ecc_status)(struct mxc_nand_host *);
6dcdf99d 157 struct nand_ecclayout *ecclayout_512, *ecclayout_2k, *ecclayout_4k;
5e05a2d6 158 void (*select_chip)(struct mtd_info *mtd, int chip);
69d023be
UKK
159 int (*correct_data)(struct mtd_info *mtd, u_char *dat,
160 u_char *read_ecc, u_char *calc_ecc);
f48d0f9a
UKK
161
162 /*
163 * On i.MX21 the CONFIG2:INT bit cannot be read if interrupts are masked
164 * (CONFIG1:INT_MSK is set). To handle this the driver uses
165 * enable_irq/disable_irq_nosync instead of CONFIG1:INT_MSK
166 */
167 int irqpending_quirk;
168 int needs_ip;
169
170 size_t regs_offset;
171 size_t spare0_offset;
172 size_t axi_offset;
173
174 int spare_len;
175 int eccbytes;
176 int eccsize;
e4303b25
UKK
177};
178
34f6e157
SH
179struct mxc_nand_host {
180 struct mtd_info mtd;
181 struct nand_chip nand;
34f6e157
SH
182 struct device *dev;
183
4b6f05e1
UKK
184 void __iomem *spare0;
185 void __iomem *main_area0;
c6de7e1b
SH
186
187 void __iomem *base;
34f6e157 188 void __iomem *regs;
71ec5155
SH
189 void __iomem *regs_axi;
190 void __iomem *regs_ip;
34f6e157 191 int status_request;
34f6e157
SH
192 struct clk *clk;
193 int clk_act;
194 int irq;
94f77e50 195 int eccsize;
d178e3e8 196 int active_cs;
34f6e157 197
63f1474c 198 struct completion op_completion;
34f6e157 199
f8f9608d
SH
200 uint8_t *data_buf;
201 unsigned int buf_start;
5f97304e 202
e4303b25 203 const struct mxc_nand_devtype_data *devtype_data;
6436356b 204 struct mxc_nand_platform_data pdata;
34f6e157
SH
205};
206
34f6e157 207/* OOB placement block for use with hardware ecc generation */
9467114e 208static struct nand_ecclayout nandv1_hw_eccoob_smallpage = {
34f6e157
SH
209 .eccbytes = 5,
210 .eccpos = {6, 7, 8, 9, 10},
8c1fd89a 211 .oobfree = {{0, 5}, {12, 4}, }
bd3fd62e
VB
212};
213
9467114e 214static struct nand_ecclayout nandv1_hw_eccoob_largepage = {
bd3fd62e
VB
215 .eccbytes = 20,
216 .eccpos = {6, 7, 8, 9, 10, 22, 23, 24, 25, 26,
217 38, 39, 40, 41, 42, 54, 55, 56, 57, 58},
218 .oobfree = {{2, 4}, {11, 10}, {27, 10}, {43, 10}, {59, 5}, }
34f6e157
SH
219};
220
9467114e
SH
221/* OOB description for 512 byte pages with 16 byte OOB */
222static struct nand_ecclayout nandv2_hw_eccoob_smallpage = {
223 .eccbytes = 1 * 9,
224 .eccpos = {
225 7, 8, 9, 10, 11, 12, 13, 14, 15
226 },
227 .oobfree = {
228 {.offset = 0, .length = 5}
229 }
230};
231
232/* OOB description for 2048 byte pages with 64 byte OOB */
233static struct nand_ecclayout nandv2_hw_eccoob_largepage = {
234 .eccbytes = 4 * 9,
235 .eccpos = {
236 7, 8, 9, 10, 11, 12, 13, 14, 15,
237 23, 24, 25, 26, 27, 28, 29, 30, 31,
238 39, 40, 41, 42, 43, 44, 45, 46, 47,
239 55, 56, 57, 58, 59, 60, 61, 62, 63
240 },
241 .oobfree = {
242 {.offset = 2, .length = 4},
243 {.offset = 16, .length = 7},
244 {.offset = 32, .length = 7},
245 {.offset = 48, .length = 7}
246 }
247};
248
2c1c5f19
BS
249/* OOB description for 4096 byte pages with 128 byte OOB */
250static struct nand_ecclayout nandv2_hw_eccoob_4k = {
251 .eccbytes = 8 * 9,
252 .eccpos = {
253 7, 8, 9, 10, 11, 12, 13, 14, 15,
254 23, 24, 25, 26, 27, 28, 29, 30, 31,
255 39, 40, 41, 42, 43, 44, 45, 46, 47,
256 55, 56, 57, 58, 59, 60, 61, 62, 63,
257 71, 72, 73, 74, 75, 76, 77, 78, 79,
258 87, 88, 89, 90, 91, 92, 93, 94, 95,
259 103, 104, 105, 106, 107, 108, 109, 110, 111,
260 119, 120, 121, 122, 123, 124, 125, 126, 127,
261 },
262 .oobfree = {
263 {.offset = 2, .length = 4},
264 {.offset = 16, .length = 7},
265 {.offset = 32, .length = 7},
266 {.offset = 48, .length = 7},
267 {.offset = 64, .length = 7},
268 {.offset = 80, .length = 7},
269 {.offset = 96, .length = 7},
270 {.offset = 112, .length = 7},
271 }
272};
273
6436356b 274static const char *part_probes[] = { "RedBoot", "cmdlinepart", "ofpart", NULL };
34f6e157 275
096bcc23
SH
276static void memcpy32_fromio(void *trg, const void __iomem *src, size_t size)
277{
278 int i;
279 u32 *t = trg;
280 const __iomem u32 *s = src;
281
282 for (i = 0; i < (size >> 2); i++)
283 *t++ = __raw_readl(s++);
284}
285
286static void memcpy32_toio(void __iomem *trg, const void *src, int size)
287{
288 int i;
289 u32 __iomem *t = trg;
290 const u32 *s = src;
291
292 for (i = 0; i < (size >> 2); i++)
293 __raw_writel(*s++, t++);
294}
295
71ec5155
SH
296static int check_int_v3(struct mxc_nand_host *host)
297{
298 uint32_t tmp;
299
300 tmp = readl(NFC_V3_IPC);
301 if (!(tmp & NFC_V3_IPC_INT))
302 return 0;
303
304 tmp &= ~NFC_V3_IPC_INT;
305 writel(tmp, NFC_V3_IPC);
306
307 return 1;
308}
309
7aaf28ac
SH
310static int check_int_v1_v2(struct mxc_nand_host *host)
311{
312 uint32_t tmp;
313
1bc99180
SH
314 tmp = readw(NFC_V1_V2_CONFIG2);
315 if (!(tmp & NFC_V1_V2_CONFIG2_INT))
7aaf28ac
SH
316 return 0;
317
f48d0f9a 318 if (!host->devtype_data->irqpending_quirk)
63f1474c 319 writew(tmp & ~NFC_V1_V2_CONFIG2_INT, NFC_V1_V2_CONFIG2);
7aaf28ac
SH
320
321 return 1;
322}
323
63f1474c
SH
324static void irq_control_v1_v2(struct mxc_nand_host *host, int activate)
325{
326 uint16_t tmp;
327
328 tmp = readw(NFC_V1_V2_CONFIG1);
329
330 if (activate)
331 tmp &= ~NFC_V1_V2_CONFIG1_INT_MSK;
332 else
333 tmp |= NFC_V1_V2_CONFIG1_INT_MSK;
334
335 writew(tmp, NFC_V1_V2_CONFIG1);
336}
337
338static void irq_control_v3(struct mxc_nand_host *host, int activate)
339{
340 uint32_t tmp;
341
342 tmp = readl(NFC_V3_CONFIG2);
343
344 if (activate)
345 tmp &= ~NFC_V3_CONFIG2_INT_MSK;
346 else
347 tmp |= NFC_V3_CONFIG2_INT_MSK;
348
349 writel(tmp, NFC_V3_CONFIG2);
350}
351
8556958a
UKK
352static void irq_control(struct mxc_nand_host *host, int activate)
353{
f48d0f9a 354 if (host->devtype_data->irqpending_quirk) {
8556958a
UKK
355 if (activate)
356 enable_irq(host->irq);
357 else
358 disable_irq_nosync(host->irq);
359 } else {
e4303b25 360 host->devtype_data->irq_control(host, activate);
8556958a
UKK
361 }
362}
363
6d38af25
UKK
364static u32 get_ecc_status_v1(struct mxc_nand_host *host)
365{
366 return readw(NFC_V1_V2_ECC_STATUS_RESULT);
367}
368
369static u32 get_ecc_status_v2(struct mxc_nand_host *host)
370{
371 return readl(NFC_V1_V2_ECC_STATUS_RESULT);
372}
373
374static u32 get_ecc_status_v3(struct mxc_nand_host *host)
375{
376 return readl(NFC_V3_ECC_STATUS_RESULT);
377}
378
8556958a
UKK
379static irqreturn_t mxc_nfc_irq(int irq, void *dev_id)
380{
381 struct mxc_nand_host *host = dev_id;
382
e4303b25 383 if (!host->devtype_data->check_int(host))
8556958a
UKK
384 return IRQ_NONE;
385
386 irq_control(host, 0);
387
388 complete(&host->op_completion);
389
390 return IRQ_HANDLED;
391}
392
34f6e157
SH
393/* This function polls the NANDFC to wait for the basic operation to
394 * complete by checking the INT bit of config2 register.
395 */
c110eaf4 396static void wait_op_done(struct mxc_nand_host *host, int useirq)
34f6e157 397{
a47bfd2e 398 int max_retries = 8000;
34f6e157
SH
399
400 if (useirq) {
e4303b25 401 if (!host->devtype_data->check_int(host)) {
63f1474c 402 INIT_COMPLETION(host->op_completion);
8556958a 403 irq_control(host, 1);
63f1474c 404 wait_for_completion(&host->op_completion);
34f6e157
SH
405 }
406 } else {
407 while (max_retries-- > 0) {
e4303b25 408 if (host->devtype_data->check_int(host))
34f6e157 409 break;
7aaf28ac 410
34f6e157
SH
411 udelay(1);
412 }
43950a60 413 if (max_retries < 0)
0a32a102 414 pr_debug("%s: INT not set\n", __func__);
34f6e157
SH
415 }
416}
417
71ec5155
SH
418static void send_cmd_v3(struct mxc_nand_host *host, uint16_t cmd, int useirq)
419{
420 /* fill command */
421 writel(cmd, NFC_V3_FLASH_CMD);
422
423 /* send out command */
424 writel(NFC_CMD, NFC_V3_LAUNCH);
425
426 /* Wait for operation to complete */
427 wait_op_done(host, useirq);
428}
429
34f6e157
SH
430/* This function issues the specified command to the NAND device and
431 * waits for completion. */
5f97304e 432static void send_cmd_v1_v2(struct mxc_nand_host *host, uint16_t cmd, int useirq)
34f6e157 433{
289c0522 434 pr_debug("send_cmd(host, 0x%x, %d)\n", cmd, useirq);
34f6e157 435
1bc99180
SH
436 writew(cmd, NFC_V1_V2_FLASH_CMD);
437 writew(NFC_CMD, NFC_V1_V2_CONFIG2);
34f6e157 438
f48d0f9a 439 if (host->devtype_data->irqpending_quirk && (cmd == NAND_CMD_RESET)) {
a47bfd2e
IC
440 int max_retries = 100;
441 /* Reset completion is indicated by NFC_CONFIG2 */
442 /* being set to 0 */
443 while (max_retries-- > 0) {
1bc99180 444 if (readw(NFC_V1_V2_CONFIG2) == 0) {
a47bfd2e
IC
445 break;
446 }
447 udelay(1);
448 }
449 if (max_retries < 0)
0a32a102 450 pr_debug("%s: RESET failed\n", __func__);
a47bfd2e
IC
451 } else {
452 /* Wait for operation to complete */
453 wait_op_done(host, useirq);
454 }
34f6e157
SH
455}
456
71ec5155
SH
457static void send_addr_v3(struct mxc_nand_host *host, uint16_t addr, int islast)
458{
459 /* fill address */
460 writel(addr, NFC_V3_FLASH_ADDR0);
461
462 /* send out address */
463 writel(NFC_ADDR, NFC_V3_LAUNCH);
464
465 wait_op_done(host, 0);
466}
467
34f6e157
SH
468/* This function sends an address (or partial address) to the
469 * NAND device. The address is used to select the source/destination for
470 * a NAND command. */
5f97304e 471static void send_addr_v1_v2(struct mxc_nand_host *host, uint16_t addr, int islast)
34f6e157 472{
289c0522 473 pr_debug("send_addr(host, 0x%x %d)\n", addr, islast);
34f6e157 474
1bc99180
SH
475 writew(addr, NFC_V1_V2_FLASH_ADDR);
476 writew(NFC_ADDR, NFC_V1_V2_CONFIG2);
34f6e157
SH
477
478 /* Wait for operation to complete */
c110eaf4 479 wait_op_done(host, islast);
34f6e157
SH
480}
481
71ec5155
SH
482static void send_page_v3(struct mtd_info *mtd, unsigned int ops)
483{
484 struct nand_chip *nand_chip = mtd->priv;
485 struct mxc_nand_host *host = nand_chip->priv;
486 uint32_t tmp;
487
488 tmp = readl(NFC_V3_CONFIG1);
489 tmp &= ~(7 << 4);
490 writel(tmp, NFC_V3_CONFIG1);
491
492 /* transfer data from NFC ram to nand */
493 writel(ops, NFC_V3_LAUNCH);
494
495 wait_op_done(host, false);
496}
497
6d38af25
UKK
498static void send_page_v2(struct mtd_info *mtd, unsigned int ops)
499{
500 struct nand_chip *nand_chip = mtd->priv;
501 struct mxc_nand_host *host = nand_chip->priv;
502
503 /* NANDFC buffer 0 is used for page read/write */
504 writew(host->active_cs << 4, NFC_V1_V2_BUF_ADDR);
505
506 writew(ops, NFC_V1_V2_CONFIG2);
507
508 /* Wait for operation to complete */
509 wait_op_done(host, true);
510}
511
512static void send_page_v1(struct mtd_info *mtd, unsigned int ops)
34f6e157 513{
2d69c7fa
SH
514 struct nand_chip *nand_chip = mtd->priv;
515 struct mxc_nand_host *host = nand_chip->priv;
c5d23f1b 516 int bufs, i;
34f6e157 517
6d38af25 518 if (mtd->writesize > 512)
c5d23f1b
SH
519 bufs = 4;
520 else
521 bufs = 1;
34f6e157 522
c5d23f1b 523 for (i = 0; i < bufs; i++) {
34f6e157 524
c5d23f1b 525 /* NANDFC buffer 0 is used for page read/write */
d178e3e8 526 writew((host->active_cs << 4) | i, NFC_V1_V2_BUF_ADDR);
34f6e157 527
1bc99180 528 writew(ops, NFC_V1_V2_CONFIG2);
34f6e157 529
c5d23f1b 530 /* Wait for operation to complete */
c110eaf4 531 wait_op_done(host, true);
34f6e157 532 }
34f6e157
SH
533}
534
71ec5155
SH
535static void send_read_id_v3(struct mxc_nand_host *host)
536{
537 /* Read ID into main buffer */
538 writel(NFC_ID, NFC_V3_LAUNCH);
539
540 wait_op_done(host, true);
541
096bcc23 542 memcpy32_fromio(host->data_buf, host->main_area0, 16);
71ec5155
SH
543}
544
34f6e157 545/* Request the NANDFC to perform a read of the NAND device ID. */
5f97304e 546static void send_read_id_v1_v2(struct mxc_nand_host *host)
34f6e157
SH
547{
548 struct nand_chip *this = &host->nand;
34f6e157
SH
549
550 /* NANDFC buffer 0 is used for device ID output */
d178e3e8 551 writew(host->active_cs << 4, NFC_V1_V2_BUF_ADDR);
34f6e157 552
1bc99180 553 writew(NFC_ID, NFC_V1_V2_CONFIG2);
34f6e157
SH
554
555 /* Wait for operation to complete */
c110eaf4 556 wait_op_done(host, true);
34f6e157 557
096bcc23 558 memcpy32_fromio(host->data_buf, host->main_area0, 16);
f7b66e5e 559
34f6e157 560 if (this->options & NAND_BUSWIDTH_16) {
34f6e157 561 /* compress the ID info */
f7b66e5e
JO
562 host->data_buf[1] = host->data_buf[2];
563 host->data_buf[2] = host->data_buf[4];
564 host->data_buf[3] = host->data_buf[6];
565 host->data_buf[4] = host->data_buf[8];
566 host->data_buf[5] = host->data_buf[10];
34f6e157
SH
567 }
568}
569
71ec5155
SH
570static uint16_t get_dev_status_v3(struct mxc_nand_host *host)
571{
572 writew(NFC_STATUS, NFC_V3_LAUNCH);
573 wait_op_done(host, true);
574
575 return readl(NFC_V3_CONFIG1) >> 16;
576}
577
34f6e157
SH
578/* This function requests the NANDFC to perform a read of the
579 * NAND device status and returns the current status. */
5f97304e 580static uint16_t get_dev_status_v1_v2(struct mxc_nand_host *host)
34f6e157 581{
c29c607a 582 void __iomem *main_buf = host->main_area0;
34f6e157 583 uint32_t store;
f06368f7 584 uint16_t ret;
34f6e157 585
d178e3e8 586 writew(host->active_cs << 4, NFC_V1_V2_BUF_ADDR);
34f6e157 587
c29c607a
SH
588 /*
589 * The device status is stored in main_area0. To
590 * prevent corruption of the buffer save the value
591 * and restore it afterwards.
592 */
34f6e157 593 store = readl(main_buf);
34f6e157 594
1bc99180 595 writew(NFC_STATUS, NFC_V1_V2_CONFIG2);
c110eaf4 596 wait_op_done(host, true);
34f6e157 597
34f6e157 598 ret = readw(main_buf);
c29c607a 599
34f6e157
SH
600 writel(store, main_buf);
601
602 return ret;
603}
604
605/* This functions is used by upper layer to checks if device is ready */
606static int mxc_nand_dev_ready(struct mtd_info *mtd)
607{
608 /*
609 * NFC handles R/B internally. Therefore, this function
610 * always returns status as ready.
611 */
612 return 1;
613}
614
615static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
616{
617 /*
618 * If HW ECC is enabled, we turn it on during init. There is
619 * no need to enable again here.
620 */
621}
622
94f77e50 623static int mxc_nand_correct_data_v1(struct mtd_info *mtd, u_char *dat,
34f6e157
SH
624 u_char *read_ecc, u_char *calc_ecc)
625{
626 struct nand_chip *nand_chip = mtd->priv;
627 struct mxc_nand_host *host = nand_chip->priv;
628
629 /*
630 * 1-Bit errors are automatically corrected in HW. No need for
631 * additional correction. 2-Bit errors cannot be corrected by
632 * HW ECC, so we need to return failure
633 */
6d38af25 634 uint16_t ecc_status = get_ecc_status_v1(host);
34f6e157
SH
635
636 if (((ecc_status & 0x3) == 2) || ((ecc_status >> 2) == 2)) {
289c0522 637 pr_debug("MXC_NAND: HWECC uncorrectable 2-bit ECC error\n");
34f6e157
SH
638 return -1;
639 }
640
641 return 0;
642}
643
94f77e50
SH
644static int mxc_nand_correct_data_v2_v3(struct mtd_info *mtd, u_char *dat,
645 u_char *read_ecc, u_char *calc_ecc)
646{
647 struct nand_chip *nand_chip = mtd->priv;
648 struct mxc_nand_host *host = nand_chip->priv;
649 u32 ecc_stat, err;
650 int no_subpages = 1;
651 int ret = 0;
652 u8 ecc_bit_mask, err_limit;
653
654 ecc_bit_mask = (host->eccsize == 4) ? 0x7 : 0xf;
655 err_limit = (host->eccsize == 4) ? 0x4 : 0x8;
656
657 no_subpages = mtd->writesize >> 9;
658
6d38af25 659 ecc_stat = host->devtype_data->get_ecc_status(host);
94f77e50
SH
660
661 do {
662 err = ecc_stat & ecc_bit_mask;
663 if (err > err_limit) {
664 printk(KERN_WARNING "UnCorrectable RS-ECC Error\n");
665 return -1;
666 } else {
667 ret += err;
668 }
669 ecc_stat >>= 4;
670 } while (--no_subpages);
671
672 mtd->ecc_stats.corrected += ret;
673 pr_debug("%d Symbol Correctable RS-ECC Error\n", ret);
674
675 return ret;
676}
677
34f6e157
SH
678static int mxc_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
679 u_char *ecc_code)
680{
681 return 0;
682}
683
684static u_char mxc_nand_read_byte(struct mtd_info *mtd)
685{
686 struct nand_chip *nand_chip = mtd->priv;
687 struct mxc_nand_host *host = nand_chip->priv;
f8f9608d 688 uint8_t ret;
34f6e157
SH
689
690 /* Check for status request */
691 if (host->status_request)
e4303b25 692 return host->devtype_data->get_dev_status(host) & 0xFF;
34f6e157 693
f8f9608d
SH
694 ret = *(uint8_t *)(host->data_buf + host->buf_start);
695 host->buf_start++;
34f6e157
SH
696
697 return ret;
698}
699
700static uint16_t mxc_nand_read_word(struct mtd_info *mtd)
701{
702 struct nand_chip *nand_chip = mtd->priv;
703 struct mxc_nand_host *host = nand_chip->priv;
f8f9608d 704 uint16_t ret;
34f6e157 705
f8f9608d
SH
706 ret = *(uint16_t *)(host->data_buf + host->buf_start);
707 host->buf_start += 2;
34f6e157
SH
708
709 return ret;
710}
711
712/* Write data of length len to buffer buf. The data to be
713 * written on NAND Flash is first copied to RAMbuffer. After the Data Input
714 * Operation by the NFC, the data is written to NAND Flash */
715static void mxc_nand_write_buf(struct mtd_info *mtd,
716 const u_char *buf, int len)
717{
718 struct nand_chip *nand_chip = mtd->priv;
719 struct mxc_nand_host *host = nand_chip->priv;
f8f9608d
SH
720 u16 col = host->buf_start;
721 int n = mtd->oobsize + mtd->writesize - col;
34f6e157 722
f8f9608d 723 n = min(n, len);
34f6e157 724
f8f9608d 725 memcpy(host->data_buf + col, buf, n);
34f6e157 726
f8f9608d 727 host->buf_start += n;
34f6e157
SH
728}
729
730/* Read the data buffer from the NAND Flash. To read the data from NAND
731 * Flash first the data output cycle is initiated by the NFC, which copies
732 * the data to RAMbuffer. This data of length len is then copied to buffer buf.
733 */
734static void mxc_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
735{
736 struct nand_chip *nand_chip = mtd->priv;
737 struct mxc_nand_host *host = nand_chip->priv;
f8f9608d
SH
738 u16 col = host->buf_start;
739 int n = mtd->oobsize + mtd->writesize - col;
34f6e157 740
f8f9608d 741 n = min(n, len);
34f6e157 742
5d9d9936 743 memcpy(buf, host->data_buf + col, n);
34f6e157 744
5d9d9936 745 host->buf_start += n;
34f6e157
SH
746}
747
748/* Used by the upper layer to verify the data in NAND Flash
749 * with the data in the buf. */
750static int mxc_nand_verify_buf(struct mtd_info *mtd,
751 const u_char *buf, int len)
752{
753 return -EFAULT;
754}
755
756/* This function is used by upper layer for select and
757 * deselect of the NAND chip */
5e05a2d6 758static void mxc_nand_select_chip_v1_v3(struct mtd_info *mtd, int chip)
34f6e157
SH
759{
760 struct nand_chip *nand_chip = mtd->priv;
761 struct mxc_nand_host *host = nand_chip->priv;
762
d178e3e8 763 if (chip == -1) {
34f6e157
SH
764 /* Disable the NFC clock */
765 if (host->clk_act) {
97c3213f 766 clk_disable_unprepare(host->clk);
34f6e157
SH
767 host->clk_act = 0;
768 }
d178e3e8
BS
769 return;
770 }
771
772 if (!host->clk_act) {
34f6e157 773 /* Enable the NFC clock */
97c3213f 774 clk_prepare_enable(host->clk);
d178e3e8
BS
775 host->clk_act = 1;
776 }
5e05a2d6 777}
34f6e157 778
5e05a2d6
UKK
779static void mxc_nand_select_chip_v2(struct mtd_info *mtd, int chip)
780{
781 struct nand_chip *nand_chip = mtd->priv;
782 struct mxc_nand_host *host = nand_chip->priv;
783
784 if (chip == -1) {
785 /* Disable the NFC clock */
786 if (host->clk_act) {
3d059693 787 clk_disable_unprepare(host->clk);
5e05a2d6
UKK
788 host->clk_act = 0;
789 }
790 return;
791 }
34f6e157 792
5e05a2d6
UKK
793 if (!host->clk_act) {
794 /* Enable the NFC clock */
3d059693 795 clk_prepare_enable(host->clk);
5e05a2d6 796 host->clk_act = 1;
34f6e157 797 }
5e05a2d6
UKK
798
799 host->active_cs = chip;
800 writew(host->active_cs << 4, NFC_V1_V2_BUF_ADDR);
34f6e157
SH
801}
802
f8f9608d
SH
803/*
804 * Function to transfer data to/from spare area.
805 */
806static void copy_spare(struct mtd_info *mtd, bool bfrom)
34f6e157 807{
f8f9608d
SH
808 struct nand_chip *this = mtd->priv;
809 struct mxc_nand_host *host = this->priv;
810 u16 i, j;
811 u16 n = mtd->writesize >> 9;
812 u8 *d = host->data_buf + mtd->writesize;
4b6f05e1 813 u8 __iomem *s = host->spare0;
f48d0f9a 814 u16 t = host->devtype_data->spare_len;
f8f9608d
SH
815
816 j = (mtd->oobsize / n >> 1) << 1;
817
818 if (bfrom) {
819 for (i = 0; i < n - 1; i++)
096bcc23 820 memcpy32_fromio(d + i * j, s + i * t, j);
f8f9608d
SH
821
822 /* the last section */
096bcc23 823 memcpy32_fromio(d + i * j, s + i * t, mtd->oobsize - i * j);
f8f9608d
SH
824 } else {
825 for (i = 0; i < n - 1; i++)
096bcc23 826 memcpy32_toio(&s[i * t], &d[i * j], j);
34f6e157 827
f8f9608d 828 /* the last section */
096bcc23 829 memcpy32_toio(&s[i * t], &d[i * j], mtd->oobsize - i * j);
34f6e157 830 }
f8f9608d 831}
34f6e157 832
a3e65b64
SH
833static void mxc_do_addr_cycle(struct mtd_info *mtd, int column, int page_addr)
834{
835 struct nand_chip *nand_chip = mtd->priv;
836 struct mxc_nand_host *host = nand_chip->priv;
34f6e157
SH
837
838 /* Write out column address, if necessary */
839 if (column != -1) {
840 /*
841 * MXC NANDFC can only perform full page+spare or
842 * spare-only read/write. When the upper layers
177b241d
GE
843 * perform a read/write buf operation, the saved column
844 * address is used to index into the full page.
34f6e157 845 */
e4303b25 846 host->devtype_data->send_addr(host, 0, page_addr == -1);
2d69c7fa 847 if (mtd->writesize > 512)
34f6e157 848 /* another col addr cycle for 2k page */
e4303b25 849 host->devtype_data->send_addr(host, 0, false);
34f6e157
SH
850 }
851
852 /* Write out page address, if necessary */
853 if (page_addr != -1) {
854 /* paddr_0 - p_addr_7 */
e4303b25 855 host->devtype_data->send_addr(host, (page_addr & 0xff), false);
34f6e157 856
2d69c7fa 857 if (mtd->writesize > 512) {
bd3fd62e
VB
858 if (mtd->size >= 0x10000000) {
859 /* paddr_8 - paddr_15 */
e4303b25
UKK
860 host->devtype_data->send_addr(host,
861 (page_addr >> 8) & 0xff,
862 false);
863 host->devtype_data->send_addr(host,
864 (page_addr >> 16) & 0xff,
865 true);
bd3fd62e
VB
866 } else
867 /* paddr_8 - paddr_15 */
e4303b25
UKK
868 host->devtype_data->send_addr(host,
869 (page_addr >> 8) & 0xff, true);
34f6e157
SH
870 } else {
871 /* One more address cycle for higher density devices */
872 if (mtd->size >= 0x4000000) {
873 /* paddr_8 - paddr_15 */
e4303b25
UKK
874 host->devtype_data->send_addr(host,
875 (page_addr >> 8) & 0xff,
876 false);
877 host->devtype_data->send_addr(host,
878 (page_addr >> 16) & 0xff,
879 true);
34f6e157
SH
880 } else
881 /* paddr_8 - paddr_15 */
e4303b25
UKK
882 host->devtype_data->send_addr(host,
883 (page_addr >> 8) & 0xff, true);
34f6e157
SH
884 }
885 }
a3e65b64
SH
886}
887
6e85dfdc
SH
888/*
889 * v2 and v3 type controllers can do 4bit or 8bit ecc depending
890 * on how much oob the nand chip has. For 8bit ecc we need at least
891 * 26 bytes of oob data per 512 byte block.
892 */
893static int get_eccsize(struct mtd_info *mtd)
894{
895 int oobbytes_per_512 = 0;
896
897 oobbytes_per_512 = mtd->oobsize * 512 / mtd->writesize;
898
899 if (oobbytes_per_512 < 26)
900 return 4;
901 else
902 return 8;
903}
904
6d38af25 905static void preset_v1(struct mtd_info *mtd)
d4840180
IC
906{
907 struct nand_chip *nand_chip = mtd->priv;
908 struct mxc_nand_host *host = nand_chip->priv;
b8db2f51
SH
909 uint16_t config1 = 0;
910
911 if (nand_chip->ecc.mode == NAND_ECC_HW)
912 config1 |= NFC_V1_V2_CONFIG1_ECC_EN;
913
f48d0f9a 914 if (!host->devtype_data->irqpending_quirk)
6d38af25
UKK
915 config1 |= NFC_V1_V2_CONFIG1_INT_MSK;
916
917 host->eccsize = 1;
918
919 writew(config1, NFC_V1_V2_CONFIG1);
920 /* preset operation */
921
922 /* Unlock the internal RAM Buffer */
923 writew(0x2, NFC_V1_V2_CONFIG);
924
925 /* Blocks to be unlocked */
926 writew(0x0, NFC_V1_UNLOCKSTART_BLKADDR);
927 writew(0xffff, NFC_V1_UNLOCKEND_BLKADDR);
928
929 /* Unlock Block Command for given address range */
930 writew(0x4, NFC_V1_V2_WRPROT);
931}
932
933static void preset_v2(struct mtd_info *mtd)
d4840180
IC
934{
935 struct nand_chip *nand_chip = mtd->priv;
936 struct mxc_nand_host *host = nand_chip->priv;
b8db2f51
SH
937 uint16_t config1 = 0;
938
939 if (nand_chip->ecc.mode == NAND_ECC_HW)
940 config1 |= NFC_V1_V2_CONFIG1_ECC_EN;
941
6d38af25 942 config1 |= NFC_V2_CONFIG1_FP_INT;
b8db2f51 943
f48d0f9a 944 if (!host->devtype_data->irqpending_quirk)
b8db2f51 945 config1 |= NFC_V1_V2_CONFIG1_INT_MSK;
6e85dfdc 946
6d38af25 947 if (mtd->writesize) {
b8db2f51
SH
948 uint16_t pages_per_block = mtd->erasesize / mtd->writesize;
949
6e85dfdc
SH
950 host->eccsize = get_eccsize(mtd);
951 if (host->eccsize == 4)
b8db2f51
SH
952 config1 |= NFC_V2_CONFIG1_ECC_MODE_4;
953
954 config1 |= NFC_V2_CONFIG1_PPB(ffs(pages_per_block) - 6);
d4840180 955 } else {
6e85dfdc 956 host->eccsize = 1;
d4840180 957 }
6e85dfdc 958
b8db2f51 959 writew(config1, NFC_V1_V2_CONFIG1);
d4840180
IC
960 /* preset operation */
961
962 /* Unlock the internal RAM Buffer */
1bc99180 963 writew(0x2, NFC_V1_V2_CONFIG);
d4840180
IC
964
965 /* Blocks to be unlocked */
6d38af25
UKK
966 writew(0x0, NFC_V21_UNLOCKSTART_BLKADDR0);
967 writew(0x0, NFC_V21_UNLOCKSTART_BLKADDR1);
968 writew(0x0, NFC_V21_UNLOCKSTART_BLKADDR2);
969 writew(0x0, NFC_V21_UNLOCKSTART_BLKADDR3);
970 writew(0xffff, NFC_V21_UNLOCKEND_BLKADDR0);
971 writew(0xffff, NFC_V21_UNLOCKEND_BLKADDR1);
972 writew(0xffff, NFC_V21_UNLOCKEND_BLKADDR2);
973 writew(0xffff, NFC_V21_UNLOCKEND_BLKADDR3);
d4840180
IC
974
975 /* Unlock Block Command for given address range */
1bc99180 976 writew(0x4, NFC_V1_V2_WRPROT);
d4840180
IC
977}
978
71ec5155
SH
979static void preset_v3(struct mtd_info *mtd)
980{
981 struct nand_chip *chip = mtd->priv;
982 struct mxc_nand_host *host = chip->priv;
983 uint32_t config2, config3;
984 int i, addr_phases;
985
986 writel(NFC_V3_CONFIG1_RBA(0), NFC_V3_CONFIG1);
987 writel(NFC_V3_IPC_CREQ, NFC_V3_IPC);
988
989 /* Unlock the internal RAM Buffer */
990 writel(NFC_V3_WRPROT_BLS_UNLOCK | NFC_V3_WRPROT_UNLOCK,
991 NFC_V3_WRPROT);
992
993 /* Blocks to be unlocked */
994 for (i = 0; i < NAND_MAX_CHIPS; i++)
995 writel(0x0 | (0xffff << 16),
996 NFC_V3_WRPROT_UNLOCK_BLK_ADD0 + (i << 2));
997
998 writel(0, NFC_V3_IPC);
999
1000 config2 = NFC_V3_CONFIG2_ONE_CYCLE |
1001 NFC_V3_CONFIG2_2CMD_PHASES |
1002 NFC_V3_CONFIG2_SPAS(mtd->oobsize >> 1) |
1003 NFC_V3_CONFIG2_ST_CMD(0x70) |
63f1474c 1004 NFC_V3_CONFIG2_INT_MSK |
71ec5155
SH
1005 NFC_V3_CONFIG2_NUM_ADDR_PHASE0;
1006
1007 if (chip->ecc.mode == NAND_ECC_HW)
1008 config2 |= NFC_V3_CONFIG2_ECC_EN;
1009
1010 addr_phases = fls(chip->pagemask) >> 3;
1011
1012 if (mtd->writesize == 2048) {
1013 config2 |= NFC_V3_CONFIG2_PS_2048;
1014 config2 |= NFC_V3_CONFIG2_NUM_ADDR_PHASE1(addr_phases);
1015 } else if (mtd->writesize == 4096) {
1016 config2 |= NFC_V3_CONFIG2_PS_4096;
1017 config2 |= NFC_V3_CONFIG2_NUM_ADDR_PHASE1(addr_phases);
1018 } else {
1019 config2 |= NFC_V3_CONFIG2_PS_512;
1020 config2 |= NFC_V3_CONFIG2_NUM_ADDR_PHASE1(addr_phases - 1);
1021 }
1022
1023 if (mtd->writesize) {
1024 config2 |= NFC_V3_CONFIG2_PPB(ffs(mtd->erasesize / mtd->writesize) - 6);
1025 host->eccsize = get_eccsize(mtd);
1026 if (host->eccsize == 8)
1027 config2 |= NFC_V3_CONFIG2_ECC_MODE_8;
1028 }
1029
1030 writel(config2, NFC_V3_CONFIG2);
1031
1032 config3 = NFC_V3_CONFIG3_NUM_OF_DEVICES(0) |
1033 NFC_V3_CONFIG3_NO_SDMA |
1034 NFC_V3_CONFIG3_RBB_MODE |
1035 NFC_V3_CONFIG3_SBB(6) | /* Reset default */
1036 NFC_V3_CONFIG3_ADD_OP(0);
1037
1038 if (!(chip->options & NAND_BUSWIDTH_16))
1039 config3 |= NFC_V3_CONFIG3_FW8;
1040
1041 writel(config3, NFC_V3_CONFIG3);
1042
1043 writel(0, NFC_V3_DELAY_LINE);
d4840180
IC
1044}
1045
34f6e157
SH
1046/* Used by the upper layer to write command to NAND Flash for
1047 * different operations to be carried out on NAND Flash */
1048static void mxc_nand_command(struct mtd_info *mtd, unsigned command,
1049 int column, int page_addr)
1050{
1051 struct nand_chip *nand_chip = mtd->priv;
1052 struct mxc_nand_host *host = nand_chip->priv;
34f6e157 1053
289c0522 1054 pr_debug("mxc_nand_command (cmd = 0x%x, col = 0x%x, page = 0x%x)\n",
34f6e157
SH
1055 command, column, page_addr);
1056
1057 /* Reset command state information */
1058 host->status_request = false;
34f6e157 1059
34f6e157 1060 /* Command pre-processing step */
34f6e157 1061 switch (command) {
d4840180 1062 case NAND_CMD_RESET:
e4303b25
UKK
1063 host->devtype_data->preset(mtd);
1064 host->devtype_data->send_cmd(host, command, false);
d4840180 1065 break;
34f6e157 1066
34f6e157 1067 case NAND_CMD_STATUS:
f8f9608d 1068 host->buf_start = 0;
34f6e157 1069 host->status_request = true;
34f6e157 1070
e4303b25 1071 host->devtype_data->send_cmd(host, command, true);
89121a6b 1072 mxc_do_addr_cycle(mtd, column, page_addr);
34f6e157
SH
1073 break;
1074
34f6e157 1075 case NAND_CMD_READ0:
34f6e157 1076 case NAND_CMD_READOOB:
89121a6b
SH
1077 if (command == NAND_CMD_READ0)
1078 host->buf_start = column;
1079 else
1080 host->buf_start = column + mtd->writesize;
f8f9608d 1081
5ea32021 1082 command = NAND_CMD_READ0; /* only READ0 is valid */
89121a6b 1083
e4303b25 1084 host->devtype_data->send_cmd(host, command, false);
89121a6b
SH
1085 mxc_do_addr_cycle(mtd, column, page_addr);
1086
2d69c7fa 1087 if (mtd->writesize > 512)
e4303b25
UKK
1088 host->devtype_data->send_cmd(host,
1089 NAND_CMD_READSTART, true);
c5d23f1b 1090
e4303b25 1091 host->devtype_data->send_page(mtd, NFC_OUTPUT);
89121a6b 1092
096bcc23
SH
1093 memcpy32_fromio(host->data_buf, host->main_area0,
1094 mtd->writesize);
89121a6b 1095 copy_spare(mtd, true);
34f6e157
SH
1096 break;
1097
34f6e157 1098 case NAND_CMD_SEQIN:
5ea32021
SH
1099 if (column >= mtd->writesize)
1100 /* call ourself to read a page */
1101 mxc_nand_command(mtd, NAND_CMD_READ0, 0, page_addr);
34f6e157 1102
5ea32021 1103 host->buf_start = column;
89121a6b 1104
e4303b25 1105 host->devtype_data->send_cmd(host, command, false);
89121a6b 1106 mxc_do_addr_cycle(mtd, column, page_addr);
34f6e157
SH
1107 break;
1108
1109 case NAND_CMD_PAGEPROG:
096bcc23 1110 memcpy32_toio(host->main_area0, host->data_buf, mtd->writesize);
f8f9608d 1111 copy_spare(mtd, false);
e4303b25
UKK
1112 host->devtype_data->send_page(mtd, NFC_INPUT);
1113 host->devtype_data->send_cmd(host, command, true);
89121a6b 1114 mxc_do_addr_cycle(mtd, column, page_addr);
34f6e157
SH
1115 break;
1116
34f6e157 1117 case NAND_CMD_READID:
e4303b25 1118 host->devtype_data->send_cmd(host, command, true);
89121a6b 1119 mxc_do_addr_cycle(mtd, column, page_addr);
e4303b25 1120 host->devtype_data->send_read_id(host);
9467114e 1121 host->buf_start = column;
34f6e157
SH
1122 break;
1123
89121a6b 1124 case NAND_CMD_ERASE1:
34f6e157 1125 case NAND_CMD_ERASE2:
e4303b25 1126 host->devtype_data->send_cmd(host, command, false);
89121a6b
SH
1127 mxc_do_addr_cycle(mtd, column, page_addr);
1128
34f6e157
SH
1129 break;
1130 }
1131}
1132
f1372055
SH
1133/*
1134 * The generic flash bbt decriptors overlap with our ecc
1135 * hardware, so define some i.MX specific ones.
1136 */
1137static uint8_t bbt_pattern[] = { 'B', 'b', 't', '0' };
1138static uint8_t mirror_pattern[] = { '1', 't', 'b', 'B' };
1139
1140static struct nand_bbt_descr bbt_main_descr = {
1141 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1142 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1143 .offs = 0,
1144 .len = 4,
1145 .veroffs = 4,
1146 .maxblocks = 4,
1147 .pattern = bbt_pattern,
1148};
1149
1150static struct nand_bbt_descr bbt_mirror_descr = {
1151 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1152 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1153 .offs = 0,
1154 .len = 4,
1155 .veroffs = 4,
1156 .maxblocks = 4,
1157 .pattern = mirror_pattern,
1158};
1159
f48d0f9a 1160/* v1 + irqpending_quirk: i.MX21 */
e4303b25 1161static const struct mxc_nand_devtype_data imx21_nand_devtype_data = {
6d38af25 1162 .preset = preset_v1,
e4303b25
UKK
1163 .send_cmd = send_cmd_v1_v2,
1164 .send_addr = send_addr_v1_v2,
6d38af25 1165 .send_page = send_page_v1,
e4303b25
UKK
1166 .send_read_id = send_read_id_v1_v2,
1167 .get_dev_status = get_dev_status_v1_v2,
1168 .check_int = check_int_v1_v2,
1169 .irq_control = irq_control_v1_v2,
6d38af25 1170 .get_ecc_status = get_ecc_status_v1,
6dcdf99d
UKK
1171 .ecclayout_512 = &nandv1_hw_eccoob_smallpage,
1172 .ecclayout_2k = &nandv1_hw_eccoob_largepage,
1173 .ecclayout_4k = &nandv1_hw_eccoob_smallpage, /* XXX: needs fix */
5e05a2d6 1174 .select_chip = mxc_nand_select_chip_v1_v3,
69d023be 1175 .correct_data = mxc_nand_correct_data_v1,
f48d0f9a
UKK
1176 .irqpending_quirk = 1,
1177 .needs_ip = 0,
1178 .regs_offset = 0xe00,
1179 .spare0_offset = 0x800,
1180 .spare_len = 16,
1181 .eccbytes = 3,
1182 .eccsize = 1,
1183};
1184
1185/* v1 + !irqpending_quirk: i.MX27, i.MX31 */
1186static const struct mxc_nand_devtype_data imx27_nand_devtype_data = {
1187 .preset = preset_v1,
1188 .send_cmd = send_cmd_v1_v2,
1189 .send_addr = send_addr_v1_v2,
1190 .send_page = send_page_v1,
1191 .send_read_id = send_read_id_v1_v2,
1192 .get_dev_status = get_dev_status_v1_v2,
1193 .check_int = check_int_v1_v2,
1194 .irq_control = irq_control_v1_v2,
1195 .get_ecc_status = get_ecc_status_v1,
1196 .ecclayout_512 = &nandv1_hw_eccoob_smallpage,
1197 .ecclayout_2k = &nandv1_hw_eccoob_largepage,
1198 .ecclayout_4k = &nandv1_hw_eccoob_smallpage, /* XXX: needs fix */
1199 .select_chip = mxc_nand_select_chip_v1_v3,
1200 .correct_data = mxc_nand_correct_data_v1,
1201 .irqpending_quirk = 0,
1202 .needs_ip = 0,
1203 .regs_offset = 0xe00,
1204 .spare0_offset = 0x800,
1205 .axi_offset = 0,
1206 .spare_len = 16,
1207 .eccbytes = 3,
1208 .eccsize = 1,
e4303b25
UKK
1209};
1210
1211/* v21: i.MX25, i.MX35 */
1212static const struct mxc_nand_devtype_data imx25_nand_devtype_data = {
6d38af25 1213 .preset = preset_v2,
e4303b25
UKK
1214 .send_cmd = send_cmd_v1_v2,
1215 .send_addr = send_addr_v1_v2,
6d38af25 1216 .send_page = send_page_v2,
e4303b25
UKK
1217 .send_read_id = send_read_id_v1_v2,
1218 .get_dev_status = get_dev_status_v1_v2,
1219 .check_int = check_int_v1_v2,
1220 .irq_control = irq_control_v1_v2,
6d38af25 1221 .get_ecc_status = get_ecc_status_v2,
6dcdf99d
UKK
1222 .ecclayout_512 = &nandv2_hw_eccoob_smallpage,
1223 .ecclayout_2k = &nandv2_hw_eccoob_largepage,
1224 .ecclayout_4k = &nandv2_hw_eccoob_4k,
5e05a2d6 1225 .select_chip = mxc_nand_select_chip_v2,
69d023be 1226 .correct_data = mxc_nand_correct_data_v2_v3,
f48d0f9a
UKK
1227 .irqpending_quirk = 0,
1228 .needs_ip = 0,
1229 .regs_offset = 0x1e00,
1230 .spare0_offset = 0x1000,
1231 .axi_offset = 0,
1232 .spare_len = 64,
1233 .eccbytes = 9,
1234 .eccsize = 0,
e4303b25
UKK
1235};
1236
1237/* v3: i.MX51, i.MX53 */
1238static const struct mxc_nand_devtype_data imx51_nand_devtype_data = {
1239 .preset = preset_v3,
1240 .send_cmd = send_cmd_v3,
1241 .send_addr = send_addr_v3,
1242 .send_page = send_page_v3,
1243 .send_read_id = send_read_id_v3,
1244 .get_dev_status = get_dev_status_v3,
1245 .check_int = check_int_v3,
1246 .irq_control = irq_control_v3,
6d38af25 1247 .get_ecc_status = get_ecc_status_v3,
6dcdf99d
UKK
1248 .ecclayout_512 = &nandv2_hw_eccoob_smallpage,
1249 .ecclayout_2k = &nandv2_hw_eccoob_largepage,
1250 .ecclayout_4k = &nandv2_hw_eccoob_smallpage, /* XXX: needs fix */
5e05a2d6 1251 .select_chip = mxc_nand_select_chip_v1_v3,
69d023be 1252 .correct_data = mxc_nand_correct_data_v2_v3,
f48d0f9a
UKK
1253 .irqpending_quirk = 0,
1254 .needs_ip = 1,
1255 .regs_offset = 0,
1256 .spare0_offset = 0x1000,
1257 .axi_offset = 0x1e00,
1258 .spare_len = 64,
1259 .eccbytes = 0,
1260 .eccsize = 0,
e4303b25
UKK
1261};
1262
6436356b
UKK
1263#ifdef CONFIG_OF_MTD
1264static const struct of_device_id mxcnd_dt_ids[] = {
1265 {
1266 .compatible = "fsl,imx21-nand",
1267 .data = &imx21_nand_devtype_data,
1268 }, {
1269 .compatible = "fsl,imx27-nand",
1270 .data = &imx27_nand_devtype_data,
1271 }, {
1272 .compatible = "fsl,imx25-nand",
1273 .data = &imx25_nand_devtype_data,
1274 }, {
1275 .compatible = "fsl,imx51-nand",
1276 .data = &imx51_nand_devtype_data,
1277 },
1278 { /* sentinel */ }
1279};
1280
1281static int __init mxcnd_probe_dt(struct mxc_nand_host *host)
1282{
1283 struct device_node *np = host->dev->of_node;
1284 struct mxc_nand_platform_data *pdata = &host->pdata;
1285 const struct of_device_id *of_id =
1286 of_match_device(mxcnd_dt_ids, host->dev);
1287 int buswidth;
1288
1289 if (!np)
1290 return 1;
1291
1292 if (of_get_nand_ecc_mode(np) >= 0)
1293 pdata->hw_ecc = 1;
1294
1295 pdata->flash_bbt = of_get_nand_on_flash_bbt(np);
1296
1297 buswidth = of_get_nand_bus_width(np);
1298 if (buswidth < 0)
1299 return buswidth;
1300
1301 pdata->width = buswidth / 8;
1302
1303 host->devtype_data = of_id->data;
1304
1305 return 0;
1306}
1307#else
1308static int __init mxcnd_probe_dt(struct mxc_nand_host *host)
1309{
1310 return 1;
1311}
1312#endif
1313
1314static int __init mxcnd_probe_pdata(struct mxc_nand_host *host)
1315{
1316 struct mxc_nand_platform_data *pdata = host->dev->platform_data;
1317
1318 if (!pdata)
1319 return -ENODEV;
1320
1321 host->pdata = *pdata;
1322
1323 if (nfc_is_v1()) {
1324 if (cpu_is_mx21())
1325 host->devtype_data = &imx21_nand_devtype_data;
1326 else
1327 host->devtype_data = &imx27_nand_devtype_data;
1328 } else if (nfc_is_v21()) {
1329 host->devtype_data = &imx25_nand_devtype_data;
1330 } else if (nfc_is_v3_2()) {
1331 host->devtype_data = &imx51_nand_devtype_data;
1332 } else
1333 BUG();
1334
1335 return 0;
1336}
1337
34f6e157
SH
1338static int __init mxcnd_probe(struct platform_device *pdev)
1339{
1340 struct nand_chip *this;
1341 struct mtd_info *mtd;
34f6e157
SH
1342 struct mxc_nand_host *host;
1343 struct resource *res;
d4ed8f12 1344 int err = 0;
34f6e157
SH
1345
1346 /* Allocate memory for MTD device structure and private data */
e4a09cbf
SH
1347 host = devm_kzalloc(&pdev->dev, sizeof(struct mxc_nand_host) +
1348 NAND_MAX_PAGESIZE + NAND_MAX_OOBSIZE, GFP_KERNEL);
34f6e157
SH
1349 if (!host)
1350 return -ENOMEM;
1351
f8f9608d 1352 host->data_buf = (uint8_t *)(host + 1);
f8f9608d 1353
34f6e157
SH
1354 host->dev = &pdev->dev;
1355 /* structures must be linked */
1356 this = &host->nand;
1357 mtd = &host->mtd;
1358 mtd->priv = this;
1359 mtd->owner = THIS_MODULE;
87f39f04 1360 mtd->dev.parent = &pdev->dev;
1fbff0a6 1361 mtd->name = DRIVER_NAME;
34f6e157
SH
1362
1363 /* 50 us command delay time */
1364 this->chip_delay = 5;
1365
1366 this->priv = host;
1367 this->dev_ready = mxc_nand_dev_ready;
1368 this->cmdfunc = mxc_nand_command;
34f6e157
SH
1369 this->read_byte = mxc_nand_read_byte;
1370 this->read_word = mxc_nand_read_word;
1371 this->write_buf = mxc_nand_write_buf;
1372 this->read_buf = mxc_nand_read_buf;
1373 this->verify_buf = mxc_nand_verify_buf;
1374
e4a09cbf
SH
1375 host->clk = devm_clk_get(&pdev->dev, "nfc");
1376 if (IS_ERR(host->clk))
1377 return PTR_ERR(host->clk);
34f6e157
SH
1378
1379 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
e4a09cbf
SH
1380 if (!res)
1381 return -ENODEV;
34f6e157 1382
e4a09cbf
SH
1383 host->base = devm_request_and_ioremap(&pdev->dev, res);
1384 if (!host->base)
1385 return -ENOMEM;
34f6e157 1386
c6de7e1b 1387 host->main_area0 = host->base;
9467114e 1388
6436356b
UKK
1389 err = mxcnd_probe_dt(host);
1390 if (err > 0)
1391 err = mxcnd_probe_pdata(host);
1392 if (err < 0)
e4a09cbf 1393 return err;
9467114e 1394
f48d0f9a
UKK
1395 if (host->devtype_data->regs_offset)
1396 host->regs = host->base + host->devtype_data->regs_offset;
1397 host->spare0 = host->base + host->devtype_data->spare0_offset;
1398 if (host->devtype_data->axi_offset)
1399 host->regs_axi = host->base + host->devtype_data->axi_offset;
1400
1401 this->ecc.bytes = host->devtype_data->eccbytes;
1402 host->eccsize = host->devtype_data->eccsize;
1403
1404 this->select_chip = host->devtype_data->select_chip;
1405 this->ecc.size = 512;
1406 this->ecc.layout = host->devtype_data->ecclayout_512;
1407
1408 if (host->devtype_data->needs_ip) {
71ec5155 1409 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
e4a09cbf
SH
1410 if (!res)
1411 return -ENODEV;
1412 host->regs_ip = devm_request_and_ioremap(&pdev->dev, res);
1413 if (!host->regs_ip)
1414 return -ENOMEM;
f48d0f9a 1415 }
13e1add1 1416
6436356b 1417 if (host->pdata.hw_ecc) {
34f6e157
SH
1418 this->ecc.calculate = mxc_nand_calculate_ecc;
1419 this->ecc.hwctl = mxc_nand_enable_hwecc;
69d023be 1420 this->ecc.correct = host->devtype_data->correct_data;
34f6e157 1421 this->ecc.mode = NAND_ECC_HW;
34f6e157 1422 } else {
34f6e157 1423 this->ecc.mode = NAND_ECC_SOFT;
34f6e157
SH
1424 }
1425
6436356b
UKK
1426 /* NAND bus width determines access functions used by upper layer */
1427 if (host->pdata.width == 2)
34f6e157 1428 this->options |= NAND_BUSWIDTH_16;
34f6e157 1429
6436356b 1430 if (host->pdata.flash_bbt) {
f1372055
SH
1431 this->bbt_td = &bbt_main_descr;
1432 this->bbt_md = &bbt_mirror_descr;
1433 /* update flash based bbt */
bb9ebd4e 1434 this->bbt_options |= NAND_BBT_USE_FLASH;
34f6e157
SH
1435 }
1436
63f1474c 1437 init_completion(&host->op_completion);
d4840180
IC
1438
1439 host->irq = platform_get_irq(pdev, 0);
1440
63f1474c 1441 /*
e4303b25
UKK
1442 * Use host->devtype_data->irq_control() here instead of irq_control()
1443 * because we must not disable_irq_nosync without having requested the
1444 * irq.
63f1474c 1445 */
e4303b25 1446 host->devtype_data->irq_control(host, 0);
63f1474c 1447
e4a09cbf
SH
1448 err = devm_request_irq(&pdev->dev, host->irq, mxc_nfc_irq,
1449 IRQF_DISABLED, DRIVER_NAME, host);
d4840180 1450 if (err)
e4a09cbf
SH
1451 return err;
1452
1453 clk_prepare_enable(host->clk);
1454 host->clk_act = 1;
d4840180 1455
63f1474c 1456 /*
8556958a
UKK
1457 * Now that we "own" the interrupt make sure the interrupt mask bit is
1458 * cleared on i.MX21. Otherwise we can't read the interrupt status bit
1459 * on this machine.
63f1474c 1460 */
f48d0f9a 1461 if (host->devtype_data->irqpending_quirk) {
8556958a 1462 disable_irq_nosync(host->irq);
e4303b25 1463 host->devtype_data->irq_control(host, 1);
8556958a 1464 }
63f1474c 1465
bd3fd62e 1466 /* first scan to find the device and get the page size */
d178e3e8 1467 if (nand_scan_ident(mtd, nfc_is_v21() ? 4 : 1, NULL)) {
bd3fd62e
VB
1468 err = -ENXIO;
1469 goto escan;
1470 }
34f6e157 1471
6e85dfdc 1472 /* Call preset again, with correct writesize this time */
e4303b25 1473 host->devtype_data->preset(mtd);
6e85dfdc 1474
2d69c7fa 1475 if (mtd->writesize == 2048)
6dcdf99d
UKK
1476 this->ecc.layout = host->devtype_data->ecclayout_2k;
1477 else if (mtd->writesize == 4096)
1478 this->ecc.layout = host->devtype_data->ecclayout_4k;
34f6e157 1479
6a918bad
MD
1480 if (this->ecc.mode == NAND_ECC_HW) {
1481 if (nfc_is_v1())
1482 this->ecc.strength = 1;
1483 else
1484 this->ecc.strength = (host->eccsize == 4) ? 4 : 8;
1485 }
1486
4a43faf5
SH
1487 /* second phase scan */
1488 if (nand_scan_tail(mtd)) {
1489 err = -ENXIO;
1490 goto escan;
1491 }
1492
34f6e157 1493 /* Register the partitions */
6436356b
UKK
1494 mtd_device_parse_register(mtd, part_probes,
1495 &(struct mtd_part_parser_data){
1496 .of_node = pdev->dev.of_node,
1497 },
1498 host->pdata.parts,
1499 host->pdata.nr_parts);
34f6e157
SH
1500
1501 platform_set_drvdata(pdev, host);
1502
1503 return 0;
1504
1505escan:
e4a09cbf 1506 clk_disable_unprepare(host->clk);
34f6e157
SH
1507
1508 return err;
1509}
1510
51eeb878 1511static int __devexit mxcnd_remove(struct platform_device *pdev)
34f6e157
SH
1512{
1513 struct mxc_nand_host *host = platform_get_drvdata(pdev);
1514
34f6e157
SH
1515 platform_set_drvdata(pdev, NULL);
1516
1517 nand_release(&host->mtd);
34f6e157
SH
1518
1519 return 0;
1520}
1521
34f6e157
SH
1522static struct platform_driver mxcnd_driver = {
1523 .driver = {
1524 .name = DRIVER_NAME,
8d1fd16d 1525 .owner = THIS_MODULE,
6436356b 1526 .of_match_table = of_match_ptr(mxcnd_dt_ids),
04dd0d3a 1527 },
daa0f15a 1528 .remove = __devexit_p(mxcnd_remove),
34f6e157
SH
1529};
1530
1531static int __init mxc_nd_init(void)
1532{
8541c118 1533 return platform_driver_probe(&mxcnd_driver, mxcnd_probe);
34f6e157
SH
1534}
1535
1536static void __exit mxc_nd_cleanup(void)
1537{
1538 /* Unregister the device structure */
1539 platform_driver_unregister(&mxcnd_driver);
1540}
1541
1542module_init(mxc_nd_init);
1543module_exit(mxc_nd_cleanup);
1544
1545MODULE_AUTHOR("Freescale Semiconductor, Inc.");
1546MODULE_DESCRIPTION("MXC NAND MTD driver");
1547MODULE_LICENSE("GPL");
This page took 0.265928 seconds and 5 git commands to generate.