diff --git a/subsys/power/policy/policy_residency.c b/subsys/power/policy/policy_residency.c index 8074fd7b51f..9f849a390cf 100644 --- a/subsys/power/policy/policy_residency.c +++ b/subsys/power/policy/policy_residency.c @@ -20,13 +20,21 @@ struct pm_state_info pm_policy_next_state(int32_t ticks) int i; for (i = ARRAY_SIZE(pm_min_residency) - 1; i >= 0; i--) { + uint32_t min_residency, exit_latency; + if (!pm_constraint_get(pm_min_residency[i].state)) { continue; } + min_residency = k_us_to_ticks_ceil32( + pm_min_residency[i].min_residency_us); + exit_latency = k_us_to_ticks_ceil32( + pm_min_residency[i].exit_latency_us); + __ASSERT(min_residency > exit_latency, + "min_residency_us < exit_latency_us"); + if ((ticks == K_TICKS_FOREVER) || - (ticks >= k_us_to_ticks_ceil32( - pm_min_residency[i].min_residency_us))) { + (ticks >= (min_residency - exit_latency))) { LOG_DBG("Selected power state %d " "(ticks: %d, min_residency: %u)", pm_min_residency[i].state, ticks,