1*92ee37ffSKamlesh Gurudasani /*
2*92ee37ffSKamlesh Gurudasani * Copyright (c) 2025-2026 Texas Instruments Incorporated - https://www.ti.com
3*92ee37ffSKamlesh Gurudasani *
4*92ee37ffSKamlesh Gurudasani * SPDX-License-Identifier: BSD-3-Clause
5*92ee37ffSKamlesh Gurudasani */
6*92ee37ffSKamlesh Gurudasani
7*92ee37ffSKamlesh Gurudasani /*
8*92ee37ffSKamlesh Gurudasani * Device Power Management API
9*92ee37ffSKamlesh Gurudasani *
10*92ee37ffSKamlesh Gurudasani * This header provides device power management operations including device
11*92ee37ffSKamlesh Gurudasani * enable/disable, reset isolation, retention control, context loss tracking,
12*92ee37ffSKamlesh Gurudasani * and SoC-specific device initialization and state management functions.
13*92ee37ffSKamlesh Gurudasani */
14*92ee37ffSKamlesh Gurudasani
15*92ee37ffSKamlesh Gurudasani #ifndef TI_DEVICE_PM_H
16*92ee37ffSKamlesh Gurudasani #define TI_DEVICE_PM_H
17*92ee37ffSKamlesh Gurudasani
18*92ee37ffSKamlesh Gurudasani #include <stdbool.h>
19*92ee37ffSKamlesh Gurudasani
20*92ee37ffSKamlesh Gurudasani /**
21*92ee37ffSKamlesh Gurudasani * ti_soc_device_get_state() - Get the current device state (SoC specific impl.)
22*92ee37ffSKamlesh Gurudasani * @dev: The device to query.
23*92ee37ffSKamlesh Gurudasani *
24*92ee37ffSKamlesh Gurudasani * Return: Non-zero if the device is enabled, zero if disabled.
25*92ee37ffSKamlesh Gurudasani */
26*92ee37ffSKamlesh Gurudasani uint32_t ti_soc_device_get_state(struct ti_device *dev);
27*92ee37ffSKamlesh Gurudasani
28*92ee37ffSKamlesh Gurudasani /**
29*92ee37ffSKamlesh Gurudasani * ti_soc_device_set_reset_iso() - Set the reset isolation flag for a device (SoC specific impl.)
30*92ee37ffSKamlesh Gurudasani * @dev: The device to modify.
31*92ee37ffSKamlesh Gurudasani * @enable: True to enable reset isolation, false to disable.
32*92ee37ffSKamlesh Gurudasani */
33*92ee37ffSKamlesh Gurudasani void ti_soc_device_set_reset_iso(struct ti_device *dev, bool enable);
34*92ee37ffSKamlesh Gurudasani
35*92ee37ffSKamlesh Gurudasani /**
36*92ee37ffSKamlesh Gurudasani * ti_soc_device_get_context_loss_count() - Get context loss count
37*92ee37ffSKamlesh Gurudasani * @device: The device to query.
38*92ee37ffSKamlesh Gurudasani *
39*92ee37ffSKamlesh Gurudasani * Return: The current loss count of the device.
40*92ee37ffSKamlesh Gurudasani */
41*92ee37ffSKamlesh Gurudasani uint32_t ti_soc_device_get_context_loss_count(struct ti_device *dev);
42*92ee37ffSKamlesh Gurudasani
43*92ee37ffSKamlesh Gurudasani /**
44*92ee37ffSKamlesh Gurudasani * ti_soc_device_enable() - Enable a device (SoC specific impl.)
45*92ee37ffSKamlesh Gurudasani * @device: The device to modify.
46*92ee37ffSKamlesh Gurudasani */
47*92ee37ffSKamlesh Gurudasani void ti_soc_device_enable(struct ti_device *dev);
48*92ee37ffSKamlesh Gurudasani
49*92ee37ffSKamlesh Gurudasani /**
50*92ee37ffSKamlesh Gurudasani * ti_soc_device_disable() - Disable a device (SoC specific impl.)
51*92ee37ffSKamlesh Gurudasani * @device: The device to modify.
52*92ee37ffSKamlesh Gurudasani * @domain_reset: True if the device is being disabled due to a domain reset.
53*92ee37ffSKamlesh Gurudasani */
54*92ee37ffSKamlesh Gurudasani void ti_soc_device_disable(struct ti_device *dev, bool domain_reset);
55*92ee37ffSKamlesh Gurudasani
56*92ee37ffSKamlesh Gurudasani /**
57*92ee37ffSKamlesh Gurudasani * ti_soc_device_clear_flags() - Clear a device initialization flags
58*92ee37ffSKamlesh Gurudasani * @dev: The device to modify.
59*92ee37ffSKamlesh Gurudasani */
60*92ee37ffSKamlesh Gurudasani void ti_soc_device_clear_flags(struct ti_device *dev);
61*92ee37ffSKamlesh Gurudasani
62*92ee37ffSKamlesh Gurudasani /**
63*92ee37ffSKamlesh Gurudasani * ti_soc_device_ret_enable() - Enable retention on a device (SoC specific impl.)
64*92ee37ffSKamlesh Gurudasani * @device: The device to modify.
65*92ee37ffSKamlesh Gurudasani */
66*92ee37ffSKamlesh Gurudasani void ti_soc_device_ret_enable(struct ti_device *dev);
67*92ee37ffSKamlesh Gurudasani
68*92ee37ffSKamlesh Gurudasani /**
69*92ee37ffSKamlesh Gurudasani * ti_soc_device_ret_disable() - Disable retention on a device (SoC specific impl.)
70*92ee37ffSKamlesh Gurudasani * @device: The device to modify.
71*92ee37ffSKamlesh Gurudasani */
72*92ee37ffSKamlesh Gurudasani void ti_soc_device_ret_disable(struct ti_device *dev);
73*92ee37ffSKamlesh Gurudasani
74*92ee37ffSKamlesh Gurudasani /**
75*92ee37ffSKamlesh Gurudasani * ti_soc_device_init() - Perform SoC level initialization of a device.
76*92ee37ffSKamlesh Gurudasani *
77*92ee37ffSKamlesh Gurudasani * The device to init.
78*92ee37ffSKamlesh Gurudasani *
79*92ee37ffSKamlesh Gurudasani * Return: 0 on success, -EAGAIN if device is not yet ready to be initialized.
80*92ee37ffSKamlesh Gurudasani */
81*92ee37ffSKamlesh Gurudasani int32_t ti_soc_device_init(struct ti_device *dev);
82*92ee37ffSKamlesh Gurudasani
83*92ee37ffSKamlesh Gurudasani /**
84*92ee37ffSKamlesh Gurudasani * ti_soc_device_init_complete() - Notify SoC device impl. that device init is complete.
85*92ee37ffSKamlesh Gurudasani *
86*92ee37ffSKamlesh Gurudasani * This allows the SoC implementation to drop any extra references it's been
87*92ee37ffSKamlesh Gurudasani * holding during init.
88*92ee37ffSKamlesh Gurudasani */
89*92ee37ffSKamlesh Gurudasani void ti_soc_device_init_complete(void);
90*92ee37ffSKamlesh Gurudasani
91*92ee37ffSKamlesh Gurudasani /**
92*92ee37ffSKamlesh Gurudasani * ti_device_disable() - Disables a device.
93*92ee37ffSKamlesh Gurudasani * @device: The device to modify.
94*92ee37ffSKamlesh Gurudasani * @domain_reset: True if the device is being disabled due to a domain reset.
95*92ee37ffSKamlesh Gurudasani *
96*92ee37ffSKamlesh Gurudasani * Performs the steps necessary to disable a device.
97*92ee37ffSKamlesh Gurudasani */
98*92ee37ffSKamlesh Gurudasani void ti_device_disable(struct ti_device *dev, bool domain_reset);
99*92ee37ffSKamlesh Gurudasani
100*92ee37ffSKamlesh Gurudasani /**
101*92ee37ffSKamlesh Gurudasani * ti_device_set_state() - Enable/disable a device.
102*92ee37ffSKamlesh Gurudasani * @device: The device to modify.
103*92ee37ffSKamlesh Gurudasani * @host_idx: The index of the host making the request.
104*92ee37ffSKamlesh Gurudasani * @enable: True to enable the device, false to allow the PMMC to power down the device.
105*92ee37ffSKamlesh Gurudasani *
106*92ee37ffSKamlesh Gurudasani * This indicates the desired state of a device by the HLOS. If a device is
107*92ee37ffSKamlesh Gurudasani * enabled, the PMMC will make sure the device and its dependencies are
108*92ee37ffSKamlesh Gurudasani * ready. If the device is not enabled, the PMMC will opportunistically
109*92ee37ffSKamlesh Gurudasani * utilize power management modes of that device and its dependencies.
110*92ee37ffSKamlesh Gurudasani *
111*92ee37ffSKamlesh Gurudasani * Enabling a device (if disabled) increments the device's reference count.
112*92ee37ffSKamlesh Gurudasani * Disabling a device (if enabled) decrements the devices' reference count.
113*92ee37ffSKamlesh Gurudasani */
114*92ee37ffSKamlesh Gurudasani void ti_device_set_state(struct ti_device *dev, uint8_t host_idx, bool enable);
115*92ee37ffSKamlesh Gurudasani
116*92ee37ffSKamlesh Gurudasani /**
117*92ee37ffSKamlesh Gurudasani * ti_device_set_retention() - Enable/disable retention on a device.
118*92ee37ffSKamlesh Gurudasani * @device: The device to modify.
119*92ee37ffSKamlesh Gurudasani * @retention: True to enable retention, false to disable it.
120*92ee37ffSKamlesh Gurudasani *
121*92ee37ffSKamlesh Gurudasani * When a device is in retention, but disabled, the PMMC can still perform
122*92ee37ffSKamlesh Gurudasani * power management tasks, but the device must keep its context. Enabling
123*92ee37ffSKamlesh Gurudasani * retention is a way save power, but still be able to bring the device back
124*92ee37ffSKamlesh Gurudasani * to full functionality quickly.
125*92ee37ffSKamlesh Gurudasani */
126*92ee37ffSKamlesh Gurudasani void ti_device_set_retention(struct ti_device *dev, bool retention);
127*92ee37ffSKamlesh Gurudasani
128*92ee37ffSKamlesh Gurudasani /**
129*92ee37ffSKamlesh Gurudasani * ti_device_clear_flags() - Clear a device initialization flags
130*92ee37ffSKamlesh Gurudasani * @dev: The device to modify.
131*92ee37ffSKamlesh Gurudasani */
132*92ee37ffSKamlesh Gurudasani void ti_device_clear_flags(struct ti_device *dev);
133*92ee37ffSKamlesh Gurudasani
134*92ee37ffSKamlesh Gurudasani /**
135*92ee37ffSKamlesh Gurudasani * ti_device_set_reset_iso() - Set the reset isolation flag for a device.
136*92ee37ffSKamlesh Gurudasani * @device: The device to modify.
137*92ee37ffSKamlesh Gurudasani * @enable: True to enable reset isolation, false to disable.
138*92ee37ffSKamlesh Gurudasani *
139*92ee37ffSKamlesh Gurudasani * The effect of reset isolation is device and SoC specific, but it generally
140*92ee37ffSKamlesh Gurudasani * prevents the device from undergoing reset with the rest of the SoC.
141*92ee37ffSKamlesh Gurudasani */
ti_device_set_reset_iso(struct ti_device * dev,bool enable)142*92ee37ffSKamlesh Gurudasani static inline void ti_device_set_reset_iso(struct ti_device *dev, bool enable)
143*92ee37ffSKamlesh Gurudasani {
144*92ee37ffSKamlesh Gurudasani ti_soc_device_set_reset_iso(dev, enable);
145*92ee37ffSKamlesh Gurudasani }
146*92ee37ffSKamlesh Gurudasani
147*92ee37ffSKamlesh Gurudasani /* Return values for ti_device_get_state() and ti_soc_device_get_state() */
148*92ee37ffSKamlesh Gurudasani #define TI_DEVICE_STATE_DISABLED 0U /* Module is off (SwRstDisable) */
149*92ee37ffSKamlesh Gurudasani #define TI_DEVICE_STATE_ENABLED 1U /* Module is enabled or in retention */
150*92ee37ffSKamlesh Gurudasani #define TI_DEVICE_STATE_TRANSITIONING 2U /* Module is transitioning or domains mixed */
151*92ee37ffSKamlesh Gurudasani
152*92ee37ffSKamlesh Gurudasani /**
153*92ee37ffSKamlesh Gurudasani * ti_device_get_state() - Get the current device state.
154*92ee37ffSKamlesh Gurudasani * @device: The device to query.
155*92ee37ffSKamlesh Gurudasani *
156*92ee37ffSKamlesh Gurudasani * Returns the current device state as configured by ti_device_set_state.
157*92ee37ffSKamlesh Gurudasani *
158*92ee37ffSKamlesh Gurudasani * Return: TI_DEVICE_STATE_DISABLED, TI_DEVICE_STATE_ENABLED, or
159*92ee37ffSKamlesh Gurudasani * TI_DEVICE_STATE_TRANSITIONING.
160*92ee37ffSKamlesh Gurudasani */
ti_device_get_state(struct ti_device * dev)161*92ee37ffSKamlesh Gurudasani static inline uint32_t ti_device_get_state(struct ti_device *dev)
162*92ee37ffSKamlesh Gurudasani {
163*92ee37ffSKamlesh Gurudasani return ti_soc_device_get_state(dev);
164*92ee37ffSKamlesh Gurudasani }
165*92ee37ffSKamlesh Gurudasani
166*92ee37ffSKamlesh Gurudasani #endif /* TI_DEVICE_PM_H */
167