blob: 91f5b3404c79c16b8bafda3ed3be1a32c27ff6fb [file] [log] [blame]
Linus Walleij6c009ab2010-09-13 00:35:22 +02001/*
2 * drivers/mtd/nand/fsmc_nand.c
3 *
4 * ST Microelectronics
5 * Flexible Static Memory Controller (FSMC)
6 * Driver for NAND portions
7 *
8 * Copyright © 2010 ST Microelectronics
9 * Vipin Kumar <vipin.kumar@st.com>
10 * Ashish Priyadarshi
11 *
12 * Based on drivers/mtd/nand/nomadik_nand.c
13 *
14 * This file is licensed under the terms of the GNU General Public
15 * License version 2. This program is licensed "as is" without any
16 * warranty of any kind, whether express or implied.
17 */
18
19#include <linux/clk.h>
20#include <linux/err.h>
21#include <linux/init.h>
22#include <linux/module.h>
23#include <linux/resource.h>
24#include <linux/sched.h>
25#include <linux/types.h>
26#include <linux/mtd/mtd.h>
27#include <linux/mtd/nand.h>
28#include <linux/mtd/nand_ecc.h>
29#include <linux/platform_device.h>
30#include <linux/mtd/partitions.h>
31#include <linux/io.h>
32#include <linux/slab.h>
33#include <linux/mtd/fsmc.h>
Linus Walleij593cd872010-11-29 13:52:19 +010034#include <linux/amba/bus.h>
Linus Walleij6c009ab2010-09-13 00:35:22 +020035#include <mtd/mtd-abi.h>
36
Bhavna Yadave29ee572012-03-07 17:00:50 +053037static struct nand_ecclayout fsmc_ecc1_128_layout = {
Linus Walleij6c009ab2010-09-13 00:35:22 +020038 .eccbytes = 24,
39 .eccpos = {2, 3, 4, 18, 19, 20, 34, 35, 36, 50, 51, 52,
40 66, 67, 68, 82, 83, 84, 98, 99, 100, 114, 115, 116},
41 .oobfree = {
42 {.offset = 8, .length = 8},
43 {.offset = 24, .length = 8},
44 {.offset = 40, .length = 8},
45 {.offset = 56, .length = 8},
46 {.offset = 72, .length = 8},
47 {.offset = 88, .length = 8},
48 {.offset = 104, .length = 8},
49 {.offset = 120, .length = 8}
50 }
51};
52
Bhavna Yadave29ee572012-03-07 17:00:50 +053053static struct nand_ecclayout fsmc_ecc1_64_layout = {
54 .eccbytes = 12,
55 .eccpos = {2, 3, 4, 18, 19, 20, 34, 35, 36, 50, 51, 52},
56 .oobfree = {
57 {.offset = 8, .length = 8},
58 {.offset = 24, .length = 8},
59 {.offset = 40, .length = 8},
60 {.offset = 56, .length = 8},
61 }
62};
63
64static struct nand_ecclayout fsmc_ecc1_16_layout = {
65 .eccbytes = 3,
66 .eccpos = {2, 3, 4},
67 .oobfree = {
68 {.offset = 8, .length = 8},
69 }
70};
71
72/*
73 * ECC4 layout for NAND of pagesize 8192 bytes & OOBsize 256 bytes. 13*16 bytes
74 * of OB size is reserved for ECC, Byte no. 0 & 1 reserved for bad block and 46
75 * bytes are free for use.
76 */
77static struct nand_ecclayout fsmc_ecc4_256_layout = {
78 .eccbytes = 208,
79 .eccpos = { 2, 3, 4, 5, 6, 7, 8,
80 9, 10, 11, 12, 13, 14,
81 18, 19, 20, 21, 22, 23, 24,
82 25, 26, 27, 28, 29, 30,
83 34, 35, 36, 37, 38, 39, 40,
84 41, 42, 43, 44, 45, 46,
85 50, 51, 52, 53, 54, 55, 56,
86 57, 58, 59, 60, 61, 62,
87 66, 67, 68, 69, 70, 71, 72,
88 73, 74, 75, 76, 77, 78,
89 82, 83, 84, 85, 86, 87, 88,
90 89, 90, 91, 92, 93, 94,
91 98, 99, 100, 101, 102, 103, 104,
92 105, 106, 107, 108, 109, 110,
93 114, 115, 116, 117, 118, 119, 120,
94 121, 122, 123, 124, 125, 126,
95 130, 131, 132, 133, 134, 135, 136,
96 137, 138, 139, 140, 141, 142,
97 146, 147, 148, 149, 150, 151, 152,
98 153, 154, 155, 156, 157, 158,
99 162, 163, 164, 165, 166, 167, 168,
100 169, 170, 171, 172, 173, 174,
101 178, 179, 180, 181, 182, 183, 184,
102 185, 186, 187, 188, 189, 190,
103 194, 195, 196, 197, 198, 199, 200,
104 201, 202, 203, 204, 205, 206,
105 210, 211, 212, 213, 214, 215, 216,
106 217, 218, 219, 220, 221, 222,
107 226, 227, 228, 229, 230, 231, 232,
108 233, 234, 235, 236, 237, 238,
109 242, 243, 244, 245, 246, 247, 248,
110 249, 250, 251, 252, 253, 254
111 },
112 .oobfree = {
113 {.offset = 15, .length = 3},
114 {.offset = 31, .length = 3},
115 {.offset = 47, .length = 3},
116 {.offset = 63, .length = 3},
117 {.offset = 79, .length = 3},
118 {.offset = 95, .length = 3},
119 {.offset = 111, .length = 3},
120 {.offset = 127, .length = 3},
121 {.offset = 143, .length = 3},
122 {.offset = 159, .length = 3},
123 {.offset = 175, .length = 3},
124 {.offset = 191, .length = 3},
125 {.offset = 207, .length = 3},
126 {.offset = 223, .length = 3},
127 {.offset = 239, .length = 3},
128 {.offset = 255, .length = 1}
129 }
130};
131
132/*
Armando Visconti0c78e932012-03-07 17:00:55 +0530133 * ECC4 layout for NAND of pagesize 4096 bytes & OOBsize 224 bytes. 13*8 bytes
134 * of OOB size is reserved for ECC, Byte no. 0 & 1 reserved for bad block & 118
135 * bytes are free for use.
136 */
137static struct nand_ecclayout fsmc_ecc4_224_layout = {
138 .eccbytes = 104,
139 .eccpos = { 2, 3, 4, 5, 6, 7, 8,
140 9, 10, 11, 12, 13, 14,
141 18, 19, 20, 21, 22, 23, 24,
142 25, 26, 27, 28, 29, 30,
143 34, 35, 36, 37, 38, 39, 40,
144 41, 42, 43, 44, 45, 46,
145 50, 51, 52, 53, 54, 55, 56,
146 57, 58, 59, 60, 61, 62,
147 66, 67, 68, 69, 70, 71, 72,
148 73, 74, 75, 76, 77, 78,
149 82, 83, 84, 85, 86, 87, 88,
150 89, 90, 91, 92, 93, 94,
151 98, 99, 100, 101, 102, 103, 104,
152 105, 106, 107, 108, 109, 110,
153 114, 115, 116, 117, 118, 119, 120,
154 121, 122, 123, 124, 125, 126
155 },
156 .oobfree = {
157 {.offset = 15, .length = 3},
158 {.offset = 31, .length = 3},
159 {.offset = 47, .length = 3},
160 {.offset = 63, .length = 3},
161 {.offset = 79, .length = 3},
162 {.offset = 95, .length = 3},
163 {.offset = 111, .length = 3},
164 {.offset = 127, .length = 97}
165 }
166};
167
168/*
Bhavna Yadave29ee572012-03-07 17:00:50 +0530169 * ECC4 layout for NAND of pagesize 4096 bytes & OOBsize 128 bytes. 13*8 bytes
170 * of OOB size is reserved for ECC, Byte no. 0 & 1 reserved for bad block & 22
171 * bytes are free for use.
172 */
173static struct nand_ecclayout fsmc_ecc4_128_layout = {
Linus Walleij6c009ab2010-09-13 00:35:22 +0200174 .eccbytes = 104,
175 .eccpos = { 2, 3, 4, 5, 6, 7, 8,
176 9, 10, 11, 12, 13, 14,
177 18, 19, 20, 21, 22, 23, 24,
178 25, 26, 27, 28, 29, 30,
179 34, 35, 36, 37, 38, 39, 40,
180 41, 42, 43, 44, 45, 46,
181 50, 51, 52, 53, 54, 55, 56,
182 57, 58, 59, 60, 61, 62,
183 66, 67, 68, 69, 70, 71, 72,
184 73, 74, 75, 76, 77, 78,
185 82, 83, 84, 85, 86, 87, 88,
186 89, 90, 91, 92, 93, 94,
187 98, 99, 100, 101, 102, 103, 104,
188 105, 106, 107, 108, 109, 110,
189 114, 115, 116, 117, 118, 119, 120,
190 121, 122, 123, 124, 125, 126
191 },
192 .oobfree = {
193 {.offset = 15, .length = 3},
194 {.offset = 31, .length = 3},
195 {.offset = 47, .length = 3},
196 {.offset = 63, .length = 3},
197 {.offset = 79, .length = 3},
198 {.offset = 95, .length = 3},
199 {.offset = 111, .length = 3},
200 {.offset = 127, .length = 1}
201 }
202};
203
204/*
Bhavna Yadave29ee572012-03-07 17:00:50 +0530205 * ECC4 layout for NAND of pagesize 2048 bytes & OOBsize 64 bytes. 13*4 bytes of
206 * OOB size is reserved for ECC, Byte no. 0 & 1 reserved for bad block and 10
207 * bytes are free for use.
208 */
209static struct nand_ecclayout fsmc_ecc4_64_layout = {
210 .eccbytes = 52,
211 .eccpos = { 2, 3, 4, 5, 6, 7, 8,
212 9, 10, 11, 12, 13, 14,
213 18, 19, 20, 21, 22, 23, 24,
214 25, 26, 27, 28, 29, 30,
215 34, 35, 36, 37, 38, 39, 40,
216 41, 42, 43, 44, 45, 46,
217 50, 51, 52, 53, 54, 55, 56,
218 57, 58, 59, 60, 61, 62,
219 },
220 .oobfree = {
221 {.offset = 15, .length = 3},
222 {.offset = 31, .length = 3},
223 {.offset = 47, .length = 3},
224 {.offset = 63, .length = 1},
225 }
226};
227
228/*
229 * ECC4 layout for NAND of pagesize 512 bytes & OOBsize 16 bytes. 13 bytes of
230 * OOB size is reserved for ECC, Byte no. 4 & 5 reserved for bad block and One
231 * byte is free for use.
232 */
233static struct nand_ecclayout fsmc_ecc4_16_layout = {
234 .eccbytes = 13,
235 .eccpos = { 0, 1, 2, 3, 6, 7, 8,
236 9, 10, 11, 12, 13, 14
237 },
238 .oobfree = {
239 {.offset = 15, .length = 1},
240 }
241};
242
243/*
Linus Walleij6c009ab2010-09-13 00:35:22 +0200244 * ECC placement definitions in oobfree type format.
245 * There are 13 bytes of ecc for every 512 byte block and it has to be read
246 * consecutively and immediately after the 512 byte data block for hardware to
247 * generate the error bit offsets in 512 byte data.
248 * Managing the ecc bytes in the following way makes it easier for software to
249 * read ecc bytes consecutive to data bytes. This way is similar to
250 * oobfree structure maintained already in generic nand driver
251 */
252static struct fsmc_eccplace fsmc_ecc4_lp_place = {
253 .eccplace = {
254 {.offset = 2, .length = 13},
255 {.offset = 18, .length = 13},
256 {.offset = 34, .length = 13},
257 {.offset = 50, .length = 13},
258 {.offset = 66, .length = 13},
259 {.offset = 82, .length = 13},
260 {.offset = 98, .length = 13},
261 {.offset = 114, .length = 13}
262 }
263};
264
Linus Walleij6c009ab2010-09-13 00:35:22 +0200265static struct fsmc_eccplace fsmc_ecc4_sp_place = {
266 .eccplace = {
267 {.offset = 0, .length = 4},
268 {.offset = 6, .length = 9}
269 }
270};
271
Linus Walleij6c009ab2010-09-13 00:35:22 +0200272/**
Linus Walleij593cd872010-11-29 13:52:19 +0100273 * struct fsmc_nand_data - structure for FSMC NAND device state
Linus Walleij6c009ab2010-09-13 00:35:22 +0200274 *
Linus Walleij593cd872010-11-29 13:52:19 +0100275 * @pid: Part ID on the AMBA PrimeCell format
Linus Walleij6c009ab2010-09-13 00:35:22 +0200276 * @mtd: MTD info for a NAND flash.
277 * @nand: Chip related info for a NAND flash.
Vipin Kumar71470322012-03-14 11:47:07 +0530278 * @partitions: Partition info for a NAND Flash.
279 * @nr_partitions: Total number of partition of a NAND flash.
Linus Walleij6c009ab2010-09-13 00:35:22 +0200280 *
281 * @ecc_place: ECC placing locations in oobfree type format.
282 * @bank: Bank number for probed device.
283 * @clk: Clock structure for FSMC.
284 *
285 * @data_va: NAND port for Data.
286 * @cmd_va: NAND port for Command.
287 * @addr_va: NAND port for Address.
288 * @regs_va: FSMC regs base address.
289 */
290struct fsmc_nand_data {
Linus Walleij593cd872010-11-29 13:52:19 +0100291 u32 pid;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200292 struct mtd_info mtd;
293 struct nand_chip nand;
Vipin Kumar71470322012-03-14 11:47:07 +0530294 struct mtd_partition *partitions;
295 unsigned int nr_partitions;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200296
297 struct fsmc_eccplace *ecc_place;
298 unsigned int bank;
299 struct clk *clk;
300
301 struct resource *resregs;
302 struct resource *rescmd;
303 struct resource *resaddr;
304 struct resource *resdata;
305
306 void __iomem *data_va;
307 void __iomem *cmd_va;
308 void __iomem *addr_va;
309 void __iomem *regs_va;
310
311 void (*select_chip)(uint32_t bank, uint32_t busw);
312};
313
314/* Assert CS signal based on chipnr */
315static void fsmc_select_chip(struct mtd_info *mtd, int chipnr)
316{
317 struct nand_chip *chip = mtd->priv;
318 struct fsmc_nand_data *host;
319
320 host = container_of(mtd, struct fsmc_nand_data, mtd);
321
322 switch (chipnr) {
323 case -1:
324 chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
325 break;
326 case 0:
327 case 1:
328 case 2:
329 case 3:
330 if (host->select_chip)
331 host->select_chip(chipnr,
332 chip->options & NAND_BUSWIDTH_16);
333 break;
334
335 default:
336 BUG();
337 }
338}
339
340/*
341 * fsmc_cmd_ctrl - For facilitaing Hardware access
342 * This routine allows hardware specific access to control-lines(ALE,CLE)
343 */
344static void fsmc_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
345{
346 struct nand_chip *this = mtd->priv;
347 struct fsmc_nand_data *host = container_of(mtd,
348 struct fsmc_nand_data, mtd);
349 struct fsmc_regs *regs = host->regs_va;
350 unsigned int bank = host->bank;
351
352 if (ctrl & NAND_CTRL_CHANGE) {
353 if (ctrl & NAND_CLE) {
354 this->IO_ADDR_R = (void __iomem *)host->cmd_va;
355 this->IO_ADDR_W = (void __iomem *)host->cmd_va;
356 } else if (ctrl & NAND_ALE) {
357 this->IO_ADDR_R = (void __iomem *)host->addr_va;
358 this->IO_ADDR_W = (void __iomem *)host->addr_va;
359 } else {
360 this->IO_ADDR_R = (void __iomem *)host->data_va;
361 this->IO_ADDR_W = (void __iomem *)host->data_va;
362 }
363
364 if (ctrl & NAND_NCE) {
365 writel(readl(&regs->bank_regs[bank].pc) | FSMC_ENABLE,
366 &regs->bank_regs[bank].pc);
367 } else {
368 writel(readl(&regs->bank_regs[bank].pc) & ~FSMC_ENABLE,
369 &regs->bank_regs[bank].pc);
370 }
371 }
372
373 mb();
374
375 if (cmd != NAND_CMD_NONE)
376 writeb(cmd, this->IO_ADDR_W);
377}
378
379/*
380 * fsmc_nand_setup - FSMC (Flexible Static Memory Controller) init routine
381 *
382 * This routine initializes timing parameters related to NAND memory access in
383 * FSMC registers
384 */
385static void __init fsmc_nand_setup(struct fsmc_regs *regs, uint32_t bank,
386 uint32_t busw)
387{
388 uint32_t value = FSMC_DEVTYPE_NAND | FSMC_ENABLE | FSMC_WAITON;
389
390 if (busw)
391 writel(value | FSMC_DEVWID_16, &regs->bank_regs[bank].pc);
392 else
393 writel(value | FSMC_DEVWID_8, &regs->bank_regs[bank].pc);
394
395 writel(readl(&regs->bank_regs[bank].pc) | FSMC_TCLR_1 | FSMC_TAR_1,
396 &regs->bank_regs[bank].pc);
397 writel(FSMC_THIZ_1 | FSMC_THOLD_4 | FSMC_TWAIT_6 | FSMC_TSET_0,
398 &regs->bank_regs[bank].comm);
399 writel(FSMC_THIZ_1 | FSMC_THOLD_4 | FSMC_TWAIT_6 | FSMC_TSET_0,
400 &regs->bank_regs[bank].attrib);
401}
402
403/*
404 * fsmc_enable_hwecc - Enables Hardware ECC through FSMC registers
405 */
406static void fsmc_enable_hwecc(struct mtd_info *mtd, int mode)
407{
408 struct fsmc_nand_data *host = container_of(mtd,
409 struct fsmc_nand_data, mtd);
410 struct fsmc_regs *regs = host->regs_va;
411 uint32_t bank = host->bank;
412
413 writel(readl(&regs->bank_regs[bank].pc) & ~FSMC_ECCPLEN_256,
414 &regs->bank_regs[bank].pc);
415 writel(readl(&regs->bank_regs[bank].pc) & ~FSMC_ECCEN,
416 &regs->bank_regs[bank].pc);
417 writel(readl(&regs->bank_regs[bank].pc) | FSMC_ECCEN,
418 &regs->bank_regs[bank].pc);
419}
420
421/*
422 * fsmc_read_hwecc_ecc4 - Hardware ECC calculator for ecc4 option supported by
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300423 * FSMC. ECC is 13 bytes for 512 bytes of data (supports error correction up to
Linus Walleij6c009ab2010-09-13 00:35:22 +0200424 * max of 8-bits)
425 */
426static int fsmc_read_hwecc_ecc4(struct mtd_info *mtd, const uint8_t *data,
427 uint8_t *ecc)
428{
429 struct fsmc_nand_data *host = container_of(mtd,
430 struct fsmc_nand_data, mtd);
431 struct fsmc_regs *regs = host->regs_va;
432 uint32_t bank = host->bank;
433 uint32_t ecc_tmp;
434 unsigned long deadline = jiffies + FSMC_BUSY_WAIT_TIMEOUT;
435
436 do {
437 if (readl(&regs->bank_regs[bank].sts) & FSMC_CODE_RDY)
438 break;
439 else
440 cond_resched();
441 } while (!time_after_eq(jiffies, deadline));
442
443 ecc_tmp = readl(&regs->bank_regs[bank].ecc1);
444 ecc[0] = (uint8_t) (ecc_tmp >> 0);
445 ecc[1] = (uint8_t) (ecc_tmp >> 8);
446 ecc[2] = (uint8_t) (ecc_tmp >> 16);
447 ecc[3] = (uint8_t) (ecc_tmp >> 24);
448
449 ecc_tmp = readl(&regs->bank_regs[bank].ecc2);
450 ecc[4] = (uint8_t) (ecc_tmp >> 0);
451 ecc[5] = (uint8_t) (ecc_tmp >> 8);
452 ecc[6] = (uint8_t) (ecc_tmp >> 16);
453 ecc[7] = (uint8_t) (ecc_tmp >> 24);
454
455 ecc_tmp = readl(&regs->bank_regs[bank].ecc3);
456 ecc[8] = (uint8_t) (ecc_tmp >> 0);
457 ecc[9] = (uint8_t) (ecc_tmp >> 8);
458 ecc[10] = (uint8_t) (ecc_tmp >> 16);
459 ecc[11] = (uint8_t) (ecc_tmp >> 24);
460
461 ecc_tmp = readl(&regs->bank_regs[bank].sts);
462 ecc[12] = (uint8_t) (ecc_tmp >> 16);
463
464 return 0;
465}
466
467/*
468 * fsmc_read_hwecc_ecc1 - Hardware ECC calculator for ecc1 option supported by
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300469 * FSMC. ECC is 3 bytes for 512 bytes of data (supports error correction up to
Linus Walleij6c009ab2010-09-13 00:35:22 +0200470 * max of 1-bit)
471 */
472static int fsmc_read_hwecc_ecc1(struct mtd_info *mtd, const uint8_t *data,
473 uint8_t *ecc)
474{
475 struct fsmc_nand_data *host = container_of(mtd,
476 struct fsmc_nand_data, mtd);
477 struct fsmc_regs *regs = host->regs_va;
478 uint32_t bank = host->bank;
479 uint32_t ecc_tmp;
480
481 ecc_tmp = readl(&regs->bank_regs[bank].ecc1);
482 ecc[0] = (uint8_t) (ecc_tmp >> 0);
483 ecc[1] = (uint8_t) (ecc_tmp >> 8);
484 ecc[2] = (uint8_t) (ecc_tmp >> 16);
485
486 return 0;
487}
488
Vipin Kumar519300c2012-03-07 17:00:49 +0530489/* Count the number of 0's in buff upto a max of max_bits */
490static int count_written_bits(uint8_t *buff, int size, int max_bits)
491{
492 int k, written_bits = 0;
493
494 for (k = 0; k < size; k++) {
495 written_bits += hweight8(~buff[k]);
496 if (written_bits > max_bits)
497 break;
498 }
499
500 return written_bits;
501}
502
Linus Walleij6c009ab2010-09-13 00:35:22 +0200503/*
504 * fsmc_read_page_hwecc
505 * @mtd: mtd info structure
506 * @chip: nand chip info structure
507 * @buf: buffer to store read data
508 * @page: page number to read
509 *
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300510 * This routine is needed for fsmc version 8 as reading from NAND chip has to be
Linus Walleij6c009ab2010-09-13 00:35:22 +0200511 * performed in a strict sequence as follows:
512 * data(512 byte) -> ecc(13 byte)
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300513 * After this read, fsmc hardware generates and reports error data bits(up to a
Linus Walleij6c009ab2010-09-13 00:35:22 +0200514 * max of 8 bits)
515 */
516static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
517 uint8_t *buf, int page)
518{
519 struct fsmc_nand_data *host = container_of(mtd,
520 struct fsmc_nand_data, mtd);
521 struct fsmc_eccplace *ecc_place = host->ecc_place;
522 int i, j, s, stat, eccsize = chip->ecc.size;
523 int eccbytes = chip->ecc.bytes;
524 int eccsteps = chip->ecc.steps;
525 uint8_t *p = buf;
526 uint8_t *ecc_calc = chip->buffers->ecccalc;
527 uint8_t *ecc_code = chip->buffers->ecccode;
528 int off, len, group = 0;
529 /*
530 * ecc_oob is intentionally taken as uint16_t. In 16bit devices, we
531 * end up reading 14 bytes (7 words) from oob. The local array is
532 * to maintain word alignment
533 */
534 uint16_t ecc_oob[7];
535 uint8_t *oob = (uint8_t *)&ecc_oob[0];
536
537 for (i = 0, s = 0; s < eccsteps; s++, i += eccbytes, p += eccsize) {
Linus Walleij6c009ab2010-09-13 00:35:22 +0200538 chip->cmdfunc(mtd, NAND_CMD_READ0, s * eccsize, page);
539 chip->ecc.hwctl(mtd, NAND_ECC_READ);
540 chip->read_buf(mtd, p, eccsize);
541
542 for (j = 0; j < eccbytes;) {
543 off = ecc_place->eccplace[group].offset;
544 len = ecc_place->eccplace[group].length;
545 group++;
546
547 /*
Vipin Kumar4cbe1bf02012-03-14 11:47:09 +0530548 * length is intentionally kept a higher multiple of 2
549 * to read at least 13 bytes even in case of 16 bit NAND
550 * devices
551 */
Vipin Kumaraea686b2012-03-14 11:47:10 +0530552 if (chip->options & NAND_BUSWIDTH_16)
553 len = roundup(len, 2);
554
Linus Walleij6c009ab2010-09-13 00:35:22 +0200555 chip->cmdfunc(mtd, NAND_CMD_READOOB, off, page);
556 chip->read_buf(mtd, oob + j, len);
557 j += len;
558 }
559
Vipin Kumar519300c2012-03-07 17:00:49 +0530560 memcpy(&ecc_code[i], oob, chip->ecc.bytes);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200561 chip->ecc.calculate(mtd, p, &ecc_calc[i]);
562
563 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
564 if (stat < 0)
565 mtd->ecc_stats.failed++;
566 else
567 mtd->ecc_stats.corrected += stat;
568 }
569
570 return 0;
571}
572
573/*
Armando Visconti753e0132012-03-07 17:00:54 +0530574 * fsmc_bch8_correct_data
Linus Walleij6c009ab2010-09-13 00:35:22 +0200575 * @mtd: mtd info structure
576 * @dat: buffer of read data
577 * @read_ecc: ecc read from device spare area
578 * @calc_ecc: ecc calculated from read data
579 *
580 * calc_ecc is a 104 bit information containing maximum of 8 error
581 * offset informations of 13 bits each in 512 bytes of read data.
582 */
Armando Visconti753e0132012-03-07 17:00:54 +0530583static int fsmc_bch8_correct_data(struct mtd_info *mtd, uint8_t *dat,
Linus Walleij6c009ab2010-09-13 00:35:22 +0200584 uint8_t *read_ecc, uint8_t *calc_ecc)
585{
586 struct fsmc_nand_data *host = container_of(mtd,
587 struct fsmc_nand_data, mtd);
Vipin Kumar519300c2012-03-07 17:00:49 +0530588 struct nand_chip *chip = mtd->priv;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200589 struct fsmc_regs *regs = host->regs_va;
590 unsigned int bank = host->bank;
Armando Viscontia612c2a2012-03-07 17:00:53 +0530591 uint32_t err_idx[8];
Linus Walleij6c009ab2010-09-13 00:35:22 +0200592 uint32_t num_err, i;
Armando Visconti753e0132012-03-07 17:00:54 +0530593 uint32_t ecc1, ecc2, ecc3, ecc4;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200594
Vipin Kumar519300c2012-03-07 17:00:49 +0530595 num_err = (readl(&regs->bank_regs[bank].sts) >> 10) & 0xF;
596
597 /* no bit flipping */
598 if (likely(num_err == 0))
599 return 0;
600
601 /* too many errors */
602 if (unlikely(num_err > 8)) {
603 /*
604 * This is a temporary erase check. A newly erased page read
605 * would result in an ecc error because the oob data is also
606 * erased to FF and the calculated ecc for an FF data is not
607 * FF..FF.
608 * This is a workaround to skip performing correction in case
609 * data is FF..FF
610 *
611 * Logic:
612 * For every page, each bit written as 0 is counted until these
613 * number of bits are greater than 8 (the maximum correction
614 * capability of FSMC for each 512 + 13 bytes)
615 */
616
617 int bits_ecc = count_written_bits(read_ecc, chip->ecc.bytes, 8);
618 int bits_data = count_written_bits(dat, chip->ecc.size, 8);
619
620 if ((bits_ecc + bits_data) <= 8) {
621 if (bits_data)
622 memset(dat, 0xff, chip->ecc.size);
623 return bits_data;
624 }
625
626 return -EBADMSG;
627 }
628
Linus Walleij6c009ab2010-09-13 00:35:22 +0200629 /*
630 * ------------------- calc_ecc[] bit wise -----------|--13 bits--|
631 * |---idx[7]--|--.....-----|---idx[2]--||---idx[1]--||---idx[0]--|
632 *
633 * calc_ecc is a 104 bit information containing maximum of 8 error
634 * offset informations of 13 bits each. calc_ecc is copied into a
635 * uint64_t array and error offset indexes are populated in err_idx
636 * array
637 */
Armando Visconti753e0132012-03-07 17:00:54 +0530638 ecc1 = readl(&regs->bank_regs[bank].ecc1);
639 ecc2 = readl(&regs->bank_regs[bank].ecc2);
640 ecc3 = readl(&regs->bank_regs[bank].ecc3);
641 ecc4 = readl(&regs->bank_regs[bank].sts);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200642
Armando Visconti753e0132012-03-07 17:00:54 +0530643 err_idx[0] = (ecc1 >> 0) & 0x1FFF;
644 err_idx[1] = (ecc1 >> 13) & 0x1FFF;
645 err_idx[2] = (((ecc2 >> 0) & 0x7F) << 6) | ((ecc1 >> 26) & 0x3F);
646 err_idx[3] = (ecc2 >> 7) & 0x1FFF;
647 err_idx[4] = (((ecc3 >> 0) & 0x1) << 12) | ((ecc2 >> 20) & 0xFFF);
648 err_idx[5] = (ecc3 >> 1) & 0x1FFF;
649 err_idx[6] = (ecc3 >> 14) & 0x1FFF;
650 err_idx[7] = (((ecc4 >> 16) & 0xFF) << 5) | ((ecc3 >> 27) & 0x1F);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200651
652 i = 0;
653 while (num_err--) {
654 change_bit(0, (unsigned long *)&err_idx[i]);
655 change_bit(1, (unsigned long *)&err_idx[i]);
656
Vipin Kumarb533f8d2012-03-14 11:47:11 +0530657 if (err_idx[i] < chip->ecc.size * 8) {
Linus Walleij6c009ab2010-09-13 00:35:22 +0200658 change_bit(err_idx[i], (unsigned long *)dat);
659 i++;
660 }
661 }
662 return i;
663}
664
665/*
666 * fsmc_nand_probe - Probe function
667 * @pdev: platform device structure
668 */
669static int __init fsmc_nand_probe(struct platform_device *pdev)
670{
671 struct fsmc_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
672 struct fsmc_nand_data *host;
673 struct mtd_info *mtd;
674 struct nand_chip *nand;
675 struct fsmc_regs *regs;
676 struct resource *res;
Linus Walleij4ad916b2010-11-29 13:52:06 +0100677 int ret = 0;
Linus Walleij593cd872010-11-29 13:52:19 +0100678 u32 pid;
679 int i;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200680
681 if (!pdata) {
682 dev_err(&pdev->dev, "platform data is NULL\n");
683 return -EINVAL;
684 }
685
686 /* Allocate memory for the device structure (and zero it) */
687 host = kzalloc(sizeof(*host), GFP_KERNEL);
688 if (!host) {
689 dev_err(&pdev->dev, "failed to allocate device structure\n");
690 return -ENOMEM;
691 }
692
693 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand_data");
694 if (!res) {
695 ret = -EIO;
696 goto err_probe1;
697 }
698
699 host->resdata = request_mem_region(res->start, resource_size(res),
700 pdev->name);
701 if (!host->resdata) {
702 ret = -EIO;
703 goto err_probe1;
704 }
705
706 host->data_va = ioremap(res->start, resource_size(res));
707 if (!host->data_va) {
708 ret = -EIO;
709 goto err_probe1;
710 }
711
Shiraz Hashimb2acc922012-03-07 17:00:51 +0530712 host->resaddr = request_mem_region(res->start + pdata->ale_off,
Linus Walleij6c009ab2010-09-13 00:35:22 +0200713 resource_size(res), pdev->name);
714 if (!host->resaddr) {
715 ret = -EIO;
716 goto err_probe1;
717 }
718
Shiraz Hashimb2acc922012-03-07 17:00:51 +0530719 host->addr_va = ioremap(res->start + pdata->ale_off,
720 resource_size(res));
Linus Walleij6c009ab2010-09-13 00:35:22 +0200721 if (!host->addr_va) {
722 ret = -EIO;
723 goto err_probe1;
724 }
725
Shiraz Hashimb2acc922012-03-07 17:00:51 +0530726 host->rescmd = request_mem_region(res->start + pdata->cle_off,
Linus Walleij6c009ab2010-09-13 00:35:22 +0200727 resource_size(res), pdev->name);
728 if (!host->rescmd) {
729 ret = -EIO;
730 goto err_probe1;
731 }
732
Shiraz Hashimb2acc922012-03-07 17:00:51 +0530733 host->cmd_va = ioremap(res->start + pdata->cle_off, resource_size(res));
Linus Walleij6c009ab2010-09-13 00:35:22 +0200734 if (!host->cmd_va) {
735 ret = -EIO;
736 goto err_probe1;
737 }
738
739 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fsmc_regs");
740 if (!res) {
741 ret = -EIO;
742 goto err_probe1;
743 }
744
745 host->resregs = request_mem_region(res->start, resource_size(res),
746 pdev->name);
747 if (!host->resregs) {
748 ret = -EIO;
749 goto err_probe1;
750 }
751
752 host->regs_va = ioremap(res->start, resource_size(res));
753 if (!host->regs_va) {
754 ret = -EIO;
755 goto err_probe1;
756 }
757
758 host->clk = clk_get(&pdev->dev, NULL);
759 if (IS_ERR(host->clk)) {
760 dev_err(&pdev->dev, "failed to fetch block clock\n");
761 ret = PTR_ERR(host->clk);
762 host->clk = NULL;
763 goto err_probe1;
764 }
765
766 ret = clk_enable(host->clk);
767 if (ret)
768 goto err_probe1;
769
Linus Walleij593cd872010-11-29 13:52:19 +0100770 /*
771 * This device ID is actually a common AMBA ID as used on the
772 * AMBA PrimeCell bus. However it is not a PrimeCell.
773 */
774 for (pid = 0, i = 0; i < 4; i++)
775 pid |= (readl(host->regs_va + resource_size(res) - 0x20 + 4 * i) & 255) << (i * 8);
776 host->pid = pid;
777 dev_info(&pdev->dev, "FSMC device partno %03x, manufacturer %02x, "
778 "revision %02x, config %02x\n",
779 AMBA_PART_BITS(pid), AMBA_MANF_BITS(pid),
780 AMBA_REV_BITS(pid), AMBA_CONFIG_BITS(pid));
781
Linus Walleij6c009ab2010-09-13 00:35:22 +0200782 host->bank = pdata->bank;
783 host->select_chip = pdata->select_bank;
Vipin Kumar71470322012-03-14 11:47:07 +0530784 host->partitions = pdata->partitions;
785 host->nr_partitions = pdata->nr_partitions;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200786 regs = host->regs_va;
787
788 /* Link all private pointers */
789 mtd = &host->mtd;
790 nand = &host->nand;
791 mtd->priv = nand;
792 nand->priv = host;
793
794 host->mtd.owner = THIS_MODULE;
795 nand->IO_ADDR_R = host->data_va;
796 nand->IO_ADDR_W = host->data_va;
797 nand->cmd_ctrl = fsmc_cmd_ctrl;
798 nand->chip_delay = 30;
799
800 nand->ecc.mode = NAND_ECC_HW;
801 nand->ecc.hwctl = fsmc_enable_hwecc;
802 nand->ecc.size = 512;
803 nand->options = pdata->options;
804 nand->select_chip = fsmc_select_chip;
Vipin Kumar467e6e72012-03-14 11:47:12 +0530805 nand->badblockbits = 7;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200806
807 if (pdata->width == FSMC_NAND_BW16)
808 nand->options |= NAND_BUSWIDTH_16;
809
810 fsmc_nand_setup(regs, host->bank, nand->options & NAND_BUSWIDTH_16);
811
Linus Walleij593cd872010-11-29 13:52:19 +0100812 if (AMBA_REV_BITS(host->pid) >= 8) {
Linus Walleij6c009ab2010-09-13 00:35:22 +0200813 nand->ecc.read_page = fsmc_read_page_hwecc;
814 nand->ecc.calculate = fsmc_read_hwecc_ecc4;
Armando Visconti753e0132012-03-07 17:00:54 +0530815 nand->ecc.correct = fsmc_bch8_correct_data;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200816 nand->ecc.bytes = 13;
Mike Dunn6a918ba2012-03-11 14:21:11 -0700817 nand->ecc.strength = 8;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200818 } else {
819 nand->ecc.calculate = fsmc_read_hwecc_ecc1;
820 nand->ecc.correct = nand_correct_data;
821 nand->ecc.bytes = 3;
Mike Dunn6a918ba2012-03-11 14:21:11 -0700822 nand->ecc.strength = 1;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200823 }
824
825 /*
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300826 * Scan to find existence of the device
Linus Walleij6c009ab2010-09-13 00:35:22 +0200827 */
828 if (nand_scan_ident(&host->mtd, 1, NULL)) {
829 ret = -ENXIO;
830 dev_err(&pdev->dev, "No NAND Device found!\n");
831 goto err_probe;
832 }
833
Linus Walleij593cd872010-11-29 13:52:19 +0100834 if (AMBA_REV_BITS(host->pid) >= 8) {
Bhavna Yadave29ee572012-03-07 17:00:50 +0530835 switch (host->mtd.oobsize) {
836 case 16:
837 nand->ecc.layout = &fsmc_ecc4_16_layout;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200838 host->ecc_place = &fsmc_ecc4_sp_place;
Bhavna Yadave29ee572012-03-07 17:00:50 +0530839 break;
840 case 64:
841 nand->ecc.layout = &fsmc_ecc4_64_layout;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200842 host->ecc_place = &fsmc_ecc4_lp_place;
Bhavna Yadave29ee572012-03-07 17:00:50 +0530843 break;
844 case 128:
845 nand->ecc.layout = &fsmc_ecc4_128_layout;
846 host->ecc_place = &fsmc_ecc4_lp_place;
847 break;
Armando Visconti0c78e932012-03-07 17:00:55 +0530848 case 224:
849 nand->ecc.layout = &fsmc_ecc4_224_layout;
850 host->ecc_place = &fsmc_ecc4_lp_place;
851 break;
Bhavna Yadave29ee572012-03-07 17:00:50 +0530852 case 256:
853 nand->ecc.layout = &fsmc_ecc4_256_layout;
854 host->ecc_place = &fsmc_ecc4_lp_place;
855 break;
856 default:
857 printk(KERN_WARNING "No oob scheme defined for "
858 "oobsize %d\n", mtd->oobsize);
859 BUG();
Linus Walleij6c009ab2010-09-13 00:35:22 +0200860 }
861 } else {
Bhavna Yadave29ee572012-03-07 17:00:50 +0530862 switch (host->mtd.oobsize) {
863 case 16:
864 nand->ecc.layout = &fsmc_ecc1_16_layout;
865 break;
866 case 64:
867 nand->ecc.layout = &fsmc_ecc1_64_layout;
868 break;
869 case 128:
870 nand->ecc.layout = &fsmc_ecc1_128_layout;
871 break;
872 default:
873 printk(KERN_WARNING "No oob scheme defined for "
874 "oobsize %d\n", mtd->oobsize);
875 BUG();
876 }
Linus Walleij6c009ab2010-09-13 00:35:22 +0200877 }
878
879 /* Second stage of scan to fill MTD data-structures */
880 if (nand_scan_tail(&host->mtd)) {
881 ret = -ENXIO;
882 goto err_probe;
883 }
884
885 /*
886 * The partition information can is accessed by (in the same precedence)
887 *
888 * command line through Bootloader,
889 * platform data,
890 * default partition information present in driver.
891 */
Linus Walleij6c009ab2010-09-13 00:35:22 +0200892 /*
Dmitry Eremin-Solenikov8d3f8bb2011-05-29 20:16:57 +0400893 * Check for partition info passed
Linus Walleij6c009ab2010-09-13 00:35:22 +0200894 */
895 host->mtd.name = "nand";
Artem Bityutskiy42d7fbe2012-03-09 19:24:26 +0200896 ret = mtd_device_parse_register(&host->mtd, NULL, NULL,
Vipin Kumar71470322012-03-14 11:47:07 +0530897 host->partitions, host->nr_partitions);
Jamie Iles99335d02011-05-23 10:23:23 +0100898 if (ret)
Linus Walleij6c009ab2010-09-13 00:35:22 +0200899 goto err_probe;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200900
901 platform_set_drvdata(pdev, host);
902 dev_info(&pdev->dev, "FSMC NAND driver registration successful\n");
903 return 0;
904
905err_probe:
906 clk_disable(host->clk);
907err_probe1:
908 if (host->clk)
909 clk_put(host->clk);
910 if (host->regs_va)
911 iounmap(host->regs_va);
912 if (host->resregs)
913 release_mem_region(host->resregs->start,
914 resource_size(host->resregs));
915 if (host->cmd_va)
916 iounmap(host->cmd_va);
917 if (host->rescmd)
918 release_mem_region(host->rescmd->start,
919 resource_size(host->rescmd));
920 if (host->addr_va)
921 iounmap(host->addr_va);
922 if (host->resaddr)
923 release_mem_region(host->resaddr->start,
924 resource_size(host->resaddr));
925 if (host->data_va)
926 iounmap(host->data_va);
927 if (host->resdata)
928 release_mem_region(host->resdata->start,
929 resource_size(host->resdata));
930
931 kfree(host);
932 return ret;
933}
934
935/*
936 * Clean up routine
937 */
938static int fsmc_nand_remove(struct platform_device *pdev)
939{
940 struct fsmc_nand_data *host = platform_get_drvdata(pdev);
941
942 platform_set_drvdata(pdev, NULL);
943
944 if (host) {
Axel Lin82e023a2011-06-03 13:15:30 +0800945 nand_release(&host->mtd);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200946 clk_disable(host->clk);
947 clk_put(host->clk);
948
949 iounmap(host->regs_va);
950 release_mem_region(host->resregs->start,
951 resource_size(host->resregs));
952 iounmap(host->cmd_va);
953 release_mem_region(host->rescmd->start,
954 resource_size(host->rescmd));
955 iounmap(host->addr_va);
956 release_mem_region(host->resaddr->start,
957 resource_size(host->resaddr));
958 iounmap(host->data_va);
959 release_mem_region(host->resdata->start,
960 resource_size(host->resdata));
961
962 kfree(host);
963 }
964 return 0;
965}
966
967#ifdef CONFIG_PM
968static int fsmc_nand_suspend(struct device *dev)
969{
970 struct fsmc_nand_data *host = dev_get_drvdata(dev);
971 if (host)
972 clk_disable(host->clk);
973 return 0;
974}
975
976static int fsmc_nand_resume(struct device *dev)
977{
978 struct fsmc_nand_data *host = dev_get_drvdata(dev);
979 if (host)
980 clk_enable(host->clk);
981 return 0;
982}
983
984static const struct dev_pm_ops fsmc_nand_pm_ops = {
985 .suspend = fsmc_nand_suspend,
986 .resume = fsmc_nand_resume,
987};
988#endif
989
990static struct platform_driver fsmc_nand_driver = {
991 .remove = fsmc_nand_remove,
992 .driver = {
993 .owner = THIS_MODULE,
994 .name = "fsmc-nand",
995#ifdef CONFIG_PM
996 .pm = &fsmc_nand_pm_ops,
997#endif
998 },
999};
1000
1001static int __init fsmc_nand_init(void)
1002{
1003 return platform_driver_probe(&fsmc_nand_driver,
1004 fsmc_nand_probe);
1005}
1006module_init(fsmc_nand_init);
1007
1008static void __exit fsmc_nand_exit(void)
1009{
1010 platform_driver_unregister(&fsmc_nand_driver);
1011}
1012module_exit(fsmc_nand_exit);
1013
1014MODULE_LICENSE("GPL");
1015MODULE_AUTHOR("Vipin Kumar <vipin.kumar@st.com>, Ashish Priyadarshi");
1016MODULE_DESCRIPTION("NAND driver for SPEAr Platforms");