summaryrefslogtreecommitdiff
path: root/power
diff options
context:
space:
mode:
authorWai-Hong Tam <waihong@google.com>2020-01-30 10:37:12 -0800
committerCommit Bot <commit-bot@chromium.org>2020-02-01 01:11:02 +0000
commitab88ce1416cfcbf0cd6a81cb16e0890eaef1eff1 (patch)
tree7634a5cc6283290a31abf9ab6958737cd79e12db /power
parentc825ad974c4086c282f1f4383a47619f6c0b207d (diff)
downloadchrome-ec-ab88ce1416cfcbf0cd6a81cb16e0890eaef1eff1.tar.gz
Trogdor: Separate the interrupt handlers of WARM_RESET_L and POWER_GOOD
The original one interrupt handler for two signals will cause a false-postive for the WARM_RESET_L release case, during a transition state that POWER_GOOD goes low but WARM_RESET_L is still high. Use two interrupt handlers for WARM_RESET_L and its pull-up rail POWER_GOOD. It is clear that what signal triggers the interrupt. BRANCH=None BUG=b:148478178 TEST=Called "dut-control warm_reset:on sleep:0.2 warm_reset:off" and saw the message "Long warm reset ended, cold resetting to restore sanity" once. Change-Id: I5a14f91c0dbfacd6a70d01d45f3e8de2b6c6a1cc Signed-off-by: Wai-Hong Tam <waihong@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2031647 Reviewed-by: Alexandru M Stan <amstan@chromium.org> Tested-by: Alexandru M Stan <amstan@chromium.org>
Diffstat (limited to 'power')
-rw-r--r--power/sc7180.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/power/sc7180.c b/power/sc7180.c
index 7d8b5b9cb0..7788f04833 100644
--- a/power/sc7180.c
+++ b/power/sc7180.c
@@ -171,19 +171,8 @@ void chipset_warm_reset_interrupt(enum gpio_signal signal)
GPIO_SEL_1P8V | GPIO_OUT_HIGH);
gpio_set_flags(GPIO_AP_RST_L, GPIO_INT_BOTH |
GPIO_SEL_1P8V | GPIO_OUT_LOW);
- } else {
- /*
- * The pull-up rail POWER_GOOD drops.
- *
- * High-Z both AP_RST_L and PS_HOLD to restore their
- * states.
- */
- gpio_set_flags(GPIO_AP_RST_L, GPIO_INT_BOTH |
- GPIO_SEL_1P8V);
- gpio_set_flags(GPIO_PS_HOLD, GPIO_INT_BOTH |
- GPIO_SEL_1P8V);
- ap_rst_overdriven = 0;
}
+ /* Ignore the else clause, the pull-up rail drops. */
} else {
if (ap_rst_overdriven) {
/*
@@ -201,7 +190,23 @@ void chipset_warm_reset_interrupt(enum gpio_signal signal)
}
/* If not overdriven, just a normal power-up, do nothing. */
}
+ power_signal_interrupt(signal);
+}
+void chipset_power_good_interrupt(enum gpio_signal signal)
+{
+ if (!gpio_get_level(GPIO_POWER_GOOD) && ap_rst_overdriven) {
+ /*
+ * POWER_GOOD is the pull-up rail of WARM_RESET_L.
+ * When POWER_GOOD drops, high-Z both AP_RST_L and PS_HOLD
+ * to restore their states.
+ */
+ gpio_set_flags(GPIO_AP_RST_L, GPIO_INT_BOTH |
+ GPIO_SEL_1P8V);
+ gpio_set_flags(GPIO_PS_HOLD, GPIO_INT_BOTH |
+ GPIO_SEL_1P8V);
+ ap_rst_overdriven = 0;
+ }
power_signal_interrupt(signal);
}