summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/power.h11
-rw-r--r--power/intel_x86.c19
2 files changed, 30 insertions, 0 deletions
diff --git a/include/power.h b/include/power.h
index 60f071a1dc..fac596d44c 100644
--- a/include/power.h
+++ b/include/power.h
@@ -180,6 +180,17 @@ static inline void power_signal_interrupt(enum gpio_signal signal) { }
#endif /* !HAS_TASK_CHIPSET */
/**
+ * Interrupt handler for rsmrst signal GPIO. This interrupt handler should be
+ * used when there is a requirement to have minimum pass through delay between
+ * the rsmrst coming to the EC and the rsmrst that goes to the PCH for high->low
+ * transitions. Low->high transitions are still handled from within the chipset
+ * task power state machine.
+ *
+ * @param signal - The gpio signal that triggered the interrupt.
+ */
+void intel_x86_rsmrst_signal_interrupt(enum gpio_signal signal);
+
+/**
* pause_in_s5 getter method.
*
* @return Whether we should pause in S5 when shutting down.
diff --git a/power/intel_x86.c b/power/intel_x86.c
index 093e9cbc1a..ace891c8b9 100644
--- a/power/intel_x86.c
+++ b/power/intel_x86.c
@@ -604,6 +604,25 @@ enum power_state common_intel_x86_power_handle_state(enum power_state state)
return state;
}
+void intel_x86_rsmrst_signal_interrupt(enum gpio_signal signal)
+{
+ int rsmrst_in = gpio_get_level(GPIO_RSMRST_L_PGOOD);
+ int rsmrst_out = gpio_get_level(GPIO_PCH_RSMRST_L);
+
+ /*
+ * This function is called when rsmrst changes state. If rsmrst
+ * has been asserted (high -> low) then pass this new state to PCH.
+ */
+ if (!rsmrst_in && (rsmrst_in != rsmrst_out))
+ gpio_set_level(GPIO_PCH_RSMRST_L, rsmrst_in);
+
+ /*
+ * Call the main power signal interrupt handler to wake up the chipset
+ * task which handles low->high rsmrst pass through.
+ */
+ power_signal_interrupt(signal);
+}
+
void common_intel_x86_handle_rsmrst(enum power_state state)
{
/*