net: wireless: rockchip_wlan: add rtl8723cs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723cs / os_dep / linux / custom_gpio_linux.c
1 /******************************************************************************
2  * Customer code to add GPIO control during WLAN start/stop
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
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.
9  *
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
13  * more details.
14  *
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
18  *
19  *
20  ******************************************************************************/
21 #include "drv_types.h"
22
23 #ifdef CONFIG_PLATFORM_SPRD
24
25 /* gspi func & GPIO define */
26 #include <mach/gpio.h>/* 0915 */
27 #include <mach/board.h>
28
29 #if !(defined ANDROID_2X)
30
31 #ifdef CONFIG_RTL8188E
32 #include <mach/regulator.h>
33 #include <linux/regulator/consumer.h>
34 #endif /* CONFIG_RTL8188E */
35
36 #ifndef GPIO_WIFI_POWER
37 #define GPIO_WIFI_POWER -1
38 #endif /* !GPIO_WIFI_POWER */
39
40 #ifndef GPIO_WIFI_RESET
41 #define GPIO_WIFI_RESET -1
42 #endif /* !GPIO_WIFI_RESET */
43
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 */
50
51 #ifdef CONFIG_SDIO_HCI
52 extern int rtw_mp_mode;
53 #else /* !CONFIG_SDIO_HCI */
54 #endif /* !CONFIG_SDIO_HCI */
55
56 int rtw_wifi_gpio_init(void)
57 {
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);
62
63                 oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);
64
65                 RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq);
66         }
67 #endif
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");
72
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");
79         }
80 #endif
81 #endif
82         return 0;
83 }
84
85 int rtw_wifi_gpio_deinit(void)
86 {
87 #ifdef CONFIG_GSPI_HCI
88         if (GPIO_WIFI_IRQ > 0)
89                 gpio_free(GPIO_WIFI_IRQ);
90 #endif
91         if (GPIO_WIFI_RESET > 0)
92                 gpio_free(GPIO_WIFI_RESET);
93         if (GPIO_WIFI_POWER > 0)
94                 gpio_free(GPIO_WIFI_POWER);
95
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);
102         }
103 #endif
104 #endif
105         return 0;
106 }
107
108 /* Customer function to control hw specific wlan gpios */
109 void rtw_wifi_gpio_wlan_ctrl(int onoff)
110 {
111         switch (onoff) {
112         case WLAN_PWDN_OFF:
113                 RTW_INFO("%s: call customer specific GPIO(%d) to set wifi power down pin to 0\n",
114                          __FUNCTION__, GPIO_WIFI_RESET);
115
116 #ifndef CONFIG_DONT_BUS_SCAN
117                 if (GPIO_WIFI_RESET > 0)
118                         gpio_direction_output(GPIO_WIFI_RESET , 0);
119 #endif
120                 break;
121
122         case WLAN_PWDN_ON:
123                 RTW_INFO("%s: callc customer specific GPIO(%d) to set wifi power down pin to 1\n",
124                          __FUNCTION__, GPIO_WIFI_RESET);
125
126                 if (GPIO_WIFI_RESET > 0)
127                         gpio_direction_output(GPIO_WIFI_RESET , 1);
128                 break;
129
130         case WLAN_POWER_OFF:
131                 break;
132
133         case WLAN_POWER_ON:
134                 break;
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",
140                                  __FUNCTION__);
141                         if (GPIO_BT_RESET > 0)
142                                 gpio_direction_output(GPIO_BT_RESET , 0);
143                 }
144                 break;
145
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);
150
151                         if (GPIO_BT_RESET > 0)
152                                 gpio_direction_output(GPIO_BT_RESET , 1);
153                 }
154                 break;
155 #endif
156 #endif
157         }
158 }
159
160 #else /* ANDROID_2X */
161
162 #include <mach/ldo.h>
163
164 #ifdef CONFIG_RTL8188E
165 extern int sprd_3rdparty_gpio_wifi_power;
166 #endif
167 extern int sprd_3rdparty_gpio_wifi_pwd;
168 #if  defined(CONFIG_RTL8723B)
169 extern int sprd_3rdparty_gpio_bt_reset;
170 #endif
171
172 int rtw_wifi_gpio_init(void)
173 {
174 #if defined(CONFIG_RTL8723B)
175         if (sprd_3rdparty_gpio_bt_reset > 0)
176                 gpio_direction_output(sprd_3rdparty_gpio_bt_reset, 1);
177 #endif
178
179         return 0;
180 }
181
182 int rtw_wifi_gpio_deinit(void)
183 {
184         return 0;
185 }
186
187 /* Customer function to control hw specific wlan gpios */
188 void rtw_wifi_gpio_wlan_ctrl(int onoff)
189 {
190         switch (onoff) {
191         case WLAN_PWDN_OFF:
192                 RTW_INFO("%s: call customer specific GPIO to set wifi power down pin to 0\n",
193                          __FUNCTION__);
194                 if (sprd_3rdparty_gpio_wifi_pwd > 0)
195                         gpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 0);
196
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);
200                 }
201                 break;
202
203         case WLAN_PWDN_ON:
204                 RTW_INFO("%s: callc customer specific GPIO to set wifi power down pin to 1\n",
205                          __FUNCTION__);
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);
210                 }
211                 if (sprd_3rdparty_gpio_wifi_pwd > 0)
212                         gpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 1);
213                 break;
214
215         case WLAN_POWER_OFF:
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 */
221
222                 RTW_INFO("%s: turn off VDD-WIFI0 3.3V\n", __FUNCTION__);
223                 LDO_TurnOffLDO(LDO_LDO_WIF0);
224
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);
229 #endif
230                 break;
231
232         case WLAN_POWER_ON:
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);
238
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);
242
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 */
248 #endif
249                 break;
250
251         case WLAN_BT_PWDN_OFF:
252                 RTW_INFO("%s: call customer specific GPIO to set bt power down pin to 0\n",
253                          __FUNCTION__);
254 #if defined(CONFIG_RTL8723B)
255                 if (sprd_3rdparty_gpio_bt_reset > 0)
256                         gpio_set_value(sprd_3rdparty_gpio_bt_reset, 0);
257 #endif
258                 break;
259
260         case WLAN_BT_PWDN_ON:
261                 RTW_INFO("%s: callc customer specific GPIO to set bt power down pin to 1\n",
262                          __FUNCTION__);
263 #if defined(CONFIG_RTL8723B)
264                 if (sprd_3rdparty_gpio_bt_reset > 0)
265                         gpio_set_value(sprd_3rdparty_gpio_bt_reset, 1);
266 #endif
267                 break;
268         }
269 }
270 #endif /* ANDROID_2X */
271
272 #elif defined(CONFIG_PLATFORM_ARM_RK3066)
273 #include <mach/iomux.h>
274
275 #define GPIO_WIFI_IRQ           RK30_PIN2_PC2
276 extern unsigned int oob_irq;
277 int rtw_wifi_gpio_init(void)
278 {
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);
284
285                 oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);
286
287                 RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq);
288         }
289 #endif
290         return 0;
291 }
292
293
294 int rtw_wifi_gpio_deinit(void)
295 {
296 #ifdef CONFIG_GSPI_HCI
297         if (GPIO_WIFI_IRQ > 0)
298                 gpio_free(GPIO_WIFI_IRQ);
299 #endif
300         return 0;
301 }
302
303 void rtw_wifi_gpio_wlan_ctrl(int onoff)
304 {
305 }
306
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)
313 {
314         RTW_INFO("%s level=%d\n", __func__, is_high);
315 }
316 int register_net_gpio_init(void)
317 {
318         rtl_net = dev_get_by_name(&init_net, "wlan0");
319         if (!rtl_net) {
320                 RTW_PRINT("rtl_net init fail!\n");
321                 return -1;
322         }
323         return rtw_register_gpio_interrupt(rtl_net, 7, gpio_int);
324 }
325 int unregister_net_gpio_init(void)
326 {
327         rtl_net = dev_get_by_name(&init_net, "wlan0");
328         if (!rtl_net) {
329                 RTW_PRINT("rtl_net init fail!\n");
330                 return -1;
331         }
332         return rtw_disable_gpio_interrupt(rtl_net, 7);
333 }
334 #endif
335
336 #else
337
338 int rtw_wifi_gpio_init(void)
339 {
340         return 0;
341 }
342
343 void rtw_wifi_gpio_wlan_ctrl(int onoff)
344 {
345 }
346 #endif /* CONFIG_PLATFORM_SPRD */