diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2016-08-30 12:52:42 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-09-08 17:58:03 -0700 |
commit | e54af6574a73c09deffa9355eb600ef09a6e5159 (patch) | |
tree | 434858646c9f1a38992e314c4258621afe1e11be /power | |
parent | 946921a974542b9e00fa412ae03df59f8fa82d84 (diff) | |
download | chrome-ec-e54af6574a73c09deffa9355eb600ef09a6e5159.tar.gz |
power: rk3399: Minimize resume latency on short suspend
BUG=chrome-os-partner:56605
BRANCH=None
TEST=Manual on kevin, modify code to force CHECK_ABORTED_SUSPEND()
condition to be true for each respective case, verify AP resumes
successfully.
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Change-Id: Ib3ec3c287c14ea2b9b410171a173c38c9385a90f
Reviewed-on: https://chromium-review.googlesource.com/378078
Commit-Ready: Shawn N <shawnn@chromium.org>
Tested-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Diffstat (limited to 'power')
-rw-r--r-- | power/rk3399.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/power/rk3399.c b/power/rk3399.c index bb0cd81f3e..1b7978d22b 100644 --- a/power/rk3399.c +++ b/power/rk3399.c @@ -97,6 +97,19 @@ DECLARE_DEFERRED(force_shutdown); */ #define PGOOD_AP_DEBOUNCE_TIMEOUT (100 * MSEC) +/* + * The AP informs the EC of its S0 / S3 state through IN_SUSPEND_DEASSERTED / + * AP_EC_S3_S0_L. Latency between deassertion and power rails coming up must + * be minimized, so check for deassertion at various stages of our suspend + * power sequencing, and immediately transition out of suspend if necessary. + */ +#define CHECK_ABORTED_SUSPEND() \ + if (!forcing_shutdown && \ + power_get_signals() & IN_SUSPEND_DEASSERTED) { \ + CPRINTS("suspend aborted"); \ + return POWER_S3S0; \ + } + enum power_state power_handle_state(enum power_state state) { static int sys_reset_asserted; @@ -259,20 +272,32 @@ enum power_state power_handle_state(enum power_state state) case POWER_S0S3: /* Call hooks before we remove power rails */ hook_notify(HOOK_CHIPSET_SUSPEND); + CHECK_ABORTED_SUSPEND(); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_PP1800_SENSOR_EN_L, 1); gpio_set_level(GPIO_PP1800_SIXAXIS_EN_L, 1); gpio_set_level(GPIO_PP3300_S0_EN_L, 1); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_PP1800_S0_EN_L, 1); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_AP_CORE_EN, 0); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_PP1800_AP_AVDD_EN_L, 1); msleep(10); + CHECK_ABORTED_SUSPEND(); + gpio_set_level(GPIO_PP900_DDRPLL_EN, 0); msleep(10); + CHECK_ABORTED_SUSPEND(); /* * Enable idle task deep sleep. Allow the low power idle task |