[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 <service@t-firefly.com>
(cherry picked from commit 203f62bb3b6fe8d2916d834952973e661ffc70ab)
This commit is contained in:
Firefly
2016-05-06 16:51:13 +08:00
committed by cjp
parent a31d823018
commit 0bfdb47f1c
2 changed files with 33 additions and 2 deletions

View File

@ -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);

View File

@ -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) {