/* * Copyright (c) 2015 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_PM_DEVICE_RUNTIME_H_ #define ZEPHYR_INCLUDE_PM_DEVICE_RUNTIME_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif /** * @brief Runtime Power Management API * * @defgroup runtime_power_management_api Runtime Power Management API * @ingroup power_management_api * @{ */ #ifdef CONFIG_PM_DEVICE_RUNTIME /** * @brief Enable device runtime PM * * Called by a device driver to enable device runtime power management. * The device might be asynchronously suspended if runtime PM is enabled * when the device is not use. * * @funcprops \pre_kernel_ok * * @param dev Pointer to device structure of the specific device driver * the caller is interested in. */ void pm_device_enable(const struct device *dev); /** * @brief Disable device runtime PM * * Called by a device driver to disable device runtime power management. * The device might be asynchronously resumed if runtime PM is disabled * * @funcprops \pre_kernel_ok * * @param dev Pointer to device structure of the specific device driver * the caller is interested in. */ void pm_device_disable(const struct device *dev); /** * @brief Call device resume asynchronously based on usage count * * Called by a device driver to mark the device as being used. * This API will asynchronously bring the device to resume state * if it not already in active state. * * @funcprops \isr_ok, \pre_kernel_ok * * @param dev Pointer to device structure of the specific device driver * the caller is interested in. * @retval 0 If successfully queued the Async request. If queued, * the caller need to wait on the poll event linked to device * pm signal mechanism to know the completion of resume operation. * @retval Errno Negative errno code if failure. */ int pm_device_get_async(const struct device *dev); /** * @brief Call device resume synchronously based on usage count * * Called by a device driver to mark the device as being used. It * will bring up or resume the device if it is in suspended state * based on the device usage count. This call is blocked until the * device PM state is changed to resume. * * @param dev Pointer to device structure of the specific device driver * the caller is interested in. * @retval 0 If successful. * @retval Errno Negative errno code if failure. */ int pm_device_get(const struct device *dev); /** * @brief Call device suspend asynchronously based on usage count * * Called by a device driver to mark the device as being released. * This API asynchronously put the device to suspend state if * it not already in suspended state. * * @funcprops \isr_ok, \pre_kernel_ok * * @param dev Pointer to device structure of the specific device driver * the caller is interested in. * @retval 0 If successfully queued the Async request. If queued, * the caller need to wait on the poll event linked to device pm * signal mechanism to know the completion of suspend operation. * @retval Errno Negative errno code if failure. */ int pm_device_put_async(const struct device *dev); /** * @brief Call device suspend synchronously based on usage count * * Called by a device driver to mark the device as being released. It * will put the device to suspended state if is is in active state * based on the device usage count. This call is blocked until the * device PM state is changed to resume. * * @param dev Pointer to device structure of the specific device driver * the caller is interested in. * @retval 0 If successful. * @retval Errno Negative errno code if failure. */ int pm_device_put(const struct device *dev); /** * @brief Wait on a device to finish an operation. * * The calling thread blocks until the device finishes a * @ref pm_device_put_async or @ref pm_device_get_async operation. If there is * no operation in progress this function will return immediately. * * @param dev Pointer to device structure of the specific device driver * the caller is interested in. * @param timeout The timeout passed to k_condvar_wait. If a timeout happens * this function will return immediately. * @retval 0 If successful. * @retval Errno Negative errno code if failure. */ int pm_device_wait(const struct device *dev, k_timeout_t timeout); #else static inline void pm_device_enable(const struct device *dev) { } static inline void pm_device_disable(const struct device *dev) { } static inline int pm_device_get(const struct device *dev) { return -ENOSYS; } static inline int pm_device_get_async(const struct device *dev) { return -ENOSYS; } static inline int pm_device_put(const struct device *dev) { return -ENOSYS; } static inline int pm_device_put_async(const struct device *dev) { return -ENOSYS; } static inline int pm_device_wait(const struct device *dev, k_timeout_t timeout) { return -ENOSYS; } #endif /** @} */ #endif /* ZEPHYR_INCLUDE_PM_DEVICE_RUNTIME_H_ */