xref: /rk3399_ARM-atf/drivers/ti/pd/include/ti_device_pm.h (revision a28114d66a6d43db4accef5fd5d6dab6c059e584)
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