Path: blob/master/ALFA-W1F1/RTL8814AU/os_dep/linux/custom_gpio_linux.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#include "drv_types.h"1516#ifdef CONFIG_PLATFORM_SPRD1718/* gspi func & GPIO define */19#include <mach/gpio.h>/* 0915 */20#include <mach/board.h>2122#if !(defined ANDROID_2X)2324#ifdef CONFIG_RTL8188E25#include <mach/regulator.h>26#include <linux/regulator/consumer.h>27#endif /* CONFIG_RTL8188E */2829#ifndef GPIO_WIFI_POWER30#define GPIO_WIFI_POWER -131#endif /* !GPIO_WIFI_POWER */3233#ifndef GPIO_WIFI_RESET34#define GPIO_WIFI_RESET -135#endif /* !GPIO_WIFI_RESET */3637#ifndef GPIO_WIFI_PWDN38#define GPIO_WIFI_PWDN -139#endif /* !GPIO_WIFI_RESET */40#ifdef CONFIG_GSPI_HCI41extern unsigned int oob_irq;42#endif /* CONFIG_GSPI_HCI */4344#ifdef CONFIG_SDIO_HCI45extern int rtw_mp_mode;46#else /* !CONFIG_SDIO_HCI */47#endif /* !CONFIG_SDIO_HCI */4849int rtw_wifi_gpio_init(void)50{51#ifdef CONFIG_GSPI_HCI52if (GPIO_WIFI_IRQ > 0) {53gpio_request(GPIO_WIFI_IRQ, "oob_irq");54gpio_direction_input(GPIO_WIFI_IRQ);5556oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);5758RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq);59}60#endif61if (GPIO_WIFI_RESET > 0)62gpio_request(GPIO_WIFI_RESET , "wifi_rst");63if (GPIO_WIFI_POWER > 0)64gpio_request(GPIO_WIFI_POWER, "wifi_power");6566#ifdef CONFIG_SDIO_HCI67#if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)68if (rtw_mp_mode == 1) {69RTW_INFO("%s GPIO_BT_RESET pin special for mp_test\n", __func__);70if (GPIO_BT_RESET > 0)71gpio_request(GPIO_BT_RESET , "bt_rst");72}73#endif74#endif75return 0;76}7778int rtw_wifi_gpio_deinit(void)79{80#ifdef CONFIG_GSPI_HCI81if (GPIO_WIFI_IRQ > 0)82gpio_free(GPIO_WIFI_IRQ);83#endif84if (GPIO_WIFI_RESET > 0)85gpio_free(GPIO_WIFI_RESET);86if (GPIO_WIFI_POWER > 0)87gpio_free(GPIO_WIFI_POWER);8889#ifdef CONFIG_SDIO_HCI90#if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)91if (rtw_mp_mode == 1) {92RTW_INFO("%s GPIO_BT_RESET pin special for mp_test\n", __func__);93if (GPIO_BT_RESET > 0)94gpio_free(GPIO_BT_RESET);95}96#endif97#endif98return 0;99}100101/* Customer function to control hw specific wlan gpios */102void rtw_wifi_gpio_wlan_ctrl(int onoff)103{104switch (onoff) {105case WLAN_PWDN_OFF:106RTW_INFO("%s: call customer specific GPIO(%d) to set wifi power down pin to 0\n",107__FUNCTION__, GPIO_WIFI_RESET);108109#ifndef CONFIG_DONT_BUS_SCAN110if (GPIO_WIFI_RESET > 0)111gpio_direction_output(GPIO_WIFI_RESET , 0);112#endif113break;114115case WLAN_PWDN_ON:116RTW_INFO("%s: callc customer specific GPIO(%d) to set wifi power down pin to 1\n",117__FUNCTION__, GPIO_WIFI_RESET);118119if (GPIO_WIFI_RESET > 0)120gpio_direction_output(GPIO_WIFI_RESET , 1);121break;122123case WLAN_POWER_OFF:124break;125126case WLAN_POWER_ON:127break;128#ifdef CONFIG_SDIO_HCI129#if (defined(CONFIG_RTL8723B)) && (MP_DRIVER == 1)130case WLAN_BT_PWDN_OFF:131if (rtw_mp_mode == 1) {132RTW_INFO("%s: call customer specific GPIO to set wifi power down pin to 0\n",133__FUNCTION__);134if (GPIO_BT_RESET > 0)135gpio_direction_output(GPIO_BT_RESET , 0);136}137break;138139case WLAN_BT_PWDN_ON:140if (rtw_mp_mode == 1) {141RTW_INFO("%s: callc customer specific GPIO to set wifi power down pin to 1 %x\n",142__FUNCTION__, GPIO_BT_RESET);143144if (GPIO_BT_RESET > 0)145gpio_direction_output(GPIO_BT_RESET , 1);146}147break;148#endif149#endif150}151}152153#else /* ANDROID_2X */154155#include <mach/ldo.h>156157#ifdef CONFIG_RTL8188E158extern int sprd_3rdparty_gpio_wifi_power;159#endif160extern int sprd_3rdparty_gpio_wifi_pwd;161#if defined(CONFIG_RTL8723B)162extern int sprd_3rdparty_gpio_bt_reset;163#endif164165int rtw_wifi_gpio_init(void)166{167#if defined(CONFIG_RTL8723B)168if (sprd_3rdparty_gpio_bt_reset > 0)169gpio_direction_output(sprd_3rdparty_gpio_bt_reset, 1);170#endif171172return 0;173}174175int rtw_wifi_gpio_deinit(void)176{177return 0;178}179180/* Customer function to control hw specific wlan gpios */181void rtw_wifi_gpio_wlan_ctrl(int onoff)182{183switch (onoff) {184case WLAN_PWDN_OFF:185RTW_INFO("%s: call customer specific GPIO to set wifi power down pin to 0\n",186__FUNCTION__);187if (sprd_3rdparty_gpio_wifi_pwd > 0)188gpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 0);189190if (sprd_3rdparty_gpio_wifi_pwd == 60) {191RTW_INFO("%s: turn off VSIM2 2.8V\n", __func__);192LDO_TurnOffLDO(LDO_LDO_SIM2);193}194break;195196case WLAN_PWDN_ON:197RTW_INFO("%s: callc customer specific GPIO to set wifi power down pin to 1\n",198__FUNCTION__);199if (sprd_3rdparty_gpio_wifi_pwd == 60) {200RTW_INFO("%s: turn on VSIM2 2.8V\n", __func__);201LDO_SetVoltLevel(LDO_LDO_SIM2, LDO_VOLT_LEVEL0);202LDO_TurnOnLDO(LDO_LDO_SIM2);203}204if (sprd_3rdparty_gpio_wifi_pwd > 0)205gpio_set_value(sprd_3rdparty_gpio_wifi_pwd, 1);206break;207208case WLAN_POWER_OFF:209#ifdef CONFIG_RTL8188E210#ifdef CONFIG_WIF1_LDO211RTW_INFO("%s: turn off VDD-WIFI0 1.2V\n", __FUNCTION__);212LDO_TurnOffLDO(LDO_LDO_WIF1);213#endif /* CONFIG_WIF1_LDO */214215RTW_INFO("%s: turn off VDD-WIFI0 3.3V\n", __FUNCTION__);216LDO_TurnOffLDO(LDO_LDO_WIF0);217218RTW_INFO("%s: call customer specific GPIO(%d) to turn off wifi power\n",219__FUNCTION__, sprd_3rdparty_gpio_wifi_power);220if (sprd_3rdparty_gpio_wifi_power != 65535)221gpio_set_value(sprd_3rdparty_gpio_wifi_power, 0);222#endif223break;224225case WLAN_POWER_ON:226#ifdef CONFIG_RTL8188E227RTW_INFO("%s: call customer specific GPIO(%d) to turn on wifi power\n",228__FUNCTION__, sprd_3rdparty_gpio_wifi_power);229if (sprd_3rdparty_gpio_wifi_power != 65535)230gpio_set_value(sprd_3rdparty_gpio_wifi_power, 1);231232RTW_INFO("%s: turn on VDD-WIFI0 3.3V\n", __FUNCTION__);233LDO_TurnOnLDO(LDO_LDO_WIF0);234LDO_SetVoltLevel(LDO_LDO_WIF0, LDO_VOLT_LEVEL1);235236#ifdef CONFIG_WIF1_LDO237RTW_INFO("%s: turn on VDD-WIFI1 1.2V\n", __func__);238LDO_TurnOnLDO(LDO_LDO_WIF1);239LDO_SetVoltLevel(LDO_LDO_WIF1, LDO_VOLT_LEVEL3);240#endif /* CONFIG_WIF1_LDO */241#endif242break;243244case WLAN_BT_PWDN_OFF:245RTW_INFO("%s: call customer specific GPIO to set bt power down pin to 0\n",246__FUNCTION__);247#if defined(CONFIG_RTL8723B)248if (sprd_3rdparty_gpio_bt_reset > 0)249gpio_set_value(sprd_3rdparty_gpio_bt_reset, 0);250#endif251break;252253case WLAN_BT_PWDN_ON:254RTW_INFO("%s: callc customer specific GPIO to set bt power down pin to 1\n",255__FUNCTION__);256#if defined(CONFIG_RTL8723B)257if (sprd_3rdparty_gpio_bt_reset > 0)258gpio_set_value(sprd_3rdparty_gpio_bt_reset, 1);259#endif260break;261}262}263#endif /* ANDROID_2X */264265#elif defined(CONFIG_PLATFORM_ARM_RK3066)266#include <mach/iomux.h>267268#define GPIO_WIFI_IRQ RK30_PIN2_PC2269extern unsigned int oob_irq;270int rtw_wifi_gpio_init(void)271{272#ifdef CONFIG_GSPI_HCI273if (GPIO_WIFI_IRQ > 0) {274rk30_mux_api_set(GPIO2C2_LCDC1DATA18_SMCBLSN1_HSADCDATA5_NAME, GPIO2C_GPIO2C2);/* jacky_test */275gpio_request(GPIO_WIFI_IRQ, "oob_irq");276gpio_direction_input(GPIO_WIFI_IRQ);277278oob_irq = gpio_to_irq(GPIO_WIFI_IRQ);279280RTW_INFO("%s oob_irq:%d\n", __func__, oob_irq);281}282#endif283return 0;284}285286287int rtw_wifi_gpio_deinit(void)288{289#ifdef CONFIG_GSPI_HCI290if (GPIO_WIFI_IRQ > 0)291gpio_free(GPIO_WIFI_IRQ);292#endif293return 0;294}295296void rtw_wifi_gpio_wlan_ctrl(int onoff)297{298}299300#ifdef CONFIG_GPIO_API301/* this is a demo for extending GPIO pin[7] as interrupt mode */302struct net_device *rtl_net;303extern int rtw_register_gpio_interrupt(struct net_device *netdev, int gpio_num, void(*callback)(u8 level));304extern int rtw_disable_gpio_interrupt(struct net_device *netdev, int gpio_num);305void gpio_int(u8 is_high)306{307RTW_INFO("%s level=%d\n", __func__, is_high);308}309int register_net_gpio_init(void)310{311rtl_net = dev_get_by_name(&init_net, "wlan0");312if (!rtl_net) {313RTW_PRINT("rtl_net init fail!\n");314return -1;315}316return rtw_register_gpio_interrupt(rtl_net, 7, gpio_int);317}318int unregister_net_gpio_init(void)319{320rtl_net = dev_get_by_name(&init_net, "wlan0");321if (!rtl_net) {322RTW_PRINT("rtl_net init fail!\n");323return -1;324}325return rtw_disable_gpio_interrupt(rtl_net, 7);326}327#endif328329#else330331int rtw_wifi_gpio_init(void)332{333return 0;334}335336void rtw_wifi_gpio_wlan_ctrl(int onoff)337{338}339#endif /* CONFIG_PLATFORM_SPRD */340341342