zephyr/include/power.h
Ramesh Thomas 6d1e3cf96d doc: power_mgmt: Added Power Management documentation
Documented the Power Management subsystem which includes the
power management hook interface, device power management,
device busy status interfac and other APIs. Also included
is a guide to writing Power Management applications.

This has 2 parts.  One is the general description of the
infrastructure and the PMA writing guide which goes in the
'subsystem' area. Other is the API description that gets
automatically pulled in from the comments in the source files.
The API description goes into the section where all other
Zephyr APIs are put.

Change-Id: Id630209b23f931a8fcccb6f59428610298486743
Signed-off-by: Ramesh Thomas <ramesh.thomas@intel.com>
2016-04-27 00:57:53 +00:00

149 lines
5.9 KiB
C

/*
* Copyright (c) 2012-2014 Wind River Systems, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __INCpower
#define __INCpower
#ifdef __cplusplus
extern "C" {
#endif
#ifdef CONFIG_SYS_POWER_MANAGEMENT
/* Constants identifying power policies */
#define SYS_PM_NOT_HANDLED 0 /* No PM operations */
#define SYS_PM_DEVICE_SUSPEND_ONLY 1 /* Only Devices are suspended */
#define SYS_PM_LOW_POWER_STATE 2 /* Low Power State */
#define SYS_PM_DEEP_SLEEP 4 /* Deep Sleep */
/**
* @brief Power Management Hook Interface
*
* @defgroup power_management_hook_interface Power Management Hook Interface
* @ingroup power_management_api
* @{
*/
/**
* @brief Hook function to notify exit of a power policy
*
* The purpose of this function is to notify exit from
* deep sleep, low power state or device suspend only policy.
* States altered at _sys_soc_suspend() should be restored in this
* function. Exit from each policy requires different handling as
* follows.
*
* Deep sleep policy exit:
* App should save information in SoC at _sys_soc_suspend() that
* will persist across deep sleep. This function should check
* that information to identify deep sleep recovery. In this case
* this function will restore states and resume execution at the
* point were system entered deep sleep. In this mode, this
* function is called with the interrupt stack. It is important
* that this function, before interrupts are enabled, restores
* the stack that was in use when system went to deep sleep. This
* is to avoid interfering interrupt handlers use of this stack.
*
* Cold boot and deep sleep recovery happen at the same location.
* Since kernel does not store deep sleep state, kernel will call
* this function in both cases. It is the responsibility of the
* power manager application to identify whether it is cold boot
* or deep sleep exit using state information that it stores.
* If the function detects cold boot, then it returns immediately.
*
* Low power state policy exit:
* Low power state policy does a CPU idle wait using a low power
* CPU idle state supported by the processor. This state is exited
* by an interrupt. In this case this function would be called
* from the interrupt's ISR context. Any state altered at
* _sys_soc_suspend should be restored and the function should
* return quickly.
*
* Device suspend only policy exit:
* This function will be called at the exit of kernel's CPU idle
* wait if device suspend only policy was used. Resume operations
* should be done for devices that were suspended in _sys_soc_suspend().
* This function is called in ISR context and it should return quickly.
*
* @return will not return to caller in deep sleep recovery
*/
extern void _sys_soc_resume(void);
/**
* @brief Hook function to allow power policy entry
*
* 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. This function should compare this time
* with the wake latency of various power saving schemes that the
* power manager application implements and use the one that fits best.
* The power saving schemes can be mapped to following policies.
*
* Deep sleep policy:
* This turns off the core voltage rail and system clock, while RAM is
* retained. This would save most power but would also have a high wake
* latency. CPU loses state so this function should save CPU states in RAM
* and the location in this function where system should resume execution at
* resume. It should re-enable interrupts and return SYS_PM_DEEP_SLEEP.
*
* Low power state policy:
* Peripherals can be turned off and clocks can be gated depending on
* time available. Then switches to CPU low power state. In this state
* the CPU is still active but in a low power state and does not lose
* any state. This state is exited by an interrupt from where the
* _sys_soc_resume() will be called. To allow interrupts to occur,
* this function should ensure that interrupts are atomically enabled
* before going to the low power CPU idle state. The atomicity of enabling
* interrupts before entering cpu idle wait is essential to avoid a task
* switch away from the kernel idle task before the cpu idle wait is reached.
* This function should return SYS_PM_LOW_POWER_STATE.
*
* Device suspend only policy:
* This function can take advantage of the kernel's idling logic
* by turning off peripherals and clocks depending on available time.
* It can return SYS_PM_DEVICE_SUSPEND_ONLY to indicate the kernel should
* do its own CPU idle wait. After the Kernel's idle wait is completed or if
* any interrupt occurs, the _sys_soc_resume() function will be called to
* allow restoring of altered states. Interrupts should not be turned on in
* this case.
*
* If this function decides to not do any operation then it should
* return SYS_PM_NOT_HANDLED to let kernel do its normal idle processing.
*
* This function is entered with interrupts disabled. It should
* re-enable interrupts if it does CPU low power wait or deep sleep.
*
* @param ticks the upcoming kernel idle time
*
* @retval SYS_PM_NOT_HANDLED If No PM operations done.
* @retval SYS_PM_DEVICE_SUSPEND_ONLY If only devices were suspended.
* @retval SYS_PM_LOW_POWER_STATE If LPS policy entered.
* @retval SYS_PM_DEEP_SLEEP If Deep Sleep policy entered.
*/
extern int _sys_soc_suspend(int32_t ticks);
/**
* @}
*/
#endif /* CONFIG_SYS_POWER_MANAGEMENT */
#ifdef __cplusplus
}
#endif
#endif /* __INCpower */