1a5ffef6aSPaul Walmsley /*
2a5ffef6aSPaul Walmsley  * OMAP3xxx clockdomains
3a5ffef6aSPaul Walmsley  *
4a5ffef6aSPaul Walmsley  * Copyright (C) 2008-2011 Texas Instruments, Inc.
5a5ffef6aSPaul Walmsley  * Copyright (C) 2008-2010 Nokia Corporation
6a5ffef6aSPaul Walmsley  *
7a5ffef6aSPaul Walmsley  * Paul Walmsley, Jouni Högander
8a5ffef6aSPaul Walmsley  *
9a5ffef6aSPaul Walmsley  * This file contains clockdomains and clockdomain wakeup/sleep
10a5ffef6aSPaul Walmsley  * dependencies for the OMAP3xxx chips.  Some notes:
11a5ffef6aSPaul Walmsley  *
12a5ffef6aSPaul Walmsley  * A useful validation rule for struct clockdomain: Any clockdomain
13a5ffef6aSPaul Walmsley  * referenced by a wkdep_srcs or sleepdep_srcs array must have a
14a5ffef6aSPaul Walmsley  * dep_bit assigned.  So wkdep_srcs/sleepdep_srcs are really just
15a5ffef6aSPaul Walmsley  * software-controllable dependencies.  Non-software-controllable
16a5ffef6aSPaul Walmsley  * dependencies do exist, but they are not encoded below (yet).
17a5ffef6aSPaul Walmsley  *
18a5ffef6aSPaul Walmsley  * The overly-specific dep_bit names are due to a bit name collision
19a5ffef6aSPaul Walmsley  * with CM_FCLKEN_{DSP,IVA2}.  The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift
20a5ffef6aSPaul Walmsley  * value are the same for all powerdomains: 2
21a5ffef6aSPaul Walmsley  *
22a5ffef6aSPaul Walmsley  * XXX should dep_bit be a mask, so we can test to see if it is 0 as a
23a5ffef6aSPaul Walmsley  * sanity check?
24a5ffef6aSPaul Walmsley  * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE
25a5ffef6aSPaul Walmsley  */
26a5ffef6aSPaul Walmsley 
27a5ffef6aSPaul Walmsley /*
28a5ffef6aSPaul Walmsley  * To-Do List
29a5ffef6aSPaul Walmsley  * -> Port the Sleep/Wakeup dependencies for the domains
30a5ffef6aSPaul Walmsley  *    from the Power domain framework
31a5ffef6aSPaul Walmsley  */
32a5ffef6aSPaul Walmsley 
33a5ffef6aSPaul Walmsley #include <linux/kernel.h>
34a5ffef6aSPaul Walmsley #include <linux/io.h>
35a5ffef6aSPaul Walmsley 
36a5ffef6aSPaul Walmsley #include "clockdomain.h"
37a5ffef6aSPaul Walmsley #include "prm2xxx_3xxx.h"
38a5ffef6aSPaul Walmsley #include "cm2xxx_3xxx.h"
39a5ffef6aSPaul Walmsley #include "cm-regbits-34xx.h"
40a5ffef6aSPaul Walmsley #include "prm-regbits-34xx.h"
41a5ffef6aSPaul Walmsley 
42a5ffef6aSPaul Walmsley /*
43a5ffef6aSPaul Walmsley  * Clockdomain dependencies for wkdeps/sleepdeps
44a5ffef6aSPaul Walmsley  *
45a5ffef6aSPaul Walmsley  * XXX Hardware dependencies (e.g., dependencies that cannot be
46a5ffef6aSPaul Walmsley  * changed in software) are not included here yet, but should be.
47a5ffef6aSPaul Walmsley  */
48a5ffef6aSPaul Walmsley 
49a5ffef6aSPaul Walmsley /* OMAP3-specific possible dependencies */
50a5ffef6aSPaul Walmsley 
51a5ffef6aSPaul Walmsley /*
52a5ffef6aSPaul Walmsley  * 3430ES1 PM_WKDEP_GFX: adds IVA2, removes CORE
53a5ffef6aSPaul Walmsley  * 3430ES2 PM_WKDEP_SGX: adds IVA2, removes CORE
54a5ffef6aSPaul Walmsley  */
55a5ffef6aSPaul Walmsley static struct clkdm_dep gfx_sgx_3xxx_wkdeps[] = {
5648a6884fSMark A. Greer 	{ .clkdm_name = "iva2_clkdm" },
5748a6884fSMark A. Greer 	{ .clkdm_name = "mpu_clkdm" },
5848a6884fSMark A. Greer 	{ .clkdm_name = "wkup_clkdm" },
59a5ffef6aSPaul Walmsley 	{ NULL },
60a5ffef6aSPaul Walmsley };
61a5ffef6aSPaul Walmsley 
6216e5e2c4SMark A. Greer static struct clkdm_dep gfx_sgx_am35x_wkdeps[] = {
6316e5e2c4SMark A. Greer 	{ .clkdm_name = "mpu_clkdm" },
6416e5e2c4SMark A. Greer 	{ .clkdm_name = "wkup_clkdm" },
6516e5e2c4SMark A. Greer 	{ NULL },
6616e5e2c4SMark A. Greer };
6716e5e2c4SMark A. Greer 
68a5ffef6aSPaul Walmsley /* 3430: PM_WKDEP_PER: CORE, IVA2, MPU, WKUP */
69a5ffef6aSPaul Walmsley static struct clkdm_dep per_wkdeps[] = {
70a5ffef6aSPaul Walmsley 	{ .clkdm_name = "core_l3_clkdm" },
71a5ffef6aSPaul Walmsley 	{ .clkdm_name = "core_l4_clkdm" },
72a5ffef6aSPaul Walmsley 	{ .clkdm_name = "iva2_clkdm" },
73a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
74a5ffef6aSPaul Walmsley 	{ .clkdm_name = "wkup_clkdm" },
75a5ffef6aSPaul Walmsley 	{ NULL },
76a5ffef6aSPaul Walmsley };
77a5ffef6aSPaul Walmsley 
7816e5e2c4SMark A. Greer static struct clkdm_dep per_am35x_wkdeps[] = {
7916e5e2c4SMark A. Greer 	{ .clkdm_name = "core_l3_clkdm" },
8016e5e2c4SMark A. Greer 	{ .clkdm_name = "core_l4_clkdm" },
8116e5e2c4SMark A. Greer 	{ .clkdm_name = "mpu_clkdm" },
8216e5e2c4SMark A. Greer 	{ .clkdm_name = "wkup_clkdm" },
8316e5e2c4SMark A. Greer 	{ NULL },
8416e5e2c4SMark A. Greer };
8516e5e2c4SMark A. Greer 
86a5ffef6aSPaul Walmsley /* 3430ES2: PM_WKDEP_USBHOST: CORE, IVA2, MPU, WKUP */
87a5ffef6aSPaul Walmsley static struct clkdm_dep usbhost_wkdeps[] = {
88a5ffef6aSPaul Walmsley 	{ .clkdm_name = "core_l3_clkdm" },
89a5ffef6aSPaul Walmsley 	{ .clkdm_name = "core_l4_clkdm" },
90a5ffef6aSPaul Walmsley 	{ .clkdm_name = "iva2_clkdm" },
91a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
92a5ffef6aSPaul Walmsley 	{ .clkdm_name = "wkup_clkdm" },
93a5ffef6aSPaul Walmsley 	{ NULL },
94a5ffef6aSPaul Walmsley };
95a5ffef6aSPaul Walmsley 
9616e5e2c4SMark A. Greer static struct clkdm_dep usbhost_am35x_wkdeps[] = {
9716e5e2c4SMark A. Greer 	{ .clkdm_name = "core_l3_clkdm" },
9816e5e2c4SMark A. Greer 	{ .clkdm_name = "core_l4_clkdm" },
9916e5e2c4SMark A. Greer 	{ .clkdm_name = "mpu_clkdm" },
10016e5e2c4SMark A. Greer 	{ .clkdm_name = "wkup_clkdm" },
10116e5e2c4SMark A. Greer 	{ NULL },
10216e5e2c4SMark A. Greer };
10316e5e2c4SMark A. Greer 
104a5ffef6aSPaul Walmsley /* 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER */
105a5ffef6aSPaul Walmsley static struct clkdm_dep mpu_3xxx_wkdeps[] = {
106a5ffef6aSPaul Walmsley 	{ .clkdm_name = "core_l3_clkdm" },
107a5ffef6aSPaul Walmsley 	{ .clkdm_name = "core_l4_clkdm" },
108a5ffef6aSPaul Walmsley 	{ .clkdm_name = "iva2_clkdm" },
109a5ffef6aSPaul Walmsley 	{ .clkdm_name = "dss_clkdm" },
110a5ffef6aSPaul Walmsley 	{ .clkdm_name = "per_clkdm" },
111a5ffef6aSPaul Walmsley 	{ NULL },
112a5ffef6aSPaul Walmsley };
113a5ffef6aSPaul Walmsley 
11416e5e2c4SMark A. Greer static struct clkdm_dep mpu_am35x_wkdeps[] = {
11516e5e2c4SMark A. Greer 	{ .clkdm_name = "core_l3_clkdm" },
11616e5e2c4SMark A. Greer 	{ .clkdm_name = "core_l4_clkdm" },
11716e5e2c4SMark A. Greer 	{ .clkdm_name = "dss_clkdm" },
11816e5e2c4SMark A. Greer 	{ .clkdm_name = "per_clkdm" },
11916e5e2c4SMark A. Greer 	{ NULL },
12016e5e2c4SMark A. Greer };
12116e5e2c4SMark A. Greer 
122a5ffef6aSPaul Walmsley /* 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER */
123a5ffef6aSPaul Walmsley static struct clkdm_dep iva2_wkdeps[] = {
124a5ffef6aSPaul Walmsley 	{ .clkdm_name = "core_l3_clkdm" },
125a5ffef6aSPaul Walmsley 	{ .clkdm_name = "core_l4_clkdm" },
126a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
127a5ffef6aSPaul Walmsley 	{ .clkdm_name = "wkup_clkdm" },
128a5ffef6aSPaul Walmsley 	{ .clkdm_name = "dss_clkdm" },
129a5ffef6aSPaul Walmsley 	{ .clkdm_name = "per_clkdm" },
130a5ffef6aSPaul Walmsley 	{ NULL },
131a5ffef6aSPaul Walmsley };
132a5ffef6aSPaul Walmsley 
133a5ffef6aSPaul Walmsley /* 3430 PM_WKDEP_CAM: IVA2, MPU, WKUP */
134a5ffef6aSPaul Walmsley static struct clkdm_dep cam_wkdeps[] = {
135a5ffef6aSPaul Walmsley 	{ .clkdm_name = "iva2_clkdm" },
136a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
137a5ffef6aSPaul Walmsley 	{ .clkdm_name = "wkup_clkdm" },
138a5ffef6aSPaul Walmsley 	{ NULL },
139a5ffef6aSPaul Walmsley };
140a5ffef6aSPaul Walmsley 
141a5ffef6aSPaul Walmsley /* 3430 PM_WKDEP_DSS: IVA2, MPU, WKUP */
142a5ffef6aSPaul Walmsley static struct clkdm_dep dss_wkdeps[] = {
143a5ffef6aSPaul Walmsley 	{ .clkdm_name = "iva2_clkdm" },
144a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
145a5ffef6aSPaul Walmsley 	{ .clkdm_name = "wkup_clkdm" },
146a5ffef6aSPaul Walmsley 	{ NULL },
147a5ffef6aSPaul Walmsley };
148a5ffef6aSPaul Walmsley 
14916e5e2c4SMark A. Greer static struct clkdm_dep dss_am35x_wkdeps[] = {
15016e5e2c4SMark A. Greer 	{ .clkdm_name = "mpu_clkdm" },
15116e5e2c4SMark A. Greer 	{ .clkdm_name = "wkup_clkdm" },
15216e5e2c4SMark A. Greer 	{ NULL },
15316e5e2c4SMark A. Greer };
15416e5e2c4SMark A. Greer 
155a5ffef6aSPaul Walmsley /* 3430: PM_WKDEP_NEON: MPU */
156a5ffef6aSPaul Walmsley static struct clkdm_dep neon_wkdeps[] = {
157a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
158a5ffef6aSPaul Walmsley 	{ NULL },
159a5ffef6aSPaul Walmsley };
160a5ffef6aSPaul Walmsley 
161a5ffef6aSPaul Walmsley /* Sleep dependency source arrays for OMAP3-specific clkdms */
162a5ffef6aSPaul Walmsley 
163a5ffef6aSPaul Walmsley /* 3430: CM_SLEEPDEP_DSS: MPU, IVA */
164a5ffef6aSPaul Walmsley static struct clkdm_dep dss_sleepdeps[] = {
165a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
166a5ffef6aSPaul Walmsley 	{ .clkdm_name = "iva2_clkdm" },
167a5ffef6aSPaul Walmsley 	{ NULL },
168a5ffef6aSPaul Walmsley };
169a5ffef6aSPaul Walmsley 
17016e5e2c4SMark A. Greer static struct clkdm_dep dss_am35x_sleepdeps[] = {
17116e5e2c4SMark A. Greer 	{ .clkdm_name = "mpu_clkdm" },
17216e5e2c4SMark A. Greer 	{ NULL },
17316e5e2c4SMark A. Greer };
17416e5e2c4SMark A. Greer 
175a5ffef6aSPaul Walmsley /* 3430: CM_SLEEPDEP_PER: MPU, IVA */
176a5ffef6aSPaul Walmsley static struct clkdm_dep per_sleepdeps[] = {
177a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
178a5ffef6aSPaul Walmsley 	{ .clkdm_name = "iva2_clkdm" },
179a5ffef6aSPaul Walmsley 	{ NULL },
180a5ffef6aSPaul Walmsley };
181a5ffef6aSPaul Walmsley 
18216e5e2c4SMark A. Greer static struct clkdm_dep per_am35x_sleepdeps[] = {
18316e5e2c4SMark A. Greer 	{ .clkdm_name = "mpu_clkdm" },
18416e5e2c4SMark A. Greer 	{ NULL },
18516e5e2c4SMark A. Greer };
18616e5e2c4SMark A. Greer 
187a5ffef6aSPaul Walmsley /* 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA */
188a5ffef6aSPaul Walmsley static struct clkdm_dep usbhost_sleepdeps[] = {
189a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
190a5ffef6aSPaul Walmsley 	{ .clkdm_name = "iva2_clkdm" },
191a5ffef6aSPaul Walmsley 	{ NULL },
192a5ffef6aSPaul Walmsley };
193a5ffef6aSPaul Walmsley 
19416e5e2c4SMark A. Greer static struct clkdm_dep usbhost_am35x_sleepdeps[] = {
19516e5e2c4SMark A. Greer 	{ .clkdm_name = "mpu_clkdm" },
19616e5e2c4SMark A. Greer 	{ NULL },
19716e5e2c4SMark A. Greer };
19816e5e2c4SMark A. Greer 
199a5ffef6aSPaul Walmsley /* 3430: CM_SLEEPDEP_CAM: MPU */
200a5ffef6aSPaul Walmsley static struct clkdm_dep cam_sleepdeps[] = {
201a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
202a5ffef6aSPaul Walmsley 	{ NULL },
203a5ffef6aSPaul Walmsley };
204a5ffef6aSPaul Walmsley 
205a5ffef6aSPaul Walmsley /*
206a5ffef6aSPaul Walmsley  * 3430ES1: CM_SLEEPDEP_GFX: MPU
207a5ffef6aSPaul Walmsley  * 3430ES2: CM_SLEEPDEP_SGX: MPU
208a5ffef6aSPaul Walmsley  * These can share data since they will never be present simultaneously
209a5ffef6aSPaul Walmsley  * on the same device.
210a5ffef6aSPaul Walmsley  */
211a5ffef6aSPaul Walmsley static struct clkdm_dep gfx_sgx_sleepdeps[] = {
212a5ffef6aSPaul Walmsley 	{ .clkdm_name = "mpu_clkdm" },
213a5ffef6aSPaul Walmsley 	{ NULL },
214a5ffef6aSPaul Walmsley };
215a5ffef6aSPaul Walmsley 
216a5ffef6aSPaul Walmsley /*
217a5ffef6aSPaul Walmsley  * OMAP3 clockdomains
218a5ffef6aSPaul Walmsley  */
219a5ffef6aSPaul Walmsley 
220a5ffef6aSPaul Walmsley static struct clockdomain mpu_3xxx_clkdm = {
221a5ffef6aSPaul Walmsley 	.name		= "mpu_clkdm",
222a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "mpu_pwrdm" },
223a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
224a5ffef6aSPaul Walmsley 	.dep_bit	= OMAP3430_EN_MPU_SHIFT,
225a5ffef6aSPaul Walmsley 	.wkdep_srcs	= mpu_3xxx_wkdeps,
226a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
227a5ffef6aSPaul Walmsley };
228a5ffef6aSPaul Walmsley 
22916e5e2c4SMark A. Greer static struct clockdomain mpu_am35x_clkdm = {
23016e5e2c4SMark A. Greer 	.name		= "mpu_clkdm",
23116e5e2c4SMark A. Greer 	.pwrdm		= { .name = "mpu_pwrdm" },
23216e5e2c4SMark A. Greer 	.flags		= CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
23316e5e2c4SMark A. Greer 	.dep_bit	= OMAP3430_EN_MPU_SHIFT,
23416e5e2c4SMark A. Greer 	.wkdep_srcs	= mpu_am35x_wkdeps,
23516e5e2c4SMark A. Greer 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
23616e5e2c4SMark A. Greer };
23716e5e2c4SMark A. Greer 
238a5ffef6aSPaul Walmsley static struct clockdomain neon_clkdm = {
239a5ffef6aSPaul Walmsley 	.name		= "neon_clkdm",
240a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "neon_pwrdm" },
241a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
242a5ffef6aSPaul Walmsley 	.wkdep_srcs	= neon_wkdeps,
243a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
244a5ffef6aSPaul Walmsley };
245a5ffef6aSPaul Walmsley 
246a5ffef6aSPaul Walmsley static struct clockdomain iva2_clkdm = {
247a5ffef6aSPaul Walmsley 	.name		= "iva2_clkdm",
248a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "iva2_pwrdm" },
249a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
250a5ffef6aSPaul Walmsley 	.dep_bit	= OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
251a5ffef6aSPaul Walmsley 	.wkdep_srcs	= iva2_wkdeps,
252a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
253a5ffef6aSPaul Walmsley };
254a5ffef6aSPaul Walmsley 
255a5ffef6aSPaul Walmsley static struct clockdomain gfx_3430es1_clkdm = {
256a5ffef6aSPaul Walmsley 	.name		= "gfx_clkdm",
257a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "gfx_pwrdm" },
258a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
259a5ffef6aSPaul Walmsley 	.wkdep_srcs	= gfx_sgx_3xxx_wkdeps,
260a5ffef6aSPaul Walmsley 	.sleepdep_srcs	= gfx_sgx_sleepdeps,
261a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
262a5ffef6aSPaul Walmsley };
263a5ffef6aSPaul Walmsley 
264a5ffef6aSPaul Walmsley static struct clockdomain sgx_clkdm = {
265a5ffef6aSPaul Walmsley 	.name		= "sgx_clkdm",
266a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "sgx_pwrdm" },
267a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
268a5ffef6aSPaul Walmsley 	.wkdep_srcs	= gfx_sgx_3xxx_wkdeps,
269a5ffef6aSPaul Walmsley 	.sleepdep_srcs	= gfx_sgx_sleepdeps,
270a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
271a5ffef6aSPaul Walmsley };
272a5ffef6aSPaul Walmsley 
27316e5e2c4SMark A. Greer static struct clockdomain sgx_am35x_clkdm = {
27416e5e2c4SMark A. Greer 	.name		= "sgx_clkdm",
27516e5e2c4SMark A. Greer 	.pwrdm		= { .name = "sgx_pwrdm" },
27616e5e2c4SMark A. Greer 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
27716e5e2c4SMark A. Greer 	.wkdep_srcs	= gfx_sgx_am35x_wkdeps,
27816e5e2c4SMark A. Greer 	.sleepdep_srcs	= gfx_sgx_sleepdeps,
27916e5e2c4SMark A. Greer 	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
28016e5e2c4SMark A. Greer };
28116e5e2c4SMark A. Greer 
282a5ffef6aSPaul Walmsley /*
283a5ffef6aSPaul Walmsley  * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
284a5ffef6aSPaul Walmsley  * then that information was removed from the 34xx ES2+ TRM.  It is
285a5ffef6aSPaul Walmsley  * unclear whether the core is still there, but the clockdomain logic
286a5ffef6aSPaul Walmsley  * is there, and must be programmed to an appropriate state if the
287a5ffef6aSPaul Walmsley  * CORE clockdomain is to become inactive.
288a5ffef6aSPaul Walmsley  */
289a5ffef6aSPaul Walmsley static struct clockdomain d2d_clkdm = {
290a5ffef6aSPaul Walmsley 	.name		= "d2d_clkdm",
291a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "core_pwrdm" },
292a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
293a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
294a5ffef6aSPaul Walmsley };
295a5ffef6aSPaul Walmsley 
296a5ffef6aSPaul Walmsley /*
297a5ffef6aSPaul Walmsley  * XXX add usecounting for clkdm dependencies, otherwise the presence
298a5ffef6aSPaul Walmsley  * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
299a5ffef6aSPaul Walmsley  * could cause trouble
300a5ffef6aSPaul Walmsley  */
301a5ffef6aSPaul Walmsley static struct clockdomain core_l3_3xxx_clkdm = {
302a5ffef6aSPaul Walmsley 	.name		= "core_l3_clkdm",
303a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "core_pwrdm" },
304a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP,
305a5ffef6aSPaul Walmsley 	.dep_bit	= OMAP3430_EN_CORE_SHIFT,
306a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
307a5ffef6aSPaul Walmsley };
308a5ffef6aSPaul Walmsley 
309a5ffef6aSPaul Walmsley /*
310a5ffef6aSPaul Walmsley  * XXX add usecounting for clkdm dependencies, otherwise the presence
311a5ffef6aSPaul Walmsley  * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
312a5ffef6aSPaul Walmsley  * could cause trouble
313a5ffef6aSPaul Walmsley  */
314a5ffef6aSPaul Walmsley static struct clockdomain core_l4_3xxx_clkdm = {
315a5ffef6aSPaul Walmsley 	.name		= "core_l4_clkdm",
316a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "core_pwrdm" },
317a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP,
318a5ffef6aSPaul Walmsley 	.dep_bit	= OMAP3430_EN_CORE_SHIFT,
319a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
320a5ffef6aSPaul Walmsley };
321a5ffef6aSPaul Walmsley 
322a5ffef6aSPaul Walmsley /* Another case of bit name collisions between several registers: EN_DSS */
323a5ffef6aSPaul Walmsley static struct clockdomain dss_3xxx_clkdm = {
324a5ffef6aSPaul Walmsley 	.name		= "dss_clkdm",
325a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "dss_pwrdm" },
326a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
327a5ffef6aSPaul Walmsley 	.dep_bit	= OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
328a5ffef6aSPaul Walmsley 	.wkdep_srcs	= dss_wkdeps,
329a5ffef6aSPaul Walmsley 	.sleepdep_srcs	= dss_sleepdeps,
330a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
331a5ffef6aSPaul Walmsley };
332a5ffef6aSPaul Walmsley 
33316e5e2c4SMark A. Greer static struct clockdomain dss_am35x_clkdm = {
33416e5e2c4SMark A. Greer 	.name		= "dss_clkdm",
33516e5e2c4SMark A. Greer 	.pwrdm		= { .name = "dss_pwrdm" },
33616e5e2c4SMark A. Greer 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
33716e5e2c4SMark A. Greer 	.dep_bit	= OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
33816e5e2c4SMark A. Greer 	.wkdep_srcs	= dss_am35x_wkdeps,
33916e5e2c4SMark A. Greer 	.sleepdep_srcs	= dss_am35x_sleepdeps,
34016e5e2c4SMark A. Greer 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
34116e5e2c4SMark A. Greer };
34216e5e2c4SMark A. Greer 
343a5ffef6aSPaul Walmsley static struct clockdomain cam_clkdm = {
344a5ffef6aSPaul Walmsley 	.name		= "cam_clkdm",
345a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "cam_pwrdm" },
346a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
347a5ffef6aSPaul Walmsley 	.wkdep_srcs	= cam_wkdeps,
348a5ffef6aSPaul Walmsley 	.sleepdep_srcs	= cam_sleepdeps,
349a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
350a5ffef6aSPaul Walmsley };
351a5ffef6aSPaul Walmsley 
352a5ffef6aSPaul Walmsley static struct clockdomain usbhost_clkdm = {
353a5ffef6aSPaul Walmsley 	.name		= "usbhost_clkdm",
354a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "usbhost_pwrdm" },
355a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
356a5ffef6aSPaul Walmsley 	.wkdep_srcs	= usbhost_wkdeps,
357a5ffef6aSPaul Walmsley 	.sleepdep_srcs	= usbhost_sleepdeps,
358a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
359a5ffef6aSPaul Walmsley };
360a5ffef6aSPaul Walmsley 
36116e5e2c4SMark A. Greer static struct clockdomain usbhost_am35x_clkdm = {
36216e5e2c4SMark A. Greer 	.name		= "usbhost_clkdm",
36316e5e2c4SMark A. Greer 	.pwrdm		= { .name = "core_pwrdm" },
36416e5e2c4SMark A. Greer 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
36516e5e2c4SMark A. Greer 	.wkdep_srcs	= usbhost_am35x_wkdeps,
36616e5e2c4SMark A. Greer 	.sleepdep_srcs	= usbhost_am35x_sleepdeps,
36716e5e2c4SMark A. Greer 	.clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
36816e5e2c4SMark A. Greer };
36916e5e2c4SMark A. Greer 
370a5ffef6aSPaul Walmsley static struct clockdomain per_clkdm = {
371a5ffef6aSPaul Walmsley 	.name		= "per_clkdm",
372a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "per_pwrdm" },
373a5ffef6aSPaul Walmsley 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
374a5ffef6aSPaul Walmsley 	.dep_bit	= OMAP3430_EN_PER_SHIFT,
375a5ffef6aSPaul Walmsley 	.wkdep_srcs	= per_wkdeps,
376a5ffef6aSPaul Walmsley 	.sleepdep_srcs	= per_sleepdeps,
377a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
378a5ffef6aSPaul Walmsley };
379a5ffef6aSPaul Walmsley 
38016e5e2c4SMark A. Greer static struct clockdomain per_am35x_clkdm = {
38116e5e2c4SMark A. Greer 	.name		= "per_clkdm",
38216e5e2c4SMark A. Greer 	.pwrdm		= { .name = "per_pwrdm" },
38316e5e2c4SMark A. Greer 	.flags		= CLKDM_CAN_HWSUP_SWSUP,
38416e5e2c4SMark A. Greer 	.dep_bit	= OMAP3430_EN_PER_SHIFT,
38516e5e2c4SMark A. Greer 	.wkdep_srcs	= per_am35x_wkdeps,
38616e5e2c4SMark A. Greer 	.sleepdep_srcs	= per_am35x_sleepdeps,
38716e5e2c4SMark A. Greer 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
38816e5e2c4SMark A. Greer };
38916e5e2c4SMark A. Greer 
390a5ffef6aSPaul Walmsley /*
391a5ffef6aSPaul Walmsley  * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is
392a5ffef6aSPaul Walmsley  * switched of even if sdti is in use
393a5ffef6aSPaul Walmsley  */
394a5ffef6aSPaul Walmsley static struct clockdomain emu_clkdm = {
395a5ffef6aSPaul Walmsley 	.name		= "emu_clkdm",
396a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "emu_pwrdm" },
397a5ffef6aSPaul Walmsley 	.flags		= /* CLKDM_CAN_ENABLE_AUTO |  */CLKDM_CAN_SWSUP,
398a5ffef6aSPaul Walmsley 	.clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
399a5ffef6aSPaul Walmsley };
400a5ffef6aSPaul Walmsley 
401a5ffef6aSPaul Walmsley static struct clockdomain dpll1_clkdm = {
402a5ffef6aSPaul Walmsley 	.name		= "dpll1_clkdm",
403a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "dpll1_pwrdm" },
404a5ffef6aSPaul Walmsley };
405a5ffef6aSPaul Walmsley 
406a5ffef6aSPaul Walmsley static struct clockdomain dpll2_clkdm = {
407a5ffef6aSPaul Walmsley 	.name		= "dpll2_clkdm",
408a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "dpll2_pwrdm" },
409a5ffef6aSPaul Walmsley };
410a5ffef6aSPaul Walmsley 
411a5ffef6aSPaul Walmsley static struct clockdomain dpll3_clkdm = {
412a5ffef6aSPaul Walmsley 	.name		= "dpll3_clkdm",
413a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "dpll3_pwrdm" },
414a5ffef6aSPaul Walmsley };
415a5ffef6aSPaul Walmsley 
416a5ffef6aSPaul Walmsley static struct clockdomain dpll4_clkdm = {
417a5ffef6aSPaul Walmsley 	.name		= "dpll4_clkdm",
418a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "dpll4_pwrdm" },
419a5ffef6aSPaul Walmsley };
420a5ffef6aSPaul Walmsley 
421a5ffef6aSPaul Walmsley static struct clockdomain dpll5_clkdm = {
422a5ffef6aSPaul Walmsley 	.name		= "dpll5_clkdm",
423a5ffef6aSPaul Walmsley 	.pwrdm		= { .name = "dpll5_pwrdm" },
424a5ffef6aSPaul Walmsley };
425a5ffef6aSPaul Walmsley 
426a5ffef6aSPaul Walmsley /*
427a5ffef6aSPaul Walmsley  * Clockdomain hwsup dependencies
428a5ffef6aSPaul Walmsley  */
429a5ffef6aSPaul Walmsley 
430a5ffef6aSPaul Walmsley static struct clkdm_autodep clkdm_autodeps[] = {
431a5ffef6aSPaul Walmsley 	{
432a5ffef6aSPaul Walmsley 		.clkdm = { .name = "mpu_clkdm" },
433a5ffef6aSPaul Walmsley 	},
434a5ffef6aSPaul Walmsley 	{
435a5ffef6aSPaul Walmsley 		.clkdm = { .name = "iva2_clkdm" },
436a5ffef6aSPaul Walmsley 	},
437a5ffef6aSPaul Walmsley 	{
438a5ffef6aSPaul Walmsley 		.clkdm = { .name = NULL },
439a5ffef6aSPaul Walmsley 	}
440a5ffef6aSPaul Walmsley };
441a5ffef6aSPaul Walmsley 
44216e5e2c4SMark A. Greer static struct clkdm_autodep clkdm_am35x_autodeps[] = {
44316e5e2c4SMark A. Greer 	{
44416e5e2c4SMark A. Greer 		.clkdm = { .name = "mpu_clkdm" },
44516e5e2c4SMark A. Greer 	},
44616e5e2c4SMark A. Greer 	{
44716e5e2c4SMark A. Greer 		.clkdm = { .name = NULL },
44816e5e2c4SMark A. Greer 	}
44916e5e2c4SMark A. Greer };
45016e5e2c4SMark A. Greer 
451a5ffef6aSPaul Walmsley /*
452a5ffef6aSPaul Walmsley  *
453a5ffef6aSPaul Walmsley  */
454a5ffef6aSPaul Walmsley 
45516e5e2c4SMark A. Greer static struct clockdomain *clockdomains_common[] __initdata = {
456a5ffef6aSPaul Walmsley 	&wkup_common_clkdm,
457a5ffef6aSPaul Walmsley 	&cm_common_clkdm,
458a5ffef6aSPaul Walmsley 	&prm_common_clkdm,
459a5ffef6aSPaul Walmsley 	&neon_clkdm,
460a5ffef6aSPaul Walmsley 	&core_l3_3xxx_clkdm,
461a5ffef6aSPaul Walmsley 	&core_l4_3xxx_clkdm,
46216e5e2c4SMark A. Greer 	&emu_clkdm,
46316e5e2c4SMark A. Greer 	&dpll1_clkdm,
46416e5e2c4SMark A. Greer 	&dpll3_clkdm,
46516e5e2c4SMark A. Greer 	&dpll4_clkdm,
46616e5e2c4SMark A. Greer 	NULL
46716e5e2c4SMark A. Greer };
46816e5e2c4SMark A. Greer 
46916e5e2c4SMark A. Greer static struct clockdomain *clockdomains_omap3430[] __initdata = {
47016e5e2c4SMark A. Greer 	&mpu_3xxx_clkdm,
47116e5e2c4SMark A. Greer 	&iva2_clkdm,
47216e5e2c4SMark A. Greer 	&d2d_clkdm,
473a5ffef6aSPaul Walmsley 	&dss_3xxx_clkdm,
474a5ffef6aSPaul Walmsley 	&cam_clkdm,
475a5ffef6aSPaul Walmsley 	&per_clkdm,
476a5ffef6aSPaul Walmsley 	&dpll2_clkdm,
477a5ffef6aSPaul Walmsley 	NULL
478a5ffef6aSPaul Walmsley };
479a5ffef6aSPaul Walmsley 
480a5ffef6aSPaul Walmsley static struct clockdomain *clockdomains_omap3430es1[] __initdata = {
481a5ffef6aSPaul Walmsley 	&gfx_3430es1_clkdm,
482a5ffef6aSPaul Walmsley 	NULL,
483a5ffef6aSPaul Walmsley };
484a5ffef6aSPaul Walmsley 
485a5ffef6aSPaul Walmsley static struct clockdomain *clockdomains_omap3430es2plus[] __initdata = {
486a5ffef6aSPaul Walmsley 	&sgx_clkdm,
487a5ffef6aSPaul Walmsley 	&dpll5_clkdm,
488a5ffef6aSPaul Walmsley 	&usbhost_clkdm,
489a5ffef6aSPaul Walmsley 	NULL,
490a5ffef6aSPaul Walmsley };
491a5ffef6aSPaul Walmsley 
49216e5e2c4SMark A. Greer static struct clockdomain *clockdomains_am35x[] __initdata = {
49316e5e2c4SMark A. Greer 	&mpu_am35x_clkdm,
49416e5e2c4SMark A. Greer 	&sgx_am35x_clkdm,
49516e5e2c4SMark A. Greer 	&dss_am35x_clkdm,
49616e5e2c4SMark A. Greer 	&per_am35x_clkdm,
49716e5e2c4SMark A. Greer 	&usbhost_am35x_clkdm,
49816e5e2c4SMark A. Greer 	&dpll5_clkdm,
49916e5e2c4SMark A. Greer 	NULL
50016e5e2c4SMark A. Greer };
50116e5e2c4SMark A. Greer 
502a5ffef6aSPaul Walmsley void __init omap3xxx_clockdomains_init(void)
503a5ffef6aSPaul Walmsley {
504a5ffef6aSPaul Walmsley 	struct clockdomain **sc;
50516e5e2c4SMark A. Greer 	unsigned int rev;
506a5ffef6aSPaul Walmsley 
507a5ffef6aSPaul Walmsley 	if (!cpu_is_omap34xx())
508a5ffef6aSPaul Walmsley 		return;
509a5ffef6aSPaul Walmsley 
510a5ffef6aSPaul Walmsley 	clkdm_register_platform_funcs(&omap3_clkdm_operations);
51116e5e2c4SMark A. Greer 	clkdm_register_clkdms(clockdomains_common);
512a5ffef6aSPaul Walmsley 
51316e5e2c4SMark A. Greer 	rev = omap_rev();
51416e5e2c4SMark A. Greer 
51516e5e2c4SMark A. Greer 	if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
51616e5e2c4SMark A. Greer 		clkdm_register_clkdms(clockdomains_am35x);
51716e5e2c4SMark A. Greer 		clkdm_register_autodeps(clkdm_am35x_autodeps);
51816e5e2c4SMark A. Greer 	} else {
51916e5e2c4SMark A. Greer 		clkdm_register_clkdms(clockdomains_omap3430);
52016e5e2c4SMark A. Greer 
52116e5e2c4SMark A. Greer 		sc = (rev == OMAP3430_REV_ES1_0) ?
52216e5e2c4SMark A. Greer 			clockdomains_omap3430es1 : clockdomains_omap3430es2plus;
523a5ffef6aSPaul Walmsley 
524a5ffef6aSPaul Walmsley 		clkdm_register_clkdms(sc);
525a5ffef6aSPaul Walmsley 		clkdm_register_autodeps(clkdm_autodeps);
52616e5e2c4SMark A. Greer 	}
52716e5e2c4SMark A. Greer 
528a5ffef6aSPaul Walmsley 	clkdm_complete_init();
529a5ffef6aSPaul Walmsley }
530