2 * drivers/mtd/nand/fsmc_nand.c
5 * Flexible Static Memory Controller (FSMC)
6 * Driver for NAND portions
8 * Copyright © 2010 ST Microelectronics
9 * Vipin Kumar <vipin.kumar@st.com>
12 * Based on drivers/mtd/nand/nomadik_nand.c
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.
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>
32 #include <linux/slab.h>
33 #include <linux/mtd/fsmc.h>
34 #include <linux/amba/bus.h>
35 #include <mtd/mtd-abi.h>
37 static struct nand_ecclayout fsmc_ecc1_layout
= {
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},
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}
53 static struct nand_ecclayout fsmc_ecc4_lp_layout
= {
55 .eccpos
= { 2, 3, 4, 5, 6, 7, 8,
56 9, 10, 11, 12, 13, 14,
57 18, 19, 20, 21, 22, 23, 24,
58 25, 26, 27, 28, 29, 30,
59 34, 35, 36, 37, 38, 39, 40,
60 41, 42, 43, 44, 45, 46,
61 50, 51, 52, 53, 54, 55, 56,
62 57, 58, 59, 60, 61, 62,
63 66, 67, 68, 69, 70, 71, 72,
64 73, 74, 75, 76, 77, 78,
65 82, 83, 84, 85, 86, 87, 88,
66 89, 90, 91, 92, 93, 94,
67 98, 99, 100, 101, 102, 103, 104,
68 105, 106, 107, 108, 109, 110,
69 114, 115, 116, 117, 118, 119, 120,
70 121, 122, 123, 124, 125, 126
73 {.offset
= 15, .length
= 3},
74 {.offset
= 31, .length
= 3},
75 {.offset
= 47, .length
= 3},
76 {.offset
= 63, .length
= 3},
77 {.offset
= 79, .length
= 3},
78 {.offset
= 95, .length
= 3},
79 {.offset
= 111, .length
= 3},
80 {.offset
= 127, .length
= 1}
85 * ECC placement definitions in oobfree type format.
86 * There are 13 bytes of ecc for every 512 byte block and it has to be read
87 * consecutively and immediately after the 512 byte data block for hardware to
88 * generate the error bit offsets in 512 byte data.
89 * Managing the ecc bytes in the following way makes it easier for software to
90 * read ecc bytes consecutive to data bytes. This way is similar to
91 * oobfree structure maintained already in generic nand driver
93 static struct fsmc_eccplace fsmc_ecc4_lp_place
= {
95 {.offset
= 2, .length
= 13},
96 {.offset
= 18, .length
= 13},
97 {.offset
= 34, .length
= 13},
98 {.offset
= 50, .length
= 13},
99 {.offset
= 66, .length
= 13},
100 {.offset
= 82, .length
= 13},
101 {.offset
= 98, .length
= 13},
102 {.offset
= 114, .length
= 13}
106 static struct nand_ecclayout fsmc_ecc4_sp_layout
= {
108 .eccpos
= { 0, 1, 2, 3, 6, 7, 8,
109 9, 10, 11, 12, 13, 14
112 {.offset
= 15, .length
= 1},
116 static struct fsmc_eccplace fsmc_ecc4_sp_place
= {
118 {.offset
= 0, .length
= 4},
119 {.offset
= 6, .length
= 9}
124 #ifdef CONFIG_MTD_PARTITIONS
126 * Default partition tables to be used if the partition information not
127 * provided through platform data.
129 * Default partition layout for small page(= 512 bytes) devices
130 * Size for "Root file system" is updated in driver based on actual device size
132 static struct mtd_partition partition_info_16KB_blk
[] = {
149 .name
= "Root File System",
156 * Default partition layout for large page(> 512 bytes) devices
157 * Size for "Root file system" is updated in driver based on actual device size
159 static struct mtd_partition partition_info_128KB_blk
[] = {
176 .name
= "Root File System",
182 #ifdef CONFIG_MTD_CMDLINE_PARTS
183 const char *part_probes
[] = { "cmdlinepart", NULL
};
188 * struct fsmc_nand_data - structure for FSMC NAND device state
190 * @pid: Part ID on the AMBA PrimeCell format
191 * @mtd: MTD info for a NAND flash.
192 * @nand: Chip related info for a NAND flash.
193 * @partitions: Partition info for a NAND Flash.
194 * @nr_partitions: Total number of partition of a NAND flash.
196 * @ecc_place: ECC placing locations in oobfree type format.
197 * @bank: Bank number for probed device.
198 * @clk: Clock structure for FSMC.
200 * @data_va: NAND port for Data.
201 * @cmd_va: NAND port for Command.
202 * @addr_va: NAND port for Address.
203 * @regs_va: FSMC regs base address.
205 struct fsmc_nand_data
{
208 struct nand_chip nand
;
209 struct mtd_partition
*partitions
;
210 unsigned int nr_partitions
;
212 struct fsmc_eccplace
*ecc_place
;
216 struct resource
*resregs
;
217 struct resource
*rescmd
;
218 struct resource
*resaddr
;
219 struct resource
*resdata
;
221 void __iomem
*data_va
;
222 void __iomem
*cmd_va
;
223 void __iomem
*addr_va
;
224 void __iomem
*regs_va
;
226 void (*select_chip
)(uint32_t bank
, uint32_t busw
);
229 /* Assert CS signal based on chipnr */
230 static void fsmc_select_chip(struct mtd_info
*mtd
, int chipnr
)
232 struct nand_chip
*chip
= mtd
->priv
;
233 struct fsmc_nand_data
*host
;
235 host
= container_of(mtd
, struct fsmc_nand_data
, mtd
);
239 chip
->cmd_ctrl(mtd
, NAND_CMD_NONE
, 0 | NAND_CTRL_CHANGE
);
245 if (host
->select_chip
)
246 host
->select_chip(chipnr
,
247 chip
->options
& NAND_BUSWIDTH_16
);
256 * fsmc_cmd_ctrl - For facilitaing Hardware access
257 * This routine allows hardware specific access to control-lines(ALE,CLE)
259 static void fsmc_cmd_ctrl(struct mtd_info
*mtd
, int cmd
, unsigned int ctrl
)
261 struct nand_chip
*this = mtd
->priv
;
262 struct fsmc_nand_data
*host
= container_of(mtd
,
263 struct fsmc_nand_data
, mtd
);
264 struct fsmc_regs
*regs
= host
->regs_va
;
265 unsigned int bank
= host
->bank
;
267 if (ctrl
& NAND_CTRL_CHANGE
) {
268 if (ctrl
& NAND_CLE
) {
269 this->IO_ADDR_R
= (void __iomem
*)host
->cmd_va
;
270 this->IO_ADDR_W
= (void __iomem
*)host
->cmd_va
;
271 } else if (ctrl
& NAND_ALE
) {
272 this->IO_ADDR_R
= (void __iomem
*)host
->addr_va
;
273 this->IO_ADDR_W
= (void __iomem
*)host
->addr_va
;
275 this->IO_ADDR_R
= (void __iomem
*)host
->data_va
;
276 this->IO_ADDR_W
= (void __iomem
*)host
->data_va
;
279 if (ctrl
& NAND_NCE
) {
280 writel(readl(®s
->bank_regs
[bank
].pc
) | FSMC_ENABLE
,
281 ®s
->bank_regs
[bank
].pc
);
283 writel(readl(®s
->bank_regs
[bank
].pc
) & ~FSMC_ENABLE
,
284 ®s
->bank_regs
[bank
].pc
);
290 if (cmd
!= NAND_CMD_NONE
)
291 writeb(cmd
, this->IO_ADDR_W
);
295 * fsmc_nand_setup - FSMC (Flexible Static Memory Controller) init routine
297 * This routine initializes timing parameters related to NAND memory access in
300 static void __init
fsmc_nand_setup(struct fsmc_regs
*regs
, uint32_t bank
,
303 uint32_t value
= FSMC_DEVTYPE_NAND
| FSMC_ENABLE
| FSMC_WAITON
;
306 writel(value
| FSMC_DEVWID_16
, ®s
->bank_regs
[bank
].pc
);
308 writel(value
| FSMC_DEVWID_8
, ®s
->bank_regs
[bank
].pc
);
310 writel(readl(®s
->bank_regs
[bank
].pc
) | FSMC_TCLR_1
| FSMC_TAR_1
,
311 ®s
->bank_regs
[bank
].pc
);
312 writel(FSMC_THIZ_1
| FSMC_THOLD_4
| FSMC_TWAIT_6
| FSMC_TSET_0
,
313 ®s
->bank_regs
[bank
].comm
);
314 writel(FSMC_THIZ_1
| FSMC_THOLD_4
| FSMC_TWAIT_6
| FSMC_TSET_0
,
315 ®s
->bank_regs
[bank
].attrib
);
319 * fsmc_enable_hwecc - Enables Hardware ECC through FSMC registers
321 static void fsmc_enable_hwecc(struct mtd_info
*mtd
, int mode
)
323 struct fsmc_nand_data
*host
= container_of(mtd
,
324 struct fsmc_nand_data
, mtd
);
325 struct fsmc_regs
*regs
= host
->regs_va
;
326 uint32_t bank
= host
->bank
;
328 writel(readl(®s
->bank_regs
[bank
].pc
) & ~FSMC_ECCPLEN_256
,
329 ®s
->bank_regs
[bank
].pc
);
330 writel(readl(®s
->bank_regs
[bank
].pc
) & ~FSMC_ECCEN
,
331 ®s
->bank_regs
[bank
].pc
);
332 writel(readl(®s
->bank_regs
[bank
].pc
) | FSMC_ECCEN
,
333 ®s
->bank_regs
[bank
].pc
);
337 * fsmc_read_hwecc_ecc4 - Hardware ECC calculator for ecc4 option supported by
338 * FSMC. ECC is 13 bytes for 512 bytes of data (supports error correction up to
341 static int fsmc_read_hwecc_ecc4(struct mtd_info
*mtd
, const uint8_t *data
,
344 struct fsmc_nand_data
*host
= container_of(mtd
,
345 struct fsmc_nand_data
, mtd
);
346 struct fsmc_regs
*regs
= host
->regs_va
;
347 uint32_t bank
= host
->bank
;
349 unsigned long deadline
= jiffies
+ FSMC_BUSY_WAIT_TIMEOUT
;
352 if (readl(®s
->bank_regs
[bank
].sts
) & FSMC_CODE_RDY
)
356 } while (!time_after_eq(jiffies
, deadline
));
358 ecc_tmp
= readl(®s
->bank_regs
[bank
].ecc1
);
359 ecc
[0] = (uint8_t) (ecc_tmp
>> 0);
360 ecc
[1] = (uint8_t) (ecc_tmp
>> 8);
361 ecc
[2] = (uint8_t) (ecc_tmp
>> 16);
362 ecc
[3] = (uint8_t) (ecc_tmp
>> 24);
364 ecc_tmp
= readl(®s
->bank_regs
[bank
].ecc2
);
365 ecc
[4] = (uint8_t) (ecc_tmp
>> 0);
366 ecc
[5] = (uint8_t) (ecc_tmp
>> 8);
367 ecc
[6] = (uint8_t) (ecc_tmp
>> 16);
368 ecc
[7] = (uint8_t) (ecc_tmp
>> 24);
370 ecc_tmp
= readl(®s
->bank_regs
[bank
].ecc3
);
371 ecc
[8] = (uint8_t) (ecc_tmp
>> 0);
372 ecc
[9] = (uint8_t) (ecc_tmp
>> 8);
373 ecc
[10] = (uint8_t) (ecc_tmp
>> 16);
374 ecc
[11] = (uint8_t) (ecc_tmp
>> 24);
376 ecc_tmp
= readl(®s
->bank_regs
[bank
].sts
);
377 ecc
[12] = (uint8_t) (ecc_tmp
>> 16);
383 * fsmc_read_hwecc_ecc1 - Hardware ECC calculator for ecc1 option supported by
384 * FSMC. ECC is 3 bytes for 512 bytes of data (supports error correction up to
387 static int fsmc_read_hwecc_ecc1(struct mtd_info
*mtd
, const uint8_t *data
,
390 struct fsmc_nand_data
*host
= container_of(mtd
,
391 struct fsmc_nand_data
, mtd
);
392 struct fsmc_regs
*regs
= host
->regs_va
;
393 uint32_t bank
= host
->bank
;
396 ecc_tmp
= readl(®s
->bank_regs
[bank
].ecc1
);
397 ecc
[0] = (uint8_t) (ecc_tmp
>> 0);
398 ecc
[1] = (uint8_t) (ecc_tmp
>> 8);
399 ecc
[2] = (uint8_t) (ecc_tmp
>> 16);
405 * fsmc_read_page_hwecc
406 * @mtd: mtd info structure
407 * @chip: nand chip info structure
408 * @buf: buffer to store read data
409 * @page: page number to read
411 * This routine is needed for fsmc version 8 as reading from NAND chip has to be
412 * performed in a strict sequence as follows:
413 * data(512 byte) -> ecc(13 byte)
414 * After this read, fsmc hardware generates and reports error data bits(up to a
417 static int fsmc_read_page_hwecc(struct mtd_info
*mtd
, struct nand_chip
*chip
,
418 uint8_t *buf
, int page
)
420 struct fsmc_nand_data
*host
= container_of(mtd
,
421 struct fsmc_nand_data
, mtd
);
422 struct fsmc_eccplace
*ecc_place
= host
->ecc_place
;
423 int i
, j
, s
, stat
, eccsize
= chip
->ecc
.size
;
424 int eccbytes
= chip
->ecc
.bytes
;
425 int eccsteps
= chip
->ecc
.steps
;
427 uint8_t *ecc_calc
= chip
->buffers
->ecccalc
;
428 uint8_t *ecc_code
= chip
->buffers
->ecccode
;
429 int off
, len
, group
= 0;
431 * ecc_oob is intentionally taken as uint16_t. In 16bit devices, we
432 * end up reading 14 bytes (7 words) from oob. The local array is
433 * to maintain word alignment
436 uint8_t *oob
= (uint8_t *)&ecc_oob
[0];
438 for (i
= 0, s
= 0; s
< eccsteps
; s
++, i
+= eccbytes
, p
+= eccsize
) {
440 chip
->cmdfunc(mtd
, NAND_CMD_READ0
, s
* eccsize
, page
);
441 chip
->ecc
.hwctl(mtd
, NAND_ECC_READ
);
442 chip
->read_buf(mtd
, p
, eccsize
);
444 for (j
= 0; j
< eccbytes
;) {
445 off
= ecc_place
->eccplace
[group
].offset
;
446 len
= ecc_place
->eccplace
[group
].length
;
450 * length is intentionally kept a higher multiple of 2
451 * to read at least 13 bytes even in case of 16 bit NAND
454 len
= roundup(len
, 2);
455 chip
->cmdfunc(mtd
, NAND_CMD_READOOB
, off
, page
);
456 chip
->read_buf(mtd
, oob
+ j
, len
);
460 memcpy(&ecc_code
[i
], oob
, 13);
461 chip
->ecc
.calculate(mtd
, p
, &ecc_calc
[i
]);
463 stat
= chip
->ecc
.correct(mtd
, p
, &ecc_code
[i
], &ecc_calc
[i
]);
465 mtd
->ecc_stats
.failed
++;
467 mtd
->ecc_stats
.corrected
+= stat
;
475 * @mtd: mtd info structure
476 * @dat: buffer of read data
477 * @read_ecc: ecc read from device spare area
478 * @calc_ecc: ecc calculated from read data
480 * calc_ecc is a 104 bit information containing maximum of 8 error
481 * offset informations of 13 bits each in 512 bytes of read data.
483 static int fsmc_correct_data(struct mtd_info
*mtd
, uint8_t *dat
,
484 uint8_t *read_ecc
, uint8_t *calc_ecc
)
486 struct fsmc_nand_data
*host
= container_of(mtd
,
487 struct fsmc_nand_data
, mtd
);
488 struct fsmc_regs
*regs
= host
->regs_va
;
489 unsigned int bank
= host
->bank
;
491 uint64_t ecc_data
[2];
494 /* The calculated ecc is actually the correction index in data */
495 memcpy(ecc_data
, calc_ecc
, 13);
498 * ------------------- calc_ecc[] bit wise -----------|--13 bits--|
499 * |---idx[7]--|--.....-----|---idx[2]--||---idx[1]--||---idx[0]--|
501 * calc_ecc is a 104 bit information containing maximum of 8 error
502 * offset informations of 13 bits each. calc_ecc is copied into a
503 * uint64_t array and error offset indexes are populated in err_idx
506 for (i
= 0; i
< 8; i
++) {
508 err_idx
[4] = ((ecc_data
[1] & 0x1) << 12) | ecc_data
[0];
512 err_idx
[i
] = (ecc_data
[i
/4] & 0x1FFF);
513 ecc_data
[i
/4] >>= 13;
516 num_err
= (readl(®s
->bank_regs
[bank
].sts
) >> 10) & 0xF;
523 change_bit(0, (unsigned long *)&err_idx
[i
]);
524 change_bit(1, (unsigned long *)&err_idx
[i
]);
526 if (err_idx
[i
] <= 512 * 8) {
527 change_bit(err_idx
[i
], (unsigned long *)dat
);
535 * fsmc_nand_probe - Probe function
536 * @pdev: platform device structure
538 static int __init
fsmc_nand_probe(struct platform_device
*pdev
)
540 struct fsmc_nand_platform_data
*pdata
= dev_get_platdata(&pdev
->dev
);
541 struct fsmc_nand_data
*host
;
542 struct mtd_info
*mtd
;
543 struct nand_chip
*nand
;
544 struct fsmc_regs
*regs
;
545 struct resource
*res
;
551 dev_err(&pdev
->dev
, "platform data is NULL\n");
555 /* Allocate memory for the device structure (and zero it) */
556 host
= kzalloc(sizeof(*host
), GFP_KERNEL
);
558 dev_err(&pdev
->dev
, "failed to allocate device structure\n");
562 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "nand_data");
568 host
->resdata
= request_mem_region(res
->start
, resource_size(res
),
570 if (!host
->resdata
) {
575 host
->data_va
= ioremap(res
->start
, resource_size(res
));
576 if (!host
->data_va
) {
581 host
->resaddr
= request_mem_region(res
->start
+ PLAT_NAND_ALE
,
582 resource_size(res
), pdev
->name
);
583 if (!host
->resaddr
) {
588 host
->addr_va
= ioremap(res
->start
+ PLAT_NAND_ALE
, resource_size(res
));
589 if (!host
->addr_va
) {
594 host
->rescmd
= request_mem_region(res
->start
+ PLAT_NAND_CLE
,
595 resource_size(res
), pdev
->name
);
601 host
->cmd_va
= ioremap(res
->start
+ PLAT_NAND_CLE
, resource_size(res
));
607 res
= platform_get_resource_byname(pdev
, IORESOURCE_MEM
, "fsmc_regs");
613 host
->resregs
= request_mem_region(res
->start
, resource_size(res
),
615 if (!host
->resregs
) {
620 host
->regs_va
= ioremap(res
->start
, resource_size(res
));
621 if (!host
->regs_va
) {
626 host
->clk
= clk_get(&pdev
->dev
, NULL
);
627 if (IS_ERR(host
->clk
)) {
628 dev_err(&pdev
->dev
, "failed to fetch block clock\n");
629 ret
= PTR_ERR(host
->clk
);
634 ret
= clk_enable(host
->clk
);
639 * This device ID is actually a common AMBA ID as used on the
640 * AMBA PrimeCell bus. However it is not a PrimeCell.
642 for (pid
= 0, i
= 0; i
< 4; i
++)
643 pid
|= (readl(host
->regs_va
+ resource_size(res
) - 0x20 + 4 * i
) & 255) << (i
* 8);
645 dev_info(&pdev
->dev
, "FSMC device partno %03x, manufacturer %02x, "
646 "revision %02x, config %02x\n",
647 AMBA_PART_BITS(pid
), AMBA_MANF_BITS(pid
),
648 AMBA_REV_BITS(pid
), AMBA_CONFIG_BITS(pid
));
650 host
->bank
= pdata
->bank
;
651 host
->select_chip
= pdata
->select_bank
;
652 regs
= host
->regs_va
;
654 /* Link all private pointers */
660 host
->mtd
.owner
= THIS_MODULE
;
661 nand
->IO_ADDR_R
= host
->data_va
;
662 nand
->IO_ADDR_W
= host
->data_va
;
663 nand
->cmd_ctrl
= fsmc_cmd_ctrl
;
664 nand
->chip_delay
= 30;
666 nand
->ecc
.mode
= NAND_ECC_HW
;
667 nand
->ecc
.hwctl
= fsmc_enable_hwecc
;
668 nand
->ecc
.size
= 512;
669 nand
->options
= pdata
->options
;
670 nand
->select_chip
= fsmc_select_chip
;
672 if (pdata
->width
== FSMC_NAND_BW16
)
673 nand
->options
|= NAND_BUSWIDTH_16
;
675 fsmc_nand_setup(regs
, host
->bank
, nand
->options
& NAND_BUSWIDTH_16
);
677 if (AMBA_REV_BITS(host
->pid
) >= 8) {
678 nand
->ecc
.read_page
= fsmc_read_page_hwecc
;
679 nand
->ecc
.calculate
= fsmc_read_hwecc_ecc4
;
680 nand
->ecc
.correct
= fsmc_correct_data
;
681 nand
->ecc
.bytes
= 13;
683 nand
->ecc
.calculate
= fsmc_read_hwecc_ecc1
;
684 nand
->ecc
.correct
= nand_correct_data
;
689 * Scan to find existence of the device
691 if (nand_scan_ident(&host
->mtd
, 1, NULL
)) {
693 dev_err(&pdev
->dev
, "No NAND Device found!\n");
697 if (AMBA_REV_BITS(host
->pid
) >= 8) {
698 if (host
->mtd
.writesize
== 512) {
699 nand
->ecc
.layout
= &fsmc_ecc4_sp_layout
;
700 host
->ecc_place
= &fsmc_ecc4_sp_place
;
702 nand
->ecc
.layout
= &fsmc_ecc4_lp_layout
;
703 host
->ecc_place
= &fsmc_ecc4_lp_place
;
706 nand
->ecc
.layout
= &fsmc_ecc1_layout
;
709 /* Second stage of scan to fill MTD data-structures */
710 if (nand_scan_tail(&host
->mtd
)) {
716 * The partition information can is accessed by (in the same precedence)
718 * command line through Bootloader,
720 * default partition information present in driver.
722 #ifdef CONFIG_MTD_PARTITIONS
723 #ifdef CONFIG_MTD_CMDLINE_PARTS
725 * Check if partition info passed via command line
727 host
->mtd
.name
= "nand";
728 host
->nr_partitions
= parse_mtd_partitions(&host
->mtd
, part_probes
,
729 &host
->partitions
, 0);
730 if (host
->nr_partitions
<= 0) {
733 * Check if partition info passed via command line
735 if (pdata
->partitions
) {
736 host
->partitions
= pdata
->partitions
;
737 host
->nr_partitions
= pdata
->nr_partitions
;
739 struct mtd_partition
*partition
;
742 /* Select the default partitions info */
743 switch (host
->mtd
.size
) {
747 host
->partitions
= partition_info_16KB_blk
;
748 host
->nr_partitions
=
749 sizeof(partition_info_16KB_blk
) /
750 sizeof(struct mtd_partition
);
756 host
->partitions
= partition_info_128KB_blk
;
757 host
->nr_partitions
=
758 sizeof(partition_info_128KB_blk
) /
759 sizeof(struct mtd_partition
);
763 pr_err("Unsupported NAND size\n");
767 partition
= host
->partitions
;
768 for (i
= 0; i
< host
->nr_partitions
; i
++, partition
++) {
769 if (partition
->size
== 0) {
770 partition
->size
= host
->mtd
.size
-
776 #ifdef CONFIG_MTD_CMDLINE_PARTS
780 if (host
->partitions
) {
781 ret
= add_mtd_partitions(&host
->mtd
, host
->partitions
,
782 host
->nr_partitions
);
787 dev_info(&pdev
->dev
, "Registering %s as whole device\n", mtd
->name
);
788 if (!add_mtd_device(mtd
)) {
794 platform_set_drvdata(pdev
, host
);
795 dev_info(&pdev
->dev
, "FSMC NAND driver registration successful\n");
799 clk_disable(host
->clk
);
804 iounmap(host
->regs_va
);
806 release_mem_region(host
->resregs
->start
,
807 resource_size(host
->resregs
));
809 iounmap(host
->cmd_va
);
811 release_mem_region(host
->rescmd
->start
,
812 resource_size(host
->rescmd
));
814 iounmap(host
->addr_va
);
816 release_mem_region(host
->resaddr
->start
,
817 resource_size(host
->resaddr
));
819 iounmap(host
->data_va
);
821 release_mem_region(host
->resdata
->start
,
822 resource_size(host
->resdata
));
831 static int fsmc_nand_remove(struct platform_device
*pdev
)
833 struct fsmc_nand_data
*host
= platform_get_drvdata(pdev
);
835 platform_set_drvdata(pdev
, NULL
);
838 #ifdef CONFIG_MTD_PARTITIONS
839 del_mtd_partitions(&host
->mtd
);
841 del_mtd_device(&host
->mtd
);
843 clk_disable(host
->clk
);
846 iounmap(host
->regs_va
);
847 release_mem_region(host
->resregs
->start
,
848 resource_size(host
->resregs
));
849 iounmap(host
->cmd_va
);
850 release_mem_region(host
->rescmd
->start
,
851 resource_size(host
->rescmd
));
852 iounmap(host
->addr_va
);
853 release_mem_region(host
->resaddr
->start
,
854 resource_size(host
->resaddr
));
855 iounmap(host
->data_va
);
856 release_mem_region(host
->resdata
->start
,
857 resource_size(host
->resdata
));
865 static int fsmc_nand_suspend(struct device
*dev
)
867 struct fsmc_nand_data
*host
= dev_get_drvdata(dev
);
869 clk_disable(host
->clk
);
873 static int fsmc_nand_resume(struct device
*dev
)
875 struct fsmc_nand_data
*host
= dev_get_drvdata(dev
);
877 clk_enable(host
->clk
);
881 static const struct dev_pm_ops fsmc_nand_pm_ops
= {
882 .suspend
= fsmc_nand_suspend
,
883 .resume
= fsmc_nand_resume
,
887 static struct platform_driver fsmc_nand_driver
= {
888 .remove
= fsmc_nand_remove
,
890 .owner
= THIS_MODULE
,
893 .pm
= &fsmc_nand_pm_ops
,
898 static int __init
fsmc_nand_init(void)
900 return platform_driver_probe(&fsmc_nand_driver
,
903 module_init(fsmc_nand_init
);
905 static void __exit
fsmc_nand_exit(void)
907 platform_driver_unregister(&fsmc_nand_driver
);
909 module_exit(fsmc_nand_exit
);
911 MODULE_LICENSE("GPL");
912 MODULE_AUTHOR("Vipin Kumar <vipin.kumar@st.com>, Ashish Priyadarshi");
913 MODULE_DESCRIPTION("NAND driver for SPEAr Platforms");