xref: /rk3399_ARM-atf/drivers/ti/pd/include/ti_psc.h (revision a28114d66a6d43db4accef5fd5d6dab6c059e584)
1*f6db41e0SKamlesh Gurudasani /*
2*f6db41e0SKamlesh Gurudasani  * Copyright (c) 2025-2026 Texas Instruments Incorporated - https://www.ti.com
3*f6db41e0SKamlesh Gurudasani  *
4*f6db41e0SKamlesh Gurudasani  * SPDX-License-Identifier: BSD-3-Clause
5*f6db41e0SKamlesh Gurudasani  */
6*f6db41e0SKamlesh Gurudasani 
7*f6db41e0SKamlesh Gurudasani /*
8*f6db41e0SKamlesh Gurudasani  * PSC Driver API
9*f6db41e0SKamlesh Gurudasani  *
10*f6db41e0SKamlesh Gurudasani  * This header provides the Power and Sleep Controller (PSC) driver interface
11*f6db41e0SKamlesh Gurudasani  * including data structures for power domains and LPSC modules, state
12*f6db41e0SKamlesh Gurudasani  * management functions, reset control, and module dependency handling.
13*f6db41e0SKamlesh Gurudasani  */
14*f6db41e0SKamlesh Gurudasani 
15*f6db41e0SKamlesh Gurudasani #ifndef TI_PSC_H
16*f6db41e0SKamlesh Gurudasani #define TI_PSC_H
17*f6db41e0SKamlesh Gurudasani 
18*f6db41e0SKamlesh Gurudasani #include <ti_device.h>
19*f6db41e0SKamlesh Gurudasani #include <ti_pm_types.h>
20*f6db41e0SKamlesh Gurudasani 
21*f6db41e0SKamlesh Gurudasani /*
22*f6db41e0SKamlesh Gurudasani  * Indicates that no device is mapped to this PSC module
23*f6db41e0SKamlesh Gurudasani  *
24*f6db41e0SKamlesh Gurudasani  * Used in device-to-PSC mapping tables to indicate that a PSC module
25*f6db41e0SKamlesh Gurudasani  * has no associated device.
26*f6db41e0SKamlesh Gurudasani  */
27*f6db41e0SKamlesh Gurudasani #define TI_PSC_DEV_NONE		7U
28*f6db41e0SKamlesh Gurudasani 
29*f6db41e0SKamlesh Gurudasani /*
30*f6db41e0SKamlesh Gurudasani  * Indicates that multiple devices are mapped to this PSC module
31*f6db41e0SKamlesh Gurudasani  *
32*f6db41e0SKamlesh Gurudasani  * Used in device-to-PSC mapping tables to indicate that a PSC module
33*f6db41e0SKamlesh Gurudasani  * controls multiple devices. The actual device list is stored elsewhere.
34*f6db41e0SKamlesh Gurudasani  */
35*f6db41e0SKamlesh Gurudasani #define TI_PSC_DEV_MULTIPLE	6U
36*f6db41e0SKamlesh Gurudasani 
37*f6db41e0SKamlesh Gurudasani /*
38*f6db41e0SKamlesh Gurudasani  * Flag indicating that the power domain exists and is valid
39*f6db41e0SKamlesh Gurudasani  *
40*f6db41e0SKamlesh Gurudasani  * Set in ti_psc_pd_data.flags to indicate that this power domain is
41*f6db41e0SKamlesh Gurudasani  * present and the information in the record is valid.
42*f6db41e0SKamlesh Gurudasani  */
43*f6db41e0SKamlesh Gurudasani #define TI_PSC_PD_EXISTS		BIT(0)
44*f6db41e0SKamlesh Gurudasani 
45*f6db41e0SKamlesh Gurudasani /*
46*f6db41e0SKamlesh Gurudasani  * Flag indicating that the power domain is always on
47*f6db41e0SKamlesh Gurudasani  *
48*f6db41e0SKamlesh Gurudasani  * Set in ti_psc_pd_data.flags to indicate that this power domain cannot
49*f6db41e0SKamlesh Gurudasani  * be powered down and is always active.
50*f6db41e0SKamlesh Gurudasani  */
51*f6db41e0SKamlesh Gurudasani #define TI_PSC_PD_ALWAYSON		BIT(1)
52*f6db41e0SKamlesh Gurudasani 
53*f6db41e0SKamlesh Gurudasani /*
54*f6db41e0SKamlesh Gurudasani  * Flag indicating that the power domain has dependencies
55*f6db41e0SKamlesh Gurudasani  *
56*f6db41e0SKamlesh Gurudasani  * Set in ti_psc_pd_data.flags to indicate that this power domain depends
57*f6db41e0SKamlesh Gurudasani  * on another power domain being active. The dependency is specified in
58*f6db41e0SKamlesh Gurudasani  * the depends field.
59*f6db41e0SKamlesh Gurudasani  */
60*f6db41e0SKamlesh Gurudasani #define TI_PSC_PD_DEPENDS		BIT(2)
61*f6db41e0SKamlesh Gurudasani 
62*f6db41e0SKamlesh Gurudasani /*
63*f6db41e0SKamlesh Gurudasani  * PSC power domain constant data
64*f6db41e0SKamlesh Gurudasani  *
65*f6db41e0SKamlesh Gurudasani  * This structure contains the constant configuration data for a PSC power
66*f6db41e0SKamlesh Gurudasani  * domain, including its characteristics, dependencies, and clock requirements.
67*f6db41e0SKamlesh Gurudasani  * This data is typically stored in ROM or const data sections.
68*f6db41e0SKamlesh Gurudasani  */
69*f6db41e0SKamlesh Gurudasani struct ti_psc_pd_data {
70*f6db41e0SKamlesh Gurudasani 	/*
71*f6db41e0SKamlesh Gurudasani 	 * Power domain configuration flags
72*f6db41e0SKamlesh Gurudasani 	 *
73*f6db41e0SKamlesh Gurudasani 	 * Combination of TI_PSC_PD_EXISTS, TI_PSC_PD_ALWAYSON, and TI_PSC_PD_DEPENDS
74*f6db41e0SKamlesh Gurudasani 	 * flags indicating the power domain's characteristics.
75*f6db41e0SKamlesh Gurudasani 	 */
76*f6db41e0SKamlesh Gurudasani 	uint8_t flags;
77*f6db41e0SKamlesh Gurudasani 
78*f6db41e0SKamlesh Gurudasani 	/*
79*f6db41e0SKamlesh Gurudasani 	 * Index of the power domain this one depends on
80*f6db41e0SKamlesh Gurudasani 	 *
81*f6db41e0SKamlesh Gurudasani 	 * If TI_PSC_PD_DEPENDS is set in flags, this field contains the ti_pd_idx_t
82*f6db41e0SKamlesh Gurudasani 	 * of the power domain that must be active before this one can be enabled.
83*f6db41e0SKamlesh Gurudasani 	 */
84*f6db41e0SKamlesh Gurudasani 	uint8_t depends;
85*f6db41e0SKamlesh Gurudasani 
86*f6db41e0SKamlesh Gurudasani 	/*
87*f6db41e0SKamlesh Gurudasani 	 * Clock dependencies for power domain transitions
88*f6db41e0SKamlesh Gurudasani 	 *
89*f6db41e0SKamlesh Gurudasani 	 * Some domains need a clock running in order to transition. This
90*f6db41e0SKamlesh Gurudasani 	 * is the id of that clock. If no such clock is needed, set to
91*f6db41e0SKamlesh Gurudasani 	 * an invalid clock id (0). We currently support only 3 clocks.
92*f6db41e0SKamlesh Gurudasani 	 */
93*f6db41e0SKamlesh Gurudasani 	ti_clk_idx_t clock_dep[3];
94*f6db41e0SKamlesh Gurudasani };
95*f6db41e0SKamlesh Gurudasani 
96*f6db41e0SKamlesh Gurudasani /*
97*f6db41e0SKamlesh Gurudasani  * PSC power domain dynamic data
98*f6db41e0SKamlesh Gurudasani  *
99*f6db41e0SKamlesh Gurudasani  * This structure contains the runtime state information for a PSC power
100*f6db41e0SKamlesh Gurudasani  * domain, tracking its usage and power-up enablement status. This data
101*f6db41e0SKamlesh Gurudasani  * changes during system operation.
102*f6db41e0SKamlesh Gurudasani  */
103*f6db41e0SKamlesh Gurudasani struct ti_psc_pd {
104*f6db41e0SKamlesh Gurudasani 	/*
105*f6db41e0SKamlesh Gurudasani 	 * Reference count tracking power domain usage
106*f6db41e0SKamlesh Gurudasani 	 *
107*f6db41e0SKamlesh Gurudasani 	 * Number of modules or users currently requiring this power domain
108*f6db41e0SKamlesh Gurudasani 	 * to be active. The domain can only be powered down when this
109*f6db41e0SKamlesh Gurudasani 	 * count reaches zero.
110*f6db41e0SKamlesh Gurudasani 	 */
111*f6db41e0SKamlesh Gurudasani 	uint8_t use_count;
112*f6db41e0SKamlesh Gurudasani 
113*f6db41e0SKamlesh Gurudasani 	/*
114*f6db41e0SKamlesh Gurudasani 	 * Power-up enable status
115*f6db41e0SKamlesh Gurudasani 	 *
116*f6db41e0SKamlesh Gurudasani 	 * True if this power domain is enabled for power-up operations,
117*f6db41e0SKamlesh Gurudasani 	 * false otherwise. This is used to track the requested state of
118*f6db41e0SKamlesh Gurudasani 	 * the power domain.
119*f6db41e0SKamlesh Gurudasani 	 */
120*f6db41e0SKamlesh Gurudasani 	bool pwr_up_enabled;
121*f6db41e0SKamlesh Gurudasani };
122*f6db41e0SKamlesh Gurudasani 
123*f6db41e0SKamlesh Gurudasani /* Module is present, information in record is valid */
124*f6db41e0SKamlesh Gurudasani #define TI_LPSC_MODULE_EXISTS	BIT(0)
125*f6db41e0SKamlesh Gurudasani 
126*f6db41e0SKamlesh Gurudasani /* Module is not capable of clock gating */
127*f6db41e0SKamlesh Gurudasani #define TI_LPSC_NO_CLOCK_GATING	BIT(1)
128*f6db41e0SKamlesh Gurudasani 
129*f6db41e0SKamlesh Gurudasani /* Module depends on another module listed in depends field */
130*f6db41e0SKamlesh Gurudasani #define TI_LPSC_DEPENDS		BIT(2)
131*f6db41e0SKamlesh Gurudasani 
132*f6db41e0SKamlesh Gurudasani /* Module implements configurable reset isolation */
133*f6db41e0SKamlesh Gurudasani #define TI_LPSC_HAS_RESET_ISO	BIT(3)
134*f6db41e0SKamlesh Gurudasani 
135*f6db41e0SKamlesh Gurudasani /* Module implements a local reset */
136*f6db41e0SKamlesh Gurudasani #define TI_LPSC_HAS_LOCAL_RESET	BIT(4)
137*f6db41e0SKamlesh Gurudasani 
138*f6db41e0SKamlesh Gurudasani /* States that enable module reset are disallowed */
139*f6db41e0SKamlesh Gurudasani #define TI_LPSC_NO_MODULE_RESET	BIT(5)
140*f6db41e0SKamlesh Gurudasani 
141*f6db41e0SKamlesh Gurudasani /*
142*f6db41e0SKamlesh Gurudasani  * Set if the module data points to a dev_list, false it a dev_array is
143*f6db41e0SKamlesh Gurudasani  * embedded.
144*f6db41e0SKamlesh Gurudasani  */
145*f6db41e0SKamlesh Gurudasani #define TI_LPSC_DEVICES_LIST	BIT(6)
146*f6db41e0SKamlesh Gurudasani 
147*f6db41e0SKamlesh Gurudasani /*
148*f6db41e0SKamlesh Gurudasani  * LPSC module constant configuration data
149*f6db41e0SKamlesh Gurudasani  *
150*f6db41e0SKamlesh Gurudasani  * This structure contains the constant configuration data for a Local Power
151*f6db41e0SKamlesh Gurudasani  * Sleep Controller (LPSC) module, including device associations, dependencies,
152*f6db41e0SKamlesh Gurudasani  * clock requirements, and module characteristics. This data is typically stored
153*f6db41e0SKamlesh Gurudasani  * in ROM or const data sections and defines the static properties of each
154*f6db41e0SKamlesh Gurudasani  * LPSC module in the system.
155*f6db41e0SKamlesh Gurudasani  */
156*f6db41e0SKamlesh Gurudasani struct ti_lpsc_module_data {
157*f6db41e0SKamlesh Gurudasani 	/*
158*f6db41e0SKamlesh Gurudasani 	 * Device-to-LPSC module association
159*f6db41e0SKamlesh Gurudasani 	 *
160*f6db41e0SKamlesh Gurudasani 	 * Which devices are members of which PSC module is duplicated in the
161*f6db41e0SKamlesh Gurudasani 	 * list of devices. However, it is duplicated here so that the entire
162*f6db41e0SKamlesh Gurudasani 	 * list of devices does not need to be looped through to find that
163*f6db41e0SKamlesh Gurudasani 	 * information. It could be generated dynamically but is stored in this
164*f6db41e0SKamlesh Gurudasani 	 * way to save memory.
165*f6db41e0SKamlesh Gurudasani 	 */
166*f6db41e0SKamlesh Gurudasani 	union {
167*f6db41e0SKamlesh Gurudasani 		/*
168*f6db41e0SKamlesh Gurudasani 		 * Embedded device array for small device lists
169*f6db41e0SKamlesh Gurudasani 		 *
170*f6db41e0SKamlesh Gurudasani 		 * If there are 4 or less devices, they can be stored here,
171*f6db41e0SKamlesh Gurudasani 		 * terminated by the 4th device or TI_DEV_ID_NONE. This avoids
172*f6db41e0SKamlesh Gurudasani 		 * the need for a separate pointer and saves memory.
173*f6db41e0SKamlesh Gurudasani 		 */
174*f6db41e0SKamlesh Gurudasani 		ti_dev_idx_t dev_array[sizeof(void *) / sizeof(ti_dev_idx_t)];
175*f6db41e0SKamlesh Gurudasani 
176*f6db41e0SKamlesh Gurudasani 		/*
177*f6db41e0SKamlesh Gurudasani 		 * Pointer to external device list for large device lists
178*f6db41e0SKamlesh Gurudasani 		 *
179*f6db41e0SKamlesh Gurudasani 		 * More than 4 devices must be stored in a separate list,
180*f6db41e0SKamlesh Gurudasani 		 * terminated by TI_DEV_ID_NONE. The TI_LPSC_DEVICES_LIST flag must be
181*f6db41e0SKamlesh Gurudasani 		 * set when this field is used instead of dev_array.
182*f6db41e0SKamlesh Gurudasani 		 */
183*f6db41e0SKamlesh Gurudasani 		const ti_dev_idx_t *dev_list;
184*f6db41e0SKamlesh Gurudasani 	} lpsc_dev;
185*f6db41e0SKamlesh Gurudasani 
186*f6db41e0SKamlesh Gurudasani 	/*
187*f6db41e0SKamlesh Gurudasani 	 * Clock dependencies for module transitions
188*f6db41e0SKamlesh Gurudasani 	 *
189*f6db41e0SKamlesh Gurudasani 	 * Some modules need a clock running in order to transition. This
190*f6db41e0SKamlesh Gurudasani 	 * is the id of that clock. If no such clock is needed, set to
191*f6db41e0SKamlesh Gurudasani 	 * an invalid clock id (0). We currently support only one clock,
192*f6db41e0SKamlesh Gurudasani 	 * this causes the structure size to be 8 bytes in the case of an
193*f6db41e0SKamlesh Gurudasani 	 * 8 bit ti_clk_idx_t and 12 bytes for a 16 bit ti_clk_idx_t.
194*f6db41e0SKamlesh Gurudasani 	 */
195*f6db41e0SKamlesh Gurudasani 	ti_clk_idx_t clock_dep[1];
196*f6db41e0SKamlesh Gurudasani 
197*f6db41e0SKamlesh Gurudasani 	/*
198*f6db41e0SKamlesh Gurudasani 	 * Module configuration flags
199*f6db41e0SKamlesh Gurudasani 	 *
200*f6db41e0SKamlesh Gurudasani 	 * Combination of TI_LPSC_MODULE_EXISTS, TI_LPSC_NO_CLOCK_GATING, TI_LPSC_DEPENDS,
201*f6db41e0SKamlesh Gurudasani 	 * TI_LPSC_HAS_RESET_ISO, TI_LPSC_HAS_LOCAL_RESET, TI_LPSC_NO_MODULE_RESET, and
202*f6db41e0SKamlesh Gurudasani 	 * TI_LPSC_DEVICES_LIST flags indicating the module's characteristics and
203*f6db41e0SKamlesh Gurudasani 	 * capabilities.
204*f6db41e0SKamlesh Gurudasani 	 */
205*f6db41e0SKamlesh Gurudasani 	uint8_t flags;
206*f6db41e0SKamlesh Gurudasani 
207*f6db41e0SKamlesh Gurudasani 	/*
208*f6db41e0SKamlesh Gurudasani 	 * Index of the LPSC module this one depends on
209*f6db41e0SKamlesh Gurudasani 	 *
210*f6db41e0SKamlesh Gurudasani 	 * If TI_LPSC_DEPENDS is set in flags, this field contains the ti_lpsc_idx_t
211*f6db41e0SKamlesh Gurudasani 	 * of the LPSC module that must be active before this one can be enabled.
212*f6db41e0SKamlesh Gurudasani 	 */
213*f6db41e0SKamlesh Gurudasani 	ti_lpsc_idx_t depends;
214*f6db41e0SKamlesh Gurudasani 
215*f6db41e0SKamlesh Gurudasani 	/*
216*f6db41e0SKamlesh Gurudasani 	 * PSC index of the dependency module
217*f6db41e0SKamlesh Gurudasani 	 *
218*f6db41e0SKamlesh Gurudasani 	 * If TI_LPSC_DEPENDS is set in flags, this field contains the ti_psc_idx_t
219*f6db41e0SKamlesh Gurudasani 	 * of the PSC that controls the dependency module. This allows for
220*f6db41e0SKamlesh Gurudasani 	 * cross-PSC dependencies.
221*f6db41e0SKamlesh Gurudasani 	 */
222*f6db41e0SKamlesh Gurudasani 	uint8_t depends_psc_idx;
223*f6db41e0SKamlesh Gurudasani 
224*f6db41e0SKamlesh Gurudasani 	/*
225*f6db41e0SKamlesh Gurudasani 	 * Power domain index this module belongs to
226*f6db41e0SKamlesh Gurudasani 	 *
227*f6db41e0SKamlesh Gurudasani 	 * The ti_pd_idx_t of the power domain that controls this LPSC module.
228*f6db41e0SKamlesh Gurudasani 	 * The module can only be active when its power domain is powered up.
229*f6db41e0SKamlesh Gurudasani 	 */
230*f6db41e0SKamlesh Gurudasani 	uint8_t powerdomain;
231*f6db41e0SKamlesh Gurudasani };
232*f6db41e0SKamlesh Gurudasani 
233*f6db41e0SKamlesh Gurudasani /*
234*f6db41e0SKamlesh Gurudasani  * LPSC module dynamic runtime data
235*f6db41e0SKamlesh Gurudasani  *
236*f6db41e0SKamlesh Gurudasani  * This structure contains the runtime state information for an LPSC module,
237*f6db41e0SKamlesh Gurudasani  * tracking its usage, power state, reset status, and loss count. This data
238*f6db41e0SKamlesh Gurudasani  * changes during system operation as modules are enabled, disabled, and reset.
239*f6db41e0SKamlesh Gurudasani  */
240*f6db41e0SKamlesh Gurudasani struct ti_lpsc_module {
241*f6db41e0SKamlesh Gurudasani 	/*
242*f6db41e0SKamlesh Gurudasani 	 * Module reset loss counter
243*f6db41e0SKamlesh Gurudasani 	 *
244*f6db41e0SKamlesh Gurudasani 	 * Incremented after module reset. This value is used to detect when
245*f6db41e0SKamlesh Gurudasani 	 * a module has undergone a reset and lost its state, allowing drivers
246*f6db41e0SKamlesh Gurudasani 	 * to know when reinitialization is necessary.
247*f6db41e0SKamlesh Gurudasani 	 */
248*f6db41e0SKamlesh Gurudasani 	uint32_t loss_count;
249*f6db41e0SKamlesh Gurudasani 
250*f6db41e0SKamlesh Gurudasani 	/*
251*f6db41e0SKamlesh Gurudasani 	 * Active usage reference count
252*f6db41e0SKamlesh Gurudasani 	 *
253*f6db41e0SKamlesh Gurudasani 	 * Non-zero if module should be active (clocks running). Incremented
254*f6db41e0SKamlesh Gurudasani 	 * by ti_lpsc_module_get() and decremented by ti_lpsc_module_put().
255*f6db41e0SKamlesh Gurudasani 	 * The module transitions to enabled state when this count is non-zero.
256*f6db41e0SKamlesh Gurudasani 	 */
257*f6db41e0SKamlesh Gurudasani 	uint8_t use_count;
258*f6db41e0SKamlesh Gurudasani 
259*f6db41e0SKamlesh Gurudasani 	/*
260*f6db41e0SKamlesh Gurudasani 	 * Retention reference count
261*f6db41e0SKamlesh Gurudasani 	 *
262*f6db41e0SKamlesh Gurudasani 	 * Non-zero if module should be powered-up but may be clock-gated.
263*f6db41e0SKamlesh Gurudasani 	 * Incremented by ti_lpsc_module_ret_get() and decremented by
264*f6db41e0SKamlesh Gurudasani 	 * ti_lpsc_module_ret_put(). This allows the module to retain state
265*f6db41e0SKamlesh Gurudasani 	 * while saving power by stopping clocks.
266*f6db41e0SKamlesh Gurudasani 	 */
267*f6db41e0SKamlesh Gurudasani 	uint8_t ret_count;
268*f6db41e0SKamlesh Gurudasani 
269*f6db41e0SKamlesh Gurudasani 	/*
270*f6db41e0SKamlesh Gurudasani 	 * Current programmed software state
271*f6db41e0SKamlesh Gurudasani 	 *
272*f6db41e0SKamlesh Gurudasani 	 * Current programmed state of the module (MDSTAT_STATE_[...]).
273*f6db41e0SKamlesh Gurudasani 	 * Reflects the state written to hardware and may differ from the
274*f6db41e0SKamlesh Gurudasani 	 * actual hardware state during transitions.
275*f6db41e0SKamlesh Gurudasani 	 */
276*f6db41e0SKamlesh Gurudasani 	uint8_t sw_state;
277*f6db41e0SKamlesh Gurudasani 
278*f6db41e0SKamlesh Gurudasani 	/*
279*f6db41e0SKamlesh Gurudasani 	 * Module reset retention flag
280*f6db41e0SKamlesh Gurudasani 	 *
281*f6db41e0SKamlesh Gurudasani 	 * True if the module is forced on due to a module reset. In this
282*f6db41e0SKamlesh Gurudasani 	 * case sw_state indicates SWRSTDISABLE but this module holds
283*f6db41e0SKamlesh Gurudasani 	 * a reference count to its powerdomain. This prevents the power
284*f6db41e0SKamlesh Gurudasani 	 * domain from being disabled while a reset is active.
285*f6db41e0SKamlesh Gurudasani 	 */
286*f6db41e0SKamlesh Gurudasani 	bool sw_mrst_ret;
287*f6db41e0SKamlesh Gurudasani 
288*f6db41e0SKamlesh Gurudasani 	/*
289*f6db41e0SKamlesh Gurudasani 	 * Power-up enable status
290*f6db41e0SKamlesh Gurudasani 	 *
291*f6db41e0SKamlesh Gurudasani 	 * Non-zero if the module power-up has been enabled. This tracks
292*f6db41e0SKamlesh Gurudasani 	 * whether the module is currently in a power-up enabled state.
293*f6db41e0SKamlesh Gurudasani 	 */
294*f6db41e0SKamlesh Gurudasani 	uint8_t pwr_up_enabled;
295*f6db41e0SKamlesh Gurudasani 
296*f6db41e0SKamlesh Gurudasani 	/*
297*f6db41e0SKamlesh Gurudasani 	 * Power-up retention status
298*f6db41e0SKamlesh Gurudasani 	 *
299*f6db41e0SKamlesh Gurudasani 	 * Non-zero if the module is in power-up retention mode. This allows
300*f6db41e0SKamlesh Gurudasani 	 * the module to maintain state while in a low-power configuration.
301*f6db41e0SKamlesh Gurudasani 	 */
302*f6db41e0SKamlesh Gurudasani 	uint8_t pwr_up_ret;
303*f6db41e0SKamlesh Gurudasani 
304*f6db41e0SKamlesh Gurudasani 	/*
305*f6db41e0SKamlesh Gurudasani 	 * Module reset active flag
306*f6db41e0SKamlesh Gurudasani 	 *
307*f6db41e0SKamlesh Gurudasani 	 * True if host has requested a module reset. This indicates that
308*f6db41e0SKamlesh Gurudasani 	 * a reset operation is currently active or pending for this module.
309*f6db41e0SKamlesh Gurudasani 	 */
310*f6db41e0SKamlesh Gurudasani 	uint8_t mrst_active;
311*f6db41e0SKamlesh Gurudasani };
312*f6db41e0SKamlesh Gurudasani 
313*f6db41e0SKamlesh Gurudasani /*
314*f6db41e0SKamlesh Gurudasani  * PSC driver operations structure
315*f6db41e0SKamlesh Gurudasani  *
316*f6db41e0SKamlesh Gurudasani  * Global constant structure containing the PSC driver operations and
317*f6db41e0SKamlesh Gurudasani  * callbacks. This structure implements the ti_drv interface for PSC
318*f6db41e0SKamlesh Gurudasani  * devices and is used by the device management framework to interact
319*f6db41e0SKamlesh Gurudasani  * with PSC hardware.
320*f6db41e0SKamlesh Gurudasani  */
321*f6db41e0SKamlesh Gurudasani extern const struct ti_drv psc_drv;
322*f6db41e0SKamlesh Gurudasani 
323*f6db41e0SKamlesh Gurudasani struct ti_soc_device_data;
324*f6db41e0SKamlesh Gurudasani 
325*f6db41e0SKamlesh Gurudasani /*
326*f6db41e0SKamlesh Gurudasani  * Array of devices controlled by multiple PSC modules
327*f6db41e0SKamlesh Gurudasani  *
328*f6db41e0SKamlesh Gurudasani  * Global constant array containing pointers to device data structures for
329*f6db41e0SKamlesh Gurudasani  * devices that are controlled by multiple PSC modules. This allows the
330*f6db41e0SKamlesh Gurudasani  * system to handle complex device-to-PSC mappings where a single device
331*f6db41e0SKamlesh Gurudasani  * may require coordination across multiple PSC modules. The array is
332*f6db41e0SKamlesh Gurudasani  * terminated by a NULL pointer.
333*f6db41e0SKamlesh Gurudasani  */
334*f6db41e0SKamlesh Gurudasani extern const struct ti_soc_device_data *const soc_psc_multiple_domains[];
335*f6db41e0SKamlesh Gurudasani 
336*f6db41e0SKamlesh Gurudasani /*
337*f6db41e0SKamlesh Gurudasani  * Get the index of a power domain within its PSC
338*f6db41e0SKamlesh Gurudasani  *
339*f6db41e0SKamlesh Gurudasani  * Calculates the power domain index by determining the offset of the
340*f6db41e0SKamlesh Gurudasani  * power domain structure within the PSC's power domain array.
341*f6db41e0SKamlesh Gurudasani  */
342*f6db41e0SKamlesh Gurudasani ti_pd_idx_t ti_psc_pd_idx(struct ti_device *psc_dev, const struct ti_psc_pd *pd);
343*f6db41e0SKamlesh Gurudasani 
344*f6db41e0SKamlesh Gurudasani /**
345*f6db41e0SKamlesh Gurudasani  * ti_psc_pd_wait() - Wait for a power domain transition to complete
346*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this power domain.
347*f6db41e0SKamlesh Gurudasani  * @pd: Pointer to the power domain to wait for.
348*f6db41e0SKamlesh Gurudasani  *
349*f6db41e0SKamlesh Gurudasani  * Polls the hardware status registers until the power domain transition
350*f6db41e0SKamlesh Gurudasani  * completes. This function blocks until the power domain reaches its
351*f6db41e0SKamlesh Gurudasani  * target state.
352*f6db41e0SKamlesh Gurudasani  */
353*f6db41e0SKamlesh Gurudasani void ti_psc_pd_wait(struct ti_device *psc_dev, struct ti_psc_pd *pd);
354*f6db41e0SKamlesh Gurudasani 
355*f6db41e0SKamlesh Gurudasani /**
356*f6db41e0SKamlesh Gurudasani  * ti_psc_pd_get() - Increment power domain reference count and enable if needed
357*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this power domain.
358*f6db41e0SKamlesh Gurudasani  * @pd: Pointer to the power domain to enable.
359*f6db41e0SKamlesh Gurudasani  *
360*f6db41e0SKamlesh Gurudasani  * Increments the use_count for the power domain and powers it up if this
361*f6db41e0SKamlesh Gurudasani  * is the first reference. Also handles dependency power domains recursively.
362*f6db41e0SKamlesh Gurudasani  */
363*f6db41e0SKamlesh Gurudasani void ti_psc_pd_get(struct ti_device *psc_dev, struct ti_psc_pd *pd);
364*f6db41e0SKamlesh Gurudasani 
365*f6db41e0SKamlesh Gurudasani /**
366*f6db41e0SKamlesh Gurudasani  * ti_psc_pd_put() - Decrement power domain reference count and disable if unused
367*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this power domain.
368*f6db41e0SKamlesh Gurudasani  * @pd: Pointer to the power domain to potentially disable.
369*f6db41e0SKamlesh Gurudasani  *
370*f6db41e0SKamlesh Gurudasani  * Decrements the use_count for the power domain and powers it down if
371*f6db41e0SKamlesh Gurudasani  * the count reaches zero. Also handles dependency power domains recursively.
372*f6db41e0SKamlesh Gurudasani  */
373*f6db41e0SKamlesh Gurudasani void ti_psc_pd_put(struct ti_device *psc_dev, struct ti_psc_pd *pd);
374*f6db41e0SKamlesh Gurudasani 
375*f6db41e0SKamlesh Gurudasani /*
376*f6db41e0SKamlesh Gurudasani  * Get the index of an LPSC module within its PSC
377*f6db41e0SKamlesh Gurudasani  *
378*f6db41e0SKamlesh Gurudasani  * Calculates the LPSC module index by determining the offset of the
379*f6db41e0SKamlesh Gurudasani  * module structure within the PSC's module array.
380*f6db41e0SKamlesh Gurudasani  */
381*f6db41e0SKamlesh Gurudasani ti_lpsc_idx_t ti_lpsc_module_idx(struct ti_device *psc_dev, const struct ti_lpsc_module *module);
382*f6db41e0SKamlesh Gurudasani 
383*f6db41e0SKamlesh Gurudasani /**
384*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_get() - Increment LPSC module active reference count and enable
385*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
386*f6db41e0SKamlesh Gurudasani  * @module: Pointer to the LPSC module to enable.
387*f6db41e0SKamlesh Gurudasani  *
388*f6db41e0SKamlesh Gurudasani  * Increments the use_count for the module and enables it (clocks running)
389*f6db41e0SKamlesh Gurudasani  * if this is the first reference. Also handles power domain and dependency
390*f6db41e0SKamlesh Gurudasani  * modules recursively. The module will be fully powered and clocked.
391*f6db41e0SKamlesh Gurudasani  */
392*f6db41e0SKamlesh Gurudasani void ti_lpsc_module_get(struct ti_device *psc_dev, struct ti_lpsc_module *module);
393*f6db41e0SKamlesh Gurudasani 
394*f6db41e0SKamlesh Gurudasani /**
395*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_put() - Decrement LPSC module active reference count and disable if unused
396*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
397*f6db41e0SKamlesh Gurudasani  * @module: Pointer to the LPSC module to potentially disable.
398*f6db41e0SKamlesh Gurudasani  *
399*f6db41e0SKamlesh Gurudasani  * Decrements the use_count for the module. If the count reaches zero and
400*f6db41e0SKamlesh Gurudasani  * ret_count is also zero, the module is disabled. Also handles power domain
401*f6db41e0SKamlesh Gurudasani  * and dependency modules recursively.
402*f6db41e0SKamlesh Gurudasani  */
403*f6db41e0SKamlesh Gurudasani void ti_lpsc_module_put(struct ti_device *psc_dev, struct ti_lpsc_module *module);
404*f6db41e0SKamlesh Gurudasani 
405*f6db41e0SKamlesh Gurudasani /**
406*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_ret_get() - Increment LPSC module retention reference count
407*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
408*f6db41e0SKamlesh Gurudasani  * @module: Pointer to the LPSC module to put in retention mode.
409*f6db41e0SKamlesh Gurudasani  *
410*f6db41e0SKamlesh Gurudasani  * Increments the ret_count for the module, ensuring it remains powered
411*f6db41e0SKamlesh Gurudasani  * but allowing clock gating. The module retains its state while saving
412*f6db41e0SKamlesh Gurudasani  * power. Also handles power domain and dependency modules recursively.
413*f6db41e0SKamlesh Gurudasani  */
414*f6db41e0SKamlesh Gurudasani void ti_lpsc_module_ret_get(struct ti_device *psc_dev, struct ti_lpsc_module *module);
415*f6db41e0SKamlesh Gurudasani 
416*f6db41e0SKamlesh Gurudasani /**
417*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_ret_put() - Decrement LPSC module retention reference count
418*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
419*f6db41e0SKamlesh Gurudasani  * @module: Pointer to the LPSC module to release from retention mode.
420*f6db41e0SKamlesh Gurudasani  *
421*f6db41e0SKamlesh Gurudasani  * Decrements the ret_count for the module. If both ret_count and use_count
422*f6db41e0SKamlesh Gurudasani  * reach zero, the module can be fully disabled. Also handles power domain
423*f6db41e0SKamlesh Gurudasani  * and dependency modules recursively.
424*f6db41e0SKamlesh Gurudasani  */
425*f6db41e0SKamlesh Gurudasani void ti_lpsc_module_ret_put(struct ti_device *psc_dev, struct ti_lpsc_module *module);
426*f6db41e0SKamlesh Gurudasani 
427*f6db41e0SKamlesh Gurudasani /**
428*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_wait() - Wait for an LPSC module transition to complete
429*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
430*f6db41e0SKamlesh Gurudasani  * @module: Pointer to the LPSC module to wait for.
431*f6db41e0SKamlesh Gurudasani  *
432*f6db41e0SKamlesh Gurudasani  * Polls the hardware status registers until the module transition completes.
433*f6db41e0SKamlesh Gurudasani  * This function blocks until the module reaches its target state.
434*f6db41e0SKamlesh Gurudasani  */
435*f6db41e0SKamlesh Gurudasani void ti_lpsc_module_wait(struct ti_device *psc_dev, struct ti_lpsc_module *module);
436*f6db41e0SKamlesh Gurudasani 
437*f6db41e0SKamlesh Gurudasani /**
438*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_set_reset_iso() - Set the reset isolation flag for a PSC module
439*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
440*f6db41e0SKamlesh Gurudasani  * @module: The PSC module to modify.
441*f6db41e0SKamlesh Gurudasani  * @enable: True to enable reset isolation, false to disable.
442*f6db41e0SKamlesh Gurudasani  *
443*f6db41e0SKamlesh Gurudasani  * This directly modifies the hardware state.
444*f6db41e0SKamlesh Gurudasani  */
445*f6db41e0SKamlesh Gurudasani void ti_lpsc_module_set_reset_iso(struct ti_device *psc_dev,
446*f6db41e0SKamlesh Gurudasani 				  struct ti_lpsc_module *module, bool enable);
447*f6db41e0SKamlesh Gurudasani 
448*f6db41e0SKamlesh Gurudasani /**
449*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_get_reset_iso() - Get the reset isolation setting from a PSC module.
450*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
451*f6db41e0SKamlesh Gurudasani  * @module: The PSC module to query.
452*f6db41e0SKamlesh Gurudasani  *
453*f6db41e0SKamlesh Gurudasani  * This queries the true hardware state.
454*f6db41e0SKamlesh Gurudasani  *
455*f6db41e0SKamlesh Gurudasani  * Return: True if reset isolation is enabled for this module, false if otherwise.
456*f6db41e0SKamlesh Gurudasani  */
457*f6db41e0SKamlesh Gurudasani bool ti_lpsc_module_get_reset_iso(struct ti_device *psc_dev,
458*f6db41e0SKamlesh Gurudasani 				  struct ti_lpsc_module *module);
459*f6db41e0SKamlesh Gurudasani 
460*f6db41e0SKamlesh Gurudasani /**
461*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_set_local_reset() - Set/clear the local reset state of a PSC module
462*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
463*f6db41e0SKamlesh Gurudasani  * @module: The PSC module to modify.
464*f6db41e0SKamlesh Gurudasani  * @enable: True to enable local reset, false to release local reset.
465*f6db41e0SKamlesh Gurudasani  *
466*f6db41e0SKamlesh Gurudasani  * The function of the local reset is module specific and only available on
467*f6db41e0SKamlesh Gurudasani  * certain modules. The most common use is to hold processors (such as the ICSS
468*f6db41e0SKamlesh Gurudasani  * or DSP) in reset.
469*f6db41e0SKamlesh Gurudasani  */
470*f6db41e0SKamlesh Gurudasani void ti_lpsc_module_set_local_reset(struct ti_device *psc_dev,
471*f6db41e0SKamlesh Gurudasani 				    struct ti_lpsc_module *module, bool enable);
472*f6db41e0SKamlesh Gurudasani 
473*f6db41e0SKamlesh Gurudasani /**
474*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_set_module_reset() - Set/clear the module reset state of a PSC module
475*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
476*f6db41e0SKamlesh Gurudasani  * @module: The PSC module to modify.
477*f6db41e0SKamlesh Gurudasani  * @enable: True to enable module reset, false to release module reset.
478*f6db41e0SKamlesh Gurudasani  *
479*f6db41e0SKamlesh Gurudasani  * The function of the module reset is module specific and only available on
480*f6db41e0SKamlesh Gurudasani  * certain modules.
481*f6db41e0SKamlesh Gurudasani  */
482*f6db41e0SKamlesh Gurudasani void ti_lpsc_module_set_module_reset(struct ti_device *psc_dev,
483*f6db41e0SKamlesh Gurudasani 				     struct ti_lpsc_module *module, bool enable);
484*f6db41e0SKamlesh Gurudasani 
485*f6db41e0SKamlesh Gurudasani /**
486*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_get_local_reset() - Get the local reset state from a PSC module.
487*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
488*f6db41e0SKamlesh Gurudasani  * @module: The PSC module to query.
489*f6db41e0SKamlesh Gurudasani  *
490*f6db41e0SKamlesh Gurudasani  * This queries the true hardware state.
491*f6db41e0SKamlesh Gurudasani  *
492*f6db41e0SKamlesh Gurudasani  * Return: True if local reset is asserted for this module, false if otherwise.
493*f6db41e0SKamlesh Gurudasani  */
494*f6db41e0SKamlesh Gurudasani bool ti_lpsc_module_get_local_reset(struct ti_device *psc_dev,
495*f6db41e0SKamlesh Gurudasani 				    struct ti_lpsc_module *module);
496*f6db41e0SKamlesh Gurudasani 
497*f6db41e0SKamlesh Gurudasani /**
498*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_get_module_reset() - Get the module reset state from a PSC module.
499*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
500*f6db41e0SKamlesh Gurudasani  * @module: The PSC module to query.
501*f6db41e0SKamlesh Gurudasani  *
502*f6db41e0SKamlesh Gurudasani  * This queries the true hardware state.
503*f6db41e0SKamlesh Gurudasani  *
504*f6db41e0SKamlesh Gurudasani  * Return: True if module reset is asserted for this module, false if otherwise.
505*f6db41e0SKamlesh Gurudasani  */
506*f6db41e0SKamlesh Gurudasani bool ti_lpsc_module_get_module_reset(struct ti_device *psc_dev,
507*f6db41e0SKamlesh Gurudasani 				     const struct ti_lpsc_module *module);
508*f6db41e0SKamlesh Gurudasani 
509*f6db41e0SKamlesh Gurudasani /**
510*f6db41e0SKamlesh Gurudasani  * ti_lpsc_module_get_state() - Get the module state from a PSC module.
511*f6db41e0SKamlesh Gurudasani  * @psc_dev: The PSC device that controls this module.
512*f6db41e0SKamlesh Gurudasani  * @module: The PSC module to query.
513*f6db41e0SKamlesh Gurudasani  *
514*f6db41e0SKamlesh Gurudasani  * This queries the true hardware state.
515*f6db41e0SKamlesh Gurudasani  *
516*f6db41e0SKamlesh Gurudasani  * Return: 0 for a disabled module, 1 for an enabled module, 2 for a module in transition.
517*f6db41e0SKamlesh Gurudasani  */
518*f6db41e0SKamlesh Gurudasani uint32_t ti_lpsc_module_get_state(struct ti_device *psc_dev,
519*f6db41e0SKamlesh Gurudasani 				  struct ti_lpsc_module *module);
520*f6db41e0SKamlesh Gurudasani 
521*f6db41e0SKamlesh Gurudasani /*
522*f6db41e0SKamlesh Gurudasani  * Look up a PSC device by its index
523*f6db41e0SKamlesh Gurudasani  *
524*f6db41e0SKamlesh Gurudasani  * Searches the system for the PSC device with the specified index.
525*f6db41e0SKamlesh Gurudasani  * This function is used to obtain a reference to a PSC device for
526*f6db41e0SKamlesh Gurudasani  * subsequent operations.
527*f6db41e0SKamlesh Gurudasani  */
528*f6db41e0SKamlesh Gurudasani struct ti_device *ti_psc_lookup(ti_psc_idx_t id);
529*f6db41e0SKamlesh Gurudasani 
530*f6db41e0SKamlesh Gurudasani /*
531*f6db41e0SKamlesh Gurudasani  * Look up a power domain within a PSC device
532*f6db41e0SKamlesh Gurudasani  *
533*f6db41e0SKamlesh Gurudasani  * Returns a pointer to the power domain structure for the specified
534*f6db41e0SKamlesh Gurudasani  * power domain index within the given PSC device.
535*f6db41e0SKamlesh Gurudasani  */
536*f6db41e0SKamlesh Gurudasani struct ti_psc_pd *ti_psc_lookup_pd(struct ti_device *psc_dev, ti_pd_idx_t id);
537*f6db41e0SKamlesh Gurudasani 
538*f6db41e0SKamlesh Gurudasani /*
539*f6db41e0SKamlesh Gurudasani  * Look up an LPSC module within a PSC device
540*f6db41e0SKamlesh Gurudasani  *
541*f6db41e0SKamlesh Gurudasani  * Returns a pointer to the LPSC module structure for the specified
542*f6db41e0SKamlesh Gurudasani  * module index within the given PSC device.
543*f6db41e0SKamlesh Gurudasani  */
544*f6db41e0SKamlesh Gurudasani struct ti_lpsc_module *ti_psc_lookup_lpsc(struct ti_device *psc_dev, ti_lpsc_idx_t id);
545*f6db41e0SKamlesh Gurudasani 
546*f6db41e0SKamlesh Gurudasani /**
547*f6db41e0SKamlesh Gurudasani  * ti_psc_drop_pwr_up_ref() - Drop all power-up references across all PSC modules and domains
548*f6db41e0SKamlesh Gurudasani  *
549*f6db41e0SKamlesh Gurudasani  * Clears the pwr_up_enabled flags for all power domains and modules across
550*f6db41e0SKamlesh Gurudasani  * all PSC devices in the system. This is typically called during system
551*f6db41e0SKamlesh Gurudasani  * shutdown or when transitioning to a low-power state to release all
552*f6db41e0SKamlesh Gurudasani  * power-up references and allow the system to power down completely.
553*f6db41e0SKamlesh Gurudasani  */
554*f6db41e0SKamlesh Gurudasani void ti_psc_drop_pwr_up_ref(void);
555*f6db41e0SKamlesh Gurudasani 
556*f6db41e0SKamlesh Gurudasani /*
557*f6db41e0SKamlesh Gurudasani  * PSC device dynamic runtime data
558*f6db41e0SKamlesh Gurudasani  *
559*f6db41e0SKamlesh Gurudasani  * This structure contains the runtime state information for a PSC device,
560*f6db41e0SKamlesh Gurudasani  * including tracking of enabled power domains and modules. This data
561*f6db41e0SKamlesh Gurudasani  * changes during system operation as power domains and modules are
562*f6db41e0SKamlesh Gurudasani  * enabled and disabled.
563*f6db41e0SKamlesh Gurudasani  */
564*f6db41e0SKamlesh Gurudasani struct ti_psc_data {
565*f6db41e0SKamlesh Gurudasani 	/*
566*f6db41e0SKamlesh Gurudasani 	 * Linked list pointer to next PSC device
567*f6db41e0SKamlesh Gurudasani 	 *
568*f6db41e0SKamlesh Gurudasani 	 * Used to maintain a linked list of all PSC devices in the system.
569*f6db41e0SKamlesh Gurudasani 	 * NULL indicates the end of the list.
570*f6db41e0SKamlesh Gurudasani 	 */
571*f6db41e0SKamlesh Gurudasani 	struct ti_device *next;
572*f6db41e0SKamlesh Gurudasani 
573*f6db41e0SKamlesh Gurudasani 	/*
574*f6db41e0SKamlesh Gurudasani 	 * Bit field of currently enabled power domains
575*f6db41e0SKamlesh Gurudasani 	 *
576*f6db41e0SKamlesh Gurudasani 	 * Each bit represents a power domain within this PSC. A set bit
577*f6db41e0SKamlesh Gurudasani 	 * indicates the power domain is currently enabled. Bit position
578*f6db41e0SKamlesh Gurudasani 	 * corresponds to the power domain index.
579*f6db41e0SKamlesh Gurudasani 	 */
580*f6db41e0SKamlesh Gurudasani 	uint32_t pds_enabled;
581*f6db41e0SKamlesh Gurudasani };
582*f6db41e0SKamlesh Gurudasani 
583*f6db41e0SKamlesh Gurudasani /*
584*f6db41e0SKamlesh Gurudasani  * PSC driver data structure
585*f6db41e0SKamlesh Gurudasani  *
586*f6db41e0SKamlesh Gurudasani  * This structure contains all the data needed for a PSC driver instance,
587*f6db41e0SKamlesh Gurudasani  * including both constant configuration data and dynamic runtime data for
588*f6db41e0SKamlesh Gurudasani  * power domains and LPSC modules. Each PSC device in the system has an
589*f6db41e0SKamlesh Gurudasani  * associated ti_psc_drv_data structure that defines its complete state
590*f6db41e0SKamlesh Gurudasani  * and configuration.
591*f6db41e0SKamlesh Gurudasani  */
592*f6db41e0SKamlesh Gurudasani struct ti_psc_drv_data {
593*f6db41e0SKamlesh Gurudasani 	/*
594*f6db41e0SKamlesh Gurudasani 	 * Base driver data structure
595*f6db41e0SKamlesh Gurudasani 	 *
596*f6db41e0SKamlesh Gurudasani 	 * Contains common driver data fields required by the device management
597*f6db41e0SKamlesh Gurudasani 	 * framework. This must be the first member to allow casting between
598*f6db41e0SKamlesh Gurudasani 	 * ti_drv_data and ti_psc_drv_data pointers.
599*f6db41e0SKamlesh Gurudasani 	 */
600*f6db41e0SKamlesh Gurudasani 	struct ti_drv_data drv_data;
601*f6db41e0SKamlesh Gurudasani 
602*f6db41e0SKamlesh Gurudasani 	/*
603*f6db41e0SKamlesh Gurudasani 	 * Pointer to dynamic runtime data
604*f6db41e0SKamlesh Gurudasani 	 *
605*f6db41e0SKamlesh Gurudasani 	 * Points to the ti_psc_data structure containing runtime state
606*f6db41e0SKamlesh Gurudasani 	 * information for this PSC device, including enabled power domains
607*f6db41e0SKamlesh Gurudasani 	 * and modules.
608*f6db41e0SKamlesh Gurudasani 	 */
609*f6db41e0SKamlesh Gurudasani 	struct ti_psc_data *data;
610*f6db41e0SKamlesh Gurudasani 
611*f6db41e0SKamlesh Gurudasani 	/*
612*f6db41e0SKamlesh Gurudasani 	 * Pointer to constant power domain data table
613*f6db41e0SKamlesh Gurudasani 	 *
614*f6db41e0SKamlesh Gurudasani 	 * Array of ti_psc_pd_data structures containing the constant
615*f6db41e0SKamlesh Gurudasani 	 * configuration for each power domain in this PSC. The array
616*f6db41e0SKamlesh Gurudasani 	 * has pd_count elements indexed by ti_pd_idx_t.
617*f6db41e0SKamlesh Gurudasani 	 */
618*f6db41e0SKamlesh Gurudasani 	const struct ti_psc_pd_data *pd_data;
619*f6db41e0SKamlesh Gurudasani 
620*f6db41e0SKamlesh Gurudasani 	/*
621*f6db41e0SKamlesh Gurudasani 	 * Pointer to dynamic power domain data table
622*f6db41e0SKamlesh Gurudasani 	 *
623*f6db41e0SKamlesh Gurudasani 	 * Array of ti_psc_pd structures containing the runtime state
624*f6db41e0SKamlesh Gurudasani 	 * for each power domain in this PSC. The array has pd_count
625*f6db41e0SKamlesh Gurudasani 	 * elements indexed by ti_pd_idx_t.
626*f6db41e0SKamlesh Gurudasani 	 */
627*f6db41e0SKamlesh Gurudasani 	struct ti_psc_pd *powerdomains;
628*f6db41e0SKamlesh Gurudasani 
629*f6db41e0SKamlesh Gurudasani 	/*
630*f6db41e0SKamlesh Gurudasani 	 * Pointer to constant LPSC module data table
631*f6db41e0SKamlesh Gurudasani 	 *
632*f6db41e0SKamlesh Gurudasani 	 * Array of ti_lpsc_module_data structures containing the constant
633*f6db41e0SKamlesh Gurudasani 	 * configuration for each LPSC module in this PSC. The array has
634*f6db41e0SKamlesh Gurudasani 	 * module_count elements indexed by ti_lpsc_idx_t.
635*f6db41e0SKamlesh Gurudasani 	 */
636*f6db41e0SKamlesh Gurudasani 	const struct ti_lpsc_module_data *mod_data;
637*f6db41e0SKamlesh Gurudasani 
638*f6db41e0SKamlesh Gurudasani 	/*
639*f6db41e0SKamlesh Gurudasani 	 * Pointer to dynamic LPSC module data table
640*f6db41e0SKamlesh Gurudasani 	 *
641*f6db41e0SKamlesh Gurudasani 	 * Array of ti_lpsc_module structures containing the runtime state
642*f6db41e0SKamlesh Gurudasani 	 * for each LPSC module in this PSC. The array has module_count
643*f6db41e0SKamlesh Gurudasani 	 * elements indexed by ti_lpsc_idx_t.
644*f6db41e0SKamlesh Gurudasani 	 */
645*f6db41e0SKamlesh Gurudasani 	struct ti_lpsc_module *modules;
646*f6db41e0SKamlesh Gurudasani 
647*f6db41e0SKamlesh Gurudasani 	/*
648*f6db41e0SKamlesh Gurudasani 	 * Total number of power domains in this PSC
649*f6db41e0SKamlesh Gurudasani 	 *
650*f6db41e0SKamlesh Gurudasani 	 * Defines the size of the pd_data and powerdomains arrays. Valid
651*f6db41e0SKamlesh Gurudasani 	 * power domain indices range from 0 to (pd_count - 1).
652*f6db41e0SKamlesh Gurudasani 	 */
653*f6db41e0SKamlesh Gurudasani 	ti_pd_idx_t pd_count;
654*f6db41e0SKamlesh Gurudasani 
655*f6db41e0SKamlesh Gurudasani 	/*
656*f6db41e0SKamlesh Gurudasani 	 * Total number of LPSC modules in this PSC
657*f6db41e0SKamlesh Gurudasani 	 *
658*f6db41e0SKamlesh Gurudasani 	 * Defines the size of the mod_data and modules arrays. Valid
659*f6db41e0SKamlesh Gurudasani 	 * LPSC module indices range from 0 to (module_count - 1).
660*f6db41e0SKamlesh Gurudasani 	 */
661*f6db41e0SKamlesh Gurudasani 	ti_lpsc_idx_t module_count;
662*f6db41e0SKamlesh Gurudasani 
663*f6db41e0SKamlesh Gurudasani 	/*
664*f6db41e0SKamlesh Gurudasani 	 * Index of this PSC in the system
665*f6db41e0SKamlesh Gurudasani 	 *
666*f6db41e0SKamlesh Gurudasani 	 * Unique identifier for this PSC device within the system. Used
667*f6db41e0SKamlesh Gurudasani 	 * for PSC lookup operations and cross-PSC dependencies.
668*f6db41e0SKamlesh Gurudasani 	 */
669*f6db41e0SKamlesh Gurudasani 	ti_psc_idx_t psc_idx;
670*f6db41e0SKamlesh Gurudasani 
671*f6db41e0SKamlesh Gurudasani 	/*
672*f6db41e0SKamlesh Gurudasani 	 * Number of supported sleep/power states
673*f6db41e0SKamlesh Gurudasani 	 *
674*f6db41e0SKamlesh Gurudasani 	 * The total number of sleep modes or low-power states that this
675*f6db41e0SKamlesh Gurudasani 	 * PSC supports. Used for power management and system suspend/resume
676*f6db41e0SKamlesh Gurudasani 	 * operations.
677*f6db41e0SKamlesh Gurudasani 	 */
678*f6db41e0SKamlesh Gurudasani 	uint8_t sleep_mode_count;
679*f6db41e0SKamlesh Gurudasani 
680*f6db41e0SKamlesh Gurudasani 	/* PSC register base address */
681*f6db41e0SKamlesh Gurudasani 	uint32_t base;
682*f6db41e0SKamlesh Gurudasani };
683*f6db41e0SKamlesh Gurudasani 
ti_to_psc_drv_data(const struct ti_drv_data * data)684*f6db41e0SKamlesh Gurudasani static inline const struct ti_psc_drv_data *ti_to_psc_drv_data(const struct ti_drv_data *data)
685*f6db41e0SKamlesh Gurudasani {
686*f6db41e0SKamlesh Gurudasani 	return ti_container_of(data, const struct ti_psc_drv_data, drv_data);
687*f6db41e0SKamlesh Gurudasani }
688*f6db41e0SKamlesh Gurudasani 
689*f6db41e0SKamlesh Gurudasani #endif /* TI_PSC_H */
690