LCOV - code coverage report
Current view: top level - zephyr/pm - device_runtime.h Hit Total Coverage
Test: new.info Lines: 8 9 88.9 %
Date: 2024-12-22 00:14:23

          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 1.14