diff options
-rw-r--r-- | include/power.h | 11 | ||||
-rw-r--r-- | power/intel_x86.c | 19 |
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) { /* |