diff options
| -rw-r--r-- | drivers/pcmcia/at91_cf.c | 35 |
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); |
| 329 | fail0: | 305 | fail0: |
| 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 | } |
