summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Anderson <dianders@chromium.org>2013-08-27 11:24:52 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-08-27 23:29:51 +0000
commitce31fda8695f4db1fa91f5bb224c781cf17f91c0 (patch)
tree4962cddb1cb928159d2ccca0f24cd2fc67287df0
parentedd28a833fbb94c5d78bab6aae88eefe1c8d9612 (diff)
downloadchrome-ec-ce31fda8695f4db1fa91f5bb224c781cf17f91c0.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> Reviewed-on: https://chromium-review.googlesource.com/167100 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 a6f2337c6f..310e1b50cc 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)