diff options
author | rgoyal <rgoyal@nvidia.com> | 2011-01-06 11:56:49 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:52:13 -0800 |
commit | ec69e8bd36c61c15847c772107ad21c8990bbd50 (patch) | |
tree | 53bd695a1c3cca82ec147a1b7a4b5691e804fdaa /arch/arm/mach-tegra/board-whistler-sdhci.c | |
parent | 6d3eb819e22551a76c95fd5ff5ee7cd2f5065f20 (diff) |
ARM: tegra: whistler: enabling wifi for bcm4329
Enabling wifi for whistler by adding bcm platform device and changing
pinmux.
BUG 773541
Original-Change-Id: I3eb812516c8e7964352b400d2b08290ae070b640
Reviewed-on: http://git-master/r/15101
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
Rebase-Id: R544e15c5a2a1c42297ef98b1b5260d2c01565584
Diffstat (limited to 'arch/arm/mach-tegra/board-whistler-sdhci.c')
-rw-r--r-- | arch/arm/mach-tegra/board-whistler-sdhci.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-whistler-sdhci.c b/arch/arm/mach-tegra/board-whistler-sdhci.c index 16003f1a6b6b..51d0f41e2530 100644 --- a/arch/arm/mach-tegra/board-whistler-sdhci.c +++ b/arch/arm/mach-tegra/board-whistler-sdhci.c @@ -17,8 +17,12 @@ #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> +#include <linux/err.h> +#include <linux/mmc/host.h> #include <asm/mach-types.h> #include <mach/irqs.h> @@ -28,8 +32,80 @@ #include "gpio-names.h" #include "board.h" +#define WHISTLER_WLAN_PWR TEGRA_GPIO_PK5 +#define WHISTLER_WLAN_RST TEGRA_GPIO_PK6 + #define WHISTLER_EXT_SDCARD_DETECT TEGRA_GPIO_PI5 +static void (*wifi_status_cb)(int card_present, void *dev_id); +static void *wifi_status_cb_devid; + +static int whistler_wifi_status_register( + void (*sdhcicallback)(int card_present, void *dev_id), + void *dev_id) +{ + if (wifi_status_cb) + return -EAGAIN; + wifi_status_cb = sdhcicallback; + wifi_status_cb_devid = dev_id; + return 0; +} + +static int whistler_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 whistler_wifi_power(int on) +{ + gpio_set_value(WHISTLER_WLAN_PWR, on); + mdelay(100); + gpio_set_value(WHISTLER_WLAN_RST, on); + mdelay(200); + + return 0; +} + +static int whistler_wifi_reset(int on) +{ + pr_debug("%s: do nothing\n", __func__); + return 0; +} + + +static struct wifi_platform_data whistler_wifi_control = { + .set_power = whistler_wifi_power, + .set_reset = whistler_wifi_reset, + .set_carddetect = whistler_wifi_set_carddetect, +}; + +static struct platform_device whistler_wifi_device = { + .name = "bcm4329_wlan", + .id = 1, + .dev = { + .platform_data = &whistler_wifi_control, + }, +}; + +static struct resource sdhci_resource1[] = { + [0] = { + .start = INT_SDMMC2, + .end = INT_SDMMC2, + .flags = IORESOURCE_IRQ, + }, + [1] = { + .start = TEGRA_SDMMC2_BASE, + .end = TEGRA_SDMMC2_BASE + TEGRA_SDMMC2_SIZE-1, + .flags = IORESOURCE_MEM, + }, +}; + + static struct resource sdhci_resource2[] = { [0] = { .start = INT_SDMMC3, @@ -56,6 +132,27 @@ static struct resource sdhci_resource3[] = { }, }; +static struct tegra_sdhci_platform_data tegra_sdhci_platform_data1 = { + .clk_id = NULL, + .force_hs = 0, + .register_status_notify = whistler_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, +}; + static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = { .cd_gpio = WHISTLER_EXT_SDCARD_DETECT, .wp_gpio = -1, @@ -68,6 +165,16 @@ static struct tegra_sdhci_platform_data tegra_sdhci_platform_data3 = { .power_gpio = -1, }; +static struct platform_device tegra_sdhci_device1 = { + .name = "sdhci-tegra", + .id = 1, + .resource = sdhci_resource1, + .num_resources = ARRAY_SIZE(sdhci_resource1), + .dev = { + .platform_data = &tegra_sdhci_platform_data1, + }, +}; + static struct platform_device tegra_sdhci_device2 = { .name = "sdhci-tegra", .id = 2, @@ -88,6 +195,20 @@ static struct platform_device tegra_sdhci_device3 = { }, }; +static int __init whistler_wifi_init(void) +{ + gpio_request(WHISTLER_WLAN_PWR, "wlan_power"); + gpio_request(WHISTLER_WLAN_RST, "wlan_rst"); + + tegra_gpio_enable(WHISTLER_WLAN_PWR); + tegra_gpio_enable(WHISTLER_WLAN_RST); + + gpio_direction_output(WHISTLER_WLAN_PWR, 0); + gpio_direction_output(WHISTLER_WLAN_RST, 0); + + platform_device_register(&whistler_wifi_device); + return 0; +} int __init whistler_sdhci_init(void) { int ret; @@ -96,6 +217,8 @@ int __init whistler_sdhci_init(void) platform_device_register(&tegra_sdhci_device3); platform_device_register(&tegra_sdhci_device2); + platform_device_register(&tegra_sdhci_device1); + whistler_wifi_init(); return 0; } |