summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Anderson <dianders@chromium.org>2013-08-27 11:24:52 -0700
committerCaroline Tice <cmtice@chromium.org>2013-08-29 22:51:07 +0000
commitfcd388df8eef2f723cb4ff7277fa44d3754bb966 (patch)
treeafb12f46bd03b1c37d75a674a17cda9a7d2d5852
parenta795b1ffe05a7c7f41f66783b711c332dd92bfb0 (diff)
downloadchrome-ec-fcd388df8eef2f723cb4ff7277fa44d3754bb966.tar.gz
pit: Move suspend/resume hook callbacks to a deferred task
Putting the suspend/resume hook callbacks on a deferred task allows frequency change notifications to lock mutexes. This is useful in a future change which locks the i2c bus around frequency changes. BRANCH=pit BUG=chrome-os-partner:22093 TEST=With all patches together: - on AP: suspend_stress_test - on EC: battery 10000 50 Change-Id: If5e31040cdc7c95a4c8ba62ee72512cb79617cc9 Signed-off-by: Doug Anderson <dianders@chromium.org> Previous-Reviewed-on: https://chromium-review.googlesource.com/167100 (cherry picked from commit ce31fda8695f4db1fa91f5bb224c781cf17f91c0) Reviewed-on: https://chromium-review.googlesource.com/167147 Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--common/chipset_gaia.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/common/chipset_gaia.c b/common/chipset_gaia.c
index a60a9970e8..1d36345612 100644
--- a/common/chipset_gaia.c
+++ b/common/chipset_gaia.c
@@ -236,8 +236,10 @@ static int check_for_power_off_event(void)
return 0;
}
-void gaia_suspend_event(enum gpio_signal signal)
+void gaia_suspend_deferred(void)
{
+ int new_ap_suspended;
+
if (!ap_on) /* power on/off : not a real suspend / resume */
return;
@@ -245,7 +247,13 @@ void gaia_suspend_event(enum gpio_signal signal)
* Note: For Snow, suspend state can only be reliably
* determined when the AP is on (crosbug.com/p/13200).
*/
- ap_suspended = !gpio_get_level(GPIO_SUSPEND_L);
+ new_ap_suspended = !gpio_get_level(GPIO_SUSPEND_L);
+
+ /* We never want to call two suspend or two resumes in a row */
+ if (ap_suspended == new_ap_suspended)
+ return;
+
+ ap_suspended = new_ap_suspended;
if (ap_suspended) {
if (lid_is_open())
@@ -258,6 +266,13 @@ void gaia_suspend_event(enum gpio_signal signal)
powerled_set_state(POWERLED_STATE_ON);
hook_notify(HOOK_CHIPSET_RESUME);
}
+
+}
+DECLARE_DEFERRED(gaia_suspend_deferred);
+
+void gaia_suspend_event(enum gpio_signal signal)
+{
+ hook_call_deferred(gaia_suspend_deferred, 0);
}
void gaia_power_event(enum gpio_signal signal)