zephyr/include/pm/device.h
Flavio Ceolin 1bd781e7b5 power: device_pm: Remove device idle pm states
Avoid confusion with device runtime idle pm states and just use device
pm states.

This simplify the code a little bit and prepare the ground for having
a better definition of device pm states. Right now this code needed to
hijack two transitional states to not break the current code logic but
the goal is avoid it and have everything in one single place.

Signed-off-by: Flavio Ceolin <flavio.ceolin@intel.com>
2021-05-07 18:35:12 -04:00

178 lines
4.9 KiB
C

/*
* Copyright (c) 2015 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_PM_DEVICE_H_
#define ZEPHYR_INCLUDE_PM_DEVICE_H_
#include <kernel.h>
#include <sys/atomic.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Device Power Management API
*
* @defgroup device_power_management_api Device Power Management API
* @ingroup power_management_api
* @{
*/
struct device;
/** @def PM_DEVICE_ACTIVE_STATE
*
* @brief device is in ACTIVE power state
*
* @details Normal operation of the device. All device context is retained.
*/
#define PM_DEVICE_ACTIVE_STATE 1
/** @def PM_DEVICE_LOW_POWER_STATE
*
* @brief device is in LOW power state
*
* @details Device context is preserved by the HW and need not be
* restored by the driver.
*/
#define PM_DEVICE_LOW_POWER_STATE 2
/** @def PM_DEVICE_SUSPEND_STATE
*
* @brief device is in SUSPEND power state
*
* @details Most device context is lost by the hardware.
* Device drivers must save and restore or reinitialize any context
* lost by the hardware
*/
#define PM_DEVICE_SUSPEND_STATE 3
/** @def PM_DEVICE_FORCE_SUSPEND_STATE
*
* @brief device is in force SUSPEND power state
*
* @details Driver puts the device in suspended state after
* completing the ongoing transactions and will not process any
* queued work or will not take any new requests for processing.
* Most device context is lost by the hardware. Device drivers must
* save and restore or reinitialize any context lost by the hardware.
*/
#define PM_DEVICE_FORCE_SUSPEND_STATE 4
/** @def PM_DEVICE_OFF_STATE
*
* @brief device is in OFF power state
*
* @details - Power has been fully removed from the device.
* The device context is lost when this state is entered, so the OS
* software will reinitialize the device when powering it back on
*/
#define PM_DEVICE_OFF_STATE 5
/** @def PM_DEVICE_RESUMING_STATE
*
* @brief device is resuming to active state.
*
* @details - The device was previously suspended and is now
* transitioning to become ACTIVE.
*/
#define PM_DEVICE_RESUMING_STATE 6
/** @def PM_DEVICE_SUSPENDING_STATE
*
* @brief device is suspending.
*
* @details - The device is currently transitioning from ACTIVE
* to SUSPEND.
*/
#define PM_DEVICE_SUSPENDING_STATE 7
/* Constants defining support device power commands */
#define PM_DEVICE_STATE_SET 1
#define PM_DEVICE_STATE_GET 2
typedef void (*pm_device_cb)(const struct device *dev,
int status, uint32_t *state, void *arg);
/**
* @brief Device PM info
*/
struct pm_device {
/** Pointer to the device */
const struct device *dev;
/** Lock to synchronize the get/put operations */
struct k_spinlock lock;
/* Following are packed fields protected by #lock. */
/** Device pm enable flag */
bool enable : 1;
/* Following are packed fields accessed with atomic bit operations. */
atomic_t atomic_flags;
/** Device usage count */
atomic_t usage;
/** Device idle internal power state */
atomic_t state;
/** Work object for asynchronous calls */
struct k_work_delayable work;
/** Event conditional var to listen to the sync request events */
struct k_condvar condvar;
};
/** Bit position in device_pm::atomic_flags that records whether the
* device is busy.
*/
#define PM_DEVICE_ATOMIC_FLAGS_BUSY_BIT 0
/**
* @brief Get name of device PM state
*
* @param state State id which name should be returned
*/
const char *pm_device_state_str(uint32_t state);
/**
* @brief Call the set power state function of a device
*
* Called by the application or power management service to let the device do
* required operations when moving to the required power state
* Note that devices may support just some of the device power states
* @param dev Pointer to device structure of the driver instance.
* @param device_power_state Device power state to be set
* @param cb Callback function to notify device power status
* @param arg Caller passed argument to callback function
*
* @retval 0 If successful in queuing the request or changing the state.
* @retval Errno Negative errno code if failure. Callback will not be called.
*/
int pm_device_state_set(const struct device *dev, uint32_t device_power_state,
pm_device_cb cb, void *arg);
/**
* @brief Call the get power state function of a device
*
* This function lets the caller know the current device
* power state at any time. This state will be one of the defined
* power states allowed for the devices in that system
*
* @param dev pointer to device structure of the driver instance.
* @param device_power_state Device power state to be filled by the device
*
* @retval 0 If successful.
* @retval Errno Negative errno code if failure.
*/
int pm_device_state_get(const struct device *dev, uint32_t *device_power_state);
/** Alias for legacy use of device_pm_control_nop */
#define device_pm_control_nop __DEPRECATED_MACRO NULL
/** @} */
#ifdef __cplusplus
}
#endif
#endif