1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * OMAP3 powerdomain definitions
4  *
5  * Copyright (C) 2007-2008, 2011 Texas Instruments, Inc.
6  * Copyright (C) 2007-2011 Nokia Corporation
7  *
8  * Paul Walmsley, Jouni Högander
9  */
10 
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/bug.h>
14 
15 #include "soc.h"
16 #include "powerdomain.h"
17 #include "powerdomains2xxx_3xxx_data.h"
18 #include "prcm-common.h"
19 #include "prm2xxx_3xxx.h"
20 #include "prm-regbits-34xx.h"
21 #include "cm2xxx_3xxx.h"
22 #include "cm-regbits-34xx.h"
23 
24 /*
25  * 34XX-specific powerdomains, dependencies
26  */
27 
28 /*
29  * Powerdomains
30  */
31 
32 static struct powerdomain iva2_pwrdm = {
33 	.name		  = "iva2_pwrdm",
34 	.prcm_offs	  = OMAP3430_IVA2_MOD,
35 	.pwrsts		  = PWRSTS_OFF_RET_ON,
36 	.pwrsts_logic_ret = PWRSTS_OFF_RET,
37 	.banks		  = 4,
38 	.pwrsts_mem_ret	  = {
39 		[0] = PWRSTS_OFF_RET,
40 		[1] = PWRSTS_OFF_RET,
41 		[2] = PWRSTS_OFF_RET,
42 		[3] = PWRSTS_OFF_RET,
43 	},
44 	.pwrsts_mem_on	  = {
45 		[0] = PWRSTS_ON,
46 		[1] = PWRSTS_ON,
47 		[2] = PWRSTS_OFF_ON,
48 		[3] = PWRSTS_ON,
49 	},
50 	.voltdm		  = { .name = "mpu_iva" },
51 };
52 
53 static struct powerdomain mpu_3xxx_pwrdm = {
54 	.name		  = "mpu_pwrdm",
55 	.prcm_offs	  = MPU_MOD,
56 	.pwrsts		  = PWRSTS_OFF_RET_ON,
57 	.pwrsts_logic_ret = PWRSTS_OFF_RET,
58 	.flags		  = PWRDM_HAS_MPU_QUIRK,
59 	.banks		  = 1,
60 	.pwrsts_mem_ret	  = {
61 		[0] = PWRSTS_OFF_RET,
62 	},
63 	.pwrsts_mem_on	  = {
64 		[0] = PWRSTS_OFF_ON,
65 	},
66 	.voltdm		  = { .name = "mpu_iva" },
67 };
68 
69 static struct powerdomain mpu_am35x_pwrdm = {
70 	.name		  = "mpu_pwrdm",
71 	.prcm_offs	  = MPU_MOD,
72 	.pwrsts		  = PWRSTS_ON,
73 	.pwrsts_logic_ret = PWRSTS_ON,
74 	.flags		  = PWRDM_HAS_MPU_QUIRK,
75 	.banks		  = 1,
76 	.pwrsts_mem_ret	  = {
77 		[0] = PWRSTS_ON,
78 	},
79 	.pwrsts_mem_on	  = {
80 		[0] = PWRSTS_ON,
81 	},
82 	.voltdm		  = { .name = "mpu_iva" },
83 };
84 
85 /*
86  * The USBTLL Save-and-Restore mechanism is broken on
87  * 3430s up to ES3.0 and 3630ES1.0. Hence this feature
88  * needs to be disabled on these chips.
89  * Refer: 3430 errata ID i459 and 3630 errata ID i579
90  *
91  * Note: setting the SAR flag could help for errata ID i478
92  *  which applies to 3430 <= ES3.1, but since the SAR feature
93  *  is broken, do not use it.
94  */
95 static struct powerdomain core_3xxx_pre_es3_1_pwrdm = {
96 	.name		  = "core_pwrdm",
97 	.prcm_offs	  = CORE_MOD,
98 	.pwrsts		  = PWRSTS_OFF_RET_ON,
99 	.pwrsts_logic_ret = PWRSTS_OFF_RET,
100 	.banks		  = 2,
101 	.pwrsts_mem_ret	  = {
102 		[0] = PWRSTS_OFF_RET,	 /* MEM1RETSTATE */
103 		[1] = PWRSTS_OFF_RET,	 /* MEM2RETSTATE */
104 	},
105 	.pwrsts_mem_on	  = {
106 		[0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
107 		[1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
108 	},
109 	.voltdm		  = { .name = "core" },
110 };
111 
112 static struct powerdomain core_3xxx_es3_1_pwrdm = {
113 	.name		  = "core_pwrdm",
114 	.prcm_offs	  = CORE_MOD,
115 	.pwrsts		  = PWRSTS_OFF_RET_ON,
116 	.pwrsts_logic_ret = PWRSTS_OFF_RET,
117 	/*
118 	 * Setting the SAR flag for errata ID i478 which applies
119 	 *  to 3430 <= ES3.1
120 	 */
121 	.flags		  = PWRDM_HAS_HDWR_SAR, /* for USBTLL only */
122 	.banks		  = 2,
123 	.pwrsts_mem_ret	  = {
124 		[0] = PWRSTS_OFF_RET,	 /* MEM1RETSTATE */
125 		[1] = PWRSTS_OFF_RET,	 /* MEM2RETSTATE */
126 	},
127 	.pwrsts_mem_on	  = {
128 		[0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
129 		[1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
130 	},
131 	.voltdm		  = { .name = "core" },
132 };
133 
134 static struct powerdomain core_am35x_pwrdm = {
135 	.name		  = "core_pwrdm",
136 	.prcm_offs	  = CORE_MOD,
137 	.pwrsts		  = PWRSTS_ON,
138 	.pwrsts_logic_ret = PWRSTS_ON,
139 	.banks		  = 2,
140 	.pwrsts_mem_ret	  = {
141 		[0] = PWRSTS_ON,	 /* MEM1RETSTATE */
142 		[1] = PWRSTS_ON,	 /* MEM2RETSTATE */
143 	},
144 	.pwrsts_mem_on	  = {
145 		[0] = PWRSTS_ON, /* MEM1ONSTATE */
146 		[1] = PWRSTS_ON, /* MEM2ONSTATE */
147 	},
148 	.voltdm		  = { .name = "core" },
149 };
150 
151 static struct powerdomain dss_pwrdm = {
152 	.name		  = "dss_pwrdm",
153 	.prcm_offs	  = OMAP3430_DSS_MOD,
154 	.pwrsts		  = PWRSTS_OFF_RET_ON,
155 	.pwrsts_logic_ret = PWRSTS_RET,
156 	.banks		  = 1,
157 	.pwrsts_mem_ret	  = {
158 		[0] = PWRSTS_RET, /* MEMRETSTATE */
159 	},
160 	.pwrsts_mem_on	  = {
161 		[0] = PWRSTS_ON,  /* MEMONSTATE */
162 	},
163 	.voltdm		  = { .name = "core" },
164 };
165 
166 static struct powerdomain dss_am35x_pwrdm = {
167 	.name		  = "dss_pwrdm",
168 	.prcm_offs	  = OMAP3430_DSS_MOD,
169 	.pwrsts		  = PWRSTS_ON,
170 	.pwrsts_logic_ret = PWRSTS_ON,
171 	.banks		  = 1,
172 	.pwrsts_mem_ret	  = {
173 		[0] = PWRSTS_ON, /* MEMRETSTATE */
174 	},
175 	.pwrsts_mem_on	  = {
176 		[0] = PWRSTS_ON,  /* MEMONSTATE */
177 	},
178 	.voltdm		  = { .name = "core" },
179 };
180 
181 /*
182  * Although the 34XX TRM Rev K Table 4-371 notes that retention is a
183  * possible SGX powerstate, the SGX device itself does not support
184  * retention.
185  */
186 static struct powerdomain sgx_pwrdm = {
187 	.name		  = "sgx_pwrdm",
188 	.prcm_offs	  = OMAP3430ES2_SGX_MOD,
189 	/* XXX This is accurate for 3430 SGX, but what about GFX? */
190 	.pwrsts		  = PWRSTS_OFF_ON,
191 	.pwrsts_logic_ret = PWRSTS_RET,
192 	.banks		  = 1,
193 	.pwrsts_mem_ret	  = {
194 		[0] = PWRSTS_RET, /* MEMRETSTATE */
195 	},
196 	.pwrsts_mem_on	  = {
197 		[0] = PWRSTS_ON,  /* MEMONSTATE */
198 	},
199 	.voltdm		  = { .name = "core" },
200 };
201 
202 static struct powerdomain sgx_am35x_pwrdm = {
203 	.name		  = "sgx_pwrdm",
204 	.prcm_offs	  = OMAP3430ES2_SGX_MOD,
205 	.pwrsts		  = PWRSTS_ON,
206 	.pwrsts_logic_ret = PWRSTS_ON,
207 	.banks		  = 1,
208 	.pwrsts_mem_ret	  = {
209 		[0] = PWRSTS_ON, /* MEMRETSTATE */
210 	},
211 	.pwrsts_mem_on	  = {
212 		[0] = PWRSTS_ON,  /* MEMONSTATE */
213 	},
214 	.voltdm		  = { .name = "core" },
215 };
216 
217 static struct powerdomain cam_pwrdm = {
218 	.name		  = "cam_pwrdm",
219 	.prcm_offs	  = OMAP3430_CAM_MOD,
220 	.pwrsts		  = PWRSTS_OFF_RET_ON,
221 	.pwrsts_logic_ret = PWRSTS_RET,
222 	.banks		  = 1,
223 	.pwrsts_mem_ret	  = {
224 		[0] = PWRSTS_RET, /* MEMRETSTATE */
225 	},
226 	.pwrsts_mem_on	  = {
227 		[0] = PWRSTS_ON,  /* MEMONSTATE */
228 	},
229 	.voltdm		  = { .name = "core" },
230 };
231 
232 static struct powerdomain per_pwrdm = {
233 	.name		  = "per_pwrdm",
234 	.prcm_offs	  = OMAP3430_PER_MOD,
235 	.pwrsts		  = PWRSTS_OFF_RET_ON,
236 	.pwrsts_logic_ret = PWRSTS_OFF_RET,
237 	.banks		  = 1,
238 	.pwrsts_mem_ret	  = {
239 		[0] = PWRSTS_RET, /* MEMRETSTATE */
240 	},
241 	.pwrsts_mem_on	  = {
242 		[0] = PWRSTS_ON,  /* MEMONSTATE */
243 	},
244 	.voltdm		  = { .name = "core" },
245 };
246 
247 static struct powerdomain per_am35x_pwrdm = {
248 	.name		  = "per_pwrdm",
249 	.prcm_offs	  = OMAP3430_PER_MOD,
250 	.pwrsts		  = PWRSTS_ON,
251 	.pwrsts_logic_ret = PWRSTS_ON,
252 	.banks		  = 1,
253 	.pwrsts_mem_ret	  = {
254 		[0] = PWRSTS_ON, /* MEMRETSTATE */
255 	},
256 	.pwrsts_mem_on	  = {
257 		[0] = PWRSTS_ON,  /* MEMONSTATE */
258 	},
259 	.voltdm		  = { .name = "core" },
260 };
261 
262 static struct powerdomain emu_pwrdm = {
263 	.name		= "emu_pwrdm",
264 	.prcm_offs	= OMAP3430_EMU_MOD,
265 	.voltdm		  = { .name = "core" },
266 };
267 
268 static struct powerdomain neon_pwrdm = {
269 	.name		  = "neon_pwrdm",
270 	.prcm_offs	  = OMAP3430_NEON_MOD,
271 	.pwrsts		  = PWRSTS_OFF_RET_ON,
272 	.pwrsts_logic_ret = PWRSTS_RET,
273 	.voltdm		  = { .name = "mpu_iva" },
274 };
275 
276 static struct powerdomain neon_am35x_pwrdm = {
277 	.name		  = "neon_pwrdm",
278 	.prcm_offs	  = OMAP3430_NEON_MOD,
279 	.pwrsts		  = PWRSTS_ON,
280 	.pwrsts_logic_ret = PWRSTS_ON,
281 	.voltdm		  = { .name = "mpu_iva" },
282 };
283 
284 static struct powerdomain usbhost_pwrdm = {
285 	.name		  = "usbhost_pwrdm",
286 	.prcm_offs	  = OMAP3430ES2_USBHOST_MOD,
287 	.pwrsts		  = PWRSTS_OFF_RET_ON,
288 	.pwrsts_logic_ret = PWRSTS_RET,
289 	/*
290 	 * REVISIT: Enabling usb host save and restore mechanism seems to
291 	 * leave the usb host domain permanently in ACTIVE mode after
292 	 * changing the usb host power domain state from OFF to active once.
293 	 * Disabling for now.
294 	 */
295 	/*.flags	  = PWRDM_HAS_HDWR_SAR,*/ /* for USBHOST ctrlr only */
296 	.banks		  = 1,
297 	.pwrsts_mem_ret	  = {
298 		[0] = PWRSTS_RET, /* MEMRETSTATE */
299 	},
300 	.pwrsts_mem_on	  = {
301 		[0] = PWRSTS_ON,  /* MEMONSTATE */
302 	},
303 	.voltdm		  = { .name = "core" },
304 };
305 
306 static struct powerdomain dpll1_pwrdm = {
307 	.name		= "dpll1_pwrdm",
308 	.prcm_offs	= MPU_MOD,
309 	.voltdm		  = { .name = "mpu_iva" },
310 };
311 
312 static struct powerdomain dpll2_pwrdm = {
313 	.name		= "dpll2_pwrdm",
314 	.prcm_offs	= OMAP3430_IVA2_MOD,
315 	.voltdm		  = { .name = "mpu_iva" },
316 };
317 
318 static struct powerdomain dpll3_pwrdm = {
319 	.name		= "dpll3_pwrdm",
320 	.prcm_offs	= PLL_MOD,
321 	.voltdm		  = { .name = "core" },
322 };
323 
324 static struct powerdomain dpll4_pwrdm = {
325 	.name		= "dpll4_pwrdm",
326 	.prcm_offs	= PLL_MOD,
327 	.voltdm		  = { .name = "core" },
328 };
329 
330 static struct powerdomain dpll5_pwrdm = {
331 	.name		= "dpll5_pwrdm",
332 	.prcm_offs	= PLL_MOD,
333 	.voltdm		  = { .name = "core" },
334 };
335 
336 static struct powerdomain alwon_81xx_pwrdm = {
337 	.name		  = "alwon_pwrdm",
338 	.prcm_offs	  = TI81XX_PRM_ALWON_MOD,
339 	.pwrsts		  = PWRSTS_OFF_ON,
340 	.voltdm		  = { .name = "core" },
341 };
342 
343 static struct powerdomain device_81xx_pwrdm = {
344 	.name		  = "device_pwrdm",
345 	.prcm_offs	  = TI81XX_PRM_DEVICE_MOD,
346 	.voltdm		  = { .name = "core" },
347 };
348 
349 static struct powerdomain gem_814x_pwrdm = {
350 	.name		= "gem_pwrdm",
351 	.prcm_offs	= TI814X_PRM_DSP_MOD,
352 	.pwrsts		= PWRSTS_OFF_ON,
353 	.voltdm		= { .name = "dsp" },
354 };
355 
356 static struct powerdomain ivahd_814x_pwrdm = {
357 	.name		= "ivahd_pwrdm",
358 	.prcm_offs	= TI814X_PRM_HDVICP_MOD,
359 	.pwrsts		= PWRSTS_OFF_ON,
360 	.voltdm		= { .name = "iva" },
361 };
362 
363 static struct powerdomain hdvpss_814x_pwrdm = {
364 	.name		= "hdvpss_pwrdm",
365 	.prcm_offs	= TI814X_PRM_HDVPSS_MOD,
366 	.pwrsts		= PWRSTS_OFF_ON,
367 	.voltdm		= { .name = "dsp" },
368 };
369 
370 static struct powerdomain sgx_814x_pwrdm = {
371 	.name		= "sgx_pwrdm",
372 	.prcm_offs	= TI814X_PRM_GFX_MOD,
373 	.pwrsts		= PWRSTS_OFF_ON,
374 	.voltdm		= { .name = "core" },
375 };
376 
377 static struct powerdomain isp_814x_pwrdm = {
378 	.name		= "isp_pwrdm",
379 	.prcm_offs	= TI814X_PRM_ISP_MOD,
380 	.pwrsts		= PWRSTS_OFF_ON,
381 	.voltdm		= { .name = "core" },
382 };
383 
384 static struct powerdomain active_81xx_pwrdm = {
385 	.name		  = "active_pwrdm",
386 	.prcm_offs	  = TI816X_PRM_ACTIVE_MOD,
387 	.pwrsts		  = PWRSTS_OFF_ON,
388 	.voltdm		  = { .name = "core" },
389 };
390 
391 static struct powerdomain default_81xx_pwrdm = {
392 	.name		  = "default_pwrdm",
393 	.prcm_offs	  = TI81XX_PRM_DEFAULT_MOD,
394 	.pwrsts		  = PWRSTS_OFF_ON,
395 	.voltdm		  = { .name = "core" },
396 };
397 
398 static struct powerdomain ivahd0_816x_pwrdm = {
399 	.name		  = "ivahd0_pwrdm",
400 	.prcm_offs	  = TI816X_PRM_IVAHD0_MOD,
401 	.pwrsts		  = PWRSTS_OFF_ON,
402 	.voltdm		  = { .name = "mpu_iva" },
403 };
404 
405 static struct powerdomain ivahd1_816x_pwrdm = {
406 	.name		  = "ivahd1_pwrdm",
407 	.prcm_offs	  = TI816X_PRM_IVAHD1_MOD,
408 	.pwrsts		  = PWRSTS_OFF_ON,
409 	.voltdm		  = { .name = "mpu_iva" },
410 };
411 
412 static struct powerdomain ivahd2_816x_pwrdm = {
413 	.name		  = "ivahd2_pwrdm",
414 	.prcm_offs	  = TI816X_PRM_IVAHD2_MOD,
415 	.pwrsts		  = PWRSTS_OFF_ON,
416 	.voltdm		  = { .name = "mpu_iva" },
417 };
418 
419 static struct powerdomain sgx_816x_pwrdm = {
420 	.name		  = "sgx_pwrdm",
421 	.prcm_offs	  = TI816X_PRM_SGX_MOD,
422 	.pwrsts		  = PWRSTS_OFF_ON,
423 	.voltdm		  = { .name = "core" },
424 };
425 
426 /* As powerdomains are added or removed above, this list must also be changed */
427 static struct powerdomain *powerdomains_omap3430_common[] __initdata = {
428 	&wkup_omap2_pwrdm,
429 	&iva2_pwrdm,
430 	&mpu_3xxx_pwrdm,
431 	&neon_pwrdm,
432 	&cam_pwrdm,
433 	&dss_pwrdm,
434 	&per_pwrdm,
435 	&emu_pwrdm,
436 	&dpll1_pwrdm,
437 	&dpll2_pwrdm,
438 	&dpll3_pwrdm,
439 	&dpll4_pwrdm,
440 	NULL
441 };
442 
443 static struct powerdomain *powerdomains_omap3430es1[] __initdata = {
444 	&gfx_omap2_pwrdm,
445 	&core_3xxx_pre_es3_1_pwrdm,
446 	NULL
447 };
448 
449 /* also includes 3630ES1.0 */
450 static struct powerdomain *powerdomains_omap3430es2_es3_0[] __initdata = {
451 	&core_3xxx_pre_es3_1_pwrdm,
452 	&sgx_pwrdm,
453 	&usbhost_pwrdm,
454 	&dpll5_pwrdm,
455 	NULL
456 };
457 
458 /* also includes 3630ES1.1+ */
459 static struct powerdomain *powerdomains_omap3430es3_1plus[] __initdata = {
460 	&core_3xxx_es3_1_pwrdm,
461 	&sgx_pwrdm,
462 	&usbhost_pwrdm,
463 	&dpll5_pwrdm,
464 	NULL
465 };
466 
467 static struct powerdomain *powerdomains_am35x[] __initdata = {
468 	&wkup_omap2_pwrdm,
469 	&mpu_am35x_pwrdm,
470 	&neon_am35x_pwrdm,
471 	&core_am35x_pwrdm,
472 	&sgx_am35x_pwrdm,
473 	&dss_am35x_pwrdm,
474 	&per_am35x_pwrdm,
475 	&emu_pwrdm,
476 	&dpll1_pwrdm,
477 	&dpll3_pwrdm,
478 	&dpll4_pwrdm,
479 	&dpll5_pwrdm,
480 	NULL
481 };
482 
483 static struct powerdomain *powerdomains_ti814x[] __initdata = {
484 	&alwon_81xx_pwrdm,
485 	&device_81xx_pwrdm,
486 	&active_81xx_pwrdm,
487 	&default_81xx_pwrdm,
488 	&gem_814x_pwrdm,
489 	&ivahd_814x_pwrdm,
490 	&hdvpss_814x_pwrdm,
491 	&sgx_814x_pwrdm,
492 	&isp_814x_pwrdm,
493 	NULL
494 };
495 
496 static struct powerdomain *powerdomains_ti816x[] __initdata = {
497 	&alwon_81xx_pwrdm,
498 	&device_81xx_pwrdm,
499 	&active_81xx_pwrdm,
500 	&default_81xx_pwrdm,
501 	&ivahd0_816x_pwrdm,
502 	&ivahd1_816x_pwrdm,
503 	&ivahd2_816x_pwrdm,
504 	&sgx_816x_pwrdm,
505 	NULL
506 };
507 
508 /* TI81XX specific ops */
509 #define TI81XX_PM_PWSTCTRL				0x0000
510 #define TI81XX_RM_RSTCTRL				0x0010
511 #define TI81XX_PM_PWSTST				0x0004
512 
ti81xx_pwrdm_set_next_pwrst(struct powerdomain * pwrdm,u8 pwrst)513 static int ti81xx_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
514 {
515 	omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
516 				   (pwrst << OMAP_POWERSTATE_SHIFT),
517 				   pwrdm->prcm_offs, TI81XX_PM_PWSTCTRL);
518 	return 0;
519 }
520 
ti81xx_pwrdm_read_next_pwrst(struct powerdomain * pwrdm)521 static int ti81xx_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
522 {
523 	return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
524 					     TI81XX_PM_PWSTCTRL,
525 					     OMAP_POWERSTATE_MASK);
526 }
527 
ti81xx_pwrdm_read_pwrst(struct powerdomain * pwrdm)528 static int ti81xx_pwrdm_read_pwrst(struct powerdomain *pwrdm)
529 {
530 	return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
531 		(pwrdm->prcm_offs == TI814X_PRM_GFX_MOD) ? TI81XX_RM_RSTCTRL :
532 					     TI81XX_PM_PWSTST,
533 					     OMAP_POWERSTATEST_MASK);
534 }
535 
ti81xx_pwrdm_read_logic_pwrst(struct powerdomain * pwrdm)536 static int ti81xx_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
537 {
538 	return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
539 		(pwrdm->prcm_offs == TI814X_PRM_GFX_MOD) ? TI81XX_RM_RSTCTRL :
540 					     TI81XX_PM_PWSTST,
541 					     OMAP3430_LOGICSTATEST_MASK);
542 }
543 
ti81xx_pwrdm_wait_transition(struct powerdomain * pwrdm)544 static int ti81xx_pwrdm_wait_transition(struct powerdomain *pwrdm)
545 {
546 	u32 c = 0;
547 
548 	while ((omap2_prm_read_mod_reg(pwrdm->prcm_offs,
549 		(pwrdm->prcm_offs == TI814X_PRM_GFX_MOD) ? TI81XX_RM_RSTCTRL :
550 				       TI81XX_PM_PWSTST) &
551 		OMAP_INTRANSITION_MASK) &&
552 		(c++ < PWRDM_TRANSITION_BAILOUT))
553 			udelay(1);
554 
555 	if (c > PWRDM_TRANSITION_BAILOUT) {
556 		pr_err("powerdomain: %s timeout waiting for transition\n",
557 		       pwrdm->name);
558 		return -EAGAIN;
559 	}
560 
561 	pr_debug("powerdomain: completed transition in %d loops\n", c);
562 
563 	return 0;
564 }
565 
566 /* For dm814x we need to fix up fix GFX pwstst and rstctrl reg offsets */
567 static struct pwrdm_ops ti81xx_pwrdm_operations = {
568 	.pwrdm_set_next_pwrst	= ti81xx_pwrdm_set_next_pwrst,
569 	.pwrdm_read_next_pwrst	= ti81xx_pwrdm_read_next_pwrst,
570 	.pwrdm_read_pwrst	= ti81xx_pwrdm_read_pwrst,
571 	.pwrdm_read_logic_pwrst	= ti81xx_pwrdm_read_logic_pwrst,
572 	.pwrdm_wait_transition	= ti81xx_pwrdm_wait_transition,
573 };
574 
omap3xxx_powerdomains_init(void)575 void __init omap3xxx_powerdomains_init(void)
576 {
577 	unsigned int rev;
578 
579 	if (!cpu_is_omap34xx() && !cpu_is_ti81xx())
580 		return;
581 
582 	/* Only 81xx needs custom pwrdm_operations */
583 	if (!cpu_is_ti81xx())
584 		pwrdm_register_platform_funcs(&omap3_pwrdm_operations);
585 
586 	rev = omap_rev();
587 
588 	if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
589 		pwrdm_register_pwrdms(powerdomains_am35x);
590 	} else if (rev == TI8148_REV_ES1_0 || rev == TI8148_REV_ES2_0 ||
591 		   rev == TI8148_REV_ES2_1) {
592 		pwrdm_register_platform_funcs(&ti81xx_pwrdm_operations);
593 		pwrdm_register_pwrdms(powerdomains_ti814x);
594 	} else if (rev == TI8168_REV_ES1_0 || rev == TI8168_REV_ES1_1
595 			|| rev == TI8168_REV_ES2_0 || rev == TI8168_REV_ES2_1) {
596 		pwrdm_register_platform_funcs(&ti81xx_pwrdm_operations);
597 		pwrdm_register_pwrdms(powerdomains_ti816x);
598 	} else {
599 		pwrdm_register_pwrdms(powerdomains_omap3430_common);
600 
601 		switch (rev) {
602 		case OMAP3430_REV_ES1_0:
603 			pwrdm_register_pwrdms(powerdomains_omap3430es1);
604 			break;
605 		case OMAP3430_REV_ES2_0:
606 		case OMAP3430_REV_ES2_1:
607 		case OMAP3430_REV_ES3_0:
608 		case OMAP3630_REV_ES1_0:
609 			pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0);
610 			break;
611 		case OMAP3430_REV_ES3_1:
612 		case OMAP3430_REV_ES3_1_2:
613 		case OMAP3630_REV_ES1_1:
614 		case OMAP3630_REV_ES1_2:
615 			pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus);
616 			break;
617 		default:
618 			WARN(1, "OMAP3 powerdomain init: unknown chip type\n");
619 		}
620 	}
621 
622 	pwrdm_complete_init();
623 }
624