Line data Source code
1 0 : /* 2 : * Copyright (c) 2015 Intel Corporation. 3 : * Copyright (c) 2021 Nordic Semiconductor ASA 4 : * 5 : * SPDX-License-Identifier: Apache-2.0 6 : */ 7 : 8 : #ifndef ZEPHYR_INCLUDE_PM_DEVICE_RUNTIME_H_ 9 : #define ZEPHYR_INCLUDE_PM_DEVICE_RUNTIME_H_ 10 : 11 : #include <zephyr/device.h> 12 : #include <zephyr/kernel.h> 13 : 14 : #ifdef __cplusplus 15 : extern "C" { 16 : #endif 17 : 18 : /** 19 : * @brief Device Runtime Power Management API 20 : * @defgroup subsys_pm_device_runtime Device Runtime 21 : * @ingroup subsys_pm 22 : * @{ 23 : */ 24 : 25 : #if defined(CONFIG_PM_DEVICE_RUNTIME) || defined(__DOXYGEN__) 26 : /** 27 : * @brief Automatically enable device runtime based on devicetree properties 28 : * 29 : * @note Must not be called from application code. See the 30 : * zephyr,pm-device-runtime-auto property in pm.yaml and z_sys_init_run_level. 31 : * 32 : * @param dev Device instance. 33 : * 34 : * @retval 0 If the device runtime PM is enabled successfully or it has not 35 : * been requested for this device in devicetree. 36 : * @retval -errno Other negative errno, result of enabled device runtime PM. 37 : */ 38 1 : int pm_device_runtime_auto_enable(const struct device *dev); 39 : 40 : /** 41 : * @brief Enable device runtime PM 42 : * 43 : * This function will enable runtime PM on the given device. If the device is 44 : * in #PM_DEVICE_STATE_ACTIVE state, the device will be suspended. 45 : * 46 : * @funcprops \pre_kernel_ok 47 : * 48 : * @param dev Device instance. 49 : * 50 : * @retval 0 If the device runtime PM is enabled successfully. 51 : * @retval -EBUSY If device is busy. 52 : * @retval -ENOTSUP If the device does not support PM. 53 : * @retval -errno Other negative errno, result of suspending the device. 54 : * 55 : * @see pm_device_init_suspended() 56 : */ 57 1 : int pm_device_runtime_enable(const struct device *dev); 58 : 59 : /** 60 : * @brief Disable device runtime PM 61 : * 62 : * If the device is currently suspended it will be resumed. 63 : * 64 : * @funcprops \pre_kernel_ok 65 : * 66 : * @param dev Device instance. 67 : * 68 : * @retval 0 If the device runtime PM is disabled successfully. 69 : * @retval -ENOTSUP If the device does not support PM. 70 : * @retval -errno Other negative errno, result of resuming the device. 71 : */ 72 1 : int pm_device_runtime_disable(const struct device *dev); 73 : 74 : /** 75 : * @brief Resume a device based on usage count. 76 : * 77 : * This function will resume the device if the device is suspended (usage count 78 : * equal to 0). In case of a resume failure, usage count and device state will 79 : * be left unchanged. In all other cases, usage count will be incremented. 80 : * 81 : * If the device is still being suspended as a result of calling 82 : * pm_device_runtime_put_async(), this function will wait for the operation to 83 : * finish to then resume the device. 84 : * 85 : * @note It is safe to use this function in contexts where blocking is not 86 : * allowed, e.g. ISR, provided the device PM implementation does not block. 87 : * 88 : * @funcprops \pre_kernel_ok 89 : * 90 : * @param dev Device instance. 91 : * 92 : * @retval 0 If it succeeds. In case device runtime PM is not enabled or not 93 : * available this function will be a no-op and will also return 0. 94 : * @retval -EWOUDBLOCK If call would block but it is not allowed (e.g. in ISR). 95 : * @retval -errno Other negative errno, result of the PM action callback. 96 : */ 97 1 : int pm_device_runtime_get(const struct device *dev); 98 : 99 : /** 100 : * @brief Suspend a device based on usage count. 101 : * 102 : * This function will suspend the device if the device is no longer required 103 : * (usage count equal to 0). In case of suspend failure, usage count and device 104 : * state will be left unchanged. In all other cases, usage count will be 105 : * decremented (down to 0). 106 : * 107 : * @funcprops \pre_kernel_ok 108 : * 109 : * @param dev Device instance. 110 : * 111 : * @retval 0 If it succeeds. In case device runtime PM is not enabled or not 112 : * available this function will be a no-op and will also return 0. 113 : * @retval -EALREADY If device is already suspended (can only happen if get/put 114 : * calls are unbalanced). 115 : * @retval -errno Other negative errno, result of the action callback. 116 : * 117 : * @see pm_device_runtime_put_async() 118 : */ 119 1 : int pm_device_runtime_put(const struct device *dev); 120 : 121 : /** 122 : * @brief Suspend a device based on usage count (asynchronously). 123 : * 124 : * This function will schedule the device suspension if the device is no longer 125 : * required (usage count equal to 0). In all other cases, usage count will be 126 : * decremented (down to 0). 127 : * 128 : * @note Asynchronous operations are not supported when in pre-kernel mode. In 129 : * this case, the function will be blocking (equivalent to 130 : * pm_device_runtime_put()). 131 : * 132 : * @funcprops \pre_kernel_ok, \async, \isr_ok 133 : * 134 : * @param dev Device instance. 135 : * @param delay Minimum amount of time before triggering the action. 136 : * 137 : * @retval 0 If it succeeds. In case device runtime PM is not enabled or not 138 : * available this function will be a no-op and will also return 0. 139 : * @retval -EBUSY If the device is busy. 140 : * @retval -EALREADY If device is already suspended (can only happen if get/put 141 : * calls are unbalanced). 142 : * 143 : * @see pm_device_runtime_put() 144 : */ 145 1 : int pm_device_runtime_put_async(const struct device *dev, k_timeout_t delay); 146 : 147 : /** 148 : * @brief Check if device runtime is enabled for a given device. 149 : * 150 : * @funcprops \pre_kernel_ok 151 : * 152 : * @param dev Device instance. 153 : * 154 : * @retval true If device has device runtime PM enabled. 155 : * @retval false If the device has device runtime PM disabled. 156 : * 157 : * @see pm_device_runtime_enable() 158 : */ 159 1 : bool pm_device_runtime_is_enabled(const struct device *dev); 160 : 161 : /** 162 : * @brief Return the current device usage counter. 163 : * 164 : * @param dev Device instance. 165 : * 166 : * @returns the current usage counter. 167 : * @retval -ENOTSUP If the device is not using runtime PM. 168 : * @retval -ENOSYS If the runtime PM is not enabled at all. 169 : */ 170 1 : int pm_device_runtime_usage(const struct device *dev); 171 : 172 : #else 173 : 174 : static inline int pm_device_runtime_auto_enable(const struct device *dev) 175 : { 176 : ARG_UNUSED(dev); 177 : return 0; 178 : } 179 : 180 : static inline int pm_device_runtime_enable(const struct device *dev) 181 : { 182 : ARG_UNUSED(dev); 183 : return 0; 184 : } 185 : 186 : static inline int pm_device_runtime_disable(const struct device *dev) 187 : { 188 : ARG_UNUSED(dev); 189 : return 0; 190 : } 191 : 192 : static inline int pm_device_runtime_get(const struct device *dev) 193 : { 194 : ARG_UNUSED(dev); 195 : return 0; 196 : } 197 : 198 : static inline int pm_device_runtime_put(const struct device *dev) 199 : { 200 : ARG_UNUSED(dev); 201 : return 0; 202 : } 203 : 204 : static inline int pm_device_runtime_put_async(const struct device *dev, 205 : k_timeout_t delay) 206 : { 207 : ARG_UNUSED(dev); 208 : ARG_UNUSED(delay); 209 : return 0; 210 : } 211 : 212 : static inline bool pm_device_runtime_is_enabled(const struct device *dev) 213 : { 214 : ARG_UNUSED(dev); 215 : return false; 216 : } 217 : 218 : static inline int pm_device_runtime_usage(const struct device *dev) 219 : { 220 : ARG_UNUSED(dev); 221 : return -ENOSYS; 222 : } 223 : 224 : #endif 225 : 226 : /** @} */ 227 : 228 : #ifdef __cplusplus 229 : } 230 : #endif 231 : 232 : #endif /* ZEPHYR_INCLUDE_PM_DEVICE_RUNTIME_H_ */