summaryrefslogtreecommitdiff
path: root/zephyr/projects/nissa/src/board_power.c
diff options
context:
space:
mode:
authorBernardo Perez Priego <bernardo.perez.priego@intel.com>2022-04-04 17:50:40 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-04-16 01:38:20 +0000
commite57d5c835eb36ba19862f449c5c08bebd2fcd7e8 (patch)
treeb1d787b0faac36fca23bdac03ab8fde29c5ca755 /zephyr/projects/nissa/src/board_power.c
parent6782c980921c397d31f66e1c1825ed19ddeb508e (diff)
downloadchrome-ec-e57d5c835eb36ba19862f449c5c08bebd2fcd7e8.tar.gz
ap_pwrseq: nivviks: Make use of ADC turn on/off feature
This will save power on CPU by turning on ADC only when is required. This required adding a few power state handlers on board power. BUG=b:228222441 TEST=zmake build nivviks; flash & run BRANCH=None Signed-off-by: Bernardo Perez Priego <bernardo.perez.priego@intel.com> Change-Id: Iec9e60d7719a233a5274123aecbaac95c6fda1aa Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3569767 Reviewed-by: Keith Short <keithshort@chromium.org> Reviewed-by: Andrew McRae <amcrae@google.com> Commit-Queue: Andrew McRae <amcrae@google.com>
Diffstat (limited to 'zephyr/projects/nissa/src/board_power.c')
-rw-r--r--zephyr/projects/nissa/src/board_power.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/zephyr/projects/nissa/src/board_power.c b/zephyr/projects/nissa/src/board_power.c
index 6524fbec40..83c693e897 100644
--- a/zephyr/projects/nissa/src/board_power.c
+++ b/zephyr/projects/nissa/src/board_power.c
@@ -21,6 +21,8 @@ LOG_MODULE_DECLARE(ap_pwrseq, LOG_LEVEL_INF);
#define X86_NON_DSX_ADLP_NONPWRSEQ_FORCE_SHUTDOWN_TO_MS 5
+static bool s0_stable;
+
static void generate_ec_soc_dsw_pwrok_handler(int delay)
{
int in_sig_val = power_signal_get(PWR_DSW_PWROK);
@@ -36,6 +38,12 @@ void board_ap_power_force_shutdown(void)
{
int timeout_ms = X86_NON_DSX_ADLP_NONPWRSEQ_FORCE_SHUTDOWN_TO_MS;
+ if (s0_stable) {
+ /* Enable these power signals in case of sudden shutdown */
+ power_signal_enable(PWR_DSW_PWROK);
+ power_signal_enable(PWR_PG_PP1P05);
+ }
+
power_signal_set(PWR_EC_PCH_RSMRST, 1);
power_signal_set(PWR_EC_SOC_DSW_PWROK, 0);
@@ -64,10 +72,17 @@ void board_ap_power_force_shutdown(void)
if (power_signal_get(PWR_DSW_PWROK))
LOG_WRN("DSW_PWROK didn't go low! Assuming G3.");
+
+ power_signal_disable(PWR_DSW_PWROK);
+ power_signal_disable(PWR_PG_PP1P05);
+ s0_stable = false;
}
void board_ap_power_action_g3_s5(void)
{
+ power_signal_enable(PWR_DSW_PWROK);
+ power_signal_enable(PWR_PG_PP1P05);
+
LOG_DBG("Turning on PWR_EN_PP5000_A and PWR_EN_PP3300_A");
power_signal_set(PWR_EN_PP5000_A, 1);
power_signal_set(PWR_EN_PP3300_A, 1);
@@ -77,8 +92,31 @@ void board_ap_power_action_g3_s5(void)
generate_ec_soc_dsw_pwrok_handler(
AP_PWRSEQ_DT_VALUE(dsw_pwrok_delay));
+ s0_stable = false;
+}
+
+void board_ap_power_action_s3_s0(void)
+{
+ s0_stable = false;
+}
+
+void board_ap_power_action_s0_s3(void)
+{
+ power_signal_enable(PWR_DSW_PWROK);
+ power_signal_enable(PWR_PG_PP1P05);
+ s0_stable = false;
}
+void board_ap_power_action_s0(void)
+{
+ if (s0_stable) {
+ return;
+ }
+ LOG_INF("Reaching S0");
+ power_signal_disable(PWR_DSW_PWROK);
+ power_signal_disable(PWR_PG_PP1P05);
+ s0_stable = true;
+}
int board_ap_power_assert_pch_power_ok(void)
{