123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*
- * 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 <device.h>
- #include <kernel.h>
- #include <sys/atomic.h>
- #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_ */
|