Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
[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 <bcmutils.h>
19
20#include <dngl_stats.h>
21#include <dhd.h>
22
23#include <wlioctl.h>
24#include <wl_iw.h>
25
f4528696
JP
26#define WL_ERROR(fmt, args...) printk(fmt, ##args)
27#define WL_TRACE(fmt, args...) no_printk(fmt, ##args)
cf2b4488
HP
28
29#ifdef CUSTOMER_HW
30extern void bcm_wlan_power_off(int);
31extern void bcm_wlan_power_on(int);
32#endif /* CUSTOMER_HW */
33#ifdef CUSTOMER_HW2
34int wifi_set_carddetect(int on);
35int wifi_set_power(int on, unsigned long msec);
36int wifi_get_irq_number(unsigned long *irq_flags_ptr);
37#endif
38
39#if defined(OOB_INTR_ONLY)
40
41#if defined(BCMLXSDMMC)
42extern int sdioh_mmc_irq(int irq);
43#endif /* (BCMLXSDMMC) */
44
45#ifdef CUSTOMER_HW3
46#include <mach/gpio.h>
47#endif
48
49/* Customer specific Host GPIO defintion */
50static int dhd_oob_gpio_num = -1; /* GG 19 */
51
52module_param(dhd_oob_gpio_num, int, 0644);
53MODULE_PARM_DESC(dhd_oob_gpio_num, "DHD oob gpio number");
54
55int dhd_customer_oob_irq_map(unsigned long *irq_flags_ptr)
56{
57 int host_oob_irq = 0;
58
59#ifdef CUSTOMER_HW2
60 host_oob_irq = wifi_get_irq_number(irq_flags_ptr);
61
62#else /* for NOT CUSTOMER_HW2 */
63#if defined(CUSTOM_OOB_GPIO_NUM)
64 if (dhd_oob_gpio_num < 0)
65 dhd_oob_gpio_num = CUSTOM_OOB_GPIO_NUM;
66#endif
67
68 if (dhd_oob_gpio_num < 0) {
f4528696
JP
69 WL_ERROR("%s: ERROR customer specific Host GPIO is NOT defined\n",
70 __func__);
cf2b4488
HP
71 return dhd_oob_gpio_num;
72 }
73
f4528696
JP
74 WL_ERROR("%s: customer specific Host GPIO number is (%d)\n",
75 __func__, dhd_oob_gpio_num);
cf2b4488
HP
76
77#if defined CUSTOMER_HW
78 host_oob_irq = MSM_GPIO_TO_INT(dhd_oob_gpio_num);
79#elif defined CUSTOMER_HW3
80 gpio_request(dhd_oob_gpio_num, "oob irq");
81 host_oob_irq = gpio_to_irq(dhd_oob_gpio_num);
82 gpio_direction_input(dhd_oob_gpio_num);
83#endif /* CUSTOMER_HW */
84#endif /* CUSTOMER_HW2 */
85
86 return host_oob_irq;
87}
88#endif /* defined(OOB_INTR_ONLY) */
89
90/* Customer function to control hw specific wlan gpios */
91void dhd_customer_gpio_wlan_ctrl(int onoff)
92{
93 switch (onoff) {
94 case WLAN_RESET_OFF:
f4528696
JP
95 WL_TRACE("%s: call customer specific GPIO to insert WLAN RESET\n",
96 __func__);
cf2b4488
HP
97#ifdef CUSTOMER_HW
98 bcm_wlan_power_off(2);
99#endif /* CUSTOMER_HW */
100#ifdef CUSTOMER_HW2
101 wifi_set_power(0, 0);
102#endif
f4528696 103 WL_ERROR("=========== WLAN placed in RESET ========\n");
cf2b4488
HP
104 break;
105
106 case WLAN_RESET_ON:
f4528696
JP
107 WL_TRACE("%s: callc customer specific GPIO to remove WLAN RESET\n",
108 __func__);
cf2b4488
HP
109#ifdef CUSTOMER_HW
110 bcm_wlan_power_on(2);
111#endif /* CUSTOMER_HW */
112#ifdef CUSTOMER_HW2
113 wifi_set_power(1, 0);
114#endif
f4528696 115 WL_ERROR("=========== WLAN going back to live ========\n");
cf2b4488
HP
116 break;
117
118 case WLAN_POWER_OFF:
f4528696
JP
119 WL_TRACE("%s: call customer specific GPIO to turn off WL_REG_ON\n",
120 __func__);
cf2b4488
HP
121#ifdef CUSTOMER_HW
122 bcm_wlan_power_off(1);
123#endif /* CUSTOMER_HW */
124 break;
125
126 case WLAN_POWER_ON:
f4528696
JP
127 WL_TRACE("%s: call customer specific GPIO to turn on WL_REG_ON\n",
128 __func__);
cf2b4488
HP
129#ifdef CUSTOMER_HW
130 bcm_wlan_power_on(1);
131#endif /* CUSTOMER_HW */
132 /* Lets customer power to get stable */
7383141b 133 udelay(200);
cf2b4488
HP
134 break;
135 }
136}
137
138#ifdef GET_CUSTOM_MAC_ENABLE
139/* Function to get custom MAC address */
140int dhd_custom_get_mac_address(unsigned char *buf)
141{
f4528696 142 WL_TRACE("%s Enter\n", __func__);
cf2b4488
HP
143 if (!buf)
144 return -EINVAL;
145
146 /* Customer access to MAC address stored outside of DHD driver */
147
148#ifdef EXAMPLE_GET_MAC
149 /* EXAMPLE code */
150 {
02160695
SF
151 u8 ea_example[ETH_ALEN] = {0x00, 0x11, 0x22, 0x33, 0x44, 0xFF};
152 memcpy(buf, ea_example, ETH_ALEN);
cf2b4488
HP
153 }
154#endif /* EXAMPLE_GET_MAC */
155
156 return 0;
157}
158#endif /* GET_CUSTOM_MAC_ENABLE */