zephyr/include/power.h

166 lines
5.0 KiB
C

/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_POWER_H_
#define ZEPHYR_INCLUDE_POWER_H_
#ifdef __cplusplus
extern "C" {
#endif
#ifdef CONFIG_SYS_POWER_MANAGEMENT
/* Constants identifying power state categories */
#define SYS_PM_ACTIVE_STATE 0 /* SOC and CPU are in active state */
#define SYS_PM_LOW_POWER_STATE 1 /* CPU low power state */
#define SYS_PM_DEEP_SLEEP 2 /* SOC low power state */
#define SYS_PM_NOT_HANDLED SYS_PM_ACTIVE_STATE
extern unsigned char sys_pm_idle_exit_notify;
/**
* @defgroup power_management_api Power Management
* @{
* @}
*/
/**
* @brief Power Management Hooks
*
* @defgroup power_management_hook_interface Power Management Hooks
* @ingroup power_management_api
* @{
*/
/**
* @brief Function to disable power management idle exit notification
*
* sys_resume() would be called from the ISR of the event that caused
* exit from kernel idling after PM operations. For some power operations,
* this notification may not be necessary. This function can be called in
* sys_suspend to disable the corresponding sys_resume notification.
*
*/
static inline void sys_pm_idle_exit_notification_disable(void)
{
sys_pm_idle_exit_notify = 0;
}
/**
* @brief Hook function to notify exit from deep sleep
*
* The purpose of this function is to notify exit from
* deep sleep. The implementation of this function can vary
* depending on the soc specific boot flow.
*
* This function would switch cpu context to the execution point at the time
* system entered deep sleep power state. Some implementations may not require
* use of this function e.g. the BSP or boot loader may do the context switch.
*
* In boot flows where this function gets called even at cold boot, the
* function should return immediately.
*
*/
void sys_resume_from_deep_sleep(void);
/**
* @brief Hook function to notify exit from kernel idling after PM operations
*
* This function would notify exit from kernel idling if a corresponding
* sys_suspend() notification was handled and did not return
* SYS_PM_NOT_HANDLED.
*
* This function would be called from the ISR context of the event
* that caused the exit from kernel idling. This will be called immediately
* after interrupts are enabled. This is called to give a chance to do
* any operations before the kernel would switch tasks or processes nested
* interrupts. This is required for cpu low power states that would require
* interrupts to be enabled while entering low power states. e.g. C1 in x86. In
* those cases, the ISR would be invoked immediately after the event wakes up
* the CPU, before code following the CPU wait, gets a chance to execute. This
* can be ignored if no operation needs to be done at the wake event
* notification. Alternatively sys_pm_idle_exit_notification_disable() can
* be called in sys_suspend to disable this notification.
*
*/
void sys_resume(void);
/**
* @brief Hook function to allow entry to low power state
*
* This function is called by the kernel when it is about to idle.
* It is passed the number of clock ticks that the kernel calculated
* as available time to idle.
*
* The implementation of this function is dependent on the soc specific
* components and the various schemes they support. Some implementations
* may choose to do device PM operations in this function, while others
* would not need to, because they would have done it at other places.
*
* Typically a wake event is set and the soc or cpu is put to any of the
* supported low power states. The wake event should be set to wake up
* the soc or cpu before the available idle time expires to avoid disrupting
* the kernel's scheduling.
*
* This function is entered with interrupts disabled. It should
* re-enable interrupts if it had entered a low power state.
*
* @param ticks the upcoming kernel idle time
*
* @retval SYS_PM_NOT_HANDLED If low power state was not entered.
* @retval SYS_PM_LOW_POWER_STATE If CPU low power state was entered.
* @retval SYS_PM_DEEP_SLEEP If SOC low power state was entered.
*/
extern int sys_suspend(s32_t ticks);
#ifdef CONFIG_PM_CONTROL_OS_DEBUG
/**
* @brief Dump Low Power states related debug info
*
* Dump Low Power states debug info like LPS entry count and residencies.
*/
extern void sys_pm_dump_debug_info(void);
#endif /* CONFIG_PM_CONTROL_OS_DEBUG */
#ifdef CONFIG_PM_CONTROL_STATE_LOCK
/**
* @brief Disable system PM state
*
* Disable system Low power states like LPS or Deep Sleep states.
*/
extern void sys_pm_ctrl_disable_state(int state);
/**
* @brief Enable system PM state
*
* Enable system Low power states like LPS or Deep Sleep states.
*/
extern void sys_pm_ctrl_enable_state(int state);
/**
* @brief Get enable status of a PM state
*
* Get enable status of a system PM state.
*/
extern bool sys_pm_ctrl_is_state_enabled(int state);
#endif /* CONFIG_PM_CONTROL_STATE_LOCK */
/**
* @}
*/
#endif /* CONFIG_SYS_POWER_MANAGEMENT */
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_POWER_H_ */