1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * OMAP3xxx clockdomains
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2008-2011 Texas Instruments, Inc.
6*4882a593Smuzhiyun * Copyright (C) 2008-2010 Nokia Corporation
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Paul Walmsley, Jouni Högander
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * This file contains clockdomains and clockdomain wakeup/sleep
11*4882a593Smuzhiyun * dependencies for the OMAP3xxx chips. Some notes:
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * A useful validation rule for struct clockdomain: Any clockdomain
14*4882a593Smuzhiyun * referenced by a wkdep_srcs or sleepdep_srcs array must have a
15*4882a593Smuzhiyun * dep_bit assigned. So wkdep_srcs/sleepdep_srcs are really just
16*4882a593Smuzhiyun * software-controllable dependencies. Non-software-controllable
17*4882a593Smuzhiyun * dependencies do exist, but they are not encoded below (yet).
18*4882a593Smuzhiyun *
19*4882a593Smuzhiyun * The overly-specific dep_bit names are due to a bit name collision
20*4882a593Smuzhiyun * with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift
21*4882a593Smuzhiyun * value are the same for all powerdomains: 2
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun * XXX should dep_bit be a mask, so we can test to see if it is 0 as a
24*4882a593Smuzhiyun * sanity check?
25*4882a593Smuzhiyun * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE
26*4882a593Smuzhiyun */
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun * To-Do List
30*4882a593Smuzhiyun * -> Port the Sleep/Wakeup dependencies for the domains
31*4882a593Smuzhiyun * from the Power domain framework
32*4882a593Smuzhiyun */
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #include <linux/kernel.h>
35*4882a593Smuzhiyun #include <linux/io.h>
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun #include "soc.h"
38*4882a593Smuzhiyun #include "clockdomain.h"
39*4882a593Smuzhiyun #include "prm2xxx_3xxx.h"
40*4882a593Smuzhiyun #include "cm2xxx_3xxx.h"
41*4882a593Smuzhiyun #include "cm-regbits-34xx.h"
42*4882a593Smuzhiyun #include "prm-regbits-34xx.h"
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun * Clockdomain dependencies for wkdeps/sleepdeps
46*4882a593Smuzhiyun *
47*4882a593Smuzhiyun * XXX Hardware dependencies (e.g., dependencies that cannot be
48*4882a593Smuzhiyun * changed in software) are not included here yet, but should be.
49*4882a593Smuzhiyun */
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun /* OMAP3-specific possible dependencies */
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun /*
54*4882a593Smuzhiyun * 3430ES1 PM_WKDEP_GFX: adds IVA2, removes CORE
55*4882a593Smuzhiyun * 3430ES2 PM_WKDEP_SGX: adds IVA2, removes CORE
56*4882a593Smuzhiyun */
57*4882a593Smuzhiyun static struct clkdm_dep gfx_sgx_3xxx_wkdeps[] = {
58*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
59*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
60*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
61*4882a593Smuzhiyun { NULL },
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun static struct clkdm_dep gfx_sgx_am35x_wkdeps[] = {
65*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
66*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
67*4882a593Smuzhiyun { NULL },
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /* 3430: PM_WKDEP_PER: CORE, IVA2, MPU, WKUP */
71*4882a593Smuzhiyun static struct clkdm_dep per_wkdeps[] = {
72*4882a593Smuzhiyun { .clkdm_name = "core_l3_clkdm" },
73*4882a593Smuzhiyun { .clkdm_name = "core_l4_clkdm" },
74*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
75*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
76*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
77*4882a593Smuzhiyun { NULL },
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun static struct clkdm_dep per_am35x_wkdeps[] = {
81*4882a593Smuzhiyun { .clkdm_name = "core_l3_clkdm" },
82*4882a593Smuzhiyun { .clkdm_name = "core_l4_clkdm" },
83*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
84*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
85*4882a593Smuzhiyun { NULL },
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun /* 3430ES2: PM_WKDEP_USBHOST: CORE, IVA2, MPU, WKUP */
89*4882a593Smuzhiyun static struct clkdm_dep usbhost_wkdeps[] = {
90*4882a593Smuzhiyun { .clkdm_name = "core_l3_clkdm" },
91*4882a593Smuzhiyun { .clkdm_name = "core_l4_clkdm" },
92*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
93*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
94*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
95*4882a593Smuzhiyun { NULL },
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun static struct clkdm_dep usbhost_am35x_wkdeps[] = {
99*4882a593Smuzhiyun { .clkdm_name = "core_l3_clkdm" },
100*4882a593Smuzhiyun { .clkdm_name = "core_l4_clkdm" },
101*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
102*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
103*4882a593Smuzhiyun { NULL },
104*4882a593Smuzhiyun };
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun /* 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER */
107*4882a593Smuzhiyun static struct clkdm_dep mpu_3xxx_wkdeps[] = {
108*4882a593Smuzhiyun { .clkdm_name = "core_l3_clkdm" },
109*4882a593Smuzhiyun { .clkdm_name = "core_l4_clkdm" },
110*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
111*4882a593Smuzhiyun { .clkdm_name = "dss_clkdm" },
112*4882a593Smuzhiyun { .clkdm_name = "per_clkdm" },
113*4882a593Smuzhiyun { NULL },
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun static struct clkdm_dep mpu_am35x_wkdeps[] = {
117*4882a593Smuzhiyun { .clkdm_name = "core_l3_clkdm" },
118*4882a593Smuzhiyun { .clkdm_name = "core_l4_clkdm" },
119*4882a593Smuzhiyun { .clkdm_name = "dss_clkdm" },
120*4882a593Smuzhiyun { .clkdm_name = "per_clkdm" },
121*4882a593Smuzhiyun { NULL },
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun /* 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER */
125*4882a593Smuzhiyun static struct clkdm_dep iva2_wkdeps[] = {
126*4882a593Smuzhiyun { .clkdm_name = "core_l3_clkdm" },
127*4882a593Smuzhiyun { .clkdm_name = "core_l4_clkdm" },
128*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
129*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
130*4882a593Smuzhiyun { .clkdm_name = "dss_clkdm" },
131*4882a593Smuzhiyun { .clkdm_name = "per_clkdm" },
132*4882a593Smuzhiyun { NULL },
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun /* 3430 PM_WKDEP_CAM: IVA2, MPU, WKUP */
136*4882a593Smuzhiyun static struct clkdm_dep cam_wkdeps[] = {
137*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
138*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
139*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
140*4882a593Smuzhiyun { NULL },
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun /* 3430 PM_WKDEP_DSS: IVA2, MPU, WKUP */
144*4882a593Smuzhiyun static struct clkdm_dep dss_wkdeps[] = {
145*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
146*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
147*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
148*4882a593Smuzhiyun { NULL },
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun static struct clkdm_dep dss_am35x_wkdeps[] = {
152*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
153*4882a593Smuzhiyun { .clkdm_name = "wkup_clkdm" },
154*4882a593Smuzhiyun { NULL },
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun /* 3430: PM_WKDEP_NEON: MPU */
158*4882a593Smuzhiyun static struct clkdm_dep neon_wkdeps[] = {
159*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
160*4882a593Smuzhiyun { NULL },
161*4882a593Smuzhiyun };
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun /* Sleep dependency source arrays for OMAP3-specific clkdms */
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun /* 3430: CM_SLEEPDEP_DSS: MPU, IVA */
166*4882a593Smuzhiyun static struct clkdm_dep dss_sleepdeps[] = {
167*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
168*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
169*4882a593Smuzhiyun { NULL },
170*4882a593Smuzhiyun };
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun static struct clkdm_dep dss_am35x_sleepdeps[] = {
173*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
174*4882a593Smuzhiyun { NULL },
175*4882a593Smuzhiyun };
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun /* 3430: CM_SLEEPDEP_PER: MPU, IVA */
178*4882a593Smuzhiyun static struct clkdm_dep per_sleepdeps[] = {
179*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
180*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
181*4882a593Smuzhiyun { NULL },
182*4882a593Smuzhiyun };
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun static struct clkdm_dep per_am35x_sleepdeps[] = {
185*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
186*4882a593Smuzhiyun { NULL },
187*4882a593Smuzhiyun };
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun /* 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA */
190*4882a593Smuzhiyun static struct clkdm_dep usbhost_sleepdeps[] = {
191*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
192*4882a593Smuzhiyun { .clkdm_name = "iva2_clkdm" },
193*4882a593Smuzhiyun { NULL },
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun static struct clkdm_dep usbhost_am35x_sleepdeps[] = {
197*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
198*4882a593Smuzhiyun { NULL },
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun /* 3430: CM_SLEEPDEP_CAM: MPU */
202*4882a593Smuzhiyun static struct clkdm_dep cam_sleepdeps[] = {
203*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
204*4882a593Smuzhiyun { NULL },
205*4882a593Smuzhiyun };
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun /*
208*4882a593Smuzhiyun * 3430ES1: CM_SLEEPDEP_GFX: MPU
209*4882a593Smuzhiyun * 3430ES2: CM_SLEEPDEP_SGX: MPU
210*4882a593Smuzhiyun * These can share data since they will never be present simultaneously
211*4882a593Smuzhiyun * on the same device.
212*4882a593Smuzhiyun */
213*4882a593Smuzhiyun static struct clkdm_dep gfx_sgx_sleepdeps[] = {
214*4882a593Smuzhiyun { .clkdm_name = "mpu_clkdm" },
215*4882a593Smuzhiyun { NULL },
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /*
219*4882a593Smuzhiyun * OMAP3 clockdomains
220*4882a593Smuzhiyun */
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun static struct clockdomain mpu_3xxx_clkdm = {
223*4882a593Smuzhiyun .name = "mpu_clkdm",
224*4882a593Smuzhiyun .pwrdm = { .name = "mpu_pwrdm" },
225*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
226*4882a593Smuzhiyun .dep_bit = OMAP3430_EN_MPU_SHIFT,
227*4882a593Smuzhiyun .wkdep_srcs = mpu_3xxx_wkdeps,
228*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
229*4882a593Smuzhiyun };
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun static struct clockdomain mpu_am35x_clkdm = {
232*4882a593Smuzhiyun .name = "mpu_clkdm",
233*4882a593Smuzhiyun .pwrdm = { .name = "mpu_pwrdm" },
234*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
235*4882a593Smuzhiyun .dep_bit = OMAP3430_EN_MPU_SHIFT,
236*4882a593Smuzhiyun .wkdep_srcs = mpu_am35x_wkdeps,
237*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
238*4882a593Smuzhiyun };
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun static struct clockdomain neon_clkdm = {
241*4882a593Smuzhiyun .name = "neon_clkdm",
242*4882a593Smuzhiyun .pwrdm = { .name = "neon_pwrdm" },
243*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
244*4882a593Smuzhiyun .wkdep_srcs = neon_wkdeps,
245*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
246*4882a593Smuzhiyun };
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun static struct clockdomain iva2_clkdm = {
249*4882a593Smuzhiyun .name = "iva2_clkdm",
250*4882a593Smuzhiyun .pwrdm = { .name = "iva2_pwrdm" },
251*4882a593Smuzhiyun .flags = CLKDM_CAN_SWSUP,
252*4882a593Smuzhiyun .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
253*4882a593Smuzhiyun .wkdep_srcs = iva2_wkdeps,
254*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
255*4882a593Smuzhiyun };
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun static struct clockdomain gfx_3430es1_clkdm = {
258*4882a593Smuzhiyun .name = "gfx_clkdm",
259*4882a593Smuzhiyun .pwrdm = { .name = "gfx_pwrdm" },
260*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
261*4882a593Smuzhiyun .wkdep_srcs = gfx_sgx_3xxx_wkdeps,
262*4882a593Smuzhiyun .sleepdep_srcs = gfx_sgx_sleepdeps,
263*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
264*4882a593Smuzhiyun };
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun static struct clockdomain sgx_clkdm = {
267*4882a593Smuzhiyun .name = "sgx_clkdm",
268*4882a593Smuzhiyun .pwrdm = { .name = "sgx_pwrdm" },
269*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
270*4882a593Smuzhiyun .wkdep_srcs = gfx_sgx_3xxx_wkdeps,
271*4882a593Smuzhiyun .sleepdep_srcs = gfx_sgx_sleepdeps,
272*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
273*4882a593Smuzhiyun };
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun static struct clockdomain sgx_am35x_clkdm = {
276*4882a593Smuzhiyun .name = "sgx_clkdm",
277*4882a593Smuzhiyun .pwrdm = { .name = "sgx_pwrdm" },
278*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
279*4882a593Smuzhiyun .wkdep_srcs = gfx_sgx_am35x_wkdeps,
280*4882a593Smuzhiyun .sleepdep_srcs = gfx_sgx_sleepdeps,
281*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
282*4882a593Smuzhiyun };
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun /*
285*4882a593Smuzhiyun * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
286*4882a593Smuzhiyun * then that information was removed from the 34xx ES2+ TRM. It is
287*4882a593Smuzhiyun * unclear whether the core is still there, but the clockdomain logic
288*4882a593Smuzhiyun * is there, and must be programmed to an appropriate state if the
289*4882a593Smuzhiyun * CORE clockdomain is to become inactive.
290*4882a593Smuzhiyun */
291*4882a593Smuzhiyun static struct clockdomain d2d_clkdm = {
292*4882a593Smuzhiyun .name = "d2d_clkdm",
293*4882a593Smuzhiyun .pwrdm = { .name = "core_pwrdm" },
294*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
295*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
296*4882a593Smuzhiyun };
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun /*
299*4882a593Smuzhiyun * XXX add usecounting for clkdm dependencies, otherwise the presence
300*4882a593Smuzhiyun * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
301*4882a593Smuzhiyun * could cause trouble
302*4882a593Smuzhiyun */
303*4882a593Smuzhiyun static struct clockdomain core_l3_3xxx_clkdm = {
304*4882a593Smuzhiyun .name = "core_l3_clkdm",
305*4882a593Smuzhiyun .pwrdm = { .name = "core_pwrdm" },
306*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP,
307*4882a593Smuzhiyun .dep_bit = OMAP3430_EN_CORE_SHIFT,
308*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun /*
312*4882a593Smuzhiyun * XXX add usecounting for clkdm dependencies, otherwise the presence
313*4882a593Smuzhiyun * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
314*4882a593Smuzhiyun * could cause trouble
315*4882a593Smuzhiyun */
316*4882a593Smuzhiyun static struct clockdomain core_l4_3xxx_clkdm = {
317*4882a593Smuzhiyun .name = "core_l4_clkdm",
318*4882a593Smuzhiyun .pwrdm = { .name = "core_pwrdm" },
319*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP,
320*4882a593Smuzhiyun .dep_bit = OMAP3430_EN_CORE_SHIFT,
321*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
322*4882a593Smuzhiyun };
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun /* Another case of bit name collisions between several registers: EN_DSS */
325*4882a593Smuzhiyun static struct clockdomain dss_3xxx_clkdm = {
326*4882a593Smuzhiyun .name = "dss_clkdm",
327*4882a593Smuzhiyun .pwrdm = { .name = "dss_pwrdm" },
328*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
329*4882a593Smuzhiyun .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
330*4882a593Smuzhiyun .wkdep_srcs = dss_wkdeps,
331*4882a593Smuzhiyun .sleepdep_srcs = dss_sleepdeps,
332*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
333*4882a593Smuzhiyun };
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun static struct clockdomain dss_am35x_clkdm = {
336*4882a593Smuzhiyun .name = "dss_clkdm",
337*4882a593Smuzhiyun .pwrdm = { .name = "dss_pwrdm" },
338*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
339*4882a593Smuzhiyun .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
340*4882a593Smuzhiyun .wkdep_srcs = dss_am35x_wkdeps,
341*4882a593Smuzhiyun .sleepdep_srcs = dss_am35x_sleepdeps,
342*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
343*4882a593Smuzhiyun };
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun static struct clockdomain cam_clkdm = {
346*4882a593Smuzhiyun .name = "cam_clkdm",
347*4882a593Smuzhiyun .pwrdm = { .name = "cam_pwrdm" },
348*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
349*4882a593Smuzhiyun .wkdep_srcs = cam_wkdeps,
350*4882a593Smuzhiyun .sleepdep_srcs = cam_sleepdeps,
351*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
352*4882a593Smuzhiyun };
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun static struct clockdomain usbhost_clkdm = {
355*4882a593Smuzhiyun .name = "usbhost_clkdm",
356*4882a593Smuzhiyun .pwrdm = { .name = "usbhost_pwrdm" },
357*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
358*4882a593Smuzhiyun .wkdep_srcs = usbhost_wkdeps,
359*4882a593Smuzhiyun .sleepdep_srcs = usbhost_sleepdeps,
360*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
361*4882a593Smuzhiyun };
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun static struct clockdomain usbhost_am35x_clkdm = {
364*4882a593Smuzhiyun .name = "usbhost_clkdm",
365*4882a593Smuzhiyun .pwrdm = { .name = "core_pwrdm" },
366*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
367*4882a593Smuzhiyun .wkdep_srcs = usbhost_am35x_wkdeps,
368*4882a593Smuzhiyun .sleepdep_srcs = usbhost_am35x_sleepdeps,
369*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
370*4882a593Smuzhiyun };
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun static struct clockdomain per_clkdm = {
373*4882a593Smuzhiyun .name = "per_clkdm",
374*4882a593Smuzhiyun .pwrdm = { .name = "per_pwrdm" },
375*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
376*4882a593Smuzhiyun .dep_bit = OMAP3430_EN_PER_SHIFT,
377*4882a593Smuzhiyun .wkdep_srcs = per_wkdeps,
378*4882a593Smuzhiyun .sleepdep_srcs = per_sleepdeps,
379*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
380*4882a593Smuzhiyun };
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun static struct clockdomain per_am35x_clkdm = {
383*4882a593Smuzhiyun .name = "per_clkdm",
384*4882a593Smuzhiyun .pwrdm = { .name = "per_pwrdm" },
385*4882a593Smuzhiyun .flags = CLKDM_CAN_HWSUP_SWSUP,
386*4882a593Smuzhiyun .dep_bit = OMAP3430_EN_PER_SHIFT,
387*4882a593Smuzhiyun .wkdep_srcs = per_am35x_wkdeps,
388*4882a593Smuzhiyun .sleepdep_srcs = per_am35x_sleepdeps,
389*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
390*4882a593Smuzhiyun };
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun static struct clockdomain emu_clkdm = {
393*4882a593Smuzhiyun .name = "emu_clkdm",
394*4882a593Smuzhiyun .pwrdm = { .name = "emu_pwrdm" },
395*4882a593Smuzhiyun .flags = (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_SWSUP |
396*4882a593Smuzhiyun CLKDM_MISSING_IDLE_REPORTING),
397*4882a593Smuzhiyun .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
398*4882a593Smuzhiyun };
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun static struct clockdomain dpll1_clkdm = {
401*4882a593Smuzhiyun .name = "dpll1_clkdm",
402*4882a593Smuzhiyun .pwrdm = { .name = "dpll1_pwrdm" },
403*4882a593Smuzhiyun };
404*4882a593Smuzhiyun
405*4882a593Smuzhiyun static struct clockdomain dpll2_clkdm = {
406*4882a593Smuzhiyun .name = "dpll2_clkdm",
407*4882a593Smuzhiyun .pwrdm = { .name = "dpll2_pwrdm" },
408*4882a593Smuzhiyun };
409*4882a593Smuzhiyun
410*4882a593Smuzhiyun static struct clockdomain dpll3_clkdm = {
411*4882a593Smuzhiyun .name = "dpll3_clkdm",
412*4882a593Smuzhiyun .pwrdm = { .name = "dpll3_pwrdm" },
413*4882a593Smuzhiyun };
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun static struct clockdomain dpll4_clkdm = {
416*4882a593Smuzhiyun .name = "dpll4_clkdm",
417*4882a593Smuzhiyun .pwrdm = { .name = "dpll4_pwrdm" },
418*4882a593Smuzhiyun };
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun static struct clockdomain dpll5_clkdm = {
421*4882a593Smuzhiyun .name = "dpll5_clkdm",
422*4882a593Smuzhiyun .pwrdm = { .name = "dpll5_pwrdm" },
423*4882a593Smuzhiyun };
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun /*
426*4882a593Smuzhiyun * Clockdomain hwsup dependencies
427*4882a593Smuzhiyun */
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun static struct clkdm_autodep clkdm_autodeps[] = {
430*4882a593Smuzhiyun {
431*4882a593Smuzhiyun .clkdm = { .name = "mpu_clkdm" },
432*4882a593Smuzhiyun },
433*4882a593Smuzhiyun {
434*4882a593Smuzhiyun .clkdm = { .name = "iva2_clkdm" },
435*4882a593Smuzhiyun },
436*4882a593Smuzhiyun {
437*4882a593Smuzhiyun .clkdm = { .name = NULL },
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun };
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun static struct clkdm_autodep clkdm_am35x_autodeps[] = {
442*4882a593Smuzhiyun {
443*4882a593Smuzhiyun .clkdm = { .name = "mpu_clkdm" },
444*4882a593Smuzhiyun },
445*4882a593Smuzhiyun {
446*4882a593Smuzhiyun .clkdm = { .name = NULL },
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun };
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun /*
451*4882a593Smuzhiyun *
452*4882a593Smuzhiyun */
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun static struct clockdomain *clockdomains_common[] __initdata = {
455*4882a593Smuzhiyun &wkup_common_clkdm,
456*4882a593Smuzhiyun &neon_clkdm,
457*4882a593Smuzhiyun &core_l3_3xxx_clkdm,
458*4882a593Smuzhiyun &core_l4_3xxx_clkdm,
459*4882a593Smuzhiyun &emu_clkdm,
460*4882a593Smuzhiyun &dpll1_clkdm,
461*4882a593Smuzhiyun &dpll3_clkdm,
462*4882a593Smuzhiyun &dpll4_clkdm,
463*4882a593Smuzhiyun NULL
464*4882a593Smuzhiyun };
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun static struct clockdomain *clockdomains_omap3430[] __initdata = {
467*4882a593Smuzhiyun &mpu_3xxx_clkdm,
468*4882a593Smuzhiyun &iva2_clkdm,
469*4882a593Smuzhiyun &d2d_clkdm,
470*4882a593Smuzhiyun &dss_3xxx_clkdm,
471*4882a593Smuzhiyun &cam_clkdm,
472*4882a593Smuzhiyun &per_clkdm,
473*4882a593Smuzhiyun &dpll2_clkdm,
474*4882a593Smuzhiyun NULL
475*4882a593Smuzhiyun };
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun static struct clockdomain *clockdomains_omap3430es1[] __initdata = {
478*4882a593Smuzhiyun &gfx_3430es1_clkdm,
479*4882a593Smuzhiyun NULL,
480*4882a593Smuzhiyun };
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun static struct clockdomain *clockdomains_omap3430es2plus[] __initdata = {
483*4882a593Smuzhiyun &sgx_clkdm,
484*4882a593Smuzhiyun &dpll5_clkdm,
485*4882a593Smuzhiyun &usbhost_clkdm,
486*4882a593Smuzhiyun NULL,
487*4882a593Smuzhiyun };
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun static struct clockdomain *clockdomains_am35x[] __initdata = {
490*4882a593Smuzhiyun &mpu_am35x_clkdm,
491*4882a593Smuzhiyun &sgx_am35x_clkdm,
492*4882a593Smuzhiyun &dss_am35x_clkdm,
493*4882a593Smuzhiyun &per_am35x_clkdm,
494*4882a593Smuzhiyun &usbhost_am35x_clkdm,
495*4882a593Smuzhiyun &dpll5_clkdm,
496*4882a593Smuzhiyun NULL
497*4882a593Smuzhiyun };
498*4882a593Smuzhiyun
omap3xxx_clockdomains_init(void)499*4882a593Smuzhiyun void __init omap3xxx_clockdomains_init(void)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun struct clockdomain **sc;
502*4882a593Smuzhiyun unsigned int rev;
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun if (!cpu_is_omap34xx())
505*4882a593Smuzhiyun return;
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun clkdm_register_platform_funcs(&omap3_clkdm_operations);
508*4882a593Smuzhiyun clkdm_register_clkdms(clockdomains_common);
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun rev = omap_rev();
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
513*4882a593Smuzhiyun clkdm_register_clkdms(clockdomains_am35x);
514*4882a593Smuzhiyun clkdm_register_autodeps(clkdm_am35x_autodeps);
515*4882a593Smuzhiyun } else {
516*4882a593Smuzhiyun clkdm_register_clkdms(clockdomains_omap3430);
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun sc = (rev == OMAP3430_REV_ES1_0) ?
519*4882a593Smuzhiyun clockdomains_omap3430es1 : clockdomains_omap3430es2plus;
520*4882a593Smuzhiyun
521*4882a593Smuzhiyun clkdm_register_clkdms(sc);
522*4882a593Smuzhiyun clkdm_register_autodeps(clkdm_autodeps);
523*4882a593Smuzhiyun }
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun clkdm_complete_init();
526*4882a593Smuzhiyun }
527