Merge branch 'tsc2005' into next
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / brcm80211 / brcmfmac / dhd_custom_gpio.c
CommitLineData
cf2b4488
HP
1/*
2 * Copyright (c) 2010 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
c6ac24e9 17#include <linux/netdevice.h>
cf2b4488
HP
18#include <osl.h>
19#include <bcmutils.h>
20
21#include <dngl_stats.h>
22#include <dhd.h>
23
24#include <wlioctl.h>
25#include <wl_iw.h>
26
f4528696
JP
27#define WL_ERROR(fmt, args...) printk(fmt, ##args)
28#define WL_TRACE(fmt, args...) no_printk(fmt, ##args)
cf2b4488
HP
29
30#ifdef CUSTOMER_HW
31extern void bcm_wlan_power_off(int);
32extern void bcm_wlan_power_on(int);
33#endif /* CUSTOMER_HW */
34#ifdef CUSTOMER_HW2
35int wifi_set_carddetect(int on);
36int wifi_set_power(int on, unsigned long msec);
37int wifi_get_irq_number(unsigned long *irq_flags_ptr);
38#endif
39
40#if defined(OOB_INTR_ONLY)
41
42#if defined(BCMLXSDMMC)
43extern int sdioh_mmc_irq(int irq);
44#endif /* (BCMLXSDMMC) */
45
46#ifdef CUSTOMER_HW3
47#include <mach/gpio.h>
48#endif
49
50/* Customer specific Host GPIO defintion */
51static int dhd_oob_gpio_num = -1; /* GG 19 */
52
53module_param(dhd_oob_gpio_num, int, 0644);
54MODULE_PARM_DESC(dhd_oob_gpio_num, "DHD oob gpio number");
55
56int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr)
57{
58 int host_oob_irq = 0;
59
60#ifdef CUSTOMER_HW2
61 host_oob_irq = wifi_get_irq_number(irq_flags_ptr);
62
63#else /* for NOT CUSTOMER_HW2 */
64#if defined(CUSTOM_OOB_GPIO_NUM)
65 if (dhd_oob_gpio_num < 0)
66 dhd_oob_gpio_num = CUSTOM_OOB_GPIO_NUM;
67#endif
68
69 if (dhd_oob_gpio_num < 0) {
f4528696
JP
70 WL_ERROR("%s: ERROR customer specific Host GPIO is NOT defined\n",
71 __func__);
cf2b4488
HP
72 return dhd_oob_gpio_num;
73 }
74
f4528696
JP
75 WL_ERROR("%s: customer specific Host GPIO number is (%d)\n",
76 __func__, dhd_oob_gpio_num);
cf2b4488
HP
77
78#if defined CUSTOMER_HW
79 host_oob_irq = MSM_GPIO_TO_INT(dhd_oob_gpio_num);
80#elif defined CUSTOMER_HW3
81 gpio_request(dhd_oob_gpio_num, "oob irq");
82 host_oob_irq = gpio_to_irq(dhd_oob_gpio_num);
83 gpio_direction_input(dhd_oob_gpio_num);
84#endif /* CUSTOMER_HW */
85#endif /* CUSTOMER_HW2 */
86
87 return host_oob_irq;
88}
89#endif /* defined(OOB_INTR_ONLY) */
90
91/* Customer function to control hw specific wlan gpios */
92void dhd_customer_gpio_wlan_ctrl(int onoff)
93{
94 switch (onoff) {
95 case WLAN_RESET_OFF:
f4528696
JP
96 WL_TRACE("%s: call customer specific GPIO to insert WLAN RESET\n",
97 __func__);
cf2b4488
HP
98#ifdef CUSTOMER_HW
99 bcm_wlan_power_off(2);
100#endif /* CUSTOMER_HW */
101#ifdef CUSTOMER_HW2
102 wifi_set_power(0, 0);
103#endif
f4528696 104 WL_ERROR("=========== WLAN placed in RESET ========\n");
cf2b4488
HP
105 break;
106
107 case WLAN_RESET_ON:
f4528696
JP
108 WL_TRACE("%s: callc customer specific GPIO to remove WLAN RESET\n",
109 __func__);
cf2b4488
HP
110#ifdef CUSTOMER_HW
111 bcm_wlan_power_on(2);
112#endif /* CUSTOMER_HW */
113#ifdef CUSTOMER_HW2
114 wifi_set_power(1, 0);
115#endif
f4528696 116 WL_ERROR("=========== WLAN going back to live ========\n");
cf2b4488
HP
117 break;
118
119 case WLAN_POWER_OFF:
f4528696
JP
120 WL_TRACE("%s: call customer specific GPIO to turn off WL_REG_ON\n",
121 __func__);
cf2b4488
HP
122#ifdef CUSTOMER_HW
123 bcm_wlan_power_off(1);
124#endif /* CUSTOMER_HW */
125 break;
126
127 case WLAN_POWER_ON:
f4528696
JP
128 WL_TRACE("%s: call customer specific GPIO to turn on WL_REG_ON\n",
129 __func__);
cf2b4488
HP
130#ifdef CUSTOMER_HW
131 bcm_wlan_power_on(1);
132#endif /* CUSTOMER_HW */
133 /* Lets customer power to get stable */
7383141b 134 udelay(200);
cf2b4488
HP
135 break;
136 }
137}
138
139#ifdef GET_CUSTOM_MAC_ENABLE
140/* Function to get custom MAC address */
141int dhd_custom_get_mac_address(unsigned char *buf)
142{
f4528696 143 WL_TRACE("%s Enter\n", __func__);
cf2b4488
HP
144 if (!buf)
145 return -EINVAL;
146
147 /* Customer access to MAC address stored outside of DHD driver */
148
149#ifdef EXAMPLE_GET_MAC
150 /* EXAMPLE code */
151 {
152 struct ether_addr ea_example = {
e9887c9d 153 {0x00, 0x11, 0x22, 0x33, 0x44, 0xFF} };
cf2b4488
HP
154 bcopy((char *)&ea_example, buf, sizeof(struct ether_addr));
155 }
156#endif /* EXAMPLE_GET_MAC */
157
158 return 0;
159}
160#endif /* GET_CUSTOM_MAC_ENABLE */