summaryrefslogtreecommitdiff
path: root/chip/npcx/lpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/npcx/lpc.c')
-rw-r--r--chip/npcx/lpc.c51
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