From 0bfdb47f1c5a381e81a29747f38dd67fa7e5cbdb Mon Sep 17 00:00:00 2001 From: Firefly Date: Fri, 6 May 2016 16:51:13 +0800 Subject: [PATCH] [u-boot] charge: add pwrkey detect when cpu wakeup from wfi By the way, as cpu can't wakeup from wfi while charger plug in or out, so it's better to define CONFIG_CHARGE_TIMER_WAKEUP if CONFIG_CHARGE_DEEP_SLEEP is defined Change-Id: Ie3133b431f95280fa75e393693eba849538edb8e Signed-off-by: Firefly (cherry picked from commit 203f62bb3b6fe8d2916d834952973e661ffc70ab) --- u-boot/arch/arm/cpu/armv7/rk32xx/pm.c | 18 ++++++++++++++++-- u-boot/common/cmd_charge.c | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/u-boot/arch/arm/cpu/armv7/rk32xx/pm.c b/u-boot/arch/arm/cpu/armv7/rk32xx/pm.c index fe4032aa3d..a34bf67554 100644 --- a/u-boot/arch/arm/cpu/armv7/rk32xx/pm.c +++ b/u-boot/arch/arm/cpu/armv7/rk32xx/pm.c @@ -19,6 +19,9 @@ DECLARE_GLOBAL_DATA_PTR; extern struct fdt_gpio_state *rkkey_get_powerkey(void); #endif +extern void rkkey_set_wfi_pwrkey_state(int pressed); +extern int rkkey_get_wfi_pwrkey_state(void); +extern int rkkey_power_state(void); /* * rkpm wakeup gpio init @@ -81,8 +84,19 @@ void rk_pm_enter(v_pm_cb_f module_pm_conf) rkclk_pll_mode(GPLL_ID, RKCLK_PLL_MODE_SLOW); rkclk_pll_mode(APLL_ID, RKCLK_PLL_MODE_SLOW); - /* cpu enter wfi mode */ - wfi(); + /* not pressed before, so wfi */ + if (!rkkey_get_wfi_pwrkey_state()) { + wfi(); + /* mark pressed state to notifier framework */ + rkkey_set_wfi_pwrkey_state(rkkey_power_state()); + + /* + * if pressed before, not wfi and release key which + * allow framework to report a short key pressed event + */ + } else { + rkkey_set_wfi_pwrkey_state(0); + } /* pll enter nornal mode */ rkclk_pll_mode(APLL_ID, RKCLK_PLL_MODE_NORMAL); diff --git a/u-boot/common/cmd_charge.c b/u-boot/common/cmd_charge.c index 34aa214f72..8374eea39f 100755 --- a/u-boot/common/cmd_charge.c +++ b/u-boot/common/cmd_charge.c @@ -100,6 +100,18 @@ int get_battery_capacity(void) { return batt_status.capacity; } +static int wfi_pwrkey_pressed = 0; + +void rkkey_set_wfi_pwrkey_state(int pressed) +{ + wfi_pwrkey_pressed = pressed; +} + +int rkkey_get_wfi_pwrkey_state(void) +{ + return wfi_pwrkey_pressed; +} + /** * check power key pressed state. */ @@ -116,8 +128,13 @@ int power_key_pressed(void) { return KEY_NOT_PRESSED; #else static unsigned int power_pressed_time = 0; +#ifdef CONFIG_CHARGE_DEEP_SLEEP + int power_pressed = rkkey_power_state() | rkkey_get_wfi_pwrkey_state(); +#else int power_pressed = rkkey_power_state(); +#endif int power_pressed_state = KEY_NOT_PRESSED; + if (!power_pressed_time) { //haven't pressed before. if (power_pressed) {