diff options
Diffstat (limited to 'power/apollolake.c')
-rw-r--r-- | power/apollolake.c | 79 |
1 files changed, 18 insertions, 61 deletions
diff --git a/power/apollolake.c b/power/apollolake.c index 3710579c3e..b93a1e25c2 100644 --- a/power/apollolake.c +++ b/power/apollolake.c @@ -11,6 +11,8 @@ #include "console.h" #include "hooks.h" #include "host_command.h" +#include "lid_switch.h" +#include "lpc.h" #include "power.h" #include "power_button.h" #include "system.h" @@ -25,20 +27,13 @@ /* Input state flags */ #define IN_RSMRST_N POWER_SIGNAL_MASK(X86_RSMRST_N) #define IN_ALL_SYS_PG POWER_SIGNAL_MASK(X86_ALL_SYS_PG) -#define IN_SLP_S0_N POWER_SIGNAL_MASK(X86_SLP_S0_N) #define IN_SLP_S3_N POWER_SIGNAL_MASK(X86_SLP_S3_N) #define IN_SLP_S4_N POWER_SIGNAL_MASK(X86_SLP_S4_N) #define IN_SUSPWRDNACK POWER_SIGNAL_MASK(X86_SUSPWRDNACK) #define IN_SUS_STAT_N POWER_SIGNAL_MASK(X86_SUS_STAT_N) -#ifdef CONFIG_POWER_S0IX -#define IN_ALL_PM_SLP_DEASSERTED (IN_SLP_S0_N | \ - IN_SLP_S3_N | \ - IN_SLP_S4_N) -#else #define IN_ALL_PM_SLP_DEASSERTED (IN_SLP_S3_N | \ IN_SLP_S4_N) -#endif #define IN_PGOOD_ALL_CORE (IN_RSMRST_N) @@ -228,7 +223,8 @@ static enum power_state _power_handle_state(enum power_state state) chipset_force_shutdown(); return POWER_S0S3; #ifdef CONFIG_POWER_S0IX - } else if ((gpio_get_level(GPIO_PCH_SLP_S0_L) == 0) && + } else if ((power_get_host_sleep_state() == + HOST_SLEEP_EVENT_S0IX_SUSPEND) && (gpio_get_level(GPIO_PCH_SLP_S3_L) == 1)) { return POWER_S0S0ix; #endif @@ -244,7 +240,8 @@ static enum power_state _power_handle_state(enum power_state state) /* * TODO: add code for unexpected power loss */ - if ((gpio_get_level(GPIO_PCH_SLP_S0_L) == 1) && + if ((power_get_host_sleep_state() == + HOST_SLEEP_EVENT_S0IX_RESUME) && (gpio_get_level(GPIO_PCH_SLP_S3_L) == 1)) { return POWER_S0ixS0; } @@ -294,6 +291,14 @@ static enum power_state _power_handle_state(enum power_state state) /* Call hooks now that rails are up */ hook_notify(HOOK_CHIPSET_STARTUP); + +#ifdef CONFIG_POWER_S0IX + /* + * Clearing the S0ix flag on the path to S0 + * to handle any reset conditions. + */ + power_reset_host_sleep_state(HOST_SLEEP_EVENT_S0IX_RESUME); +#endif return POWER_S3; case POWER_S3S0: @@ -340,6 +345,10 @@ static enum power_state _power_handle_state(enum power_state state) */ enable_sleep(SLEEP_MASK_AP_RUN); +#ifdef CONFIG_POWER_S0IX + /* re-init S0ix flag */ + power_reset_host_sleep_state(HOST_SLEEP_EVENT_S0IX_RESUME); +#endif return POWER_S3; #ifdef CONFIG_POWER_S0IX @@ -424,58 +433,6 @@ enum power_state power_handle_state(enum power_state state) return new_state; } -#ifdef CONFIG_POWER_S0IX -static struct { - int required; /* indicates de-bounce required. */ - int done; /* debounced */ -} slp_s0_debounce = { - .required = 0, - .done = 1, -}; - -int chipset_get_ps_debounced_level(enum gpio_signal signal) -{ - /* - * If power state is updated in power_update_signal() by any interrupts - * other than SLP_S0 during the 1 msec pulse(invalid SLP_S0 signal), - * reading SLP_S0 should be corrected with slp_s0_debounce.done flag. - */ - int level = gpio_get_level(signal); - - return (signal == GPIO_PCH_SLP_S0_L) ? - (level & slp_s0_debounce.done) : level; -} - -static void slp_s0_assertion_deferred(void) -{ - int s0_level = gpio_get_level(GPIO_PCH_SLP_S0_L); - /* - (s0_level != 0) || - ((s0_level == 0) && (slp_s0_debounce.required == 0)) - */ - if (s0_level == slp_s0_debounce.required) { - if (s0_level) - slp_s0_debounce.done = 1; /* debounced! */ - - power_signal_interrupt(GPIO_PCH_SLP_S0_L); - } - - slp_s0_debounce.required = 0; -} -DECLARE_DEFERRED(slp_s0_assertion_deferred); - -void power_signal_interrupt_S0(enum gpio_signal signal) -{ - if (gpio_get_level(GPIO_PCH_SLP_S0_L)) { - slp_s0_debounce.required = 1; - hook_call_deferred(slp_s0_assertion_deferred, 3 * MSEC); - } else if (slp_s0_debounce.required == 0) { - slp_s0_debounce.done = 0; - slp_s0_assertion_deferred(); - } -} -#endif - /** * chipset check if PLTRST# is valid. * |