LCOV - code coverage report
Current view: top level - zephyr/pm - device_runtime.h Coverage Total Hit
Test: new.info Lines: 88.9 % 9 8
Test Date: 2025-09-05 16:43:28

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

Generated by: LCOV version 2.0-1