1 /******************************************************************************
2 * Customer code to add GPIO control during WLAN start/stop
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
20 ******************************************************************************/
21 #include "drv_types.h"
23 #ifdef CONFIG_PLATFORM_SPRD
25 /* gspi func & GPIO define */
26 #include <mach/gpio.h>/* 0915 */
27 #include <mach/board.h>
29 #if !(defined ANDROID_2X)
31 #ifdef CONFIG_RTL8188E
32 #include <mach/regulator.h>
33 #include <linux/regulator/consumer.h>
34 #endif /* CONFIG_RTL8188E */
36 #ifndef GPIO_WIFI_POWER
37 #define GPIO_WIFI_POWER -1
38 #endif /* !GPIO_WIFI_POWER */
40 #ifndef GPIO_WIFI_RESET
41 #define GPIO_WIFI_RESET -1
42 #endif /* !GPIO_WIFI_RESET */
44 #ifndef GPIO_WIFI_PWDN
45 #define GPIO_WIFI_PWDN -1
46 #endif /* !GPIO_WIFI_RESET */
47 #ifdef CONFIG_GSPI_HCI
48 extern unsigned int oob_irq;
49 #endif /* CONFIG_GSPI_HCI */
51 #ifdef CONFIG_SDIO_HCI
52 extern int rtw_mp_mode;
53 #else /* !CONFIG_SDIO_HCI */
54 #endif /* !CONFIG_SDIO_HCI */
56 int rtw_wifi_gpio_init(void)
58 #ifdef CONFIG_GSPI_HCI
59 if (GPIO_WIFI_IRQ > 0) {
60 gpio_request(GPIO_WIFI_IRQ, "oob_irq");
61 gpio_direction_input(GPIO_WIFI_IRQ);
63 oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);
65 RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq);
68 if (GPIO_WIFI_RESET > 0)
69 gpio_request(GPIO_WIFI_RESET , "wifi_rst");
70 if (GPIO_WIFI_POWER > 0)
71 gpio_request(GPIO_WIFI_POWER, "wifi_power");
73 #ifdef CONFIG_SDIO_HCI
74 #if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)
75 if (rtw_mp_mode == 1) {
76 RTW_INFO("%s GPIO_BT_RESET pin special for mp_test\n", __func__);
77 if (GPIO_BT_RESET > 0)
78 gpio_request(GPIO_BT_RESET , "bt_rst");
85 int rtw_wifi_gpio_deinit(void)
87 #ifdef CONFIG_GSPI_HCI
88 if (GPIO_WIFI_IRQ > 0)
89 gpio_free(GPIO_WIFI_IRQ);
91 if (GPIO_WIFI_RESET > 0)
92 gpio_free(GPIO_WIFI_RESET);
93 if (GPIO_WIFI_POWER > 0)
94 gpio_free(GPIO_WIFI_POWER);
96 #ifdef CONFIG_SDIO_HCI
97 #if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)
98 if (rtw_mp_mode == 1) {
99 RTW_INFO("%s GPIO_BT_RESET pin special for mp_test\n", __func__);
100 if (GPIO_BT_RESET > 0)
101 gpio_free(GPIO_BT_RESET);
108 /* Customer function to control hw specific wlan gpios */
109 void rtw_wifi_gpio_wlan_ctrl(int onoff)
113 RTW_INFO("%s: call customer specific GPIO(%d) to set wifi power down pin to 0\n",
114 __FUNCTION__, GPIO_WIFI_RESET);
116 #ifndef CONFIG_DONT_BUS_SCAN
117 if (GPIO_WIFI_RESET > 0)
118 gpio_direction_output(GPIO_WIFI_RESET , 0);
123 RTW_INFO("%s: callc customer specific GPIO(%d) to set wifi power down pin to 1\n",
124 __FUNCTION__, GPIO_WIFI_RESET);
126 if (GPIO_WIFI_RESET > 0)
127 gpio_direction_output(GPIO_WIFI_RESET , 1);
135 #ifdef CONFIG_SDIO_HCI
136 #if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)
137 case WLAN_BT_PWDN_OFF:
138 if (rtw_mp_mode == 1) {
139 RTW_INFO("%s: call customer specific GPIO to set wifi power down pin to 0\n",
141 if (GPIO_BT_RESET > 0)
142 gpio_direction_output(GPIO_BT_RESET , 0);
146 case WLAN_BT_PWDN_ON:
147 if (rtw_mp_mode == 1) {
148 RTW_INFO("%s: callc customer specific GPIO to set wifi power down pin to 1 %x\n",
149 __FUNCTION__, GPIO_BT_RESET);
151 if (GPIO_BT_RESET > 0)
152 gpio_direction_output(GPIO_BT_RESET , 1);
160 #else /* ANDROID_2X */
162 #include <mach/ldo.h>
164 #ifdef CONFIG_RTL8188E
165 extern int sprd_3rdparty_gpio_wifi_power;
167 extern int sprd_3rdparty_gpio_wifi_pwd;
168 #if defined(CONFIG_RTL8723B)
169 extern int sprd_3rdparty_gpio_bt_reset;
172 int rtw_wifi_gpio_init(void)
174 #if defined(CONFIG_RTL8723B)
175 if (sprd_3rdparty_gpio_bt_reset > 0)
176 gpio_direction_output(sprd_3rdparty_gpio_bt_reset, 1);
182 int rtw_wifi_gpio_deinit(void)
187 /* Customer function to control hw specific wlan gpios */
188 void rtw_wifi_gpio_wlan_ctrl(int onoff)
192 RTW_INFO("%s: call customer specific GPIO to set wifi power down pin to 0\n",
194 if (sprd_3rdparty_gpio_wifi_pwd > 0)
195 gpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 0);
197 if (sprd_3rdparty_gpio_wifi_pwd == 60) {
198 RTW_INFO("%s: turn off VSIM2 2.8V\n", __func__);
199 LDO_TurnOffLDO(LDO_LDO_SIM2);
204 RTW_INFO("%s: callc customer specific GPIO to set wifi power down pin to 1\n",
206 if (sprd_3rdparty_gpio_wifi_pwd == 60) {
207 RTW_INFO("%s: turn on VSIM2 2.8V\n", __func__);
208 LDO_SetVoltLevel(LDO_LDO_SIM2, LDO_VOLT_LEVEL0);
209 LDO_TurnOnLDO(LDO_LDO_SIM2);
211 if (sprd_3rdparty_gpio_wifi_pwd > 0)
212 gpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 1);
216 #ifdef CONFIG_RTL8188E
217 #ifdef CONFIG_WIF1_LDO
218 RTW_INFO("%s: turn off VDD-WIFI0 1.2V\n", __FUNCTION__);
219 LDO_TurnOffLDO(LDO_LDO_WIF1);
220 #endif /* CONFIG_WIF1_LDO */
222 RTW_INFO("%s: turn off VDD-WIFI0 3.3V\n", __FUNCTION__);
223 LDO_TurnOffLDO(LDO_LDO_WIF0);
225 RTW_INFO("%s: call customer specific GPIO(%d) to turn off wifi power\n",
226 __FUNCTION__, sprd_3rdparty_gpio_wifi_power);
227 if (sprd_3rdparty_gpio_wifi_power != 65535)
228 gpio_set_value(sprd_3rdparty_gpio_wifi_power, 0);
233 #ifdef CONFIG_RTL8188E
234 RTW_INFO("%s: call customer specific GPIO(%d) to turn on wifi power\n",
235 __FUNCTION__, sprd_3rdparty_gpio_wifi_power);
236 if (sprd_3rdparty_gpio_wifi_power != 65535)
237 gpio_set_value(sprd_3rdparty_gpio_wifi_power, 1);
239 RTW_INFO("%s: turn on VDD-WIFI0 3.3V\n", __FUNCTION__);
240 LDO_TurnOnLDO(LDO_LDO_WIF0);
241 LDO_SetVoltLevel(LDO_LDO_WIF0, LDO_VOLT_LEVEL1);
243 #ifdef CONFIG_WIF1_LDO
244 RTW_INFO("%s: turn on VDD-WIFI1 1.2V\n", __func__);
245 LDO_TurnOnLDO(LDO_LDO_WIF1);
246 LDO_SetVoltLevel(LDO_LDO_WIF1, LDO_VOLT_LEVEL3);
247 #endif /* CONFIG_WIF1_LDO */
251 case WLAN_BT_PWDN_OFF:
252 RTW_INFO("%s: call customer specific GPIO to set bt power down pin to 0\n",
254 #if defined(CONFIG_RTL8723B)
255 if (sprd_3rdparty_gpio_bt_reset > 0)
256 gpio_set_value(sprd_3rdparty_gpio_bt_reset, 0);
260 case WLAN_BT_PWDN_ON:
261 RTW_INFO("%s: callc customer specific GPIO to set bt power down pin to 1\n",
263 #if defined(CONFIG_RTL8723B)
264 if (sprd_3rdparty_gpio_bt_reset > 0)
265 gpio_set_value(sprd_3rdparty_gpio_bt_reset, 1);
270 #endif /* ANDROID_2X */
272 #elif defined(CONFIG_PLATFORM_ARM_RK3066)
273 #include <mach/iomux.h>
275 #define GPIO_WIFI_IRQ RK30_PIN2_PC2
276 extern unsigned int oob_irq;
277 int rtw_wifi_gpio_init(void)
279 #ifdef CONFIG_GSPI_HCI
280 if (GPIO_WIFI_IRQ > 0) {
281 rk30_mux_api_set(GPIO2C2_LCDC1DATA18_SMCBLSN1_HSADCDATA5_NAME, GPIO2C_GPIO2C2);/* jacky_test */
282 gpio_request(GPIO_WIFI_IRQ, "oob_irq");
283 gpio_direction_input(GPIO_WIFI_IRQ);
285 oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);
287 RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq);
294 int rtw_wifi_gpio_deinit(void)
296 #ifdef CONFIG_GSPI_HCI
297 if (GPIO_WIFI_IRQ > 0)
298 gpio_free(GPIO_WIFI_IRQ);
303 void rtw_wifi_gpio_wlan_ctrl(int onoff)
307 #ifdef CONFIG_GPIO_API
308 /* this is a demo for extending GPIO pin[7] as interrupt mode */
309 struct net_device *rtl_net;
310 extern int rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level));
311 extern int rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num);
312 void gpio_int(u8 is_high)
314 RTW_INFO("%s level=%d\n", __func__, is_high);
316 int register_net_gpio_init(void)
318 rtl_net = dev_get_by_name(&init_net, "wlan0");
320 RTW_PRINT("rtl_net init fail!\n");
323 return rtw_register_gpio_interrupt(rtl_net, 7, gpio_int);
325 int unregister_net_gpio_init(void)
327 rtl_net = dev_get_by_name(&init_net, "wlan0");
329 RTW_PRINT("rtl_net init fail!\n");
332 return rtw_disable_gpio_interrupt(rtl_net, 7);
338 int rtw_wifi_gpio_init(void)
343 void rtw_wifi_gpio_wlan_ctrl(int onoff)
346 #endif /* CONFIG_PLATFORM_SPRD */