diff options
Diffstat (limited to 'arch/arm/mach-at91/at91rm9200_devices.c')
-rw-r--r-- | arch/arm/mach-at91/at91rm9200_devices.c | 92 |
1 files changed, 54 insertions, 38 deletions
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index e6b7d0533dd7..f6c09b8f5fc9 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c | |||
@@ -294,9 +294,9 @@ void __init at91_add_device_cf(struct at91_cf_data *data) {} | |||
294 | * MMC / SD | 294 | * MMC / SD |
295 | * -------------------------------------------------------------------- */ | 295 | * -------------------------------------------------------------------- */ |
296 | 296 | ||
297 | #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) | 297 | #if IS_ENABLED(CONFIG_MMC_ATMELMCI) |
298 | static u64 mmc_dmamask = DMA_BIT_MASK(32); | 298 | static u64 mmc_dmamask = DMA_BIT_MASK(32); |
299 | static struct at91_mmc_data mmc_data; | 299 | static struct mci_platform_data mmc_data; |
300 | 300 | ||
301 | static struct resource mmc_resources[] = { | 301 | static struct resource mmc_resources[] = { |
302 | [0] = { | 302 | [0] = { |
@@ -312,7 +312,7 @@ static struct resource mmc_resources[] = { | |||
312 | }; | 312 | }; |
313 | 313 | ||
314 | static struct platform_device at91rm9200_mmc_device = { | 314 | static struct platform_device at91rm9200_mmc_device = { |
315 | .name = "at91_mci", | 315 | .name = "atmel_mci", |
316 | .id = -1, | 316 | .id = -1, |
317 | .dev = { | 317 | .dev = { |
318 | .dma_mask = &mmc_dmamask, | 318 | .dma_mask = &mmc_dmamask, |
@@ -323,53 +323,69 @@ static struct platform_device at91rm9200_mmc_device = { | |||
323 | .num_resources = ARRAY_SIZE(mmc_resources), | 323 | .num_resources = ARRAY_SIZE(mmc_resources), |
324 | }; | 324 | }; |
325 | 325 | ||
326 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | 326 | void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) |
327 | { | 327 | { |
328 | unsigned int i; | ||
329 | unsigned int slot_count = 0; | ||
330 | |||
328 | if (!data) | 331 | if (!data) |
329 | return; | 332 | return; |
330 | 333 | ||
331 | /* input/irq */ | 334 | for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) { |
332 | if (gpio_is_valid(data->det_pin)) { | ||
333 | at91_set_gpio_input(data->det_pin, 1); | ||
334 | at91_set_deglitch(data->det_pin, 1); | ||
335 | } | ||
336 | if (gpio_is_valid(data->wp_pin)) | ||
337 | at91_set_gpio_input(data->wp_pin, 1); | ||
338 | if (gpio_is_valid(data->vcc_pin)) | ||
339 | at91_set_gpio_output(data->vcc_pin, 0); | ||
340 | |||
341 | /* CLK */ | ||
342 | at91_set_A_periph(AT91_PIN_PA27, 0); | ||
343 | 335 | ||
344 | if (data->slot_b) { | 336 | if (!data->slot[i].bus_width) |
345 | /* CMD */ | 337 | continue; |
346 | at91_set_B_periph(AT91_PIN_PA8, 1); | ||
347 | 338 | ||
348 | /* DAT0, maybe DAT1..DAT3 */ | 339 | /* input/irq */ |
349 | at91_set_B_periph(AT91_PIN_PA9, 1); | 340 | if (gpio_is_valid(data->slot[i].detect_pin)) { |
350 | if (data->wire4) { | 341 | at91_set_gpio_input(data->slot[i].detect_pin, 1); |
351 | at91_set_B_periph(AT91_PIN_PA10, 1); | 342 | at91_set_deglitch(data->slot[i].detect_pin, 1); |
352 | at91_set_B_periph(AT91_PIN_PA11, 1); | ||
353 | at91_set_B_periph(AT91_PIN_PA12, 1); | ||
354 | } | 343 | } |
355 | } else { | 344 | if (gpio_is_valid(data->slot[i].wp_pin)) |
356 | /* CMD */ | 345 | at91_set_gpio_input(data->slot[i].wp_pin, 1); |
357 | at91_set_A_periph(AT91_PIN_PA28, 1); | 346 | |
358 | 347 | switch (i) { | |
359 | /* DAT0, maybe DAT1..DAT3 */ | 348 | case 0: /* slot A */ |
360 | at91_set_A_periph(AT91_PIN_PA29, 1); | 349 | /* CMD */ |
361 | if (data->wire4) { | 350 | at91_set_A_periph(AT91_PIN_PA28, 1); |
362 | at91_set_B_periph(AT91_PIN_PB3, 1); | 351 | /* DAT0, maybe DAT1..DAT3 */ |
363 | at91_set_B_periph(AT91_PIN_PB4, 1); | 352 | at91_set_A_periph(AT91_PIN_PA29, 1); |
364 | at91_set_B_periph(AT91_PIN_PB5, 1); | 353 | if (data->slot[i].bus_width == 4) { |
354 | at91_set_B_periph(AT91_PIN_PB3, 1); | ||
355 | at91_set_B_periph(AT91_PIN_PB4, 1); | ||
356 | at91_set_B_periph(AT91_PIN_PB5, 1); | ||
357 | } | ||
358 | slot_count++; | ||
359 | break; | ||
360 | case 1: /* slot B */ | ||
361 | /* CMD */ | ||
362 | at91_set_B_periph(AT91_PIN_PA8, 1); | ||
363 | /* DAT0, maybe DAT1..DAT3 */ | ||
364 | at91_set_B_periph(AT91_PIN_PA9, 1); | ||
365 | if (data->slot[i].bus_width == 4) { | ||
366 | at91_set_B_periph(AT91_PIN_PA10, 1); | ||
367 | at91_set_B_periph(AT91_PIN_PA11, 1); | ||
368 | at91_set_B_periph(AT91_PIN_PA12, 1); | ||
369 | } | ||
370 | slot_count++; | ||
371 | break; | ||
372 | default: | ||
373 | printk(KERN_ERR | ||
374 | "AT91: SD/MMC slot %d not available\n", i); | ||
375 | break; | ||
376 | } | ||
377 | if (slot_count) { | ||
378 | /* CLK */ | ||
379 | at91_set_A_periph(AT91_PIN_PA27, 0); | ||
380 | |||
381 | mmc_data = *data; | ||
382 | platform_device_register(&at91rm9200_mmc_device); | ||
365 | } | 383 | } |
366 | } | 384 | } |
367 | 385 | ||
368 | mmc_data = *data; | ||
369 | platform_device_register(&at91rm9200_mmc_device); | ||
370 | } | 386 | } |
371 | #else | 387 | #else |
372 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} | 388 | void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {} |
373 | #endif | 389 | #endif |
374 | 390 | ||
375 | 391 | ||