diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-22 19:56:22 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-22 19:56:22 -0400 |
commit | ac1b7c378ef26fba6694d5f118fe7fc16fee2fe2 (patch) | |
tree | 3f72979545bb070eb2c3e903cbf31dc4aef3ffc9 /drivers/mtd/nand/plat_nand.c | |
parent | 9e268beb92ee3a853b3946e84b10358207e2085f (diff) | |
parent | c90173f0907486fe4010c2a8cef534e2473db43f (diff) |
Merge git://git.infradead.org/mtd-2.6
* git://git.infradead.org/mtd-2.6: (63 commits)
mtd: OneNAND: Allow setting of boundary information when built as module
jffs2: leaking jffs2_summary in function jffs2_scan_medium
mtd: nand: Fix memory leak on txx9ndfmc probe failure.
mtd: orion_nand: use burst reads with double word accesses
mtd/nand: s3c6400 support for s3c2410 driver
[MTD] [NAND] S3C2410: Use DIV_ROUND_UP
[MTD] [NAND] S3C2410: Deal with unaligned lengths in S3C2440 buffer read/write
[MTD] [NAND] S3C2410: Allow the machine code to get the BBT table from NAND
[MTD] [NAND] S3C2410: Added a kerneldoc for s3c2410_nand_set
mtd: physmap_of: Add multiple regions and concatenation support
mtd: nand: max_retries off by one in mxc_nand
mtd: nand: s3c2410_nand_setrate(): use correct macros for 2412/2440
mtd: onenand: add bbt_wait & unlock_all as replaceable for some platform
mtd: Flex-OneNAND support
mtd: nand: add OMAP2/OMAP3 NAND driver
mtd: maps: Blackfin async: fix memory leaks in probe/remove funcs
mtd: uclinux: mark local stuff static
mtd: uclinux: do not allow to be built as a module
mtd: uclinux: allow systems to override map addr/size
mtd: blackfin NFC: fix hang when using NAND on BF527-EZKITs
...
Diffstat (limited to 'drivers/mtd/nand/plat_nand.c')
-rw-r--r-- | drivers/mtd/nand/plat_nand.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c index 86e1d08eee00..4e16c6f5bdd5 100644 --- a/drivers/mtd/nand/plat_nand.c +++ b/drivers/mtd/nand/plat_nand.c | |||
@@ -61,6 +61,8 @@ static int __devinit plat_nand_probe(struct platform_device *pdev) | |||
61 | data->chip.cmd_ctrl = pdata->ctrl.cmd_ctrl; | 61 | data->chip.cmd_ctrl = pdata->ctrl.cmd_ctrl; |
62 | data->chip.dev_ready = pdata->ctrl.dev_ready; | 62 | data->chip.dev_ready = pdata->ctrl.dev_ready; |
63 | data->chip.select_chip = pdata->ctrl.select_chip; | 63 | data->chip.select_chip = pdata->ctrl.select_chip; |
64 | data->chip.write_buf = pdata->ctrl.write_buf; | ||
65 | data->chip.read_buf = pdata->ctrl.read_buf; | ||
64 | data->chip.chip_delay = pdata->chip.chip_delay; | 66 | data->chip.chip_delay = pdata->chip.chip_delay; |
65 | data->chip.options |= pdata->chip.options; | 67 | data->chip.options |= pdata->chip.options; |
66 | 68 | ||
@@ -70,6 +72,13 @@ static int __devinit plat_nand_probe(struct platform_device *pdev) | |||
70 | 72 | ||
71 | platform_set_drvdata(pdev, data); | 73 | platform_set_drvdata(pdev, data); |
72 | 74 | ||
75 | /* Handle any platform specific setup */ | ||
76 | if (pdata->ctrl.probe) { | ||
77 | res = pdata->ctrl.probe(pdev); | ||
78 | if (res) | ||
79 | goto out; | ||
80 | } | ||
81 | |||
73 | /* Scan to find existance of the device */ | 82 | /* Scan to find existance of the device */ |
74 | if (nand_scan(&data->mtd, 1)) { | 83 | if (nand_scan(&data->mtd, 1)) { |
75 | res = -ENXIO; | 84 | res = -ENXIO; |
@@ -86,6 +95,8 @@ static int __devinit plat_nand_probe(struct platform_device *pdev) | |||
86 | return 0; | 95 | return 0; |
87 | } | 96 | } |
88 | } | 97 | } |
98 | if (pdata->chip.set_parts) | ||
99 | pdata->chip.set_parts(data->mtd.size, &pdata->chip); | ||
89 | if (pdata->chip.partitions) { | 100 | if (pdata->chip.partitions) { |
90 | data->parts = pdata->chip.partitions; | 101 | data->parts = pdata->chip.partitions; |
91 | res = add_mtd_partitions(&data->mtd, data->parts, | 102 | res = add_mtd_partitions(&data->mtd, data->parts, |
@@ -99,6 +110,8 @@ static int __devinit plat_nand_probe(struct platform_device *pdev) | |||
99 | 110 | ||
100 | nand_release(&data->mtd); | 111 | nand_release(&data->mtd); |
101 | out: | 112 | out: |
113 | if (pdata->ctrl.remove) | ||
114 | pdata->ctrl.remove(pdev); | ||
102 | platform_set_drvdata(pdev, NULL); | 115 | platform_set_drvdata(pdev, NULL); |
103 | iounmap(data->io_base); | 116 | iounmap(data->io_base); |
104 | kfree(data); | 117 | kfree(data); |
@@ -111,15 +124,15 @@ out: | |||
111 | static int __devexit plat_nand_remove(struct platform_device *pdev) | 124 | static int __devexit plat_nand_remove(struct platform_device *pdev) |
112 | { | 125 | { |
113 | struct plat_nand_data *data = platform_get_drvdata(pdev); | 126 | struct plat_nand_data *data = platform_get_drvdata(pdev); |
114 | #ifdef CONFIG_MTD_PARTITIONS | ||
115 | struct platform_nand_data *pdata = pdev->dev.platform_data; | 127 | struct platform_nand_data *pdata = pdev->dev.platform_data; |
116 | #endif | ||
117 | 128 | ||
118 | nand_release(&data->mtd); | 129 | nand_release(&data->mtd); |
119 | #ifdef CONFIG_MTD_PARTITIONS | 130 | #ifdef CONFIG_MTD_PARTITIONS |
120 | if (data->parts && data->parts != pdata->chip.partitions) | 131 | if (data->parts && data->parts != pdata->chip.partitions) |
121 | kfree(data->parts); | 132 | kfree(data->parts); |
122 | #endif | 133 | #endif |
134 | if (pdata->ctrl.remove) | ||
135 | pdata->ctrl.remove(pdev); | ||
123 | iounmap(data->io_base); | 136 | iounmap(data->io_base); |
124 | kfree(data); | 137 | kfree(data); |
125 | 138 | ||
@@ -128,7 +141,7 @@ static int __devexit plat_nand_remove(struct platform_device *pdev) | |||
128 | 141 | ||
129 | static struct platform_driver plat_nand_driver = { | 142 | static struct platform_driver plat_nand_driver = { |
130 | .probe = plat_nand_probe, | 143 | .probe = plat_nand_probe, |
131 | .remove = plat_nand_remove, | 144 | .remove = __devexit_p(plat_nand_remove), |
132 | .driver = { | 145 | .driver = { |
133 | .name = "gen_nand", | 146 | .name = "gen_nand", |
134 | .owner = THIS_MODULE, | 147 | .owner = THIS_MODULE, |