diff options
author | Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> | 2010-12-15 09:43:44 -0500 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2011-01-06 10:28:22 -0500 |
commit | eaca491f75af5afa9265a6bdfcbbfff6837634ab (patch) | |
tree | 1dd373ecd237b464cc2ccb252594b84fca5f2ccc | |
parent | dcf12463c3416b4a8fc84545233424df0a91e406 (diff) |
mtd: nand: ams-delta: drop omap_read/write, use ioremap
There is a common requirement for not using OMAP specific omap_readw() /
omap_writew() function calls in drivers/, but replace them with
readw() / writew() on ioremap()ped addresses passed from arch/ instead.
The patch implements this idea for the Amstrad Delta NAND driver. To be
able to use the modified driver, the board file is updated with the
platform device I/O resource declaration, which is passed from there.
Created and tested against linux-2.6.37-rc5, on top of recent patch
'MTD: NAND: ams-delta: convert to platform driver'.
Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r-- | arch/arm/mach-omap1/board-ams-delta.c | 13 | ||||
-rw-r--r-- | drivers/mtd/nand/ams-delta.c | 49 |
2 files changed, 55 insertions, 7 deletions
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index 81282f5e8b2d..b75ff0b03853 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
@@ -181,9 +181,20 @@ static struct omap_board_config_kernel ams_delta_config[] = { | |||
181 | { OMAP_TAG_LCD, &ams_delta_lcd_config }, | 181 | { OMAP_TAG_LCD, &ams_delta_lcd_config }, |
182 | }; | 182 | }; |
183 | 183 | ||
184 | static struct resource ams_delta_nand_resources[] = { | ||
185 | [0] = { | ||
186 | .start = OMAP1_MPUIO_BASE, | ||
187 | .end = OMAP1_MPUIO_BASE + | ||
188 | OMAP_MPUIO_IO_CNTL + sizeof(u32) - 1, | ||
189 | .flags = IORESOURCE_MEM, | ||
190 | }, | ||
191 | }; | ||
192 | |||
184 | static struct platform_device ams_delta_nand_device = { | 193 | static struct platform_device ams_delta_nand_device = { |
185 | .name = "ams-delta-nand", | 194 | .name = "ams-delta-nand", |
186 | .id = -1 | 195 | .id = -1, |
196 | .num_resources = ARRAY_SIZE(ams_delta_nand_resources), | ||
197 | .resource = ams_delta_nand_resources, | ||
187 | }; | 198 | }; |
188 | 199 | ||
189 | static struct resource ams_delta_kp_resources[] = { | 200 | static struct resource ams_delta_kp_resources[] = { |
diff --git a/drivers/mtd/nand/ams-delta.c b/drivers/mtd/nand/ams-delta.c index 7d49f6a6b726..a067d090cb31 100644 --- a/drivers/mtd/nand/ams-delta.c +++ b/drivers/mtd/nand/ams-delta.c | |||
@@ -5,6 +5,7 @@ | |||
5 | * | 5 | * |
6 | * Derived from drivers/mtd/toto.c | 6 | * Derived from drivers/mtd/toto.c |
7 | * Converted to platform driver by Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> | 7 | * Converted to platform driver by Janusz Krzysztofik <jkrzyszt@tis.icnet.pl> |
8 | * Partially stolen from drivers/mtd/nand/plat_nand.c | ||
8 | * | 9 | * |
9 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
@@ -63,9 +64,10 @@ static struct mtd_partition partition_info[] = { | |||
63 | static void ams_delta_write_byte(struct mtd_info *mtd, u_char byte) | 64 | static void ams_delta_write_byte(struct mtd_info *mtd, u_char byte) |
64 | { | 65 | { |
65 | struct nand_chip *this = mtd->priv; | 66 | struct nand_chip *this = mtd->priv; |
67 | void __iomem *io_base = this->priv; | ||
66 | 68 | ||
67 | omap_writew(0, (OMAP1_MPUIO_BASE + OMAP_MPUIO_IO_CNTL)); | 69 | writew(0, io_base + OMAP_MPUIO_IO_CNTL); |
68 | omap_writew(byte, this->IO_ADDR_W); | 70 | writew(byte, this->IO_ADDR_W); |
69 | ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, 0); | 71 | ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, 0); |
70 | ndelay(40); | 72 | ndelay(40); |
71 | ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, | 73 | ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, |
@@ -76,11 +78,12 @@ static u_char ams_delta_read_byte(struct mtd_info *mtd) | |||
76 | { | 78 | { |
77 | u_char res; | 79 | u_char res; |
78 | struct nand_chip *this = mtd->priv; | 80 | struct nand_chip *this = mtd->priv; |
81 | void __iomem *io_base = this->priv; | ||
79 | 82 | ||
80 | ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, 0); | 83 | ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, 0); |
81 | ndelay(40); | 84 | ndelay(40); |
82 | omap_writew(~0, (OMAP1_MPUIO_BASE + OMAP_MPUIO_IO_CNTL)); | 85 | writew(~0, io_base + OMAP_MPUIO_IO_CNTL); |
83 | res = omap_readw(this->IO_ADDR_R); | 86 | res = readw(this->IO_ADDR_R); |
84 | ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, | 87 | ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, |
85 | AMS_DELTA_LATCH2_NAND_NRE); | 88 | AMS_DELTA_LATCH2_NAND_NRE); |
86 | 89 | ||
@@ -155,8 +158,13 @@ static int ams_delta_nand_ready(struct mtd_info *mtd) | |||
155 | static int __devinit ams_delta_init(struct platform_device *pdev) | 158 | static int __devinit ams_delta_init(struct platform_device *pdev) |
156 | { | 159 | { |
157 | struct nand_chip *this; | 160 | struct nand_chip *this; |
161 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
162 | void __iomem *io_base; | ||
158 | int err = 0; | 163 | int err = 0; |
159 | 164 | ||
165 | if (!res) | ||
166 | return -ENXIO; | ||
167 | |||
160 | /* Allocate memory for MTD device structure and private data */ | 168 | /* Allocate memory for MTD device structure and private data */ |
161 | ams_delta_mtd = kmalloc(sizeof(struct mtd_info) + | 169 | ams_delta_mtd = kmalloc(sizeof(struct mtd_info) + |
162 | sizeof(struct nand_chip), GFP_KERNEL); | 170 | sizeof(struct nand_chip), GFP_KERNEL); |
@@ -178,9 +186,25 @@ static int __devinit ams_delta_init(struct platform_device *pdev) | |||
178 | /* Link the private data with the MTD structure */ | 186 | /* Link the private data with the MTD structure */ |
179 | ams_delta_mtd->priv = this; | 187 | ams_delta_mtd->priv = this; |
180 | 188 | ||
189 | if (!request_mem_region(res->start, resource_size(res), | ||
190 | dev_name(&pdev->dev))) { | ||
191 | dev_err(&pdev->dev, "request_mem_region failed\n"); | ||
192 | err = -EBUSY; | ||
193 | goto out_free; | ||
194 | } | ||
195 | |||
196 | io_base = ioremap(res->start, resource_size(res)); | ||
197 | if (io_base == NULL) { | ||
198 | dev_err(&pdev->dev, "ioremap failed\n"); | ||
199 | err = -EIO; | ||
200 | goto out_release_io; | ||
201 | } | ||
202 | |||
203 | this->priv = io_base; | ||
204 | |||
181 | /* Set address of NAND IO lines */ | 205 | /* Set address of NAND IO lines */ |
182 | this->IO_ADDR_R = (OMAP1_MPUIO_BASE + OMAP_MPUIO_INPUT_LATCH); | 206 | this->IO_ADDR_R = io_base + OMAP_MPUIO_INPUT_LATCH; |
183 | this->IO_ADDR_W = (OMAP1_MPUIO_BASE + OMAP_MPUIO_OUTPUT); | 207 | this->IO_ADDR_W = io_base + OMAP_MPUIO_OUTPUT; |
184 | this->read_byte = ams_delta_read_byte; | 208 | this->read_byte = ams_delta_read_byte; |
185 | this->write_buf = ams_delta_write_buf; | 209 | this->write_buf = ams_delta_write_buf; |
186 | this->read_buf = ams_delta_read_buf; | 210 | this->read_buf = ams_delta_read_buf; |
@@ -196,6 +220,8 @@ static int __devinit ams_delta_init(struct platform_device *pdev) | |||
196 | this->chip_delay = 30; | 220 | this->chip_delay = 30; |
197 | this->ecc.mode = NAND_ECC_SOFT; | 221 | this->ecc.mode = NAND_ECC_SOFT; |
198 | 222 | ||
223 | platform_set_drvdata(pdev, io_base); | ||
224 | |||
199 | /* Set chip enabled, but */ | 225 | /* Set chip enabled, but */ |
200 | ams_delta_latch2_write(NAND_MASK, AMS_DELTA_LATCH2_NAND_NRE | | 226 | ams_delta_latch2_write(NAND_MASK, AMS_DELTA_LATCH2_NAND_NRE | |
201 | AMS_DELTA_LATCH2_NAND_NWE | | 227 | AMS_DELTA_LATCH2_NAND_NWE | |
@@ -215,6 +241,11 @@ static int __devinit ams_delta_init(struct platform_device *pdev) | |||
215 | goto out; | 241 | goto out; |
216 | 242 | ||
217 | out_mtd: | 243 | out_mtd: |
244 | platform_set_drvdata(pdev, NULL); | ||
245 | iounmap(io_base); | ||
246 | out_release_io: | ||
247 | release_mem_region(res->start, resource_size(res)); | ||
248 | out_free: | ||
218 | kfree(ams_delta_mtd); | 249 | kfree(ams_delta_mtd); |
219 | out: | 250 | out: |
220 | return err; | 251 | return err; |
@@ -225,9 +256,15 @@ static int __devinit ams_delta_init(struct platform_device *pdev) | |||
225 | */ | 256 | */ |
226 | static int __devexit ams_delta_cleanup(struct platform_device *pdev) | 257 | static int __devexit ams_delta_cleanup(struct platform_device *pdev) |
227 | { | 258 | { |
259 | void __iomem *io_base = platform_get_drvdata(pdev); | ||
260 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
261 | |||
228 | /* Release resources, unregister device */ | 262 | /* Release resources, unregister device */ |
229 | nand_release(ams_delta_mtd); | 263 | nand_release(ams_delta_mtd); |
230 | 264 | ||
265 | iounmap(io_base); | ||
266 | release_mem_region(res->start, resource_size(res)); | ||
267 | |||
231 | /* Free the MTD device structure */ | 268 | /* Free the MTD device structure */ |
232 | kfree(ams_delta_mtd); | 269 | kfree(ams_delta_mtd); |
233 | 270 | ||