summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-enterprise-sdhci.c
diff options
context:
space:
mode:
authorKasoju Mallikarjun <mkasoju@nvidia.com>2011-04-07 00:41:48 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:52:14 -0800
commitd61a08be66786a8938b4b10a1dcf469bf4251b7f (patch)
tree911b70bc08fe508fbbd300fa81779b831a45ffd5 /arch/arm/mach-tegra/board-enterprise-sdhci.c
parent1d54780590dc095a2011352f74058c2ab05d3555 (diff)
android: wifi: arm: tegra: tegra_enterprise: Creating board files
Creating initial board files and config files for tegra_enterprise board. Original-Change-Id: I77dcd612421167b9c6441d5d6fb779bb51491efa Reviewed-on: http://git-master/r/20852 Reviewed-by: Niket Sirsi <nsirsi@nvidia.com> Tested-by: Niket Sirsi <nsirsi@nvidia.com> Change-Id: I498fe3cde454657c22fb1c1bc2212eb5e2f7fd6e Rebase-Id: Rc408b20c823411b73b88e3da92492410a91ecaef
Diffstat (limited to 'arch/arm/mach-tegra/board-enterprise-sdhci.c')
-rw-r--r--arch/arm/mach-tegra/board-enterprise-sdhci.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-enterprise-sdhci.c b/arch/arm/mach-tegra/board-enterprise-sdhci.c
index a2418ead7f00..b480782af6dd 100644
--- a/arch/arm/mach-tegra/board-enterprise-sdhci.c
+++ b/arch/arm/mach-tegra/board-enterprise-sdhci.c
@@ -16,6 +16,7 @@
#include <linux/resource.h>
#include <linux/platform_device.h>
+#include <linux/wlan_plat.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/clk.h>
@@ -31,8 +32,45 @@
#include "board.h"
+#define ENTERPRISE_WLAN_PWR TEGRA_GPIO_PD4
+#define ENTERPRISE_WLAN_RST TEGRA_GPIO_PD3
#define ENTERPRISE_SD_CD TEGRA_GPIO_PI5
+static void (*wifi_status_cb)(int card_present, void *dev_id);
+static void *wifi_status_cb_devid;
+static int enterprise_wifi_status_register(void (*callback)(int , void *), void *);
+
+static int enterprise_wifi_reset(int on);
+static int enterprise_wifi_power(int on);
+static int enterprise_wifi_set_carddetect(int val);
+
+static struct wifi_platform_data enterprise_wifi_control = {
+ .set_power = enterprise_wifi_power,
+ .set_reset = enterprise_wifi_reset,
+ .set_carddetect = enterprise_wifi_set_carddetect,
+};
+
+static struct platform_device enterprise_wifi_device = {
+ .name = "bcm4329_wlan",
+ .id = 1,
+ .dev = {
+ .platform_data = &enterprise_wifi_control,
+ },
+};
+
+static struct resource sdhci_resource0[] = {
+ [0] = {
+ .start = INT_SDMMC1,
+ .end = INT_SDMMC1,
+ .flags = IORESOURCE_IRQ,
+ },
+ [1] = {
+ .start = TEGRA_SDMMC1_BASE,
+ .end = TEGRA_SDMMC1_BASE + TEGRA_SDMMC1_SIZE-1,
+ .flags = IORESOURCE_MEM,
+ },
+};
+
static struct resource sdhci_resource2[] = {
[0] = {
.start = INT_SDMMC3,
@@ -60,6 +98,33 @@ static struct resource sdhci_resource3[] = {
};
+static struct tegra_sdhci_platform_data tegra_sdhci_platform_data0 = {
+ .clk_id = NULL,
+ .force_hs = 0,
+ .register_status_notify = enterprise_wifi_status_register,
+ .cccr = {
+ .sdio_vsn = 2,
+ .multi_block = 1,
+ .low_speed = 0,
+ .wide_bus = 0,
+ .high_power = 1,
+ .high_speed = 1,
+ },
+ .cis = {
+ .vendor = 0x02d0,
+ .device = 0x4329,
+ },
+ .cd_gpio = -1,
+ .wp_gpio = -1,
+ .power_gpio = -1,
+ .tap_delay = 6,
+ .is_voltage_switch_supported = false,
+ .vsd_name = NULL,
+ .vsd_slot_name = NULL,
+ .max_clk = 48000000,
+ .is_8bit_supported = false,
+};
+
static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = {
.cd_gpio = -1,
.wp_gpio = -1,
@@ -73,6 +138,16 @@ static struct tegra_sdhci_platform_data tegra_sdhci_platform_data3 = {
.is_8bit = 1,
};
+static struct platform_device tegra_sdhci_device0 = {
+ .name = "sdhci-tegra",
+ .id = 2,
+ .resource = sdhci_resource0,
+ .num_resources = ARRAY_SIZE(sdhci_resource0),
+ .dev = {
+ .platform_data = &tegra_sdhci_platform_data0,
+ },
+};
+
static struct platform_device tegra_sdhci_device2 = {
.name = "sdhci-tegra",
.id = 2,
@@ -93,14 +168,79 @@ static struct platform_device tegra_sdhci_device3 = {
},
};
+static int enterprise_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 int enterprise_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;
+}
+
+static int enterprise_wifi_power(int on)
+{
+ pr_debug("%s: %d\n", __func__, on);
+ gpio_set_value(ENTERPRISE_WLAN_PWR, on);
+ mdelay(100);
+ gpio_set_value(ENTERPRISE_WLAN_RST, on);
+ mdelay(200);
+
+ return 0;
+}
+
+static int enterprise_wifi_reset(int on)
+{
+ pr_debug("%s: do nothing\n", __func__);
+ return 0;
+}
+
+static int __init enterprise_wifi_init(void)
+{
+ int rc;
+
+ rc = gpio_request(ENTERPRISE_WLAN_PWR, "wlan_power");
+ if (rc)
+ pr_err("WLAN_PWR gpio request failed:%d\n", rc);
+ rc = gpio_request(ENTERPRISE_WLAN_RST, "wlan_rst");
+ if (rc)
+ pr_err("WLAN_RST gpio request failed:%d\n", rc);
+
+ tegra_gpio_enable(ENTERPRISE_WLAN_PWR);
+ tegra_gpio_enable(ENTERPRISE_WLAN_RST);
+
+ rc = gpio_direction_output(ENTERPRISE_WLAN_PWR, 0);
+ if (rc)
+ pr_err("WLAN_PWR gpio direction configuration failed:%d\n", rc);
+ gpio_direction_output(ENTERPRISE_WLAN_RST, 0);
+ if (rc)
+ pr_err("WLAN_RST gpio direction configuration failed:%d\n", rc);
+
+ platform_device_register(&enterprise_wifi_device);
+ return 0;
+}
+
int __init enterprise_sdhci_init(void)
{
platform_device_register(&tegra_sdhci_device3);
+ platform_device_register(&tegra_sdhci_device0);
tegra_gpio_enable(ENTERPRISE_SD_CD);
tegra_sdhci_platform_data2.cd_gpio = ENTERPRISE_SD_CD;
platform_device_register(&tegra_sdhci_device2);
+ enterprise_wifi_init();
return 0;
}