summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-kai-sdhci.c
diff options
context:
space:
mode:
authorOm Prakash Singh <omp@nvidia.com>2011-12-20 18:35:37 +0530
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-02-03 05:21:36 -0800
commitf7d2f0cad9b563b32f5973f304cd9fceb222fcd1 (patch)
tree873ae4e1f7960250c90350368909f90f800505a8 /arch/arm/mach-tegra/board-kai-sdhci.c
parentb2e4cc8269bcd746afc69c9342b1bb0a8ade81bb (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.c118
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;
}