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 | |
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
-rw-r--r-- | arch/arm/mach-tegra/board-kai-sdhci.c | 118 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-kai.c | 92 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-kai.h | 3 |
3 files changed, 212 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; } diff --git a/arch/arm/mach-tegra/board-kai.c b/arch/arm/mach-tegra/board-kai.c index 408d0db17c0f..558e57f54eb6 100644 --- a/arch/arm/mach-tegra/board-kai.c +++ b/arch/arm/mach-tegra/board-kai.c @@ -35,6 +35,9 @@ #include <linux/tegra_uart.h> #include <linux/memblock.h> #include <linux/spi-tegra.h> +#include <linux/skbuff.h> +#include <linux/ti_wilink_st.h> +#include <linux/regulator/consumer.h> #include <mach/clk.h> #include <mach/iomap.h> @@ -112,6 +115,94 @@ static struct tegra_utmip_config utmi_phy_config[] = { }, }; + +static struct regulator *vdd_com_bt = NULL; + +static int plat_kim_set_power(int state) +{ + static int bt_power_state; + if (state == bt_power_state) + return 0; + + if (vdd_com_bt == NULL) { + vdd_com_bt = regulator_get(NULL, "vdd_com_bd"); + if (WARN_ON(IS_ERR(vdd_com_bt))) { + pr_err("%s: couldn't get regulator vdd_com_bt: %ld\n", + __func__, PTR_ERR(vdd_com_bt)); + vdd_com_bt = NULL; + return -ENODEV; + } + } + + pr_info("Powering %s bluetooth\n", (state ? "on" : "off")); + bt_power_state = state; + + if (state) { + regulator_enable(vdd_com_bt); + mdelay(100); + } else + regulator_disable(vdd_com_bt); + + return 0; +} + +static unsigned long retry_suspend; + +static int plat_kim_suspend(struct platform_device *pdev, pm_message_t state) +{ + struct kim_data_s *kim_gdata; + struct st_data_s *core_data; + kim_gdata = dev_get_drvdata(&pdev->dev); + core_data = kim_gdata->core_data; + if (st_ll_getstate(core_data) != ST_LL_INVALID) { + /* Prevent suspend until sleep indication from chip */ + while (st_ll_getstate(core_data) != ST_LL_ASLEEP && + (retry_suspend++ < 5)) { + return -1; + } + } + return 0; +} + +static int plat_kim_resume(struct platform_device *pdev) +{ + retry_suspend = 0; + return 0; +} + + +/* wl128x BT, FM, GPS connectivity chip */ +struct ti_st_plat_data wilink_pdata = { + .nshutdown_gpio = TEGRA_GPIO_PU0, + .dev_name = BLUETOOTH_UART_DEV_NAME, + .flow_cntrl = 1, + .baud_rate = 3000000, + .suspend = plat_kim_suspend, + .resume = plat_kim_resume, + .set_power = plat_kim_set_power, +}; + +static struct platform_device wl128x_device = { + .name = "kim", + .id = -1, + .dev.platform_data = &wilink_pdata, +}; + +static struct platform_device btwilink_device = { + .name = "btwilink", + .id = -1, +}; + +static noinline void __init kai_bt_st(void) +{ + pr_info("kai_bt_st"); + + platform_device_register(&wl128x_device); + platform_device_register(&btwilink_device); + tegra_gpio_enable(TEGRA_GPIO_PU0); + return; +} + static __initdata struct tegra_clk_init_table kai_clk_init_table[] = { /* name parent rate enabled */ { "pll_m", NULL, 0, false}, @@ -566,6 +657,7 @@ static void __init tegra_kai_init(void) kai_touch_init(); kai_keys_init(); kai_panel_init(); + kai_bt_st(); kai_pins_state_init(); tegra_release_bootloader_fb(); #ifdef CONFIG_TEGRA_WDT_RECOVERY diff --git a/arch/arm/mach-tegra/board-kai.h b/arch/arm/mach-tegra/board-kai.h index 9dbced74b6ba..43617af97449 100644 --- a/arch/arm/mach-tegra/board-kai.h +++ b/arch/arm/mach-tegra/board-kai.h @@ -47,6 +47,9 @@ #define MAX77663_IRQ_BASE TEGRA_NR_IRQS #define MAX77663_IRQ_END (MAX77663_IRQ_BASE + MAX77663_IRQ_NR) +/* UART port which is used by bluetooth*/ +#define BLUETOOTH_UART_DEV_NAME "/dev/ttyHS2" + int kai_charge_init(void); int kai_regulator_init(void); int kai_suspend_init(void); |