| /* |
| * 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 */ |