From c4ee5b4b276e9e85f2b33763e92fd24fcf14bdbf Mon Sep 17 00:00:00 2001 From: kfx Date: Tue, 11 Sep 2012 11:18:06 +0800 Subject: [PATCH] rk2928: a720: usb wifi: add power control --- .../mach-rk2928/board-rk2928-a720-tps65910.c | 24 ++++++++++++++++++- arch/arm/mach-rk2928/include/mach/board.h | 4 ++++ .../net/wireless/rkusbwifi/wifi_power_ops.c | 9 +++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-rk2928/board-rk2928-a720-tps65910.c b/arch/arm/mach-rk2928/board-rk2928-a720-tps65910.c index 3193edb5e40e..6e9598fefc05 100755 --- a/arch/arm/mach-rk2928/board-rk2928-a720-tps65910.c +++ b/arch/arm/mach-rk2928/board-rk2928-a720-tps65910.c @@ -224,6 +224,28 @@ int tps65910_pre_init(struct tps65910 *tps65910){ return 0; } +void rk2928_usb_wifi_on(void) +{ + struct regulator *ldo; + ldo = regulator_get(NULL, "vmmc"); //vccio_wl + regulator_enable(ldo); + printk("%s: vccio_wl enable\n", __func__); + regulator_put(ldo); + udelay(100); +} +EXPORT_SYMBOL(rk2928_usb_wifi_on); +void rk2928_usb_wifi_off(void) +{ + struct regulator *ldo; + ldo = regulator_get(NULL, "vmmc"); //vccio_wl + printk("%s: vccio_wl disable\n", __func__); + regulator_disable(ldo); + regulator_put(ldo); + udelay(100); +} +EXPORT_SYMBOL(rk2928_usb_wifi_off); + + int tps65910_post_init(struct tps65910 *tps65910) { struct regulator *dcdc; @@ -308,6 +330,7 @@ int tps65910_post_init(struct tps65910 *tps65910) regulator_set_voltage(ldo,3300000,3300000); regulator_enable(ldo); printk("%s set vmmc vccio_wl=%dmV end\n", __func__, regulator_get_voltage(ldo)); + regulator_disable(ldo); regulator_put(ldo); udelay(100); @@ -315,7 +338,6 @@ int tps65910_post_init(struct tps65910 *tps65910) return 0; } - static struct regulator_consumer_supply tps65910_smps1_supply[] = { { .supply = "vdd1", diff --git a/arch/arm/mach-rk2928/include/mach/board.h b/arch/arm/mach-rk2928/include/mach/board.h index f6d6e99b2bdd..42b207253831 100644 --- a/arch/arm/mach-rk2928/include/mach/board.h +++ b/arch/arm/mach-rk2928/include/mach/board.h @@ -29,6 +29,10 @@ void board_gpio_suspend(void); void board_gpio_resume(void); void __sramfunc board_pmu_suspend(void); void __sramfunc board_pmu_resume(void); +#ifdef CONFIG_MACH_RK2928_A720 +void rk2928_usb_wifi_on(void); +void rk2928_usb_wifi_off(void); +#endif extern struct sys_timer rk2928_timer; diff --git a/drivers/net/wireless/rkusbwifi/wifi_power_ops.c b/drivers/net/wireless/rkusbwifi/wifi_power_ops.c index 4096bdac15fd..6897ddd3ffaa 100644 --- a/drivers/net/wireless/rkusbwifi/wifi_power_ops.c +++ b/drivers/net/wireless/rkusbwifi/wifi_power_ops.c @@ -21,6 +21,7 @@ #include #include #endif +#include #if (WIFI_GPIO_POWER_CONTROL == 1) @@ -74,7 +75,11 @@ 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); +#endif if (power_gpio.use_gpio != POWER_NOT_USE_GPIO) msleep(1000); @@ -92,7 +97,11 @@ 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); +#endif msleep(5); wifi_turn_off_callback(); -- 2.34.1