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