blob: 81fc8e6b8cb8a528866d99c9cfd8a1cd03e7701a [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;
Vipin Kumar712c4ad2012-03-14 11:47:16 +0530299 struct device *dev;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200300 struct clk *clk;
301
Vipin Kumare2f6bce2012-03-14 11:47:14 +0530302 struct fsmc_nand_timings *dev_timings;
303
Linus Walleij6c009ab2010-09-13 00:35:22 +0200304 void __iomem *data_va;
305 void __iomem *cmd_va;
306 void __iomem *addr_va;
307 void __iomem *regs_va;
308
309 void (*select_chip)(uint32_t bank, uint32_t busw);
310};
311
312/* Assert CS signal based on chipnr */
313static void fsmc_select_chip(struct mtd_info *mtd, int chipnr)
314{
315 struct nand_chip *chip = mtd->priv;
316 struct fsmc_nand_data *host;
317
318 host = container_of(mtd, struct fsmc_nand_data, mtd);
319
320 switch (chipnr) {
321 case -1:
322 chip->cmd_ctrl(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
323 break;
324 case 0:
325 case 1:
326 case 2:
327 case 3:
328 if (host->select_chip)
329 host->select_chip(chipnr,
330 chip->options & NAND_BUSWIDTH_16);
331 break;
332
333 default:
334 BUG();
335 }
336}
337
338/*
339 * fsmc_cmd_ctrl - For facilitaing Hardware access
340 * This routine allows hardware specific access to control-lines(ALE,CLE)
341 */
342static void fsmc_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
343{
344 struct nand_chip *this = mtd->priv;
345 struct fsmc_nand_data *host = container_of(mtd,
346 struct fsmc_nand_data, mtd);
347 struct fsmc_regs *regs = host->regs_va;
348 unsigned int bank = host->bank;
349
350 if (ctrl & NAND_CTRL_CHANGE) {
351 if (ctrl & NAND_CLE) {
352 this->IO_ADDR_R = (void __iomem *)host->cmd_va;
353 this->IO_ADDR_W = (void __iomem *)host->cmd_va;
354 } else if (ctrl & NAND_ALE) {
355 this->IO_ADDR_R = (void __iomem *)host->addr_va;
356 this->IO_ADDR_W = (void __iomem *)host->addr_va;
357 } else {
358 this->IO_ADDR_R = (void __iomem *)host->data_va;
359 this->IO_ADDR_W = (void __iomem *)host->data_va;
360 }
361
362 if (ctrl & NAND_NCE) {
363 writel(readl(&regs->bank_regs[bank].pc) | FSMC_ENABLE,
364 &regs->bank_regs[bank].pc);
365 } else {
366 writel(readl(&regs->bank_regs[bank].pc) & ~FSMC_ENABLE,
367 &regs->bank_regs[bank].pc);
368 }
369 }
370
371 mb();
372
373 if (cmd != NAND_CMD_NONE)
374 writeb(cmd, this->IO_ADDR_W);
375}
376
377/*
378 * fsmc_nand_setup - FSMC (Flexible Static Memory Controller) init routine
379 *
380 * This routine initializes timing parameters related to NAND memory access in
381 * FSMC registers
382 */
Shiraz Hashimf63acb72012-03-14 11:47:13 +0530383static void fsmc_nand_setup(struct fsmc_regs *regs, uint32_t bank,
Vipin Kumare2f6bce2012-03-14 11:47:14 +0530384 uint32_t busw, struct fsmc_nand_timings *timings)
Linus Walleij6c009ab2010-09-13 00:35:22 +0200385{
386 uint32_t value = FSMC_DEVTYPE_NAND | FSMC_ENABLE | FSMC_WAITON;
Vipin Kumare2f6bce2012-03-14 11:47:14 +0530387 uint32_t tclr, tar, thiz, thold, twait, tset;
388 struct fsmc_nand_timings *tims;
389 struct fsmc_nand_timings default_timings = {
390 .tclr = FSMC_TCLR_1,
391 .tar = FSMC_TAR_1,
392 .thiz = FSMC_THIZ_1,
393 .thold = FSMC_THOLD_4,
394 .twait = FSMC_TWAIT_6,
395 .tset = FSMC_TSET_0,
396 };
397
398 if (timings)
399 tims = timings;
400 else
401 tims = &default_timings;
402
403 tclr = (tims->tclr & FSMC_TCLR_MASK) << FSMC_TCLR_SHIFT;
404 tar = (tims->tar & FSMC_TAR_MASK) << FSMC_TAR_SHIFT;
405 thiz = (tims->thiz & FSMC_THIZ_MASK) << FSMC_THIZ_SHIFT;
406 thold = (tims->thold & FSMC_THOLD_MASK) << FSMC_THOLD_SHIFT;
407 twait = (tims->twait & FSMC_TWAIT_MASK) << FSMC_TWAIT_SHIFT;
408 tset = (tims->tset & FSMC_TSET_MASK) << FSMC_TSET_SHIFT;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200409
410 if (busw)
411 writel(value | FSMC_DEVWID_16, &regs->bank_regs[bank].pc);
412 else
413 writel(value | FSMC_DEVWID_8, &regs->bank_regs[bank].pc);
414
Vipin Kumare2f6bce2012-03-14 11:47:14 +0530415 writel(readl(&regs->bank_regs[bank].pc) | tclr | tar,
Linus Walleij6c009ab2010-09-13 00:35:22 +0200416 &regs->bank_regs[bank].pc);
Vipin Kumare2f6bce2012-03-14 11:47:14 +0530417 writel(thiz | thold | twait | tset, &regs->bank_regs[bank].comm);
418 writel(thiz | thold | twait | tset, &regs->bank_regs[bank].attrib);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200419}
420
421/*
422 * fsmc_enable_hwecc - Enables Hardware ECC through FSMC registers
423 */
424static void fsmc_enable_hwecc(struct mtd_info *mtd, int mode)
425{
426 struct fsmc_nand_data *host = container_of(mtd,
427 struct fsmc_nand_data, mtd);
428 struct fsmc_regs *regs = host->regs_va;
429 uint32_t bank = host->bank;
430
431 writel(readl(&regs->bank_regs[bank].pc) & ~FSMC_ECCPLEN_256,
432 &regs->bank_regs[bank].pc);
433 writel(readl(&regs->bank_regs[bank].pc) & ~FSMC_ECCEN,
434 &regs->bank_regs[bank].pc);
435 writel(readl(&regs->bank_regs[bank].pc) | FSMC_ECCEN,
436 &regs->bank_regs[bank].pc);
437}
438
439/*
440 * fsmc_read_hwecc_ecc4 - Hardware ECC calculator for ecc4 option supported by
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300441 * FSMC. ECC is 13 bytes for 512 bytes of data (supports error correction up to
Linus Walleij6c009ab2010-09-13 00:35:22 +0200442 * max of 8-bits)
443 */
444static int fsmc_read_hwecc_ecc4(struct mtd_info *mtd, const uint8_t *data,
445 uint8_t *ecc)
446{
447 struct fsmc_nand_data *host = container_of(mtd,
448 struct fsmc_nand_data, mtd);
449 struct fsmc_regs *regs = host->regs_va;
450 uint32_t bank = host->bank;
451 uint32_t ecc_tmp;
452 unsigned long deadline = jiffies + FSMC_BUSY_WAIT_TIMEOUT;
453
454 do {
455 if (readl(&regs->bank_regs[bank].sts) & FSMC_CODE_RDY)
456 break;
457 else
458 cond_resched();
459 } while (!time_after_eq(jiffies, deadline));
460
Vipin Kumar712c4ad2012-03-14 11:47:16 +0530461 if (time_after_eq(jiffies, deadline)) {
462 dev_err(host->dev, "calculate ecc timed out\n");
463 return -ETIMEDOUT;
464 }
465
Linus Walleij6c009ab2010-09-13 00:35:22 +0200466 ecc_tmp = readl(&regs->bank_regs[bank].ecc1);
467 ecc[0] = (uint8_t) (ecc_tmp >> 0);
468 ecc[1] = (uint8_t) (ecc_tmp >> 8);
469 ecc[2] = (uint8_t) (ecc_tmp >> 16);
470 ecc[3] = (uint8_t) (ecc_tmp >> 24);
471
472 ecc_tmp = readl(&regs->bank_regs[bank].ecc2);
473 ecc[4] = (uint8_t) (ecc_tmp >> 0);
474 ecc[5] = (uint8_t) (ecc_tmp >> 8);
475 ecc[6] = (uint8_t) (ecc_tmp >> 16);
476 ecc[7] = (uint8_t) (ecc_tmp >> 24);
477
478 ecc_tmp = readl(&regs->bank_regs[bank].ecc3);
479 ecc[8] = (uint8_t) (ecc_tmp >> 0);
480 ecc[9] = (uint8_t) (ecc_tmp >> 8);
481 ecc[10] = (uint8_t) (ecc_tmp >> 16);
482 ecc[11] = (uint8_t) (ecc_tmp >> 24);
483
484 ecc_tmp = readl(&regs->bank_regs[bank].sts);
485 ecc[12] = (uint8_t) (ecc_tmp >> 16);
486
487 return 0;
488}
489
490/*
491 * fsmc_read_hwecc_ecc1 - Hardware ECC calculator for ecc1 option supported by
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300492 * FSMC. ECC is 3 bytes for 512 bytes of data (supports error correction up to
Linus Walleij6c009ab2010-09-13 00:35:22 +0200493 * max of 1-bit)
494 */
495static int fsmc_read_hwecc_ecc1(struct mtd_info *mtd, const uint8_t *data,
496 uint8_t *ecc)
497{
498 struct fsmc_nand_data *host = container_of(mtd,
499 struct fsmc_nand_data, mtd);
500 struct fsmc_regs *regs = host->regs_va;
501 uint32_t bank = host->bank;
502 uint32_t ecc_tmp;
503
504 ecc_tmp = readl(&regs->bank_regs[bank].ecc1);
505 ecc[0] = (uint8_t) (ecc_tmp >> 0);
506 ecc[1] = (uint8_t) (ecc_tmp >> 8);
507 ecc[2] = (uint8_t) (ecc_tmp >> 16);
508
509 return 0;
510}
511
Vipin Kumar519300c2012-03-07 17:00:49 +0530512/* Count the number of 0's in buff upto a max of max_bits */
513static int count_written_bits(uint8_t *buff, int size, int max_bits)
514{
515 int k, written_bits = 0;
516
517 for (k = 0; k < size; k++) {
518 written_bits += hweight8(~buff[k]);
519 if (written_bits > max_bits)
520 break;
521 }
522
523 return written_bits;
524}
525
Linus Walleij6c009ab2010-09-13 00:35:22 +0200526/*
Vipin Kumar604e7542012-03-14 11:47:17 +0530527 * fsmc_write_buf - write buffer to chip
528 * @mtd: MTD device structure
529 * @buf: data buffer
530 * @len: number of bytes to write
531 */
532static void fsmc_write_buf(struct mtd_info *mtd, const uint8_t *buf, int len)
533{
534 int i;
535 struct nand_chip *chip = mtd->priv;
536
537 if (IS_ALIGNED((uint32_t)buf, sizeof(uint32_t)) &&
538 IS_ALIGNED(len, sizeof(uint32_t))) {
539 uint32_t *p = (uint32_t *)buf;
540 len = len >> 2;
541 for (i = 0; i < len; i++)
542 writel(p[i], chip->IO_ADDR_W);
543 } else {
544 for (i = 0; i < len; i++)
545 writeb(buf[i], chip->IO_ADDR_W);
546 }
547}
548
549/*
550 * fsmc_read_buf - read chip data into buffer
551 * @mtd: MTD device structure
552 * @buf: buffer to store date
553 * @len: number of bytes to read
554 */
555static void fsmc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
556{
557 int i;
558 struct nand_chip *chip = mtd->priv;
559
560 if (IS_ALIGNED((uint32_t)buf, sizeof(uint32_t)) &&
561 IS_ALIGNED(len, sizeof(uint32_t))) {
562 uint32_t *p = (uint32_t *)buf;
563 len = len >> 2;
564 for (i = 0; i < len; i++)
565 p[i] = readl(chip->IO_ADDR_R);
566 } else {
567 for (i = 0; i < len; i++)
568 buf[i] = readb(chip->IO_ADDR_R);
569 }
570}
571
572/*
Linus Walleij6c009ab2010-09-13 00:35:22 +0200573 * fsmc_read_page_hwecc
574 * @mtd: mtd info structure
575 * @chip: nand chip info structure
576 * @buf: buffer to store read data
577 * @page: page number to read
578 *
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300579 * This routine is needed for fsmc version 8 as reading from NAND chip has to be
Linus Walleij6c009ab2010-09-13 00:35:22 +0200580 * performed in a strict sequence as follows:
581 * data(512 byte) -> ecc(13 byte)
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300582 * After this read, fsmc hardware generates and reports error data bits(up to a
Linus Walleij6c009ab2010-09-13 00:35:22 +0200583 * max of 8 bits)
584 */
585static int fsmc_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
586 uint8_t *buf, int page)
587{
588 struct fsmc_nand_data *host = container_of(mtd,
589 struct fsmc_nand_data, mtd);
590 struct fsmc_eccplace *ecc_place = host->ecc_place;
591 int i, j, s, stat, eccsize = chip->ecc.size;
592 int eccbytes = chip->ecc.bytes;
593 int eccsteps = chip->ecc.steps;
594 uint8_t *p = buf;
595 uint8_t *ecc_calc = chip->buffers->ecccalc;
596 uint8_t *ecc_code = chip->buffers->ecccode;
597 int off, len, group = 0;
598 /*
599 * ecc_oob is intentionally taken as uint16_t. In 16bit devices, we
600 * end up reading 14 bytes (7 words) from oob. The local array is
601 * to maintain word alignment
602 */
603 uint16_t ecc_oob[7];
604 uint8_t *oob = (uint8_t *)&ecc_oob[0];
605
606 for (i = 0, s = 0; s < eccsteps; s++, i += eccbytes, p += eccsize) {
Linus Walleij6c009ab2010-09-13 00:35:22 +0200607 chip->cmdfunc(mtd, NAND_CMD_READ0, s * eccsize, page);
608 chip->ecc.hwctl(mtd, NAND_ECC_READ);
609 chip->read_buf(mtd, p, eccsize);
610
611 for (j = 0; j < eccbytes;) {
612 off = ecc_place->eccplace[group].offset;
613 len = ecc_place->eccplace[group].length;
614 group++;
615
616 /*
Vipin Kumar4cbe1bf02012-03-14 11:47:09 +0530617 * length is intentionally kept a higher multiple of 2
618 * to read at least 13 bytes even in case of 16 bit NAND
619 * devices
620 */
Vipin Kumaraea686b2012-03-14 11:47:10 +0530621 if (chip->options & NAND_BUSWIDTH_16)
622 len = roundup(len, 2);
623
Linus Walleij6c009ab2010-09-13 00:35:22 +0200624 chip->cmdfunc(mtd, NAND_CMD_READOOB, off, page);
625 chip->read_buf(mtd, oob + j, len);
626 j += len;
627 }
628
Vipin Kumar519300c2012-03-07 17:00:49 +0530629 memcpy(&ecc_code[i], oob, chip->ecc.bytes);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200630 chip->ecc.calculate(mtd, p, &ecc_calc[i]);
631
632 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
633 if (stat < 0)
634 mtd->ecc_stats.failed++;
635 else
636 mtd->ecc_stats.corrected += stat;
637 }
638
639 return 0;
640}
641
642/*
Armando Visconti753e0132012-03-07 17:00:54 +0530643 * fsmc_bch8_correct_data
Linus Walleij6c009ab2010-09-13 00:35:22 +0200644 * @mtd: mtd info structure
645 * @dat: buffer of read data
646 * @read_ecc: ecc read from device spare area
647 * @calc_ecc: ecc calculated from read data
648 *
649 * calc_ecc is a 104 bit information containing maximum of 8 error
650 * offset informations of 13 bits each in 512 bytes of read data.
651 */
Armando Visconti753e0132012-03-07 17:00:54 +0530652static int fsmc_bch8_correct_data(struct mtd_info *mtd, uint8_t *dat,
Linus Walleij6c009ab2010-09-13 00:35:22 +0200653 uint8_t *read_ecc, uint8_t *calc_ecc)
654{
655 struct fsmc_nand_data *host = container_of(mtd,
656 struct fsmc_nand_data, mtd);
Vipin Kumar519300c2012-03-07 17:00:49 +0530657 struct nand_chip *chip = mtd->priv;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200658 struct fsmc_regs *regs = host->regs_va;
659 unsigned int bank = host->bank;
Armando Viscontia612c2a2012-03-07 17:00:53 +0530660 uint32_t err_idx[8];
Linus Walleij6c009ab2010-09-13 00:35:22 +0200661 uint32_t num_err, i;
Armando Visconti753e0132012-03-07 17:00:54 +0530662 uint32_t ecc1, ecc2, ecc3, ecc4;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200663
Vipin Kumar519300c2012-03-07 17:00:49 +0530664 num_err = (readl(&regs->bank_regs[bank].sts) >> 10) & 0xF;
665
666 /* no bit flipping */
667 if (likely(num_err == 0))
668 return 0;
669
670 /* too many errors */
671 if (unlikely(num_err > 8)) {
672 /*
673 * This is a temporary erase check. A newly erased page read
674 * would result in an ecc error because the oob data is also
675 * erased to FF and the calculated ecc for an FF data is not
676 * FF..FF.
677 * This is a workaround to skip performing correction in case
678 * data is FF..FF
679 *
680 * Logic:
681 * For every page, each bit written as 0 is counted until these
682 * number of bits are greater than 8 (the maximum correction
683 * capability of FSMC for each 512 + 13 bytes)
684 */
685
686 int bits_ecc = count_written_bits(read_ecc, chip->ecc.bytes, 8);
687 int bits_data = count_written_bits(dat, chip->ecc.size, 8);
688
689 if ((bits_ecc + bits_data) <= 8) {
690 if (bits_data)
691 memset(dat, 0xff, chip->ecc.size);
692 return bits_data;
693 }
694
695 return -EBADMSG;
696 }
697
Linus Walleij6c009ab2010-09-13 00:35:22 +0200698 /*
699 * ------------------- calc_ecc[] bit wise -----------|--13 bits--|
700 * |---idx[7]--|--.....-----|---idx[2]--||---idx[1]--||---idx[0]--|
701 *
702 * calc_ecc is a 104 bit information containing maximum of 8 error
703 * offset informations of 13 bits each. calc_ecc is copied into a
704 * uint64_t array and error offset indexes are populated in err_idx
705 * array
706 */
Armando Visconti753e0132012-03-07 17:00:54 +0530707 ecc1 = readl(&regs->bank_regs[bank].ecc1);
708 ecc2 = readl(&regs->bank_regs[bank].ecc2);
709 ecc3 = readl(&regs->bank_regs[bank].ecc3);
710 ecc4 = readl(&regs->bank_regs[bank].sts);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200711
Armando Visconti753e0132012-03-07 17:00:54 +0530712 err_idx[0] = (ecc1 >> 0) & 0x1FFF;
713 err_idx[1] = (ecc1 >> 13) & 0x1FFF;
714 err_idx[2] = (((ecc2 >> 0) & 0x7F) << 6) | ((ecc1 >> 26) & 0x3F);
715 err_idx[3] = (ecc2 >> 7) & 0x1FFF;
716 err_idx[4] = (((ecc3 >> 0) & 0x1) << 12) | ((ecc2 >> 20) & 0xFFF);
717 err_idx[5] = (ecc3 >> 1) & 0x1FFF;
718 err_idx[6] = (ecc3 >> 14) & 0x1FFF;
719 err_idx[7] = (((ecc4 >> 16) & 0xFF) << 5) | ((ecc3 >> 27) & 0x1F);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200720
721 i = 0;
722 while (num_err--) {
723 change_bit(0, (unsigned long *)&err_idx[i]);
724 change_bit(1, (unsigned long *)&err_idx[i]);
725
Vipin Kumarb533f8d2012-03-14 11:47:11 +0530726 if (err_idx[i] < chip->ecc.size * 8) {
Linus Walleij6c009ab2010-09-13 00:35:22 +0200727 change_bit(err_idx[i], (unsigned long *)dat);
728 i++;
729 }
730 }
731 return i;
732}
733
734/*
735 * fsmc_nand_probe - Probe function
736 * @pdev: platform device structure
737 */
738static int __init fsmc_nand_probe(struct platform_device *pdev)
739{
740 struct fsmc_nand_platform_data *pdata = dev_get_platdata(&pdev->dev);
741 struct fsmc_nand_data *host;
742 struct mtd_info *mtd;
743 struct nand_chip *nand;
744 struct fsmc_regs *regs;
745 struct resource *res;
Linus Walleij4ad916b2010-11-29 13:52:06 +0100746 int ret = 0;
Linus Walleij593cd872010-11-29 13:52:19 +0100747 u32 pid;
748 int i;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200749
750 if (!pdata) {
751 dev_err(&pdev->dev, "platform data is NULL\n");
752 return -EINVAL;
753 }
754
755 /* Allocate memory for the device structure (and zero it) */
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530756 host = devm_kzalloc(&pdev->dev, sizeof(*host), GFP_KERNEL);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200757 if (!host) {
758 dev_err(&pdev->dev, "failed to allocate device structure\n");
759 return -ENOMEM;
760 }
761
762 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "nand_data");
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530763 if (!res)
764 return -EINVAL;
765
766 if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
767 pdev->name)) {
768 dev_err(&pdev->dev, "Failed to get memory data resourse\n");
769 return -ENOENT;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200770 }
771
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530772 host->data_va = devm_ioremap(&pdev->dev, res->start,
773 resource_size(res));
Linus Walleij6c009ab2010-09-13 00:35:22 +0200774 if (!host->data_va) {
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530775 dev_err(&pdev->dev, "data ioremap failed\n");
776 return -ENOMEM;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200777 }
778
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530779 if (!devm_request_mem_region(&pdev->dev, res->start + pdata->ale_off,
780 resource_size(res), pdev->name)) {
781 dev_err(&pdev->dev, "Failed to get memory ale resourse\n");
782 return -ENOENT;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200783 }
784
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530785 host->addr_va = devm_ioremap(&pdev->dev, res->start + pdata->ale_off,
Shiraz Hashimb2acc922012-03-07 17:00:51 +0530786 resource_size(res));
Linus Walleij6c009ab2010-09-13 00:35:22 +0200787 if (!host->addr_va) {
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530788 dev_err(&pdev->dev, "ale ioremap failed\n");
789 return -ENOMEM;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200790 }
791
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530792 if (!devm_request_mem_region(&pdev->dev, res->start + pdata->cle_off,
793 resource_size(res), pdev->name)) {
794 dev_err(&pdev->dev, "Failed to get memory cle resourse\n");
795 return -ENOENT;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200796 }
797
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530798 host->cmd_va = devm_ioremap(&pdev->dev, res->start + pdata->cle_off,
799 resource_size(res));
Linus Walleij6c009ab2010-09-13 00:35:22 +0200800 if (!host->cmd_va) {
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530801 dev_err(&pdev->dev, "ale ioremap failed\n");
802 return -ENOMEM;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200803 }
804
805 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fsmc_regs");
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530806 if (!res)
807 return -EINVAL;
808
809 if (!devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
810 pdev->name)) {
811 dev_err(&pdev->dev, "Failed to get memory regs resourse\n");
812 return -ENOENT;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200813 }
814
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530815 host->regs_va = devm_ioremap(&pdev->dev, res->start,
816 resource_size(res));
Linus Walleij6c009ab2010-09-13 00:35:22 +0200817 if (!host->regs_va) {
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530818 dev_err(&pdev->dev, "regs ioremap failed\n");
819 return -ENOMEM;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200820 }
821
822 host->clk = clk_get(&pdev->dev, NULL);
823 if (IS_ERR(host->clk)) {
824 dev_err(&pdev->dev, "failed to fetch block clock\n");
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530825 return PTR_ERR(host->clk);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200826 }
827
828 ret = clk_enable(host->clk);
829 if (ret)
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530830 goto err_clk_enable;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200831
Linus Walleij593cd872010-11-29 13:52:19 +0100832 /*
833 * This device ID is actually a common AMBA ID as used on the
834 * AMBA PrimeCell bus. However it is not a PrimeCell.
835 */
836 for (pid = 0, i = 0; i < 4; i++)
837 pid |= (readl(host->regs_va + resource_size(res) - 0x20 + 4 * i) & 255) << (i * 8);
838 host->pid = pid;
839 dev_info(&pdev->dev, "FSMC device partno %03x, manufacturer %02x, "
840 "revision %02x, config %02x\n",
841 AMBA_PART_BITS(pid), AMBA_MANF_BITS(pid),
842 AMBA_REV_BITS(pid), AMBA_CONFIG_BITS(pid));
843
Linus Walleij6c009ab2010-09-13 00:35:22 +0200844 host->bank = pdata->bank;
845 host->select_chip = pdata->select_bank;
Vipin Kumar71470322012-03-14 11:47:07 +0530846 host->partitions = pdata->partitions;
847 host->nr_partitions = pdata->nr_partitions;
Vipin Kumar712c4ad2012-03-14 11:47:16 +0530848 host->dev = &pdev->dev;
Vipin Kumare2f6bce2012-03-14 11:47:14 +0530849 host->dev_timings = pdata->nand_timings;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200850 regs = host->regs_va;
851
852 /* Link all private pointers */
853 mtd = &host->mtd;
854 nand = &host->nand;
855 mtd->priv = nand;
856 nand->priv = host;
857
858 host->mtd.owner = THIS_MODULE;
859 nand->IO_ADDR_R = host->data_va;
860 nand->IO_ADDR_W = host->data_va;
861 nand->cmd_ctrl = fsmc_cmd_ctrl;
862 nand->chip_delay = 30;
863
864 nand->ecc.mode = NAND_ECC_HW;
865 nand->ecc.hwctl = fsmc_enable_hwecc;
866 nand->ecc.size = 512;
867 nand->options = pdata->options;
868 nand->select_chip = fsmc_select_chip;
Vipin Kumar467e6e72012-03-14 11:47:12 +0530869 nand->badblockbits = 7;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200870
871 if (pdata->width == FSMC_NAND_BW16)
872 nand->options |= NAND_BUSWIDTH_16;
873
Vipin Kumar604e7542012-03-14 11:47:17 +0530874 /*
875 * use customized (word by word) version of read_buf, write_buf if
876 * access_with_dev_width is reset supported
877 */
878 if (pdata->mode == USE_WORD_ACCESS) {
879 nand->read_buf = fsmc_read_buf;
880 nand->write_buf = fsmc_write_buf;
881 }
882
Vipin Kumare2f6bce2012-03-14 11:47:14 +0530883 fsmc_nand_setup(regs, host->bank, nand->options & NAND_BUSWIDTH_16,
884 host->dev_timings);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200885
Linus Walleij593cd872010-11-29 13:52:19 +0100886 if (AMBA_REV_BITS(host->pid) >= 8) {
Linus Walleij6c009ab2010-09-13 00:35:22 +0200887 nand->ecc.read_page = fsmc_read_page_hwecc;
888 nand->ecc.calculate = fsmc_read_hwecc_ecc4;
Armando Visconti753e0132012-03-07 17:00:54 +0530889 nand->ecc.correct = fsmc_bch8_correct_data;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200890 nand->ecc.bytes = 13;
Mike Dunn6a918ba2012-03-11 14:21:11 -0700891 nand->ecc.strength = 8;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200892 } else {
893 nand->ecc.calculate = fsmc_read_hwecc_ecc1;
894 nand->ecc.correct = nand_correct_data;
895 nand->ecc.bytes = 3;
Mike Dunn6a918ba2012-03-11 14:21:11 -0700896 nand->ecc.strength = 1;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200897 }
898
899 /*
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300900 * Scan to find existence of the device
Linus Walleij6c009ab2010-09-13 00:35:22 +0200901 */
902 if (nand_scan_ident(&host->mtd, 1, NULL)) {
903 ret = -ENXIO;
904 dev_err(&pdev->dev, "No NAND Device found!\n");
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530905 goto err_scan_ident;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200906 }
907
Linus Walleij593cd872010-11-29 13:52:19 +0100908 if (AMBA_REV_BITS(host->pid) >= 8) {
Bhavna Yadave29ee572012-03-07 17:00:50 +0530909 switch (host->mtd.oobsize) {
910 case 16:
911 nand->ecc.layout = &fsmc_ecc4_16_layout;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200912 host->ecc_place = &fsmc_ecc4_sp_place;
Bhavna Yadave29ee572012-03-07 17:00:50 +0530913 break;
914 case 64:
915 nand->ecc.layout = &fsmc_ecc4_64_layout;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200916 host->ecc_place = &fsmc_ecc4_lp_place;
Bhavna Yadave29ee572012-03-07 17:00:50 +0530917 break;
918 case 128:
919 nand->ecc.layout = &fsmc_ecc4_128_layout;
920 host->ecc_place = &fsmc_ecc4_lp_place;
921 break;
Armando Visconti0c78e932012-03-07 17:00:55 +0530922 case 224:
923 nand->ecc.layout = &fsmc_ecc4_224_layout;
924 host->ecc_place = &fsmc_ecc4_lp_place;
925 break;
Bhavna Yadave29ee572012-03-07 17:00:50 +0530926 case 256:
927 nand->ecc.layout = &fsmc_ecc4_256_layout;
928 host->ecc_place = &fsmc_ecc4_lp_place;
929 break;
930 default:
931 printk(KERN_WARNING "No oob scheme defined for "
932 "oobsize %d\n", mtd->oobsize);
933 BUG();
Linus Walleij6c009ab2010-09-13 00:35:22 +0200934 }
935 } else {
Bhavna Yadave29ee572012-03-07 17:00:50 +0530936 switch (host->mtd.oobsize) {
937 case 16:
938 nand->ecc.layout = &fsmc_ecc1_16_layout;
939 break;
940 case 64:
941 nand->ecc.layout = &fsmc_ecc1_64_layout;
942 break;
943 case 128:
944 nand->ecc.layout = &fsmc_ecc1_128_layout;
945 break;
946 default:
947 printk(KERN_WARNING "No oob scheme defined for "
948 "oobsize %d\n", mtd->oobsize);
949 BUG();
950 }
Linus Walleij6c009ab2010-09-13 00:35:22 +0200951 }
952
953 /* Second stage of scan to fill MTD data-structures */
954 if (nand_scan_tail(&host->mtd)) {
955 ret = -ENXIO;
956 goto err_probe;
957 }
958
959 /*
960 * The partition information can is accessed by (in the same precedence)
961 *
962 * command line through Bootloader,
963 * platform data,
964 * default partition information present in driver.
965 */
Linus Walleij6c009ab2010-09-13 00:35:22 +0200966 /*
Dmitry Eremin-Solenikov8d3f8bb2011-05-29 20:16:57 +0400967 * Check for partition info passed
Linus Walleij6c009ab2010-09-13 00:35:22 +0200968 */
969 host->mtd.name = "nand";
Artem Bityutskiy42d7fbe2012-03-09 19:24:26 +0200970 ret = mtd_device_parse_register(&host->mtd, NULL, NULL,
Vipin Kumar71470322012-03-14 11:47:07 +0530971 host->partitions, host->nr_partitions);
Jamie Iles99335d02011-05-23 10:23:23 +0100972 if (ret)
Linus Walleij6c009ab2010-09-13 00:35:22 +0200973 goto err_probe;
Linus Walleij6c009ab2010-09-13 00:35:22 +0200974
975 platform_set_drvdata(pdev, host);
976 dev_info(&pdev->dev, "FSMC NAND driver registration successful\n");
977 return 0;
978
979err_probe:
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530980err_scan_ident:
Linus Walleij6c009ab2010-09-13 00:35:22 +0200981 clk_disable(host->clk);
Vipin Kumar82b9dbe2012-03-14 11:47:15 +0530982err_clk_enable:
983 clk_put(host->clk);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200984 return ret;
985}
986
987/*
988 * Clean up routine
989 */
990static int fsmc_nand_remove(struct platform_device *pdev)
991{
992 struct fsmc_nand_data *host = platform_get_drvdata(pdev);
993
994 platform_set_drvdata(pdev, NULL);
995
996 if (host) {
Axel Lin82e023a2011-06-03 13:15:30 +0800997 nand_release(&host->mtd);
Linus Walleij6c009ab2010-09-13 00:35:22 +0200998 clk_disable(host->clk);
999 clk_put(host->clk);
Linus Walleij6c009ab2010-09-13 00:35:22 +02001000 }
Vipin Kumar82b9dbe2012-03-14 11:47:15 +05301001
Linus Walleij6c009ab2010-09-13 00:35:22 +02001002 return 0;
1003}
1004
1005#ifdef CONFIG_PM
1006static int fsmc_nand_suspend(struct device *dev)
1007{
1008 struct fsmc_nand_data *host = dev_get_drvdata(dev);
1009 if (host)
1010 clk_disable(host->clk);
1011 return 0;
1012}
1013
1014static int fsmc_nand_resume(struct device *dev)
1015{
1016 struct fsmc_nand_data *host = dev_get_drvdata(dev);
Shiraz Hashimf63acb72012-03-14 11:47:13 +05301017 if (host) {
Linus Walleij6c009ab2010-09-13 00:35:22 +02001018 clk_enable(host->clk);
Shiraz Hashimf63acb72012-03-14 11:47:13 +05301019 fsmc_nand_setup(host->regs_va, host->bank,
Vipin Kumare2f6bce2012-03-14 11:47:14 +05301020 host->nand.options & NAND_BUSWIDTH_16,
1021 host->dev_timings);
Shiraz Hashimf63acb72012-03-14 11:47:13 +05301022 }
Linus Walleij6c009ab2010-09-13 00:35:22 +02001023 return 0;
1024}
1025
Shiraz Hashimf63acb72012-03-14 11:47:13 +05301026static SIMPLE_DEV_PM_OPS(fsmc_nand_pm_ops, fsmc_nand_suspend, fsmc_nand_resume);
Linus Walleij6c009ab2010-09-13 00:35:22 +02001027#endif
1028
1029static struct platform_driver fsmc_nand_driver = {
1030 .remove = fsmc_nand_remove,
1031 .driver = {
1032 .owner = THIS_MODULE,
1033 .name = "fsmc-nand",
1034#ifdef CONFIG_PM
1035 .pm = &fsmc_nand_pm_ops,
1036#endif
1037 },
1038};
1039
1040static int __init fsmc_nand_init(void)
1041{
1042 return platform_driver_probe(&fsmc_nand_driver,
1043 fsmc_nand_probe);
1044}
1045module_init(fsmc_nand_init);
1046
1047static void __exit fsmc_nand_exit(void)
1048{
1049 platform_driver_unregister(&fsmc_nand_driver);
1050}
1051module_exit(fsmc_nand_exit);
1052
1053MODULE_LICENSE("GPL");
1054MODULE_AUTHOR("Vipin Kumar <vipin.kumar@st.com>, Ashish Priyadarshi");
1055MODULE_DESCRIPTION("NAND driver for SPEAr Platforms");