summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWai-Hong Tam <waihong@google.com>2019-12-11 19:08:42 -0800
committerCommit Bot <commit-bot@chromium.org>2020-01-23 01:02:38 +0000
commit29f5016d7b9cf9ed050af33d40772306e7207bf3 (patch)
treeef8a4eaeecef36caee9d1dfd9865945341b7b060
parent15ea40d83fb22bf4655ecb2b2c4fb66bce90cb92 (diff)
downloadchrome-ec-29f5016d7b9cf9ed050af33d40772306e7207bf3.tar.gz
sdm845, sc7180: Prioritize the power_request for checking power on and off
When checking the event for power on or power off, should check the power_request first such that this request can be cleared; otherwise, the request still presents and may result a loop. BRANCH=None BUG=b:145901185 TEST=Toggle the WARM_RESET_L signal and no loop happens. Change-Id: Ifb79107d40b9a4c8e71a459ccd3063a0cacede17 Signed-off-by: Wai-Hong Tam <waihong@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1963378 Reviewed-by: Stephen Boyd <swboyd@chromium.org>
-rw-r--r--power/sc7180.c34
-rw-r--r--power/sdm845.c34
2 files changed, 36 insertions, 32 deletions
diff --git a/power/sc7180.c b/power/sc7180.c
index 01f588fe61..3da8d5c4bb 100644
--- a/power/sc7180.c
+++ b/power/sc7180.c
@@ -567,6 +567,17 @@ static uint8_t check_for_power_on_event(void)
ap_off_flag = system_get_reset_flags() & EC_RESET_FLAG_AP_OFF;
system_clear_reset_flags(EC_RESET_FLAG_AP_OFF);
+
+ if (power_request == POWER_REQ_ON) {
+ power_request = POWER_REQ_NONE;
+ return POWER_ON_BY_POWER_REQ_ON;
+ }
+
+ if (power_request == POWER_REQ_RESET) {
+ power_request = POWER_REQ_NONE;
+ return POWER_ON_BY_POWER_REQ_RESET;
+ }
+
/* check if system is already ON */
if (power_get_signals() & IN_POWER_GOOD) {
if (ap_off_flag) {
@@ -602,16 +613,6 @@ static uint8_t check_for_power_on_event(void)
if (power_button_is_pressed())
return POWER_ON_BY_POWER_BUTTON_PRESSED;
- if (power_request == POWER_REQ_ON) {
- power_request = POWER_REQ_NONE;
- return POWER_ON_BY_POWER_REQ_ON;
- }
-
- if (power_request == POWER_REQ_RESET) {
- power_request = POWER_REQ_NONE;
- return POWER_ON_BY_POWER_REQ_RESET;
- }
-
return POWER_OFF_CANCEL;
}
@@ -628,12 +629,7 @@ static uint8_t check_for_power_off_event(void)
timestamp_t now;
int pressed = 0;
- /*
- * Check for power button press.
- */
- if (power_button_is_pressed()) {
- pressed = POWER_OFF_BY_POWER_BUTTON_PRESSED;
- } else if (power_request == POWER_REQ_OFF) {
+ if (power_request == POWER_REQ_OFF) {
power_request = POWER_REQ_NONE;
return POWER_OFF_BY_POWER_REQ_OFF;
} else if (power_request == POWER_REQ_RESET) {
@@ -644,6 +640,12 @@ static uint8_t check_for_power_off_event(void)
return POWER_OFF_BY_POWER_REQ_RESET;
}
+ /*
+ * Check for power button press.
+ */
+ if (power_button_is_pressed())
+ pressed = POWER_OFF_BY_POWER_BUTTON_PRESSED;
+
now = get_time();
if (pressed) {
if (!power_button_was_pressed) {
diff --git a/power/sdm845.c b/power/sdm845.c
index ac5b814ad3..a799ec5883 100644
--- a/power/sdm845.c
+++ b/power/sdm845.c
@@ -555,6 +555,17 @@ static uint8_t check_for_power_on_event(void)
ap_off_flag = system_get_reset_flags() & EC_RESET_FLAG_AP_OFF;
system_clear_reset_flags(EC_RESET_FLAG_AP_OFF);
+
+ if (power_request == POWER_REQ_ON) {
+ power_request = POWER_REQ_NONE;
+ return POWER_ON_BY_POWER_REQ_ON;
+ }
+
+ if (power_request == POWER_REQ_RESET) {
+ power_request = POWER_REQ_NONE;
+ return POWER_ON_BY_POWER_REQ_RESET;
+ }
+
/* check if system is already ON */
if (power_get_signals() & IN_POWER_GOOD) {
if (ap_off_flag) {
@@ -590,16 +601,6 @@ static uint8_t check_for_power_on_event(void)
if (power_button_is_pressed())
return POWER_ON_BY_POWER_BUTTON_PRESSED;
- if (power_request == POWER_REQ_ON) {
- power_request = POWER_REQ_NONE;
- return POWER_ON_BY_POWER_REQ_ON;
- }
-
- if (power_request == POWER_REQ_RESET) {
- power_request = POWER_REQ_NONE;
- return POWER_ON_BY_POWER_REQ_RESET;
- }
-
return POWER_OFF_CANCEL;
}
@@ -616,12 +617,7 @@ static uint8_t check_for_power_off_event(void)
timestamp_t now;
int pressed = 0;
- /*
- * Check for power button press.
- */
- if (power_button_is_pressed()) {
- pressed = POWER_OFF_BY_POWER_BUTTON_PRESSED;
- } else if (power_request == POWER_REQ_OFF) {
+ if (power_request == POWER_REQ_OFF) {
power_request = POWER_REQ_NONE;
return POWER_OFF_BY_POWER_REQ_OFF;
} else if (power_request == POWER_REQ_RESET) {
@@ -632,6 +628,12 @@ static uint8_t check_for_power_off_event(void)
return POWER_OFF_BY_POWER_REQ_RESET;
}
+ /*
+ * Check for power button press.
+ */
+ if (power_button_is_pressed())
+ pressed = POWER_OFF_BY_POWER_BUTTON_PRESSED;
+
now = get_time();
if (pressed) {
if (!power_button_was_pressed) {