xref: /rk3399_ARM-atf/drivers/ti/pd/ti_device_psc.c (revision a28114d66a6d43db4accef5fd5d6dab6c059e584)
1*a1a3a16fSKamlesh Gurudasani /*
2*a1a3a16fSKamlesh Gurudasani  * Copyright (c) 2025-2026 Texas Instruments Incorporated - https://www.ti.com
3*a1a3a16fSKamlesh Gurudasani  *
4*a1a3a16fSKamlesh Gurudasani  * SPDX-License-Identifier: BSD-3-Clause
5*a1a3a16fSKamlesh Gurudasani  */
6*a1a3a16fSKamlesh Gurudasani 
7*a1a3a16fSKamlesh Gurudasani /*
8*a1a3a16fSKamlesh Gurudasani  * Device to PSC Module Mapping
9*a1a3a16fSKamlesh Gurudasani  *
10*a1a3a16fSKamlesh Gurudasani  * This module bridges devices and PSC LPSC modules, providing state queries,
11*a1a3a16fSKamlesh Gurudasani  * reset control, and context loss tracking for device-to-PSC module associations.
12*a1a3a16fSKamlesh Gurudasani  */
13*a1a3a16fSKamlesh Gurudasani 
14*a1a3a16fSKamlesh Gurudasani #include <assert.h>
15*a1a3a16fSKamlesh Gurudasani #include <errno.h>
16*a1a3a16fSKamlesh Gurudasani 
17*a1a3a16fSKamlesh Gurudasani #include <common/debug.h>
18*a1a3a16fSKamlesh Gurudasani #include <ti_device.h>
19*a1a3a16fSKamlesh Gurudasani #include <ti_device_pm.h>
20*a1a3a16fSKamlesh Gurudasani #include <ti_psc.h>
21*a1a3a16fSKamlesh Gurudasani 
22*a1a3a16fSKamlesh Gurudasani /* Sentinel value indicating no LPSC module association */
23*a1a3a16fSKamlesh Gurudasani #define PSC_LPSC_NONE		55U
24*a1a3a16fSKamlesh Gurudasani 
25*a1a3a16fSKamlesh Gurudasani /**
26*a1a3a16fSKamlesh Gurudasani  * ti_soc_device_get_state_internal() - Get the PSC state for a single SoC device domain.
27*a1a3a16fSKamlesh Gurudasani  * @dev: SoC device data identifying the PSC index and LPSC module.
28*a1a3a16fSKamlesh Gurudasani  *
29*a1a3a16fSKamlesh Gurudasani  * Return: The LPSC module state, or 0 if PSC or module is not found.
30*a1a3a16fSKamlesh Gurudasani  */
ti_soc_device_get_state_internal(const struct ti_soc_device_data * dev)31*a1a3a16fSKamlesh Gurudasani static uint32_t ti_soc_device_get_state_internal(const struct ti_soc_device_data *dev)
32*a1a3a16fSKamlesh Gurudasani {
33*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = ti_psc_lookup((ti_psc_idx_t) dev->psc_idx);
34*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module;
35*a1a3a16fSKamlesh Gurudasani 
36*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
37*a1a3a16fSKamlesh Gurudasani 		return 0U;
38*a1a3a16fSKamlesh Gurudasani 	}
39*a1a3a16fSKamlesh Gurudasani 
40*a1a3a16fSKamlesh Gurudasani 	module = ti_psc_lookup_lpsc(psc_dev, dev->mod);
41*a1a3a16fSKamlesh Gurudasani 	if (module == NULL) {
42*a1a3a16fSKamlesh Gurudasani 		return 0U;
43*a1a3a16fSKamlesh Gurudasani 	}
44*a1a3a16fSKamlesh Gurudasani 
45*a1a3a16fSKamlesh Gurudasani 	return ti_lpsc_module_get_state(psc_dev, module);
46*a1a3a16fSKamlesh Gurudasani }
47*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_get_state(struct ti_device * dev)48*a1a3a16fSKamlesh Gurudasani uint32_t ti_soc_device_get_state(struct ti_device *dev)
49*a1a3a16fSKamlesh Gurudasani {
50*a1a3a16fSKamlesh Gurudasani 	const struct ti_soc_device_data *domains;
51*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *data;
52*a1a3a16fSKamlesh Gurudasani 	uint32_t ret = 2U;
53*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
54*a1a3a16fSKamlesh Gurudasani 
55*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
56*a1a3a16fSKamlesh Gurudasani 
57*a1a3a16fSKamlesh Gurudasani 	data = ti_get_dev_data(dev);
58*a1a3a16fSKamlesh Gurudasani 
59*a1a3a16fSKamlesh Gurudasani 	if (data->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
60*a1a3a16fSKamlesh Gurudasani 		domains = soc_psc_multiple_domains[data->soc.mod];
61*a1a3a16fSKamlesh Gurudasani 		for (i = 0U; domains[i].psc_idx != TI_PSC_DEV_NONE; i++) {
62*a1a3a16fSKamlesh Gurudasani 			uint32_t this_ret;
63*a1a3a16fSKamlesh Gurudasani 
64*a1a3a16fSKamlesh Gurudasani 			this_ret = ti_soc_device_get_state_internal(&domains[i]);
65*a1a3a16fSKamlesh Gurudasani 			if (i == 0U) {
66*a1a3a16fSKamlesh Gurudasani 				ret = this_ret;
67*a1a3a16fSKamlesh Gurudasani 			} else if (ret != this_ret) {
68*a1a3a16fSKamlesh Gurudasani 				/* Mixed state of our domains, label as transition */
69*a1a3a16fSKamlesh Gurudasani 				ret = 2U;
70*a1a3a16fSKamlesh Gurudasani 			} else {
71*a1a3a16fSKamlesh Gurudasani 				/* Do Nothing */
72*a1a3a16fSKamlesh Gurudasani 			}
73*a1a3a16fSKamlesh Gurudasani 		}
74*a1a3a16fSKamlesh Gurudasani 	} else {
75*a1a3a16fSKamlesh Gurudasani 		ret = ti_soc_device_get_state_internal(&data->soc);
76*a1a3a16fSKamlesh Gurudasani 	}
77*a1a3a16fSKamlesh Gurudasani 
78*a1a3a16fSKamlesh Gurudasani 	return ret;
79*a1a3a16fSKamlesh Gurudasani }
80*a1a3a16fSKamlesh Gurudasani 
81*a1a3a16fSKamlesh Gurudasani /**
82*a1a3a16fSKamlesh Gurudasani  * ti_soc_device_set_reset_iso_internal() - Set reset isolation for a single SoC device domain.
83*a1a3a16fSKamlesh Gurudasani  * @dev: SoC device data identifying the PSC index and LPSC module.
84*a1a3a16fSKamlesh Gurudasani  * @enable: True to enable reset isolation, false to disable.
85*a1a3a16fSKamlesh Gurudasani  */
ti_soc_device_set_reset_iso_internal(const struct ti_soc_device_data * dev,bool enable)86*a1a3a16fSKamlesh Gurudasani static void ti_soc_device_set_reset_iso_internal(const struct ti_soc_device_data *dev, bool enable)
87*a1a3a16fSKamlesh Gurudasani {
88*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = ti_psc_lookup((ti_psc_idx_t) dev->psc_idx);
89*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module;
90*a1a3a16fSKamlesh Gurudasani 
91*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
92*a1a3a16fSKamlesh Gurudasani 		return;
93*a1a3a16fSKamlesh Gurudasani 	}
94*a1a3a16fSKamlesh Gurudasani 
95*a1a3a16fSKamlesh Gurudasani 	module = ti_psc_lookup_lpsc(psc_dev, dev->mod);
96*a1a3a16fSKamlesh Gurudasani 	if (module == NULL) {
97*a1a3a16fSKamlesh Gurudasani 		return;
98*a1a3a16fSKamlesh Gurudasani 	}
99*a1a3a16fSKamlesh Gurudasani 
100*a1a3a16fSKamlesh Gurudasani 	ti_lpsc_module_set_reset_iso(psc_dev, module, enable);
101*a1a3a16fSKamlesh Gurudasani }
102*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_set_reset_iso(struct ti_device * dev,bool enable)103*a1a3a16fSKamlesh Gurudasani void ti_soc_device_set_reset_iso(struct ti_device *dev, bool enable)
104*a1a3a16fSKamlesh Gurudasani {
105*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *data;
106*a1a3a16fSKamlesh Gurudasani 
107*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
108*a1a3a16fSKamlesh Gurudasani 
109*a1a3a16fSKamlesh Gurudasani 	data = ti_get_dev_data(dev);
110*a1a3a16fSKamlesh Gurudasani 
111*a1a3a16fSKamlesh Gurudasani 	if (data->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
112*a1a3a16fSKamlesh Gurudasani 		/* Reset ISO not supported for devices with multiple domains */
113*a1a3a16fSKamlesh Gurudasani 	} else {
114*a1a3a16fSKamlesh Gurudasani 		ti_soc_device_set_reset_iso_internal(&data->soc, enable);
115*a1a3a16fSKamlesh Gurudasani 	}
116*a1a3a16fSKamlesh Gurudasani }
117*a1a3a16fSKamlesh Gurudasani 
118*a1a3a16fSKamlesh Gurudasani /**
119*a1a3a16fSKamlesh Gurudasani  * ti_soc_device_get_context_loss_count_internal() - Get context loss count for a device domain.
120*a1a3a16fSKamlesh Gurudasani  * @dev: SoC device data identifying the PSC index and LPSC module.
121*a1a3a16fSKamlesh Gurudasani  *
122*a1a3a16fSKamlesh Gurudasani  * Return: The context loss count for the LPSC module, or 0 if not found.
123*a1a3a16fSKamlesh Gurudasani  */
ti_soc_device_get_context_loss_count_internal(const struct ti_soc_device_data * dev)124*a1a3a16fSKamlesh Gurudasani static uint32_t ti_soc_device_get_context_loss_count_internal(const struct ti_soc_device_data *dev)
125*a1a3a16fSKamlesh Gurudasani {
126*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = ti_psc_lookup((ti_psc_idx_t) dev->psc_idx);
127*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module;
128*a1a3a16fSKamlesh Gurudasani 
129*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
130*a1a3a16fSKamlesh Gurudasani 		return 0U;
131*a1a3a16fSKamlesh Gurudasani 	}
132*a1a3a16fSKamlesh Gurudasani 
133*a1a3a16fSKamlesh Gurudasani 	module = ti_psc_lookup_lpsc(psc_dev, dev->mod);
134*a1a3a16fSKamlesh Gurudasani 	if (module == NULL) {
135*a1a3a16fSKamlesh Gurudasani 		return 0U;
136*a1a3a16fSKamlesh Gurudasani 	}
137*a1a3a16fSKamlesh Gurudasani 
138*a1a3a16fSKamlesh Gurudasani 	return module->loss_count;
139*a1a3a16fSKamlesh Gurudasani }
140*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_get_context_loss_count(struct ti_device * dev)141*a1a3a16fSKamlesh Gurudasani uint32_t ti_soc_device_get_context_loss_count(struct ti_device *dev)
142*a1a3a16fSKamlesh Gurudasani {
143*a1a3a16fSKamlesh Gurudasani 	const struct ti_soc_device_data *domains;
144*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *data;
145*a1a3a16fSKamlesh Gurudasani 	uint32_t ret = 0U;
146*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
147*a1a3a16fSKamlesh Gurudasani 
148*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
149*a1a3a16fSKamlesh Gurudasani 
150*a1a3a16fSKamlesh Gurudasani 	data = ti_get_dev_data(dev);
151*a1a3a16fSKamlesh Gurudasani 
152*a1a3a16fSKamlesh Gurudasani 	if (data->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
153*a1a3a16fSKamlesh Gurudasani 		domains = soc_psc_multiple_domains[data->soc.mod];
154*a1a3a16fSKamlesh Gurudasani 		for (i = 0U; domains[i].psc_idx != TI_PSC_DEV_NONE; i++) {
155*a1a3a16fSKamlesh Gurudasani 			ret += ti_soc_device_get_context_loss_count_internal(&domains[i]);
156*a1a3a16fSKamlesh Gurudasani 		}
157*a1a3a16fSKamlesh Gurudasani 	} else {
158*a1a3a16fSKamlesh Gurudasani 		ret = ti_soc_device_get_context_loss_count_internal(&data->soc);
159*a1a3a16fSKamlesh Gurudasani 	}
160*a1a3a16fSKamlesh Gurudasani 
161*a1a3a16fSKamlesh Gurudasani 	return ret;
162*a1a3a16fSKamlesh Gurudasani }
163*a1a3a16fSKamlesh Gurudasani 
164*a1a3a16fSKamlesh Gurudasani /**
165*a1a3a16fSKamlesh Gurudasani  * ti_soc_device_enable_internal() - Enable the PSC LPSC module for a single SoC device domain.
166*a1a3a16fSKamlesh Gurudasani  * @dev: SoC device data identifying the PSC index and LPSC module.
167*a1a3a16fSKamlesh Gurudasani  */
ti_soc_device_enable_internal(const struct ti_soc_device_data * dev)168*a1a3a16fSKamlesh Gurudasani static void ti_soc_device_enable_internal(const struct ti_soc_device_data *dev)
169*a1a3a16fSKamlesh Gurudasani {
170*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = ti_psc_lookup((ti_psc_idx_t) dev->psc_idx);
171*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module;
172*a1a3a16fSKamlesh Gurudasani 
173*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
174*a1a3a16fSKamlesh Gurudasani 		return;
175*a1a3a16fSKamlesh Gurudasani 	}
176*a1a3a16fSKamlesh Gurudasani 
177*a1a3a16fSKamlesh Gurudasani 	module = ti_psc_lookup_lpsc(psc_dev, dev->mod);
178*a1a3a16fSKamlesh Gurudasani 	if (module == NULL) {
179*a1a3a16fSKamlesh Gurudasani 		return;
180*a1a3a16fSKamlesh Gurudasani 	}
181*a1a3a16fSKamlesh Gurudasani 
182*a1a3a16fSKamlesh Gurudasani 	ti_lpsc_module_get(psc_dev, module);
183*a1a3a16fSKamlesh Gurudasani }
184*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_enable(struct ti_device * dev)185*a1a3a16fSKamlesh Gurudasani void ti_soc_device_enable(struct ti_device *dev)
186*a1a3a16fSKamlesh Gurudasani {
187*a1a3a16fSKamlesh Gurudasani 	const struct ti_soc_device_data *domains;
188*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *data;
189*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
190*a1a3a16fSKamlesh Gurudasani 
191*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
192*a1a3a16fSKamlesh Gurudasani 
193*a1a3a16fSKamlesh Gurudasani 	data = ti_get_dev_data(dev);
194*a1a3a16fSKamlesh Gurudasani 
195*a1a3a16fSKamlesh Gurudasani 	VERBOSE("DEVICE_ON: dev_id=%u\n", ti_device_id(dev));
196*a1a3a16fSKamlesh Gurudasani 
197*a1a3a16fSKamlesh Gurudasani 	if (data->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
198*a1a3a16fSKamlesh Gurudasani 		domains = soc_psc_multiple_domains[data->soc.mod];
199*a1a3a16fSKamlesh Gurudasani 		for (i = 0U; domains[i].psc_idx != TI_PSC_DEV_NONE; i++) {
200*a1a3a16fSKamlesh Gurudasani 			ti_soc_device_enable_internal(&domains[i]);
201*a1a3a16fSKamlesh Gurudasani 		}
202*a1a3a16fSKamlesh Gurudasani 	} else {
203*a1a3a16fSKamlesh Gurudasani 		ti_soc_device_enable_internal(&data->soc);
204*a1a3a16fSKamlesh Gurudasani 	}
205*a1a3a16fSKamlesh Gurudasani }
206*a1a3a16fSKamlesh Gurudasani 
207*a1a3a16fSKamlesh Gurudasani /**
208*a1a3a16fSKamlesh Gurudasani  * ti_soc_device_disable_internal() - Disable the PSC LPSC module for a single SoC device domain.
209*a1a3a16fSKamlesh Gurudasani  * @dev: SoC device data identifying the PSC index and LPSC module.
210*a1a3a16fSKamlesh Gurudasani  */
ti_soc_device_disable_internal(const struct ti_soc_device_data * dev)211*a1a3a16fSKamlesh Gurudasani static void ti_soc_device_disable_internal(const struct ti_soc_device_data *dev)
212*a1a3a16fSKamlesh Gurudasani {
213*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = ti_psc_lookup((ti_psc_idx_t) dev->psc_idx);
214*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module;
215*a1a3a16fSKamlesh Gurudasani 
216*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
217*a1a3a16fSKamlesh Gurudasani 		return;
218*a1a3a16fSKamlesh Gurudasani 	}
219*a1a3a16fSKamlesh Gurudasani 
220*a1a3a16fSKamlesh Gurudasani 	module = ti_psc_lookup_lpsc(psc_dev, dev->mod);
221*a1a3a16fSKamlesh Gurudasani 	if (module == NULL) {
222*a1a3a16fSKamlesh Gurudasani 		return;
223*a1a3a16fSKamlesh Gurudasani 	}
224*a1a3a16fSKamlesh Gurudasani 
225*a1a3a16fSKamlesh Gurudasani 	ti_lpsc_module_put(psc_dev, module);
226*a1a3a16fSKamlesh Gurudasani }
227*a1a3a16fSKamlesh Gurudasani 
228*a1a3a16fSKamlesh Gurudasani /**
229*a1a3a16fSKamlesh Gurudasani  * ti_soc_device_disable_internal_flags_iterate() - Clear all PSC initialization flags.
230*a1a3a16fSKamlesh Gurudasani  * @psc_dev: The PSC device whose flags are to be cleared.
231*a1a3a16fSKamlesh Gurudasani  * @module: Entry-point LPSC module (flags cleared here first, then entire PSC reset).
232*a1a3a16fSKamlesh Gurudasani  *
233*a1a3a16fSKamlesh Gurudasani  * Clears initialization flags for every power domain and LPSC module in the
234*a1a3a16fSKamlesh Gurudasani  * PSC referenced by psc_dev. Despite accepting a specific module as the entry
235*a1a3a16fSKamlesh Gurudasani  * point, the implementation resets the entire PSC state intentionally: all
236*a1a3a16fSKamlesh Gurudasani  * LPSCs must be disabled before a power domain can power off. Recurses into
237*a1a3a16fSKamlesh Gurudasani  * any dependency PSC.
238*a1a3a16fSKamlesh Gurudasani  */
ti_soc_device_disable_internal_flags_iterate(struct ti_device * psc_dev,struct ti_lpsc_module * module)239*a1a3a16fSKamlesh Gurudasani static void ti_soc_device_disable_internal_flags_iterate(struct ti_device *psc_dev,
240*a1a3a16fSKamlesh Gurudasani 							 struct ti_lpsc_module *module)
241*a1a3a16fSKamlesh Gurudasani {
242*a1a3a16fSKamlesh Gurudasani 	const struct ti_psc_drv_data *psc = ti_to_psc_drv_data(ti_get_drv_data(psc_dev));
243*a1a3a16fSKamlesh Gurudasani 	const struct ti_lpsc_module_data *data;
244*a1a3a16fSKamlesh Gurudasani 	const struct ti_psc_drv_data *depends_psc;
245*a1a3a16fSKamlesh Gurudasani 	struct ti_device *depends_dev;
246*a1a3a16fSKamlesh Gurudasani 	struct ti_psc_pd *pd;
247*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *temp;
248*a1a3a16fSKamlesh Gurudasani 	uint32_t idx;
249*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module_p = module;
250*a1a3a16fSKamlesh Gurudasani 
251*a1a3a16fSKamlesh Gurudasani 	if (module_p != NULL) {
252*a1a3a16fSKamlesh Gurudasani 		module_p->use_count = 0U;
253*a1a3a16fSKamlesh Gurudasani 		module_p->ret_count = 0U;
254*a1a3a16fSKamlesh Gurudasani 		module_p->pwr_up_enabled = 0U;
255*a1a3a16fSKamlesh Gurudasani 		module_p->pwr_up_ret = 0U;
256*a1a3a16fSKamlesh Gurudasani 		module_p->sw_state = 0U;
257*a1a3a16fSKamlesh Gurudasani 		module_p->loss_count = 0U;
258*a1a3a16fSKamlesh Gurudasani 		module_p->mrst_active = 0U;
259*a1a3a16fSKamlesh Gurudasani 		module_p->sw_mrst_ret = false;
260*a1a3a16fSKamlesh Gurudasani 	}
261*a1a3a16fSKamlesh Gurudasani 
262*a1a3a16fSKamlesh Gurudasani 	if (psc == NULL) {
263*a1a3a16fSKamlesh Gurudasani 		return;
264*a1a3a16fSKamlesh Gurudasani 	}
265*a1a3a16fSKamlesh Gurudasani 
266*a1a3a16fSKamlesh Gurudasani 	for (idx = 0U; idx < psc->pd_count; idx++) {
267*a1a3a16fSKamlesh Gurudasani 		pd = &psc->powerdomains[idx];
268*a1a3a16fSKamlesh Gurudasani 		pd->use_count = 0U;
269*a1a3a16fSKamlesh Gurudasani 		pd->pwr_up_enabled = false;
270*a1a3a16fSKamlesh Gurudasani 	}
271*a1a3a16fSKamlesh Gurudasani 	for (idx = 0U; idx < psc->module_count; idx++) {
272*a1a3a16fSKamlesh Gurudasani 		temp = &psc->modules[idx];
273*a1a3a16fSKamlesh Gurudasani 		temp->use_count = 0U;
274*a1a3a16fSKamlesh Gurudasani 		temp->ret_count = 0U;
275*a1a3a16fSKamlesh Gurudasani 		temp->pwr_up_enabled = 0U;
276*a1a3a16fSKamlesh Gurudasani 		temp->pwr_up_ret = 0U;
277*a1a3a16fSKamlesh Gurudasani 		temp->sw_state = 0U;
278*a1a3a16fSKamlesh Gurudasani 		temp->sw_mrst_ret = false;
279*a1a3a16fSKamlesh Gurudasani 		temp->loss_count = 0U;
280*a1a3a16fSKamlesh Gurudasani 		temp->mrst_active = 0U;
281*a1a3a16fSKamlesh Gurudasani 	}
282*a1a3a16fSKamlesh Gurudasani 
283*a1a3a16fSKamlesh Gurudasani 	psc->data->pds_enabled = 0U;
284*a1a3a16fSKamlesh Gurudasani 	idx = ti_lpsc_module_idx(psc_dev, module_p);
285*a1a3a16fSKamlesh Gurudasani 	data = &psc->mod_data[idx];
286*a1a3a16fSKamlesh Gurudasani 
287*a1a3a16fSKamlesh Gurudasani 	if ((data->flags & TI_LPSC_DEPENDS) != 0U) {
288*a1a3a16fSKamlesh Gurudasani 		depends_dev = ti_psc_lookup((ti_psc_idx_t) data->depends_psc_idx);
289*a1a3a16fSKamlesh Gurudasani 		if (depends_dev != NULL) {
290*a1a3a16fSKamlesh Gurudasani 			depends_psc = ti_to_psc_drv_data(ti_get_drv_data(depends_dev));
291*a1a3a16fSKamlesh Gurudasani 			if ((depends_psc != NULL) && (module_p != NULL)) {
292*a1a3a16fSKamlesh Gurudasani 				module_p = &depends_psc->modules[(ti_lpsc_idx_t) data->depends];
293*a1a3a16fSKamlesh Gurudasani 				ti_soc_device_disable_internal_flags_iterate(depends_dev, module_p);
294*a1a3a16fSKamlesh Gurudasani 			}
295*a1a3a16fSKamlesh Gurudasani 		}
296*a1a3a16fSKamlesh Gurudasani 	}
297*a1a3a16fSKamlesh Gurudasani }
298*a1a3a16fSKamlesh Gurudasani 
299*a1a3a16fSKamlesh Gurudasani /**
300*a1a3a16fSKamlesh Gurudasani  * ti_soc_device_disable_internal_flags() - Clear PSC initialization flags for a device.
301*a1a3a16fSKamlesh Gurudasani  * @dev: SoC device data identifying the PSC and LPSC module.
302*a1a3a16fSKamlesh Gurudasani  *
303*a1a3a16fSKamlesh Gurudasani  * Clears initialization flags for the PSC module associated with the given device.
304*a1a3a16fSKamlesh Gurudasani  */
ti_soc_device_disable_internal_flags(const struct ti_soc_device_data * dev)305*a1a3a16fSKamlesh Gurudasani static void ti_soc_device_disable_internal_flags(const struct ti_soc_device_data *dev)
306*a1a3a16fSKamlesh Gurudasani {
307*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = ti_psc_lookup((ti_psc_idx_t) dev->psc_idx);
308*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module;
309*a1a3a16fSKamlesh Gurudasani 
310*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
311*a1a3a16fSKamlesh Gurudasani 		return;
312*a1a3a16fSKamlesh Gurudasani 	}
313*a1a3a16fSKamlesh Gurudasani 
314*a1a3a16fSKamlesh Gurudasani 	module = ti_psc_lookup_lpsc(psc_dev, dev->mod);
315*a1a3a16fSKamlesh Gurudasani 	ti_soc_device_disable_internal_flags_iterate(psc_dev, module);
316*a1a3a16fSKamlesh Gurudasani }
317*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_disable(struct ti_device * dev,bool domain_reset)318*a1a3a16fSKamlesh Gurudasani void ti_soc_device_disable(struct ti_device *dev, bool domain_reset)
319*a1a3a16fSKamlesh Gurudasani {
320*a1a3a16fSKamlesh Gurudasani 	const struct ti_soc_device_data *domains;
321*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *data;
322*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
323*a1a3a16fSKamlesh Gurudasani 
324*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
325*a1a3a16fSKamlesh Gurudasani 
326*a1a3a16fSKamlesh Gurudasani 	data = ti_get_dev_data(dev);
327*a1a3a16fSKamlesh Gurudasani 
328*a1a3a16fSKamlesh Gurudasani 	VERBOSE("DEVICE_OFF: dev_id=%u\n", ti_device_id(dev));
329*a1a3a16fSKamlesh Gurudasani 
330*a1a3a16fSKamlesh Gurudasani 	if (domain_reset == false) {
331*a1a3a16fSKamlesh Gurudasani 		if (data->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
332*a1a3a16fSKamlesh Gurudasani 			domains = soc_psc_multiple_domains[data->soc.mod];
333*a1a3a16fSKamlesh Gurudasani 			for (i = 0U; domains[i].psc_idx != TI_PSC_DEV_NONE; i++) {
334*a1a3a16fSKamlesh Gurudasani 				ti_soc_device_disable_internal(&domains[i]);
335*a1a3a16fSKamlesh Gurudasani 			}
336*a1a3a16fSKamlesh Gurudasani 		} else {
337*a1a3a16fSKamlesh Gurudasani 			ti_soc_device_disable_internal(&data->soc);
338*a1a3a16fSKamlesh Gurudasani 		}
339*a1a3a16fSKamlesh Gurudasani 	}
340*a1a3a16fSKamlesh Gurudasani }
341*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_clear_flags(struct ti_device * dev)342*a1a3a16fSKamlesh Gurudasani void ti_soc_device_clear_flags(struct ti_device *dev)
343*a1a3a16fSKamlesh Gurudasani {
344*a1a3a16fSKamlesh Gurudasani 	const struct ti_soc_device_data *domains;
345*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *data;
346*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
347*a1a3a16fSKamlesh Gurudasani 
348*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
349*a1a3a16fSKamlesh Gurudasani 
350*a1a3a16fSKamlesh Gurudasani 	data = ti_get_dev_data(dev);
351*a1a3a16fSKamlesh Gurudasani 
352*a1a3a16fSKamlesh Gurudasani 	VERBOSE("CLEAR_FLAGS: dev_id=%u\n", ti_device_id(dev));
353*a1a3a16fSKamlesh Gurudasani 
354*a1a3a16fSKamlesh Gurudasani 	if (data->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
355*a1a3a16fSKamlesh Gurudasani 		domains = soc_psc_multiple_domains[data->soc.mod];
356*a1a3a16fSKamlesh Gurudasani 		for (i = 0U; domains[i].psc_idx != TI_PSC_DEV_NONE; i++) {
357*a1a3a16fSKamlesh Gurudasani 			ti_soc_device_disable_internal_flags(&domains[i]);
358*a1a3a16fSKamlesh Gurudasani 		}
359*a1a3a16fSKamlesh Gurudasani 	} else {
360*a1a3a16fSKamlesh Gurudasani 		ti_soc_device_disable_internal_flags(&data->soc);
361*a1a3a16fSKamlesh Gurudasani 	}
362*a1a3a16fSKamlesh Gurudasani }
363*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_ret_enable_internal(const struct ti_soc_device_data * dev)364*a1a3a16fSKamlesh Gurudasani static void ti_soc_device_ret_enable_internal(const struct ti_soc_device_data *dev)
365*a1a3a16fSKamlesh Gurudasani {
366*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = ti_psc_lookup((ti_psc_idx_t) dev->psc_idx);
367*a1a3a16fSKamlesh Gurudasani 	struct ti_psc_pd *pd;
368*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module;
369*a1a3a16fSKamlesh Gurudasani 
370*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
371*a1a3a16fSKamlesh Gurudasani 		return;
372*a1a3a16fSKamlesh Gurudasani 	}
373*a1a3a16fSKamlesh Gurudasani 
374*a1a3a16fSKamlesh Gurudasani 	pd = ti_psc_lookup_pd(psc_dev, (ti_pd_idx_t) dev->pd);
375*a1a3a16fSKamlesh Gurudasani 	if (pd != NULL) {
376*a1a3a16fSKamlesh Gurudasani 		ti_psc_pd_get(psc_dev, pd);
377*a1a3a16fSKamlesh Gurudasani 	}
378*a1a3a16fSKamlesh Gurudasani 
379*a1a3a16fSKamlesh Gurudasani 	module = ti_psc_lookup_lpsc(psc_dev, dev->mod);
380*a1a3a16fSKamlesh Gurudasani 	if (module != NULL) {
381*a1a3a16fSKamlesh Gurudasani 		ti_lpsc_module_ret_get(psc_dev, module);
382*a1a3a16fSKamlesh Gurudasani 	}
383*a1a3a16fSKamlesh Gurudasani }
384*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_ret_enable(struct ti_device * dev)385*a1a3a16fSKamlesh Gurudasani void ti_soc_device_ret_enable(struct ti_device *dev)
386*a1a3a16fSKamlesh Gurudasani {
387*a1a3a16fSKamlesh Gurudasani 	const struct ti_soc_device_data *domains;
388*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *data;
389*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
390*a1a3a16fSKamlesh Gurudasani 
391*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
392*a1a3a16fSKamlesh Gurudasani 
393*a1a3a16fSKamlesh Gurudasani 	data = ti_get_dev_data(dev);
394*a1a3a16fSKamlesh Gurudasani 
395*a1a3a16fSKamlesh Gurudasani 	if (data->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
396*a1a3a16fSKamlesh Gurudasani 		domains = soc_psc_multiple_domains[data->soc.mod];
397*a1a3a16fSKamlesh Gurudasani 		for (i = 0U; domains[i].psc_idx != TI_PSC_DEV_NONE; i++) {
398*a1a3a16fSKamlesh Gurudasani 			ti_soc_device_ret_enable_internal(&domains[i]);
399*a1a3a16fSKamlesh Gurudasani 		}
400*a1a3a16fSKamlesh Gurudasani 	} else {
401*a1a3a16fSKamlesh Gurudasani 		ti_soc_device_ret_enable_internal(&data->soc);
402*a1a3a16fSKamlesh Gurudasani 	}
403*a1a3a16fSKamlesh Gurudasani }
404*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_ret_disable_internal(const struct ti_soc_device_data * dev)405*a1a3a16fSKamlesh Gurudasani static void ti_soc_device_ret_disable_internal(const struct ti_soc_device_data *dev)
406*a1a3a16fSKamlesh Gurudasani {
407*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = ti_psc_lookup((ti_psc_idx_t) dev->psc_idx);
408*a1a3a16fSKamlesh Gurudasani 	struct ti_lpsc_module *module;
409*a1a3a16fSKamlesh Gurudasani 	struct ti_psc_pd *pd;
410*a1a3a16fSKamlesh Gurudasani 
411*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
412*a1a3a16fSKamlesh Gurudasani 		return;
413*a1a3a16fSKamlesh Gurudasani 	}
414*a1a3a16fSKamlesh Gurudasani 
415*a1a3a16fSKamlesh Gurudasani 	module = ti_psc_lookup_lpsc(psc_dev, dev->mod);
416*a1a3a16fSKamlesh Gurudasani 	if (module != NULL) {
417*a1a3a16fSKamlesh Gurudasani 		ti_lpsc_module_ret_put(psc_dev, module);
418*a1a3a16fSKamlesh Gurudasani 	}
419*a1a3a16fSKamlesh Gurudasani 
420*a1a3a16fSKamlesh Gurudasani 	pd = ti_psc_lookup_pd(psc_dev, (ti_pd_idx_t) dev->pd);
421*a1a3a16fSKamlesh Gurudasani 	if (pd != NULL) {
422*a1a3a16fSKamlesh Gurudasani 		ti_psc_pd_put(psc_dev, pd);
423*a1a3a16fSKamlesh Gurudasani 	}
424*a1a3a16fSKamlesh Gurudasani }
425*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_ret_disable(struct ti_device * dev)426*a1a3a16fSKamlesh Gurudasani void ti_soc_device_ret_disable(struct ti_device *dev)
427*a1a3a16fSKamlesh Gurudasani {
428*a1a3a16fSKamlesh Gurudasani 	const struct ti_soc_device_data *domains;
429*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *data;
430*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
431*a1a3a16fSKamlesh Gurudasani 
432*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
433*a1a3a16fSKamlesh Gurudasani 
434*a1a3a16fSKamlesh Gurudasani 	data = ti_get_dev_data(dev);
435*a1a3a16fSKamlesh Gurudasani 
436*a1a3a16fSKamlesh Gurudasani 	if (data->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
437*a1a3a16fSKamlesh Gurudasani 		domains = soc_psc_multiple_domains[data->soc.mod];
438*a1a3a16fSKamlesh Gurudasani 		for (i = 0U; domains[i].psc_idx != TI_PSC_DEV_NONE; i++) {
439*a1a3a16fSKamlesh Gurudasani 			ti_soc_device_ret_disable_internal(&domains[i]);
440*a1a3a16fSKamlesh Gurudasani 		}
441*a1a3a16fSKamlesh Gurudasani 	} else {
442*a1a3a16fSKamlesh Gurudasani 		ti_soc_device_ret_disable_internal(&data->soc);
443*a1a3a16fSKamlesh Gurudasani 	}
444*a1a3a16fSKamlesh Gurudasani }
445*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_init_complete(void)446*a1a3a16fSKamlesh Gurudasani void ti_soc_device_init_complete(void)
447*a1a3a16fSKamlesh Gurudasani {
448*a1a3a16fSKamlesh Gurudasani 	ti_psc_drop_pwr_up_ref();
449*a1a3a16fSKamlesh Gurudasani }
450*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_verify_mapping(const struct ti_psc_drv_data * psc,uint32_t dev_id,const struct ti_soc_device_data * dev)451*a1a3a16fSKamlesh Gurudasani static int32_t ti_soc_device_verify_mapping(const struct ti_psc_drv_data *psc,
452*a1a3a16fSKamlesh Gurudasani 					    uint32_t dev_id, const struct ti_soc_device_data *dev)
453*a1a3a16fSKamlesh Gurudasani {
454*a1a3a16fSKamlesh Gurudasani 	const struct ti_lpsc_module_data *mdata;
455*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
456*a1a3a16fSKamlesh Gurudasani 
457*a1a3a16fSKamlesh Gurudasani 	/*
458*a1a3a16fSKamlesh Gurudasani 	 * Make sure the redundant const data stored in the PSC data is
459*a1a3a16fSKamlesh Gurudasani 	 * correct. This redundant data would ideally be checked or even
460*a1a3a16fSKamlesh Gurudasani 	 * generated at compile time.
461*a1a3a16fSKamlesh Gurudasani 	 */
462*a1a3a16fSKamlesh Gurudasani 	if (dev->mod != PSC_LPSC_NONE) {
463*a1a3a16fSKamlesh Gurudasani 		mdata = &psc->mod_data[dev->mod];
464*a1a3a16fSKamlesh Gurudasani 
465*a1a3a16fSKamlesh Gurudasani 		if ((mdata->flags & TI_LPSC_DEVICES_LIST) != 0U) {
466*a1a3a16fSKamlesh Gurudasani 			for (i = 0U; mdata->lpsc_dev.dev_list[i] != dev_id; i++) {
467*a1a3a16fSKamlesh Gurudasani 				if (mdata->lpsc_dev.dev_list[i] == TI_DEV_ID_NONE) {
468*a1a3a16fSKamlesh Gurudasani 					VERBOSE("ACTION FAIL: INVALID_PSC_DATA\n");
469*a1a3a16fSKamlesh Gurudasani 					return -EINVAL;
470*a1a3a16fSKamlesh Gurudasani 				}
471*a1a3a16fSKamlesh Gurudasani 			}
472*a1a3a16fSKamlesh Gurudasani 		} else {
473*a1a3a16fSKamlesh Gurudasani 			for (i = 0U; mdata->lpsc_dev.dev_array[i] != dev_id; i++) {
474*a1a3a16fSKamlesh Gurudasani 				if ((i >= (ARRAY_SIZE(mdata->lpsc_dev.dev_array) - 1UL)) ||
475*a1a3a16fSKamlesh Gurudasani 				    (mdata->lpsc_dev.dev_array[i] == TI_DEV_ID_NONE)) {
476*a1a3a16fSKamlesh Gurudasani 					VERBOSE("ACTION FAIL: INVALID_PSC_DATA\n");
477*a1a3a16fSKamlesh Gurudasani 					return -EINVAL;
478*a1a3a16fSKamlesh Gurudasani 				}
479*a1a3a16fSKamlesh Gurudasani 			}
480*a1a3a16fSKamlesh Gurudasani 		}
481*a1a3a16fSKamlesh Gurudasani 	}
482*a1a3a16fSKamlesh Gurudasani 
483*a1a3a16fSKamlesh Gurudasani 	return 0;
484*a1a3a16fSKamlesh Gurudasani }
485*a1a3a16fSKamlesh Gurudasani 
ti_soc_device_init_internal(struct ti_device * dev)486*a1a3a16fSKamlesh Gurudasani static int32_t ti_soc_device_init_internal(struct ti_device *dev)
487*a1a3a16fSKamlesh Gurudasani {
488*a1a3a16fSKamlesh Gurudasani 	const struct ti_soc_device_data *domains;
489*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *devdata;
490*a1a3a16fSKamlesh Gurudasani 	const struct ti_drv_data *drvdata;
491*a1a3a16fSKamlesh Gurudasani 	struct ti_device *psc_dev = NULL;
492*a1a3a16fSKamlesh Gurudasani 	const struct ti_psc_drv_data *psc = NULL;
493*a1a3a16fSKamlesh Gurudasani 	uint32_t dev_id;
494*a1a3a16fSKamlesh Gurudasani 	int32_t ret;
495*a1a3a16fSKamlesh Gurudasani 	uint32_t i;
496*a1a3a16fSKamlesh Gurudasani 
497*a1a3a16fSKamlesh Gurudasani 	dev_id = ti_device_id(dev);
498*a1a3a16fSKamlesh Gurudasani 	devdata = ti_get_dev_data(dev);
499*a1a3a16fSKamlesh Gurudasani 
500*a1a3a16fSKamlesh Gurudasani 	/* Check if this PSC manages its own power domain */
501*a1a3a16fSKamlesh Gurudasani 	if ((devdata->flags & TI_DEVD_FLAG_DRV_DATA) != 0U) {
502*a1a3a16fSKamlesh Gurudasani 		drvdata = ti_to_drv_data(devdata);
503*a1a3a16fSKamlesh Gurudasani 		if (drvdata->drv == &psc_drv) {
504*a1a3a16fSKamlesh Gurudasani 			psc = ti_to_psc_drv_data(drvdata);
505*a1a3a16fSKamlesh Gurudasani 			if (psc->psc_idx == devdata->soc.psc_idx) {
506*a1a3a16fSKamlesh Gurudasani 				psc_dev = dev;
507*a1a3a16fSKamlesh Gurudasani 			} else {
508*a1a3a16fSKamlesh Gurudasani 				psc = NULL;
509*a1a3a16fSKamlesh Gurudasani 			}
510*a1a3a16fSKamlesh Gurudasani 		}
511*a1a3a16fSKamlesh Gurudasani 	}
512*a1a3a16fSKamlesh Gurudasani 
513*a1a3a16fSKamlesh Gurudasani 	if (psc_dev != NULL) {
514*a1a3a16fSKamlesh Gurudasani 		/* We are our own PSC */
515*a1a3a16fSKamlesh Gurudasani 		return ti_soc_device_verify_mapping(psc, dev_id, &devdata->soc);
516*a1a3a16fSKamlesh Gurudasani 	}
517*a1a3a16fSKamlesh Gurudasani 
518*a1a3a16fSKamlesh Gurudasani 	if (devdata->soc.psc_idx == TI_PSC_DEV_MULTIPLE) {
519*a1a3a16fSKamlesh Gurudasani 		/* Find all the PSCs this device needs */
520*a1a3a16fSKamlesh Gurudasani 		domains = soc_psc_multiple_domains[devdata->soc.mod];
521*a1a3a16fSKamlesh Gurudasani 		for (i = 0U; domains[i].psc_idx != TI_PSC_DEV_NONE; i++) {
522*a1a3a16fSKamlesh Gurudasani 			psc_dev = ti_psc_lookup((ti_psc_idx_t) domains[i].psc_idx);
523*a1a3a16fSKamlesh Gurudasani 			if (psc_dev == NULL) {
524*a1a3a16fSKamlesh Gurudasani 				return -EAGAIN;
525*a1a3a16fSKamlesh Gurudasani 			}
526*a1a3a16fSKamlesh Gurudasani 
527*a1a3a16fSKamlesh Gurudasani 			psc = ti_to_psc_drv_data(ti_get_drv_data(psc_dev));
528*a1a3a16fSKamlesh Gurudasani 			ret = ti_soc_device_verify_mapping(psc, dev_id, &domains[i]);
529*a1a3a16fSKamlesh Gurudasani 			if (ret != 0) {
530*a1a3a16fSKamlesh Gurudasani 				return ret;
531*a1a3a16fSKamlesh Gurudasani 			}
532*a1a3a16fSKamlesh Gurudasani 		}
533*a1a3a16fSKamlesh Gurudasani 
534*a1a3a16fSKamlesh Gurudasani 		return 0;
535*a1a3a16fSKamlesh Gurudasani 	}
536*a1a3a16fSKamlesh Gurudasani 
537*a1a3a16fSKamlesh Gurudasani 	/* We just need the one PSC */
538*a1a3a16fSKamlesh Gurudasani 	psc_dev = ti_psc_lookup((ti_psc_idx_t) devdata->soc.psc_idx);
539*a1a3a16fSKamlesh Gurudasani 	if (psc_dev == NULL) {
540*a1a3a16fSKamlesh Gurudasani 		/*
541*a1a3a16fSKamlesh Gurudasani 		 * Don't try to bring this dev up before calling init
542*a1a3a16fSKamlesh Gurudasani 		 * on the device's PSC.
543*a1a3a16fSKamlesh Gurudasani 		 */
544*a1a3a16fSKamlesh Gurudasani 		return -EAGAIN;
545*a1a3a16fSKamlesh Gurudasani 	}
546*a1a3a16fSKamlesh Gurudasani 
547*a1a3a16fSKamlesh Gurudasani 	psc = ti_to_psc_drv_data(ti_get_drv_data(psc_dev));
548*a1a3a16fSKamlesh Gurudasani 	return ti_soc_device_verify_mapping(psc, dev_id, &devdata->soc);
549*a1a3a16fSKamlesh Gurudasani }
550*a1a3a16fSKamlesh Gurudasani 
551*a1a3a16fSKamlesh Gurudasani /* Defer all other device initialization until PSC initializes */
ti_soc_device_init(struct ti_device * dev)552*a1a3a16fSKamlesh Gurudasani int32_t ti_soc_device_init(struct ti_device *dev)
553*a1a3a16fSKamlesh Gurudasani {
554*a1a3a16fSKamlesh Gurudasani 	const struct ti_dev_data *devdata;
555*a1a3a16fSKamlesh Gurudasani 
556*a1a3a16fSKamlesh Gurudasani 	assert(dev != NULL);
557*a1a3a16fSKamlesh Gurudasani 
558*a1a3a16fSKamlesh Gurudasani 	devdata = ti_get_dev_data(dev);
559*a1a3a16fSKamlesh Gurudasani 
560*a1a3a16fSKamlesh Gurudasani 	if (devdata->soc.psc_idx != TI_PSC_DEV_NONE) {
561*a1a3a16fSKamlesh Gurudasani 		return ti_soc_device_init_internal(dev);
562*a1a3a16fSKamlesh Gurudasani 	}
563*a1a3a16fSKamlesh Gurudasani 
564*a1a3a16fSKamlesh Gurudasani 	return 0;
565*a1a3a16fSKamlesh Gurudasani }
566