custom_gpio_linux.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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. #ifdef CONFIG_PLATFORM_SPRD
  23. /* gspi func & GPIO define */
  24. #include <mach/gpio.h>/* 0915 */
  25. #include <mach/board.h>
  26. #if !(defined ANDROID_2X)
  27. #ifdef CONFIG_RTL8188E
  28. #include <mach/regulator.h>
  29. #include <linux/regulator/consumer.h>
  30. #endif /* CONFIG_RTL8188E */
  31. #ifndef GPIO_WIFI_POWER
  32. #define GPIO_WIFI_POWER -1
  33. #endif /* !GPIO_WIFI_POWER */
  34. #ifndef GPIO_WIFI_RESET
  35. #define GPIO_WIFI_RESET -1
  36. #endif /* !GPIO_WIFI_RESET */
  37. #ifndef GPIO_WIFI_PWDN
  38. #define GPIO_WIFI_PWDN -1
  39. #endif /* !GPIO_WIFI_RESET */
  40. #ifdef CONFIG_GSPI_HCI
  41. extern unsigned int oob_irq;
  42. #endif /* CONFIG_GSPI_HCI */
  43. #ifdef CONFIG_SDIO_HCI
  44. extern int rtw_mp_mode;
  45. #else /* !CONFIG_SDIO_HCI */
  46. #endif /* !CONFIG_SDIO_HCI */
  47. int rtw_wifi_gpio_init(void)
  48. {
  49. #ifdef CONFIG_GSPI_HCI
  50. if (GPIO_WIFI_IRQ > 0) {
  51. gpio_request(GPIO_WIFI_IRQ, "oob_irq");
  52. gpio_direction_input(GPIO_WIFI_IRQ);
  53. oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);
  54. RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq);
  55. }
  56. #endif
  57. if (GPIO_WIFI_RESET > 0)
  58. gpio_request(GPIO_WIFI_RESET , "wifi_rst");
  59. if (GPIO_WIFI_POWER > 0)
  60. gpio_request(GPIO_WIFI_POWER, "wifi_power");
  61. #ifdef CONFIG_SDIO_HCI
  62. #if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)
  63. if (rtw_mp_mode == 1) {
  64. RTW_INFO("%s GPIO_BT_RESET pin special for mp_test\n", __func__);
  65. if (GPIO_BT_RESET > 0)
  66. gpio_request(GPIO_BT_RESET , "bt_rst");
  67. }
  68. #endif
  69. #endif
  70. return 0;
  71. }
  72. int rtw_wifi_gpio_deinit(void)
  73. {
  74. #ifdef CONFIG_GSPI_HCI
  75. if (GPIO_WIFI_IRQ > 0)
  76. gpio_free(GPIO_WIFI_IRQ);
  77. #endif
  78. if (GPIO_WIFI_RESET > 0)
  79. gpio_free(GPIO_WIFI_RESET);
  80. if (GPIO_WIFI_POWER > 0)
  81. gpio_free(GPIO_WIFI_POWER);
  82. #ifdef CONFIG_SDIO_HCI
  83. #if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)
  84. if (rtw_mp_mode == 1) {
  85. RTW_INFO("%s GPIO_BT_RESET pin special for mp_test\n", __func__);
  86. if (GPIO_BT_RESET > 0)
  87. gpio_free(GPIO_BT_RESET);
  88. }
  89. #endif
  90. #endif
  91. return 0;
  92. }
  93. /* Customer function to control hw specific wlan gpios */
  94. void rtw_wifi_gpio_wlan_ctrl(int onoff)
  95. {
  96. switch (onoff) {
  97. case WLAN_PWDN_OFF:
  98. RTW_INFO("%s: call customer specific GPIO(%d) to set wifi power down pin to 0\n",
  99. __FUNCTION__, GPIO_WIFI_RESET);
  100. #ifndef CONFIG_DONT_BUS_SCAN
  101. if (GPIO_WIFI_RESET > 0)
  102. gpio_direction_output(GPIO_WIFI_RESET , 0);
  103. #endif
  104. break;
  105. case WLAN_PWDN_ON:
  106. RTW_INFO("%s: callc customer specific GPIO(%d) to set wifi power down pin to 1\n",
  107. __FUNCTION__, GPIO_WIFI_RESET);
  108. if (GPIO_WIFI_RESET > 0)
  109. gpio_direction_output(GPIO_WIFI_RESET , 1);
  110. break;
  111. case WLAN_POWER_OFF:
  112. break;
  113. case WLAN_POWER_ON:
  114. break;
  115. #ifdef CONFIG_SDIO_HCI
  116. #if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)
  117. case WLAN_BT_PWDN_OFF:
  118. if (rtw_mp_mode == 1) {
  119. RTW_INFO("%s: call customer specific GPIO to set wifi power down pin to 0\n",
  120. __FUNCTION__);
  121. if (GPIO_BT_RESET > 0)
  122. gpio_direction_output(GPIO_BT_RESET , 0);
  123. }
  124. break;
  125. case WLAN_BT_PWDN_ON:
  126. if (rtw_mp_mode == 1) {
  127. RTW_INFO("%s: callc customer specific GPIO to set wifi power down pin to 1 %x\n",
  128. __FUNCTION__, GPIO_BT_RESET);
  129. if (GPIO_BT_RESET > 0)
  130. gpio_direction_output(GPIO_BT_RESET , 1);
  131. }
  132. break;
  133. #endif
  134. #endif
  135. }
  136. }
  137. #else /* ANDROID_2X */
  138. #include <mach/ldo.h>
  139. #ifdef CONFIG_RTL8188E
  140. extern int sprd_3rdparty_gpio_wifi_power;
  141. #endif
  142. extern int sprd_3rdparty_gpio_wifi_pwd;
  143. #if defined(CONFIG_RTL8723B)
  144. extern int sprd_3rdparty_gpio_bt_reset;
  145. #endif
  146. int rtw_wifi_gpio_init(void)
  147. {
  148. #if defined(CONFIG_RTL8723B)
  149. if (sprd_3rdparty_gpio_bt_reset > 0)
  150. gpio_direction_output(sprd_3rdparty_gpio_bt_reset, 1);
  151. #endif
  152. return 0;
  153. }
  154. int rtw_wifi_gpio_deinit(void)
  155. {
  156. return 0;
  157. }
  158. /* Customer function to control hw specific wlan gpios */
  159. void rtw_wifi_gpio_wlan_ctrl(int onoff)
  160. {
  161. switch (onoff) {
  162. case WLAN_PWDN_OFF:
  163. RTW_INFO("%s: call customer specific GPIO to set wifi power down pin to 0\n",
  164. __FUNCTION__);
  165. if (sprd_3rdparty_gpio_wifi_pwd > 0)
  166. gpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 0);
  167. if (sprd_3rdparty_gpio_wifi_pwd == 60) {
  168. RTW_INFO("%s: turn off VSIM2 2.8V\n", __func__);
  169. LDO_TurnOffLDO(LDO_LDO_SIM2);
  170. }
  171. break;
  172. case WLAN_PWDN_ON:
  173. RTW_INFO("%s: callc customer specific GPIO to set wifi power down pin to 1\n",
  174. __FUNCTION__);
  175. if (sprd_3rdparty_gpio_wifi_pwd == 60) {
  176. RTW_INFO("%s: turn on VSIM2 2.8V\n", __func__);
  177. LDO_SetVoltLevel(LDO_LDO_SIM2, LDO_VOLT_LEVEL0);
  178. LDO_TurnOnLDO(LDO_LDO_SIM2);
  179. }
  180. if (sprd_3rdparty_gpio_wifi_pwd > 0)
  181. gpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 1);
  182. break;
  183. case WLAN_POWER_OFF:
  184. #ifdef CONFIG_RTL8188E
  185. #ifdef CONFIG_WIF1_LDO
  186. RTW_INFO("%s: turn off VDD-WIFI0 1.2V\n", __FUNCTION__);
  187. LDO_TurnOffLDO(LDO_LDO_WIF1);
  188. #endif /* CONFIG_WIF1_LDO */
  189. RTW_INFO("%s: turn off VDD-WIFI0 3.3V\n", __FUNCTION__);
  190. LDO_TurnOffLDO(LDO_LDO_WIF0);
  191. RTW_INFO("%s: call customer specific GPIO(%d) to turn off wifi power\n",
  192. __FUNCTION__, sprd_3rdparty_gpio_wifi_power);
  193. if (sprd_3rdparty_gpio_wifi_power != 65535)
  194. gpio_set_value(sprd_3rdparty_gpio_wifi_power, 0);
  195. #endif
  196. break;
  197. case WLAN_POWER_ON:
  198. #ifdef CONFIG_RTL8188E
  199. RTW_INFO("%s: call customer specific GPIO(%d) to turn on wifi power\n",
  200. __FUNCTION__, sprd_3rdparty_gpio_wifi_power);
  201. if (sprd_3rdparty_gpio_wifi_power != 65535)
  202. gpio_set_value(sprd_3rdparty_gpio_wifi_power, 1);
  203. RTW_INFO("%s: turn on VDD-WIFI0 3.3V\n", __FUNCTION__);
  204. LDO_TurnOnLDO(LDO_LDO_WIF0);
  205. LDO_SetVoltLevel(LDO_LDO_WIF0, LDO_VOLT_LEVEL1);
  206. #ifdef CONFIG_WIF1_LDO
  207. RTW_INFO("%s: turn on VDD-WIFI1 1.2V\n", __func__);
  208. LDO_TurnOnLDO(LDO_LDO_WIF1);
  209. LDO_SetVoltLevel(LDO_LDO_WIF1, LDO_VOLT_LEVEL3);
  210. #endif /* CONFIG_WIF1_LDO */
  211. #endif
  212. break;
  213. case WLAN_BT_PWDN_OFF:
  214. RTW_INFO("%s: call customer specific GPIO to set bt power down pin to 0\n",
  215. __FUNCTION__);
  216. #if defined(CONFIG_RTL8723B)
  217. if (sprd_3rdparty_gpio_bt_reset > 0)
  218. gpio_set_value(sprd_3rdparty_gpio_bt_reset, 0);
  219. #endif
  220. break;
  221. case WLAN_BT_PWDN_ON:
  222. RTW_INFO("%s: callc customer specific GPIO to set bt power down pin to 1\n",
  223. __FUNCTION__);
  224. #if defined(CONFIG_RTL8723B)
  225. if (sprd_3rdparty_gpio_bt_reset > 0)
  226. gpio_set_value(sprd_3rdparty_gpio_bt_reset, 1);
  227. #endif
  228. break;
  229. }
  230. }
  231. #endif /* ANDROID_2X */
  232. #elif defined(CONFIG_PLATFORM_ARM_RK3066)
  233. #include <mach/iomux.h>
  234. #define GPIO_WIFI_IRQ RK30_PIN2_PC2
  235. extern unsigned int oob_irq;
  236. int rtw_wifi_gpio_init(void)
  237. {
  238. #ifdef CONFIG_GSPI_HCI
  239. if (GPIO_WIFI_IRQ > 0) {
  240. rk30_mux_api_set(GPIO2C2_LCDC1DATA18_SMCBLSN1_HSADCDATA5_NAME, GPIO2C_GPIO2C2);/* jacky_test */
  241. gpio_request(GPIO_WIFI_IRQ, "oob_irq");
  242. gpio_direction_input(GPIO_WIFI_IRQ);
  243. oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);
  244. RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq);
  245. }
  246. #endif
  247. return 0;
  248. }
  249. int rtw_wifi_gpio_deinit(void)
  250. {
  251. #ifdef CONFIG_GSPI_HCI
  252. if (GPIO_WIFI_IRQ > 0)
  253. gpio_free(GPIO_WIFI_IRQ);
  254. #endif
  255. return 0;
  256. }
  257. void rtw_wifi_gpio_wlan_ctrl(int onoff)
  258. {
  259. }
  260. #ifdef CONFIG_GPIO_API
  261. /* this is a demo for extending GPIO pin[7] as interrupt mode */
  262. struct net_device *rtl_net;
  263. extern int rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level));
  264. extern int rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num);
  265. void gpio_int(u8 is_high)
  266. {
  267. RTW_INFO("%s level=%d\n", __func__, is_high);
  268. }
  269. int register_net_gpio_init(void)
  270. {
  271. rtl_net = dev_get_by_name(&init_net, "wlan0");
  272. if (!rtl_net) {
  273. RTW_PRINT("rtl_net init fail!\n");
  274. return -1;
  275. }
  276. return rtw_register_gpio_interrupt(rtl_net, 7, gpio_int);
  277. }
  278. int unregister_net_gpio_init(void)
  279. {
  280. rtl_net = dev_get_by_name(&init_net, "wlan0");
  281. if (!rtl_net) {
  282. RTW_PRINT("rtl_net init fail!\n");
  283. return -1;
  284. }
  285. return rtw_disable_gpio_interrupt(rtl_net, 7);
  286. }
  287. #endif
  288. #else
  289. int rtw_wifi_gpio_init(void)
  290. {
  291. return 0;
  292. }
  293. void rtw_wifi_gpio_wlan_ctrl(int onoff)
  294. {
  295. }
  296. #endif /* CONFIG_PLATFORM_SPRD */