wifi: modify usb wifi power control for rk2928

This commit is contained in:
hwg
2012-09-16 12:41:20 +08:00
parent 4ef7eb5061
commit 3056032b0d
2 changed files with 59 additions and 30 deletions

81
arch/arm/mach-rk2928/board-rk2928-sdk-sdmmc.c Normal file → Executable file
View File

@@ -198,12 +198,31 @@ static void rk29_sdmmc_set_iomux(int device_id, unsigned int bus_width)
#endif
//int rk29sdk_wifi_power_state = 0;
//int rk29sdk_bt_power_state = 0;
#ifdef CONFIG_WIFI_CONTROL_FUNC
//
// Define wifi module's power and reset gpio, and gpio sensitive level
//
#if defined(CONFIG_RK903) || defined(CONFIG_RK901)
#define RK30SDK_WIFI_GPIO_POWER_N RK2928_PIN0_PD6
#define RK29SDK_WIFI_GPIO_RESET_N RK2928_PIN3_PC2
#define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE GPIO_HIGH
#define RK30SDK_WIFI_GPIO_RESET_N RK2928_PIN3_PC2
#define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE GPIO_HIGH
#endif
#if defined(CONFIG_RTL8192CU) || defined(CONFIG_RTL8188EU)
#define RK30SDK_WIFI_GPIO_POWER_N RK2928_PIN0_PD6
#define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE GPIO_LOW
#endif
#if defined(CONFIG_BCM4329) || defined(CONFIG_BCM4319)
#define RK30SDK_WIFI_GPIO_POWER_N RK2928_PIN0_PD6
#define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE GPIO_HIGH
#define RK30SDK_WIFI_GPIO_RESET_N RK2928_PIN3_PC2
#define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE GPIO_HIGH
#endif
#define PREALLOC_WLAN_SEC_NUM 4
#define PREALLOC_WLAN_BUF_NUM 160
@@ -310,21 +329,18 @@ static int __init rk29sdk_wifi_bt_gpio_control_init(void)
return -1;
}
if (gpio_request(RK29SDK_WIFI_GPIO_RESET_N, "wifi reset")) {
#ifdef RK30SDK_WIFI_GPIO_RESET_N
if (gpio_request(RK30SDK_WIFI_GPIO_RESET_N, "wifi reset")) {
pr_info("%s: request wifi reset gpio failed\n", __func__);
gpio_free(RK30SDK_WIFI_GPIO_POWER_N);
return -1;
}
/*
if (gpio_request(RK29SDK_BT_GPIO_RESET_N, "bt reset")) {
pr_info("%s: request bt reset gpio failed\n", __func__);
gpio_free(RK29SDK_WIFI_GPIO_RESET_N);
return -1;
}*/
#endif
gpio_direction_output(RK30SDK_WIFI_GPIO_POWER_N, GPIO_LOW);
gpio_direction_output(RK29SDK_WIFI_GPIO_RESET_N, GPIO_LOW);
//gpio_direction_output(RK29SDK_BT_GPIO_RESET_N, GPIO_LOW);
gpio_direction_output(RK30SDK_WIFI_GPIO_POWER_N, !RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE);
#ifdef RK30SDK_WIFI_GPIO_RESET_N
gpio_direction_output(RK30SDK_WIFI_GPIO_RESET_N, !RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE);
#endif
#if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
@@ -347,22 +363,26 @@ static int __init rk29sdk_wifi_bt_gpio_control_init(void)
return 0;
}
static int rk29sdk_wifi_power(int on)
#ifndef CONFIG_MACH_RK2928_A720
int rk29sdk_wifi_power(int on)
{
pr_info("%s: %d\n", __func__, on);
if (on){
gpio_set_value(RK30SDK_WIFI_GPIO_POWER_N, GPIO_HIGH);
mdelay(50);
gpio_set_value(RK30SDK_WIFI_GPIO_POWER_N, RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE);
mdelay(50);
#if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
rk29_sdmmc_gpio_open(1, 1); //added by xbw at 2011-10-13
#endif
gpio_set_value(RK29SDK_WIFI_GPIO_RESET_N, GPIO_HIGH);
#ifdef RK30SDK_WIFI_GPIO_RESET_N
gpio_set_value(RK30SDK_WIFI_GPIO_RESET_N, RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE);
#endif
mdelay(100);
pr_info("wifi turn on power\n");
}else{
// if (!rk29sdk_bt_power_state){
gpio_set_value(RK30SDK_WIFI_GPIO_POWER_N, GPIO_LOW);
gpio_set_value(RK30SDK_WIFI_GPIO_POWER_N, !RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE);
#if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
rk29_sdmmc_gpio_open(1, 0); //added by xbw at 2011-10-13
@@ -374,20 +394,37 @@ static int rk29sdk_wifi_power(int on)
// {
// pr_info("wifi shouldn't shut off power, bt is using it!\n");
// }
gpio_set_value(RK29SDK_WIFI_GPIO_RESET_N, GPIO_LOW);
#ifdef RK30SDK_WIFI_GPIO_RESET_N
gpio_set_value(RK30SDK_WIFI_GPIO_RESET_N, !RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE);
#endif
}
// rk29sdk_wifi_power_state = on;
//rk29sdk_wifi_power_state = on;
return 0;
}
#else
int rk29sdk_wifi_power(int on)
{
pr_info("%s: %d\n", __func__, on);
if (on){
rk2928_usb_wifi_on();
pr_info("wifi turn on power\n");
}else{
rk2928_usb_wifi_off();
pr_info("wifi shut off power\n");
}
return 0;
}
#endif
EXPORT_SYMBOL(rk29sdk_wifi_power);
static int rk29sdk_wifi_reset_state;
static int rk29sdk_wifi_reset(int on)
{
pr_info("%s: %d\n", __func__, on);
gpio_set_value(RK29SDK_WIFI_GPIO_RESET_N, on);
mdelay(100);
//mdelay(100);
rk29sdk_wifi_reset_state = on;
return 0;
}

View File

@@ -77,12 +77,8 @@ int wifi_gpio_operate(struct wifi_power *gpio, int flag)
*/
int wifi_turn_on_rtl8192c_card(void)
{
#ifdef CONFIG_MACH_RK2928_A720
rk2928_usb_wifi_on();
#else
//wifi_gpio_operate(&power_gpio, GPIO_SWITCH_ON);
rk29sdk_wifi_power(1);
#endif
if (power_gpio.use_gpio != POWER_NOT_USE_GPIO)
msleep(1000);
@@ -100,12 +96,8 @@ int wifi_turn_on_card(int module)
int wifi_turn_off_card(void)
{
#ifdef CONFIG_MACH_RK2928_A720
rk2928_usb_wifi_off();
#else
//wifi_gpio_operate(&power_gpio, GPIO_SWITCH_OFF);
rk29sdk_wifi_power(0);
#endif
msleep(5);
wifi_turn_off_callback();