]> git.karo-electronics.de Git - linux-beck.git/commitdiff
omap: blaze: add mmc5/wl1283 device support
authorVishal Mahaveer <vishalm@ti.com>
Tue, 5 Jul 2011 10:38:23 +0000 (03:38 -0700)
committerTony Lindgren <tony@atomide.com>
Tue, 5 Jul 2011 10:38:23 +0000 (03:38 -0700)
Add MMC5 support on BLAZE, which has the wl1283 device hardwired to.

The wl1283 is a 4-wire, 1.8V, embedded SDIO WLAN device with an external IRQ line,
and power-controlled by a GPIO-based fixed regulator.

Based on the patch for zoom by Ohad Ben-Cohen <ohad@wizery.com>

Signed-off-by: Vishal Mahaveer <vishalm@ti.com>
[tony@atomide.com: improved formatting a bit]
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap2/board-4430sdp.c

index 5e03ddb0eb174c4c089a32d97fd606c6a7d94439..e5e8bbb003590c89ebce8591ad79c215f76da4a1 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/i2c/twl.h>
 #include <linux/gpio_keys.h>
 #include <linux/regulator/machine.h>
+#include <linux/regulator/fixed.h>
 #include <linux/leds.h>
 #include <linux/leds_pwm.h>
 
@@ -37,6 +38,7 @@
 #include <plat/mmc.h>
 #include <plat/omap4-keypad.h>
 #include <video/omapdss.h>
+#include <linux/wl12xx.h>
 
 #include "mux.h"
 #include "hsmmc.h"
@@ -51,6 +53,9 @@
 #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
 #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
 
+#define GPIO_WIFI_PMENA                54
+#define GPIO_WIFI_IRQ          53
+
 static const int sdp4430_keymap[] = {
        KEY(0, 0, KEY_E),
        KEY(0, 1, KEY_R),
@@ -326,6 +331,14 @@ static struct omap2_hsmmc_info mmc[] = {
                .gpio_cd        = -EINVAL,
                .gpio_wp        = -EINVAL,
        },
+       {
+               .mmc            = 5,
+               .caps           = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
+               .gpio_cd        = -EINVAL,
+               .gpio_wp        = -EINVAL,
+               .ocr_mask       = MMC_VDD_165_195,
+               .nonremovable   = true,
+       },
        {}      /* Terminator */
 };
 
@@ -337,6 +350,37 @@ static struct regulator_consumer_supply sdp4430_vmmc_supply[] = {
        REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
 };
 
+static struct regulator_consumer_supply omap4_sdp4430_vmmc5_supply = {
+       .supply = "vmmc",
+       .dev_name = "omap_hsmmc.4",
+};
+
+static struct regulator_init_data sdp4430_vmmc5 = {
+       .constraints = {
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+       },
+       .num_consumer_supplies = 1,
+       .consumer_supplies = &omap4_sdp4430_vmmc5_supply,
+};
+
+static struct fixed_voltage_config sdp4430_vwlan = {
+       .supply_name            = "vwl1271",
+       .microvolts             = 1800000, /* 1.8V */
+       .gpio                   = GPIO_WIFI_PMENA,
+       .startup_delay          = 70000, /* 70msec */
+       .enable_high            = 1,
+       .enabled_at_boot        = 0,
+       .init_data              = &sdp4430_vmmc5,
+};
+
+static struct platform_device omap_vwlan_device = {
+       .name           = "reg-fixed-voltage",
+       .id             = 1,
+       .dev = {
+               .platform_data = &sdp4430_vwlan,
+       },
+};
+
 static int omap4_twl6030_hsmmc_late_init(struct device *dev)
 {
        int ret = 0;
@@ -511,6 +555,7 @@ static struct regulator_init_data sdp4430_vusb = {
 static struct regulator_init_data sdp4430_clk32kg = {
        .constraints = {
                .valid_ops_mask         = REGULATOR_CHANGE_STATUS,
+               .always_on              = true,
        },
 };
 
@@ -715,6 +760,41 @@ static inline void board_serial_init(void)
 }
  #endif
 
+static void omap4_sdp4430_wifi_mux_init(void)
+{
+       omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT |
+                               OMAP_PIN_OFF_WAKEUPENABLE);
+       omap_mux_init_gpio(GPIO_WIFI_PMENA, OMAP_PIN_OUTPUT);
+
+       omap_mux_init_signal("sdmmc5_cmd.sdmmc5_cmd",
+                               OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
+       omap_mux_init_signal("sdmmc5_clk.sdmmc5_clk",
+                               OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
+       omap_mux_init_signal("sdmmc5_dat0.sdmmc5_dat0",
+                               OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
+       omap_mux_init_signal("sdmmc5_dat1.sdmmc5_dat1",
+                               OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
+       omap_mux_init_signal("sdmmc5_dat2.sdmmc5_dat2",
+                               OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
+       omap_mux_init_signal("sdmmc5_dat3.sdmmc5_dat3",
+                               OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
+
+}
+
+static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {
+       .irq = OMAP_GPIO_IRQ(GPIO_WIFI_IRQ),
+       .board_ref_clock = WL12XX_REFCLOCK_26,
+       .board_tcxo_clock = WL12XX_TCXOCLOCK_26,
+};
+
+static void omap4_sdp4430_wifi_init(void)
+{
+       omap4_sdp4430_wifi_mux_init();
+       if (wl12xx_set_platform_data(&omap4_sdp4430_wlan_data))
+               pr_err("Error setting wl12xx data\n");
+       platform_device_register(&omap_vwlan_device);
+}
+
 static void __init omap_4430sdp_init(void)
 {
        int status;
@@ -731,6 +811,7 @@ static void __init omap_4430sdp_init(void)
        omap_sfh7741prox_init();
        platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices));
        board_serial_init();
+       omap4_sdp4430_wifi_init();
        omap4_twl6030_hsmmc_init(mmc);
 
        usb_musb_init(&musb_board_data);