diff options
Diffstat (limited to 'zephyr/subsys/ap_pwrseq/ap_power_interface.c')
-rw-r--r-- | zephyr/subsys/ap_pwrseq/ap_power_interface.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/zephyr/subsys/ap_pwrseq/ap_power_interface.c b/zephyr/subsys/ap_pwrseq/ap_power_interface.c index 1461ed139b..684bcbb5e0 100644 --- a/zephyr/subsys/ap_pwrseq/ap_power_interface.c +++ b/zephyr/subsys/ap_pwrseq/ap_power_interface.c @@ -8,6 +8,7 @@ LOG_MODULE_DECLARE(ap_pwrseq, CONFIG_AP_PWRSEQ_LOG_LEVEL); +#ifndef CONFIG_AP_PWRSEQ_DRIVER bool ap_power_in_state(enum ap_power_state_mask state_mask) { int need_mask = 0; @@ -114,6 +115,69 @@ void ap_power_exit_hardoff(void) return; request_start_from_g3(); } +#else +bool ap_power_in_state(enum ap_power_state_mask state_mask) +{ + /* + * PWRSEQ_DRIVER will only expose stable power states (transitions + * occur automatically and are not visible to API consumers), so + * return ap_power_in_or_transitioning_to_state since it is + * equivalent to this function. + */ + return ap_power_in_or_transitioning_to_state(state_mask); +} + +bool ap_power_in_or_transitioning_to_state(enum ap_power_state_mask state_mask) +{ + const struct device *dev = ap_pwrseq_get_instance(); + + switch (ap_pwrseq_get_current_state(dev)) { + case AP_POWER_STATE_G3: + return state_mask & AP_POWER_STATE_HARD_OFF; + case AP_POWER_STATE_S5: + return state_mask & AP_POWER_STATE_SOFT_OFF; + case AP_POWER_STATE_S3: + case AP_POWER_STATE_S4: + return state_mask & AP_POWER_STATE_SUSPEND; +#if CONFIG_AP_PWRSEQ_S0IX + case AP_POWER_STATE_S0IX: + return state_mask & AP_POWER_STATE_STANDBY; +#endif + case AP_POWER_STATE_S0: + return state_mask & AP_POWER_STATE_ON; + default: + break; + } + /* Unknown power state; return false. */ + return 0; +} + +void ap_power_exit_hardoff(void) +{ + const struct device *dev = ap_pwrseq_get_instance(); + enum ap_pwrseq_state power_state; + + ap_pwrseq_state_lock(dev); + /* + * If not in the soft-off state, hard-off state, or headed there, + * nothing to do. + */ + power_state = ap_pwrseq_get_current_state(dev); + if (power_state == AP_POWER_STATE_G3 || + power_state == AP_POWER_STATE_S5) { + request_start_from_g3(); + } + + ap_pwrseq_state_unlock(dev); +} + +void ap_pwrseq_task_start(void) +{ + const struct device *dev = ap_pwrseq_get_instance(); + + ap_pwrseq_start(dev, chipset_pwr_seq_get_state()); +} +#endif /* CONFIG_AP_PWRSEQ_DRIVER */ void ap_power_init_reset_log(void) { |