diff options
Diffstat (limited to 'chip/npcx/lpc.c')
-rw-r--r-- | chip/npcx/lpc.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/chip/npcx/lpc.c b/chip/npcx/lpc.c index 8885013195..7f569af078 100644 --- a/chip/npcx/lpc.c +++ b/chip/npcx/lpc.c @@ -15,6 +15,7 @@ #include "host_command.h" #include "keyboard_protocol.h" #include "lpc.h" +#include "lpc_chip.h" #include "port80.h" #include "pwm.h" #include "registers.h" @@ -24,7 +25,6 @@ #include "uart.h" #include "util.h" #include "system_chip.h" -#include "lpc_chip.h" /* Console output macros */ #if !(DEBUG_LPC) @@ -1104,3 +1104,52 @@ static int lpc_get_protocol_info(struct host_cmd_handler_args *args) DECLARE_HOST_COMMAND(EC_CMD_GET_PROTOCOL_INFO, lpc_get_protocol_info, EC_VER_MASK(0)); + +#ifdef CONFIG_POWER_S0IX +static void lpc_clear_host_events(void) +{ + while (lpc_query_host_event_state() != 0) + ; +} + +/* + * In AP S0 -> S3 & S0ix transitions, + * the chipset_suspend is called. + * + * The chipset_in_state(CHIPSET_STATE_STANDBY | CHIPSET_STATE_ON) + * is used to detect the S0ix transiton. + * + * During S0ix entry, the wake mask for lid open is enabled. + */ +void lpc_enable_wake_mask_for_lid_open(void) +{ + if (chipset_in_state(CHIPSET_STATE_STANDBY | CHIPSET_STATE_ON)) { + uint32_t mask; + + mask = lpc_get_host_event_mask(LPC_HOST_EVENT_WAKE) | + EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_OPEN); + + lpc_set_host_event_mask(LPC_HOST_EVENT_WAKE, mask); + } +} + +/* + * In AP S0ix & S3 -> S0 transitions, + * the chipset_resume hook is called. + * + * During S0ix exit, the wake mask for lid open is disabled. + * All pending events are cleared + */ +void lpc_disable_wake_mask_for_lid_open(void) +{ + if (chipset_in_state(CHIPSET_STATE_STANDBY | CHIPSET_STATE_ON)) { + uint32_t mask; + + mask = lpc_get_host_event_mask(LPC_HOST_EVENT_WAKE) & + ~EC_HOST_EVENT_MASK(EC_HOST_EVENT_LID_OPEN); + + lpc_set_host_event_mask(LPC_HOST_EVENT_WAKE, mask); + lpc_clear_host_events(); + } +} +#endif |