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