aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Victor <andrew@sanpeople.com>2006-12-04 05:26:36 -0500
committerDominik Brodowski <linux@dominikbrodowski.net>2006-12-04 20:19:30 -0500
commit40a0017eb89c4c5a4bf81523edd867d730c9f143 (patch)
treee4a528771b70991e1fad2cff94630239fdf86bfa
parent1dd997f8fa5d52a473c77201a96efe3b66abc3d8 (diff)
[PATCH] pcmcia: at91_cf update
This is an update to the AT91 CompactFlash driver. We replace the hard-coded "chip select 4" with the chip-select value passed via platform_data. The configuration of the EBI memory controller to enable Compact Flash access is now also handled in the platform setup code and not in the driver. Signed-off-by: Andrew Victor <andrew@sanpeople.com> Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
-rw-r--r--drivers/pcmcia/at91_cf.c35
1 files changed, 3 insertions, 32 deletions
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c
index a8fa6c17fcf1..b6746301d9a9 100644
--- a/drivers/pcmcia/at91_cf.c
+++ b/drivers/pcmcia/at91_cf.c
@@ -157,9 +157,8 @@ static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
157 157
158 /* 158 /*
159 * Use 16 bit accesses unless/until we need 8-bit i/o space. 159 * Use 16 bit accesses unless/until we need 8-bit i/o space.
160 * Always set CSR4 ... PCMCIA won't always unmap things.
161 */ 160 */
162 csr = at91_sys_read(AT91_SMC_CSR(4)) & ~AT91_SMC_DBW; 161 csr = at91_sys_read(AT91_SMC_CSR(cf->board->chipselect)) & ~AT91_SMC_DBW;
163 162
164 /* 163 /*
165 * NOTE: this CF controller ignores IOIS16, so we can't really do 164 * NOTE: this CF controller ignores IOIS16, so we can't really do
@@ -178,7 +177,7 @@ static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
178 csr |= AT91_SMC_DBW_16; 177 csr |= AT91_SMC_DBW_16;
179 pr_debug("%s: 16bit i/o bus\n", driver_name); 178 pr_debug("%s: 16bit i/o bus\n", driver_name);
180 } 179 }
181 at91_sys_write(AT91_SMC_CSR(4), csr); 180 at91_sys_write(AT91_SMC_CSR(cf->board->chipselect), csr);
182 181
183 io->start = cf->socket.io_offset; 182 io->start = cf->socket.io_offset;
184 io->stop = io->start + SZ_2K - 1; 183 io->stop = io->start + SZ_2K - 1;
@@ -222,7 +221,6 @@ static int __init at91_cf_probe(struct platform_device *pdev)
222 struct at91_cf_socket *cf; 221 struct at91_cf_socket *cf;
223 struct at91_cf_data *board = pdev->dev.platform_data; 222 struct at91_cf_data *board = pdev->dev.platform_data;
224 struct resource *io; 223 struct resource *io;
225 unsigned int csa;
226 int status; 224 int status;
227 225
228 if (!board || !board->det_pin || !board->rst_pin) 226 if (!board || !board->det_pin || !board->rst_pin)
@@ -241,28 +239,6 @@ static int __init at91_cf_probe(struct platform_device *pdev)
241 cf->phys_baseaddr = io->start; 239 cf->phys_baseaddr = io->start;
242 platform_set_drvdata(pdev, cf); 240 platform_set_drvdata(pdev, cf);
243 241
244 /* CF takes over CS4, CS5, CS6 */
245 csa = at91_sys_read(AT91_EBI_CSA);
246 at91_sys_write(AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH);
247
248 /* nWAIT is _not_ a default setting */
249 (void) at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */
250
251 /*
252 * Static memory controller timing adjustments.
253 * REVISIT: these timings are in terms of MCK cycles, so
254 * when MCK changes (cpufreq etc) so must these values...
255 */
256 at91_sys_write(AT91_SMC_CSR(4),
257 AT91_SMC_ACSS_STD
258 | AT91_SMC_DBW_16
259 | AT91_SMC_BAT
260 | AT91_SMC_WSEN
261 | AT91_SMC_NWS_(32) /* wait states */
262 | AT91_SMC_RWSETUP_(6) /* setup time */
263 | AT91_SMC_RWHOLD_(4) /* hold time */
264 );
265
266 /* must be a GPIO; ergo must trigger on both edges */ 242 /* must be a GPIO; ergo must trigger on both edges */
267 status = request_irq(board->det_pin, at91_cf_irq, 0, driver_name, cf); 243 status = request_irq(board->det_pin, at91_cf_irq, 0, driver_name, cf);
268 if (status < 0) 244 if (status < 0)
@@ -291,7 +267,7 @@ static int __init at91_cf_probe(struct platform_device *pdev)
291 goto fail1; 267 goto fail1;
292 } 268 }
293 269
294 /* reserve CS4, CS5, and CS6 regions; but use just CS4 */ 270 /* reserve chip-select regions */
295 if (!request_mem_region(io->start, io->end + 1 - io->start, 271 if (!request_mem_region(io->start, io->end + 1 - io->start,
296 driver_name)) { 272 driver_name)) {
297 status = -ENXIO; 273 status = -ENXIO;
@@ -327,7 +303,6 @@ fail0a:
327 device_init_wakeup(&pdev->dev, 0); 303 device_init_wakeup(&pdev->dev, 0);
328 free_irq(board->det_pin, cf); 304 free_irq(board->det_pin, cf);
329fail0: 305fail0:
330 at91_sys_write(AT91_EBI_CSA, csa);
331 kfree(cf); 306 kfree(cf);
332 return status; 307 return status;
333} 308}
@@ -337,7 +312,6 @@ static int __exit at91_cf_remove(struct platform_device *pdev)
337 struct at91_cf_socket *cf = platform_get_drvdata(pdev); 312 struct at91_cf_socket *cf = platform_get_drvdata(pdev);
338 struct at91_cf_data *board = cf->board; 313 struct at91_cf_data *board = cf->board;
339 struct resource *io = cf->socket.io[0].res; 314 struct resource *io = cf->socket.io[0].res;
340 unsigned int csa;
341 315
342 pcmcia_unregister_socket(&cf->socket); 316 pcmcia_unregister_socket(&cf->socket);
343 if (board->irq_pin) 317 if (board->irq_pin)
@@ -347,9 +321,6 @@ static int __exit at91_cf_remove(struct platform_device *pdev)
347 iounmap((void __iomem *) cf->socket.io_offset); 321 iounmap((void __iomem *) cf->socket.io_offset);
348 release_mem_region(io->start, io->end + 1 - io->start); 322 release_mem_region(io->start, io->end + 1 - io->start);
349 323
350 csa = at91_sys_read(AT91_EBI_CSA);
351 at91_sys_write(AT91_EBI_CSA, csa & ~AT91_EBI_CS4A);
352
353 kfree(cf); 324 kfree(cf);
354 return 0; 325 return 0;
355} 326}