diff options
author | Om Prakash Singh <omp@nvidia.com> | 2011-12-20 18:35:37 +0530 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-02-03 05:21:36 -0800 |
commit | f7d2f0cad9b563b32f5973f304cd9fceb222fcd1 (patch) | |
tree | 873ae4e1f7960250c90350368909f90f800505a8 /arch/arm/mach-tegra/board-kai-sdhci.c | |
parent | b2e4cc8269bcd746afc69c9342b1bb0a8ade81bb (diff) |
arm: tegra: kai: add support for bluetooth and wifi
1) Enable TEGRA_GPIO_PU0 for Bluetooth
2) Add platform device wl128x_device and btwilink_device for Bluetooth
3) Set platform data kai_wlan_data for WiFi
Bug 926128
Reviewed-on: http://git-master/r/75929
Change-Id: I3bbe48899358106a299728e924e5a893f68ac60c
Signed-off-by: Om Prakash Singh <omp@nvidia.com>
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-on: http://git-master/r/78437
Reviewed-by: Automatic_Commit_Validation_User
Diffstat (limited to 'arch/arm/mach-tegra/board-kai-sdhci.c')
-rw-r--r-- | arch/arm/mach-tegra/board-kai-sdhci.c | 118 |
1 files changed, 117 insertions, 1 deletions
diff --git a/arch/arm/mach-tegra/board-kai-sdhci.c b/arch/arm/mach-tegra/board-kai-sdhci.c index 99f7736b14e7..7f320fab1011 100644 --- a/arch/arm/mach-tegra/board-kai-sdhci.c +++ b/arch/arm/mach-tegra/board-kai-sdhci.c @@ -22,6 +22,8 @@ #include <linux/clk.h> #include <linux/err.h> #include <linux/mmc/host.h> +#include <linux/wl12xx.h> +#include <linux/regulator/consumer.h> #include <asm/mach-types.h> #include <mach/irqs.h> @@ -33,6 +35,30 @@ #include "board-kai.h" #define KAI_SD_CD TEGRA_GPIO_PI5 +#define KAI_WLAN_EN TEGRA_GPIO_PD3 +#define KAI_WLAN_IRQ TEGRA_GPIO_PV1 + +static void (*wifi_status_cb)(int card_present, void *dev_id); +static void *wifi_status_cb_devid; + +static int kai_wifi_status_register( + void (*callback)(int card_present, void *dev_id), + void *dev_id) +{ + if (wifi_status_cb) + return -EAGAIN; + wifi_status_cb = callback; + wifi_status_cb_devid = dev_id; + return 0; +} + +static struct regulator *vdd_com = NULL; + +static struct wl12xx_platform_data kai_wlan_data __initdata = { + .irq = TEGRA_GPIO_TO_IRQ(KAI_WLAN_IRQ), + .board_ref_clock = WL12XX_REFCLOCK_26, + .board_tcxo_clock = 1, +}; static struct resource sdhci_resource0[] = { [0] = { @@ -73,9 +99,26 @@ static struct resource sdhci_resource3[] = { }, }; +static struct embedded_sdio_data embedded_sdio_data2 = { + .cccr = { + .sdio_vsn = 2, + .multi_block = 1, + .low_speed = 0, + .wide_bus = 0, + .high_power = 1, + .high_speed = 1, + }, + .cis = { + .vendor = 0x0097, + .device = 0x4076, + }, +}; + static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = { .mmc_data = { - .built_in = 1, + .register_status_notify = kai_wifi_status_register, + /* .embedded_sdio = &embedded_sdio_data2, */ + .built_in = 0, }, .cd_gpio = -1, .wp_gpio = -1, @@ -88,6 +131,7 @@ static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = { .vdd_min_uv = -1, .max_clk = 0, .is_8bit_supported = false, */ + /* .max_clk = 25000000, */ }; static struct tegra_sdhci_platform_data tegra_sdhci_platform_data0 = { @@ -153,11 +197,83 @@ static struct platform_device tegra_sdhci_device3 = { }, }; +int kai_wifi_set_carddetect(int val) +{ + pr_debug("%s: %d\n", __func__, val); + if (wifi_status_cb) + wifi_status_cb(val, wifi_status_cb_devid); + else + pr_warning("%s: Nobody to notify\n", __func__); + return 0; +} +EXPORT_SYMBOL(kai_wifi_set_carddetect); + +int kai_wifi_power(int power_on) +{ + pr_err("Powering %s wifi\n", (power_on ? "on" : "off")); + + if (vdd_com == NULL) { + vdd_com = regulator_get(NULL, "vdd_com_bd"); + if (WARN_ON(IS_ERR(vdd_com))) { + pr_err("%s: couldn't get regulator vdd_com: %ld\n", + __func__, PTR_ERR(vdd_com)); + return -ENODEV; + } + } + + if (power_on) { + regulator_enable(vdd_com); + mdelay(100); + gpio_set_value(KAI_WLAN_EN, 1); + mdelay(15); + gpio_set_value(KAI_WLAN_EN, 0); + mdelay(1); + gpio_set_value(KAI_WLAN_EN, 1); + mdelay(70); + } else { + gpio_set_value(KAI_WLAN_EN, 0); + regulator_disable(vdd_com); + } + + return 0; +} +EXPORT_SYMBOL(kai_wifi_power); + +static int __init kai_wifi_init(void) +{ + int rc; + + rc = gpio_request(KAI_WLAN_EN, "wl12xx"); + if (rc) + pr_err("WLAN_EN gpio request failed:%d\n", rc); + + rc = gpio_request(KAI_WLAN_IRQ, "wl12xx"); + if (rc) + pr_err("WLAN_IRQ gpio request failed:%d\n", rc); + + tegra_gpio_enable(KAI_WLAN_EN); + tegra_gpio_enable(KAI_WLAN_IRQ); + + rc = gpio_direction_output(KAI_WLAN_EN, 0); + if (rc) + pr_err("WLAN_EN gpio direction configuration failed:%d\n", rc); + + rc = gpio_direction_input(KAI_WLAN_IRQ); + if (rc) + pr_err("WLAN_IRQ gpio direction configuration failed:%d\n", rc); + + if (wl12xx_set_platform_data(&kai_wlan_data)) + pr_err("Error setting wl12xx data\n"); + + return 0; +} + int __init kai_sdhci_init(void) { platform_device_register(&tegra_sdhci_device3); platform_device_register(&tegra_sdhci_device2); platform_device_register(&tegra_sdhci_device0); + kai_wifi_init(); return 0; } |