diff options
author | Scott Williams <scwilliams@nvidia.com> | 2010-12-07 11:20:05 -0800 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:45:24 -0800 |
commit | e8c4914e040999d075b562ea671d99ab64cf45a4 (patch) | |
tree | 153a5500a8a1639f7ae6b95bc04d43a20145209c /arch/arm/mach-tegra/board-aruba-sdhci.c | |
parent | 5a5ed447904971aa146e15966b2d9c982fa157b0 (diff) |
[ARM/tegra] Add Aruba board definition files
Bug 764354
Original-Change-Id: I23d0ddc5107c02195ef58cab0e0c49ea65c72a87
Reviewed-on: http://git-master/r/12229
Reviewed-by: Scott Williams <scwilliams@nvidia.com>
Tested-by: Scott Williams <scwilliams@nvidia.com>
Original-Change-Id: Ibaa7f1e4cd5a3e3475d56601b420e40985194197
Rebase-Id: Rbdcbee634d19419502574f356a35370797db473a
Diffstat (limited to 'arch/arm/mach-tegra/board-aruba-sdhci.c')
-rw-r--r-- | arch/arm/mach-tegra/board-aruba-sdhci.c | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-aruba-sdhci.c b/arch/arm/mach-tegra/board-aruba-sdhci.c new file mode 100644 index 000000000000..fc801c080fa7 --- /dev/null +++ b/arch/arm/mach-tegra/board-aruba-sdhci.c @@ -0,0 +1,251 @@ +/* + * arch/arm/mach-tegra/board-harmony-sdhci.c + * + * Copyright (C) 2010 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#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> +#include <mach/iomap.h> +#include <mach/sdhci.h> + +#include "gpio-names.h" +#include "board.h" + +#define ARUBA_WIFI 0 /* !!!FIXME!!! NOT SUPPORTED YET */ + +#if ARUBA_WIFI + +#define ARUBA_WLAN_PWR TEGRA_GPIO_PK5 +#define ARUBA_WLAN_RST TEGRA_GPIO_PK6 + +static void (*wifi_status_cb)(int card_present, void *dev_id); +static void *wifi_status_cb_devid; +static int aruba_wifi_status_register(void (*callback)(int , void *), void *); +static struct clk *wifi_32k_clk; + +static int aruba_wifi_reset(int on); +static int aruba_wifi_power(int on); +static int aruba_wifi_set_carddetect(int val); + +static struct wifi_platform_data aruba_wifi_control = { + .set_power = aruba_wifi_power, + .set_reset = aruba_wifi_reset, + .set_carddetect = aruba_wifi_set_carddetect, +}; + +static struct platform_device aruba_wifi_device = { + .name = "bcm4329_wlan", + .id = 1, + .dev = { + .platform_data = &aruba_wifi_control, + }, +}; +#endif + +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, + .end = INT_SDMMC3, + .flags = IORESOURCE_IRQ, + }, + [1] = { + .start = TEGRA_SDMMC3_BASE, + .end = TEGRA_SDMMC3_BASE + TEGRA_SDMMC3_SIZE-1, + .flags = IORESOURCE_MEM, + }, +}; + +static struct resource sdhci_resource3[] = { + [0] = { + .start = INT_SDMMC4, + .end = INT_SDMMC4, + .flags = IORESOURCE_IRQ, + }, + [1] = { + .start = TEGRA_SDMMC4_BASE, + .end = TEGRA_SDMMC4_BASE + TEGRA_SDMMC4_SIZE-1, + .flags = IORESOURCE_MEM, + }, +}; + + +static struct tegra_sdhci_platform_data tegra_sdhci_platform_data0 = { + .clk_id = NULL, + .force_hs = 0, +#if ARUBA_WIFI /* !!!FIXME!!! NOT SUPPORTED YET */ + .register_status_notify = aruba_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, + }, +#endif + .cd_gpio = -1, + .wp_gpio = -1, + .power_gpio = -1, +}; + +static struct tegra_sdhci_platform_data tegra_sdhci_platform_data2 = { + .clk_id = NULL, + .force_hs = 1, + .cd_gpio = -1, + .wp_gpio = -1, + .power_gpio = -1, +}; + +static struct tegra_sdhci_platform_data tegra_sdhci_platform_data3 = { + .clk_id = NULL, + .force_hs = 0, + .cd_gpio = -1, + .wp_gpio = -1, + .power_gpio = -1, +}; + +static struct platform_device tegra_sdhci_device0 = { + .name = "sdhci-tegra", + .id = 0, + .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, + .resource = sdhci_resource2, + .num_resources = ARRAY_SIZE(sdhci_resource2), + .dev = { + .platform_data = &tegra_sdhci_platform_data2, + }, +}; + +static struct platform_device tegra_sdhci_device3 = { + .name = "sdhci-tegra", + .id = 3, + .resource = sdhci_resource3, + .num_resources = ARRAY_SIZE(sdhci_resource3), + .dev = { + .platform_data = &tegra_sdhci_platform_data3, + }, +}; + +#if ARUBA_WIFI /* !!!FIXME!!! NOT SUPPORTED YET */ +static int aruba_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 aruba_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 aruba_wifi_power(int on) +{ + pr_debug("%s: %d\n", __func__, on); + + gpio_set_value(ARUBA_WLAN_PWR, on); + mdelay(100); + gpio_set_value(ARUBA_WLAN_RST, on); + mdelay(200); + + if (on) + clk_enable(wifi_32k_clk); + else + clk_disable(wifi_32k_clk); + + return 0; +} + +static int aruba_wifi_reset(int on) +{ + pr_debug("%s: do nothing\n", __func__); + return 0; +} + +static int __init aruba_wifi_init(void) +{ + wifi_32k_clk = clk_get_sys(NULL, "blink"); + if (IS_ERR(wifi_32k_clk)) { + pr_err("%s: unable to get blink clock\n", __func__); + return PTR_ERR(wifi_32k_clk); + } + + gpio_request(ARUBA_WLAN_PWR, "wlan_power"); + gpio_request(ARUBA_WLAN_RST, "wlan_rst"); + + tegra_gpio_enable(ARUBA_WLAN_PWR); + tegra_gpio_enable(ARUBA_WLAN_RST); + + gpio_direction_output(ARUBA_WLAN_PWR, 0); + gpio_direction_output(ARUBA_WLAN_RST, 0); + + platform_device_register(&aruba_wifi_device); + return 0; +} +#else +#define aruba_wifi_init() do {} while (0) +#endif + +int __init aruba_sdhci_init(void) +{ + platform_device_register(&tegra_sdhci_device3); + platform_device_register(&tegra_sdhci_device2); + platform_device_register(&tegra_sdhci_device0); + + aruba_wifi_init(); + return 0; +} |