diff options
author | Kasoju Mallikarjun <mkasoju@nvidia.com> | 2011-04-07 00:41:48 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:52:14 -0800 |
commit | d61a08be66786a8938b4b10a1dcf469bf4251b7f (patch) | |
tree | 911b70bc08fe508fbbd300fa81779b831a45ffd5 /arch/arm/mach-tegra/board-enterprise-sdhci.c | |
parent | 1d54780590dc095a2011352f74058c2ab05d3555 (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.c | 140 |
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; } |