]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/mach-omap1/board-nokia770.c
ARM: OMAP: Get rid of controller vs slot confusion, initialize MMC devices dynamically
[linux-2.6-omap-h63xx.git] / arch / arm / mach-omap1 / board-nokia770.c
index 6e96a9d81ad739c046e009a016c9963010f7d962..7b28f4da214a63a907e637cf5888018698a3b8f5 100644 (file)
@@ -216,27 +216,66 @@ static struct omap_usb_config nokia770_usb_config __initdata = {
        .pins[0]        = 6,
 };
 
-static struct omap_mmc_platform_data nokia770_mmc_data = {
-       .nr_slots                       = 2,
+#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
+
+#define NOKIA770_GPIO_MMC_POWER                41
+#define NOKIA770_GPIO_MMC_SWITCH       23
+
+static int nokia770_mmc_set_power(struct device *dev, int slot, int power_on,
+                               int vdd)
+{
+       if (power_on)
+               gpio_set_value(NOKIA770_GPIO_MMC_POWER, 1);
+       else
+               gpio_set_value(NOKIA770_GPIO_MMC_POWER, 0);
+
+       return 0;
+}
+
+static int nokia770_mmc_get_cover_state(struct device *dev, int slot)
+{
+       return gpio_get_value(NOKIA770_GPIO_MMC_SWITCH);
+}
+
+static struct omap_mmc_platform_data nokia770_mmc2_data = {
+       .nr_slots                       = 1,
+       .dma_mask                       = 0xffffffff,
        .slots[0]       = {
-               .enabled                = 0,
-               .wire4                  = 0,
-               .wp_pin                 = -1,
-               .power_pin              = -1,
-               .switch_pin             = -1,
+               .set_power              = nokia770_mmc_set_power,
+               .get_cover_state        = nokia770_mmc_get_cover_state,
                .name                   = "mmcblk",
        },
-       .slots[1]       = {
-               .enabled                = 0,
-               .wire4                  = 0,
-               .wp_pin                 = -1,
-               .power_pin              = -1,
-               .switch_pin             = -1,
-               .name                   = "mmcblk",
-       },
-
 };
 
+static struct omap_mmc_platform_data *nokia770_mmc_data[OMAP16XX_NR_MMC];
+
+static void __init nokia770_mmc_init(void)
+{
+       int ret;
+
+       ret = gpio_request(NOKIA770_GPIO_MMC_POWER, "MMC power");
+       if (ret < 0)
+               return;
+       gpio_direction_output(NOKIA770_GPIO_MMC_POWER, 0);
+
+       ret = gpio_request(NOKIA770_GPIO_MMC_SWITCH, "MMC cover");
+       if (ret < 0) {
+               gpio_free(NOKIA770_GPIO_MMC_POWER);
+               return;
+       }
+       gpio_direction_input(NOKIA770_GPIO_MMC_SWITCH);
+
+       /* Only the second MMC controller is used */
+       nokia770_mmc_data[1] = &nokia770_mmc2_data;
+       omap1_init_mmc(nokia770_mmc_data, OMAP16XX_NR_MMC);
+}
+
+#else
+static inline void nokia770_mmc_init(void)
+{
+}
+#endif
+
 static struct omap_board_config_kernel nokia770_config[] __initdata = {
        { OMAP_TAG_USB,         NULL },
 };
@@ -382,7 +421,7 @@ static void __init omap_nokia770_init(void)
        hwa742_dev_init();
        ads7846_dev_init();
        mipid_dev_init();
-       omap1_init_mmc(&nokia770_mmc_data);
+       nokia770_mmc_init();
 }
 
 static void __init omap_nokia770_map_io(void)