xref: /OK3568_Linux_fs/kernel/arch/arm/mach-omap2/clockdomains3xxx_data.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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