Merge branch 'i2c-embedded/for-next' of git://git.pengutronix.de/git/wsa/linux
[~shefty/rdma-dev.git] / arch / arm / mach-at91 / at91rm9200_devices.c
index 0b972f2e57eb22cbfa230b662e22a21628298bf2..a563189cdfc3e1bfd4bdc2e71049073de01cd712 100644 (file)
@@ -294,9 +294,9 @@ void __init at91_add_device_cf(struct at91_cf_data *data) {}
  *  MMC / SD
  * -------------------------------------------------------------------- */
 
-#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
+#if IS_ENABLED(CONFIG_MMC_ATMELMCI)
 static u64 mmc_dmamask = DMA_BIT_MASK(32);
-static struct at91_mmc_data mmc_data;
+static struct mci_platform_data mmc_data;
 
 static struct resource mmc_resources[] = {
        [0] = {
@@ -312,7 +312,7 @@ static struct resource mmc_resources[] = {
 };
 
 static struct platform_device at91rm9200_mmc_device = {
-       .name           = "at91_mci",
+       .name           = "atmel_mci",
        .id             = -1,
        .dev            = {
                                .dma_mask               = &mmc_dmamask,
@@ -323,53 +323,69 @@ static struct platform_device at91rm9200_mmc_device = {
        .num_resources  = ARRAY_SIZE(mmc_resources),
 };
 
-void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
+void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)
 {
+       unsigned int i;
+       unsigned int slot_count = 0;
+
        if (!data)
                return;
 
-       /* input/irq */
-       if (gpio_is_valid(data->det_pin)) {
-               at91_set_gpio_input(data->det_pin, 1);
-               at91_set_deglitch(data->det_pin, 1);
-       }
-       if (gpio_is_valid(data->wp_pin))
-               at91_set_gpio_input(data->wp_pin, 1);
-       if (gpio_is_valid(data->vcc_pin))
-               at91_set_gpio_output(data->vcc_pin, 0);
-
-       /* CLK */
-       at91_set_A_periph(AT91_PIN_PA27, 0);
+       for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) {
 
-       if (data->slot_b) {
-               /* CMD */
-               at91_set_B_periph(AT91_PIN_PA8, 1);
+               if (!data->slot[i].bus_width)
+                       continue;
 
-               /* DAT0, maybe DAT1..DAT3 */
-               at91_set_B_periph(AT91_PIN_PA9, 1);
-               if (data->wire4) {
-                       at91_set_B_periph(AT91_PIN_PA10, 1);
-                       at91_set_B_periph(AT91_PIN_PA11, 1);
-                       at91_set_B_periph(AT91_PIN_PA12, 1);
+               /* input/irq */
+               if (gpio_is_valid(data->slot[i].detect_pin)) {
+                       at91_set_gpio_input(data->slot[i].detect_pin, 1);
+                       at91_set_deglitch(data->slot[i].detect_pin, 1);
                }
-       } else {
-               /* CMD */
-               at91_set_A_periph(AT91_PIN_PA28, 1);
-
-               /* DAT0, maybe DAT1..DAT3 */
-               at91_set_A_periph(AT91_PIN_PA29, 1);
-               if (data->wire4) {
-                       at91_set_B_periph(AT91_PIN_PB3, 1);
-                       at91_set_B_periph(AT91_PIN_PB4, 1);
-                       at91_set_B_periph(AT91_PIN_PB5, 1);
+               if (gpio_is_valid(data->slot[i].wp_pin))
+                       at91_set_gpio_input(data->slot[i].wp_pin, 1);
+
+               switch (i) {
+               case 0:                                 /* slot A */
+                       /* CMD */
+                       at91_set_A_periph(AT91_PIN_PA28, 1);
+                       /* DAT0, maybe DAT1..DAT3 */
+                       at91_set_A_periph(AT91_PIN_PA29, 1);
+                       if (data->slot[i].bus_width == 4) {
+                               at91_set_B_periph(AT91_PIN_PB3, 1);
+                               at91_set_B_periph(AT91_PIN_PB4, 1);
+                               at91_set_B_periph(AT91_PIN_PB5, 1);
+                       }
+                       slot_count++;
+                       break;
+               case 1:                                 /* slot B */
+                       /* CMD */
+                       at91_set_B_periph(AT91_PIN_PA8, 1);
+                       /* DAT0, maybe DAT1..DAT3 */
+                       at91_set_B_periph(AT91_PIN_PA9, 1);
+                       if (data->slot[i].bus_width == 4) {
+                               at91_set_B_periph(AT91_PIN_PA10, 1);
+                               at91_set_B_periph(AT91_PIN_PA11, 1);
+                               at91_set_B_periph(AT91_PIN_PA12, 1);
+                       }
+                       slot_count++;
+                       break;
+               default:
+                       printk(KERN_ERR
+                              "AT91: SD/MMC slot %d not available\n", i);
+                       break;
+               }
+               if (slot_count) {
+                       /* CLK */
+                       at91_set_A_periph(AT91_PIN_PA27, 0);
+
+                       mmc_data = *data;
+                       platform_device_register(&at91rm9200_mmc_device);
                }
        }
 
-       mmc_data = *data;
-       platform_device_register(&at91rm9200_mmc_device);
 }
 #else
-void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
+void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
 #endif