13#ifndef ZEPHYR_INCLUDE_PM_DEVICE_H_
14#define ZEPHYR_INCLUDE_PM_DEVICE_H_
41 PM_DEVICE_FLAG_TURN_ON_FAILED,
43 PM_DEVICE_FLAG_PD_CLAIMED,
48 PM_DEVICE_FLAG_WS_CAPABLE,
50 PM_DEVICE_FLAG_WS_ENABLED,
52 PM_DEVICE_FLAG_RUNTIME_ENABLED,
56 PM_DEVICE_FLAG_RUNTIME_AUTO,
58 PM_DEVICE_FLAG_ISR_SAFE,
71#define PM_DEVICE_ISR_SAFE 1
216#if defined(CONFIG_PM_DEVICE_RUNTIME) || defined(__DOXYGEN__)
220#ifdef CONFIG_PM_DEVICE_POWER_DOMAIN
222 const struct device *domain;
236#if defined(CONFIG_PM_DEVICE_RUNTIME) || defined(__DOXYGEN__)
241#if defined(CONFIG_PM_DEVICE_RUNTIME_ASYNC) || defined(__DOXYGEN__)
260#if defined(CONFIG_PM_DEVICE_RUNTIME) || defined(__DOXYGEN__)
272#ifdef CONFIG_PM_DEVICE_RUNTIME_ASYNC
273#define Z_PM_DEVICE_RUNTIME_INIT(obj) \
274 .lock = Z_SEM_INITIALIZER(obj.lock, 1, 1), \
275 .event = Z_EVENT_INITIALIZER(obj.event),
276#elif CONFIG_PM_DEVICE_RUNTIME
277#define Z_PM_DEVICE_RUNTIME_INIT(obj) \
278 .lock = Z_SEM_INITIALIZER(obj.lock, 1, 1),
280#define Z_PM_DEVICE_RUNTIME_INIT(obj)
283#ifdef CONFIG_PM_DEVICE_POWER_DOMAIN
284#define Z_PM_DEVICE_POWER_DOMAIN_INIT(_node_id) \
285 .domain = DEVICE_DT_GET_OR_NULL(DT_PHANDLE(_node_id, \
288#define Z_PM_DEVICE_POWER_DOMAIN_INIT(obj)
296#define Z_PM_DEVICE_FLAGS(node_id) \
298 DT_NODE_EXISTS(node_id), \
299 ((DT_PROP_OR(node_id, wakeup_source, 0) \
300 << PM_DEVICE_FLAG_WS_CAPABLE) | \
301 (DT_PROP_OR(node_id, zephyr_pm_device_runtime_auto, 0) \
302 << PM_DEVICE_FLAG_RUNTIME_AUTO) | \
303 (DT_NODE_HAS_COMPAT(node_id, power_domain) << \
304 PM_DEVICE_FLAG_PD)), \
318#define Z_PM_DEVICE_BASE_INIT(obj, node_id, pm_action_cb, _flags) \
320 .flags = ATOMIC_INIT(Z_PM_DEVICE_FLAGS(node_id) | (_flags)), \
321 .state = PM_DEVICE_STATE_ACTIVE, \
322 .action_cb = pm_action_cb, \
323 Z_PM_DEVICE_POWER_DOMAIN_INIT(node_id) \
336#define Z_PM_DEVICE_INIT(obj, node_id, pm_action_cb, isr_safe) \
338 .base = Z_PM_DEVICE_BASE_INIT(obj, node_id, pm_action_cb, \
339 isr_safe ? BIT(PM_DEVICE_FLAG_ISR_SAFE) : 0), \
340 COND_CODE_1(isr_safe, (), (Z_PM_DEVICE_RUNTIME_INIT(obj))) \
348#define Z_PM_DEVICE_NAME(dev_id) _CONCAT(__pm_device_, dev_id)
362#define Z_PM_DEVICE_DEFINE_SLOT(dev_id) \
363 static STRUCT_SECTION_ITERABLE_ALTERNATE(pm_device_slots, device, \
364 _CONCAT(__pm_slot_, dev_id))
366#define Z_PM_DEVICE_DEFINE_SLOT(dev_id)
369#ifdef CONFIG_PM_DEVICE
377#define Z_PM_DEVICE_DEFINE(node_id, dev_id, pm_action_cb, isr_safe) \
378 Z_PM_DEVICE_DEFINE_SLOT(dev_id); \
379 static struct COND_CODE_1(isr_safe, (pm_device_isr), (pm_device)) \
380 Z_PM_DEVICE_NAME(dev_id) = \
381 Z_PM_DEVICE_INIT(Z_PM_DEVICE_NAME(dev_id), node_id, \
382 pm_action_cb, isr_safe)
389#define Z_PM_DEVICE_GET(dev_id) ((struct pm_device_base *)&Z_PM_DEVICE_NAME(dev_id))
392#define Z_PM_DEVICE_DEFINE(node_id, dev_id, pm_action_cb, isr_safe)
393#define Z_PM_DEVICE_GET(dev_id) NULL
409#define PM_DEVICE_DEFINE(dev_id, pm_action_cb, ...) \
410 Z_PM_DEVICE_DEFINE(DT_INVALID_NODE, dev_id, pm_action_cb, \
411 COND_CODE_1(IS_EMPTY(__VA_ARGS__), (0), (__VA_ARGS__)))
424#define PM_DEVICE_DT_DEFINE(node_id, pm_action_cb, ...) \
425 Z_PM_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), pm_action_cb, \
426 COND_CODE_1(IS_EMPTY(__VA_ARGS__), (0), (__VA_ARGS__)))
439#define PM_DEVICE_DT_INST_DEFINE(idx, pm_action_cb, ...) \
440 Z_PM_DEVICE_DEFINE(DT_DRV_INST(idx), \
441 Z_DEVICE_DT_DEV_ID(DT_DRV_INST(idx)), \
443 COND_CODE_1(IS_EMPTY(__VA_ARGS__), (0), (__VA_ARGS__)))
453#define PM_DEVICE_GET(dev_id) \
454 Z_PM_DEVICE_GET(dev_id)
464#define PM_DEVICE_DT_GET(node_id) \
465 PM_DEVICE_GET(Z_DEVICE_DT_DEV_ID(node_id))
475#define PM_DEVICE_DT_INST_GET(idx) \
476 PM_DEVICE_DT_GET(DT_DRV_INST(idx))
519#if defined(CONFIG_PM_DEVICE) || defined(__DOXYGEN__)
669 const struct device *domain);
684 const struct device *domain);
796 const struct device *domain)
804 const struct device *domain)
823 if ((rc < 0) && (rc != -
ENOTSUP)) {
long atomic_t
Atomic integer variable.
Definition atomic_types.h:31
bool pm_device_wakeup_is_enabled(const struct device *dev)
Check if a device is enabled as a wake up source.
int pm_device_power_domain_remove(const struct device *dev, const struct device *domain)
Remove a device from a power domain.
bool pm_device_on_power_domain(const struct device *dev)
Check if the device is on a switchable power domain.
int pm_device_action_run(const struct device *dev, enum pm_device_action action)
Run a pm action on a device.
static void pm_device_init_suspended(const struct device *dev)
Initialize a device state to PM_DEVICE_STATE_SUSPENDED.
Definition device.h:543
pm_device_state
Device power states.
Definition device.h:74
bool pm_device_wakeup_enable(const struct device *dev, bool enable)
Enable or disable a device as a wake up source.
void pm_device_children_action_run(const struct device *dev, enum pm_device_action action, pm_device_action_failed_cb_t failure_cb)
Run a pm action on all children of a device.
void pm_device_busy_set(const struct device *dev)
Mark a device as busy.
int(* pm_device_action_cb_t)(const struct device *dev, enum pm_device_action action)
Device PM action callback.
Definition device.h:189
void pm_device_busy_clear(const struct device *dev)
Clear a device busy status.
bool pm_device_is_busy(const struct device *dev)
Check if a device is busy.
bool(* pm_device_action_failed_cb_t)(const struct device *dev, int err)
Device PM action failed callback.
Definition device.h:200
bool pm_device_is_powered(const struct device *dev)
Check if the device is currently powered.
int pm_device_power_domain_add(const struct device *dev, const struct device *domain)
Add a device to a power domain.
bool pm_device_wakeup_is_capable(const struct device *dev)
Check if a device is wake up capable.
const char * pm_device_state_str(enum pm_device_state state)
Get name of device PM state.
int pm_device_driver_init(const struct device *dev, pm_device_action_cb_t action_cb)
Move a device driver into its initial device power state.
int pm_device_driver_deinit(const struct device *dev, pm_device_action_cb_t action_cb)
Prepare PM device for device driver deinit.
bool pm_device_is_any_busy(void)
Check if any device is busy.
pm_device_action
Device PM actions.
Definition device.h:150
static void pm_device_init_off(const struct device *dev)
Initialize a device state to PM_DEVICE_STATE_OFF.
Definition device.h:563
int pm_device_state_get(const struct device *dev, enum pm_device_state *state)
Obtain the power state of a device.
@ PM_DEVICE_STATE_SUSPENDED
Device hardware is powered, but the device is not needed by the system.
Definition device.h:105
@ PM_DEVICE_STATE_OFF
Device hardware is not powered.
Definition device.h:146
@ PM_DEVICE_STATE_SUSPENDING
Device hardware is powered, but the device has been scheduled to be suspended, as it is no longer nee...
Definition device.h:122
@ PM_DEVICE_STATE_ACTIVE
Device hardware is powered, and the device is needed by the system.
Definition device.h:81
@ PM_DEVICE_ACTION_TURN_OFF
Turn off.
Definition device.h:169
@ PM_DEVICE_ACTION_SUSPEND
Suspend.
Definition device.h:152
@ PM_DEVICE_ACTION_RESUME
Resume.
Definition device.h:154
@ PM_DEVICE_ACTION_TURN_ON
Turn on.
Definition device.h:177
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define ENOTSUP
Unsupported value.
Definition errno.h:114
state
Definition parser_state.h:29
#define bool
Definition stdbool.h:13
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
struct pm_device_base * pm_base
Definition device.h:545
Event Structure.
Definition kernel.h:2691
Semaphore structure.
Definition kernel.h:3703
Kernel Spin Lock.
Definition spinlock.h:45
A structure used to submit work after a delay.
Definition kernel.h:4643
Device PM info.
Definition device.h:209
uint32_t usage
Device usage count.
Definition device.h:218
pm_device_action_cb_t action_cb
Device PM action callback.
Definition device.h:215
enum pm_device_state state
Device power state.
Definition device.h:213
atomic_t flags
Device PM status flags.
Definition device.h:211
Runtime PM info for device with synchronous PM.
Definition device.h:257
struct k_spinlock lock
Lock to synchronize the synchronous get/put operations.
Definition device.h:262
struct pm_device_base base
Base info.
Definition device.h:259
Runtime PM info for device with generic PM.
Definition device.h:233
struct k_work_delayable work
Work object for asynchronous calls.
Definition device.h:245
struct k_event event
Event var to listen to the sync request events.
Definition device.h:243
struct k_sem lock
Lock to synchronize the get/put operations.
Definition device.h:240
const struct device * dev
Pointer to the device.
Definition device.h:238
struct pm_device_base base
Base info.
Definition device.h:235
Header file for the Atomic operations API.
Iterable sections helpers.