50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
/*
|
|
* Copyright (c) 2018 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr.h>
|
|
#include <kernel.h>
|
|
#include <power/power_state.h>
|
|
#include "pm_policy.h"
|
|
|
|
#include <logging/log.h>
|
|
LOG_MODULE_DECLARE(power, CONFIG_PM_LOG_LEVEL);
|
|
|
|
#define STATE_ACTIVE \
|
|
(struct pm_state_info){PM_STATE_ACTIVE, 0, 0}
|
|
|
|
static const struct pm_state_info pm_dummy_states[] =
|
|
PM_STATE_INFO_DT_ITEMS_LIST(DT_NODELABEL(cpu0));
|
|
|
|
struct pm_state_info pm_policy_next_state(int32_t ticks)
|
|
{
|
|
static struct pm_state_info cur_pm_state_info;
|
|
int i = (int)cur_pm_state_info.state;
|
|
uint8_t states_len = ARRAY_SIZE(pm_dummy_states);
|
|
|
|
if (states_len == 0) {
|
|
/* No power states to go through. */
|
|
return STATE_ACTIVE;
|
|
}
|
|
|
|
do {
|
|
i = (i + 1) % states_len;
|
|
|
|
if (!pm_constraint_get(
|
|
pm_dummy_states[i].state)) {
|
|
continue;
|
|
}
|
|
|
|
cur_pm_state_info = pm_dummy_states[i];
|
|
|
|
LOG_DBG("Selected power state: %u", pm_dummy_states[i].state);
|
|
|
|
return pm_dummy_states[i];
|
|
} while (pm_dummy_states[i].state != cur_pm_state_info.state);
|
|
|
|
LOG_DBG("No suitable power state found!");
|
|
return STATE_ACTIVE;
|
|
}
|