summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-ventana-wifi.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/board-ventana-wifi.c')
-rw-r--r--arch/arm/mach-tegra/board-ventana-wifi.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-ventana-wifi.c b/arch/arm/mach-tegra/board-ventana-wifi.c
new file mode 100644
index 000000000000..0d686f5a1fb3
--- /dev/null
+++ b/arch/arm/mach-tegra/board-ventana-wifi.c
@@ -0,0 +1,98 @@
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/wlan_plat.h>
+#include <linux/delay.h>
+
+#include "nvodm_query_discovery.h"
+#include "gpio-names.h"
+#include "board.h"
+
+#define VENTANA_WLAN_PWR TEGRA_GPIO_PK5
+#define VENTANA_WLAN_RST TEGRA_GPIO_PK6
+
+static void (*wifi_status_cb)(int card_present, void *dev_id);
+static void *wifi_status_cb_devid;
+
+
+int ventana_wifi_status_register(void (*callback)(int card_present,
+ void *dev_id), void *dev_id)
+{
+ pr_debug("%s:\n", __func__);
+ if (wifi_status_cb) {
+ pr_err("%s: callback already registered\n", __func__);
+ return -EAGAIN;
+ }
+ wifi_status_cb = callback;
+ wifi_status_cb_devid = dev_id;
+ return 0;
+}
+
+
+static int ventana_wifi_power_state;
+static int ventana_wifi_power(int on)
+{
+ pr_debug("%s: %d\n", __func__, on);
+
+ mdelay(100);
+ gpio_set_value(VENTANA_WLAN_PWR, on);
+ mdelay(100);
+ gpio_set_value(VENTANA_WLAN_RST, on);
+ mdelay(200);
+
+ ventana_wifi_power_state = on;
+ return 0;
+}
+
+static int ventana_wifi_reset_state;
+static int ventana_wifi_reset(int on)
+{
+ pr_debug("%s: %d do nothing\n", __func__, on);
+ ventana_wifi_reset_state = on;
+ return 0;
+}
+
+static int ventana_wifi_cd; /* WIFI virtual 'card detect' status */
+static int ventana_wifi_set_carddetect(int val)
+{
+ pr_debug("%s: %d\n", __func__, val);
+ ventana_wifi_cd = 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 struct wifi_platform_data ventana_wifi_control = {
+ .set_power = ventana_wifi_power,
+ .set_reset = ventana_wifi_reset,
+ .set_carddetect = ventana_wifi_set_carddetect,
+};
+
+static struct platform_device ventana_wifi_device = {
+ .name = "bcm4329_wlan",
+ .id = 1,
+ .dev = {
+ .platform_data = &ventana_wifi_control,
+ },
+};
+
+static void __init ventana_wlan_gpio(void)
+{
+ tegra_gpio_enable(VENTANA_WLAN_PWR);
+ gpio_request(VENTANA_WLAN_PWR, "wlan_pwr");
+ gpio_direction_output(VENTANA_WLAN_PWR, 0);
+
+ tegra_gpio_enable(VENTANA_WLAN_RST);
+ gpio_request(VENTANA_WLAN_RST, "wlan_rst");
+ gpio_direction_output(VENTANA_WLAN_RST, 0);
+}
+
+int __init ventana_setup_wifi(void)
+{
+ pr_debug("%s: start\n", __func__);
+ ventana_wlan_gpio();
+ return platform_device_register(&ventana_wifi_device);
+}