diff options
author | Rob Emanuele <rob@emanuele.us> | 2009-09-22 19:45:22 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 10:39:37 -0400 |
commit | 864f38ebdcb1f7dc4138b7ccb801f16f1696eb8e (patch) | |
tree | 390fddc2e951479b0b66a8a93e1895e483394488 /arch/arm/mach-at91/at91sam9260_devices.c | |
parent | 04d699c3643fbf75dd72c03a4eacec87149c4aca (diff) |
AT91: atmel-mci: Platform configuration to the the atmel-mci driver
Created a modified version of the at91sam9g20 evaluation kit platform
(board-sam9g20ek-2slot-mmc.c) and device support to make use of the
updated atmel-mci driver.
As the use of two slots modify GPIO pin allocation, we create another
board file.
This requires getting the most updated arch/arm/tools/mach-types from
http://www.arm.linux.org.uk/developer/machines/download.php to have the machine
type for the at91sam9g20ek-2slot-mmc board.
[nicolas.ferre@atmel.com: printk, slot_count modification in at91sam9260_devices.c file]
[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Rob Emanuele <rob@emanuele.us>
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Andrew Victor <linux@maxim.org.za>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: <linux-mmc@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/arm/mach-at91/at91sam9260_devices.c')
-rw-r--r-- | arch/arm/mach-at91/at91sam9260_devices.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index ee4ea0e720cf..07eb7b07e442 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
@@ -278,6 +278,102 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
278 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} | 278 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} |
279 | #endif | 279 | #endif |
280 | 280 | ||
281 | /* -------------------------------------------------------------------- | ||
282 | * MMC / SD Slot for Atmel MCI Driver | ||
283 | * -------------------------------------------------------------------- */ | ||
284 | |||
285 | #if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE) | ||
286 | static u64 mmc_dmamask = DMA_BIT_MASK(32); | ||
287 | static struct mci_platform_data mmc_data; | ||
288 | |||
289 | static struct resource mmc_resources[] = { | ||
290 | [0] = { | ||
291 | .start = AT91SAM9260_BASE_MCI, | ||
292 | .end = AT91SAM9260_BASE_MCI + SZ_16K - 1, | ||
293 | .flags = IORESOURCE_MEM, | ||
294 | }, | ||
295 | [1] = { | ||
296 | .start = AT91SAM9260_ID_MCI, | ||
297 | .end = AT91SAM9260_ID_MCI, | ||
298 | .flags = IORESOURCE_IRQ, | ||
299 | }, | ||
300 | }; | ||
301 | |||
302 | static struct platform_device at91sam9260_mmc_device = { | ||
303 | .name = "atmel_mci", | ||
304 | .id = -1, | ||
305 | .dev = { | ||
306 | .dma_mask = &mmc_dmamask, | ||
307 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
308 | .platform_data = &mmc_data, | ||
309 | }, | ||
310 | .resource = mmc_resources, | ||
311 | .num_resources = ARRAY_SIZE(mmc_resources), | ||
312 | }; | ||
313 | |||
314 | void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) | ||
315 | { | ||
316 | unsigned int i; | ||
317 | unsigned int slot_count = 0; | ||
318 | |||
319 | if (!data) | ||
320 | return; | ||
321 | |||
322 | for (i = 0; i < ATMEL_MCI_MAX_NR_SLOTS; i++) { | ||
323 | if (data->slot[i].bus_width) { | ||
324 | /* input/irq */ | ||
325 | if (data->slot[i].detect_pin) { | ||
326 | at91_set_gpio_input(data->slot[i].detect_pin, 1); | ||
327 | at91_set_deglitch(data->slot[i].detect_pin, 1); | ||
328 | } | ||
329 | if (data->slot[i].wp_pin) | ||
330 | at91_set_gpio_input(data->slot[i].wp_pin, 1); | ||
331 | |||
332 | switch (i) { | ||
333 | case 0: | ||
334 | /* CMD */ | ||
335 | at91_set_A_periph(AT91_PIN_PA7, 1); | ||
336 | /* DAT0, maybe DAT1..DAT3 */ | ||
337 | at91_set_A_periph(AT91_PIN_PA6, 1); | ||
338 | if (data->slot[i].bus_width == 4) { | ||
339 | at91_set_A_periph(AT91_PIN_PA9, 1); | ||
340 | at91_set_A_periph(AT91_PIN_PA10, 1); | ||
341 | at91_set_A_periph(AT91_PIN_PA11, 1); | ||
342 | } | ||
343 | slot_count++; | ||
344 | break; | ||
345 | case 1: | ||
346 | /* CMD */ | ||
347 | at91_set_B_periph(AT91_PIN_PA1, 1); | ||
348 | /* DAT0, maybe DAT1..DAT3 */ | ||
349 | at91_set_B_periph(AT91_PIN_PA0, 1); | ||
350 | if (data->slot[i].bus_width == 4) { | ||
351 | at91_set_B_periph(AT91_PIN_PA5, 1); | ||
352 | at91_set_B_periph(AT91_PIN_PA4, 1); | ||
353 | at91_set_B_periph(AT91_PIN_PA3, 1); | ||
354 | } | ||
355 | slot_count++; | ||
356 | break; | ||
357 | default: | ||
358 | printk(KERN_ERR | ||
359 | "AT91: SD/MMC slot %d not available\n", i); | ||
360 | break; | ||
361 | } | ||
362 | } | ||
363 | } | ||
364 | |||
365 | if (slot_count) { | ||
366 | /* CLK */ | ||
367 | at91_set_A_periph(AT91_PIN_PA8, 0); | ||
368 | |||
369 | mmc_data = *data; | ||
370 | platform_device_register(&at91sam9260_mmc_device); | ||
371 | } | ||
372 | } | ||
373 | #else | ||
374 | void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {} | ||
375 | #endif | ||
376 | |||
281 | 377 | ||
282 | /* -------------------------------------------------------------------- | 378 | /* -------------------------------------------------------------------- |
283 | * NAND / SmartMedia | 379 | * NAND / SmartMedia |