Merge branch 'topic/lola' into for-linus
[pandora-kernel.git] / arch / arm / mach-omap2 / clockdomains2xxx_3xxx_data.c
1 /*
2  * OMAP2/3 clockdomains
3  *
4  * Copyright (C) 2008-2009 Texas Instruments, Inc.
5  * Copyright (C) 2008-2010 Nokia Corporation
6  *
7  * Paul Walmsley, Jouni Högander
8  *
9  * This file contains clockdomains and clockdomain wakeup/sleep
10  * dependencies for the OMAP2/3 chips.  Some notes:
11  *
12  * A useful validation rule for struct clockdomain: Any clockdomain
13  * referenced by a wkdep_srcs or sleepdep_srcs array must have a
14  * dep_bit assigned.  So wkdep_srcs/sleepdep_srcs are really just
15  * software-controllable dependencies.  Non-software-controllable
16  * dependencies do exist, but they are not encoded below (yet).
17  *
18  * 24xx does not support programmable sleep dependencies (SLEEPDEP)
19  *
20  * The overly-specific dep_bit names are due to a bit name collision
21  * with CM_FCLKEN_{DSP,IVA2}.  The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift
22  * value are the same for all powerdomains: 2
23  *
24  * XXX should dep_bit be a mask, so we can test to see if it is 0 as a
25  * sanity check?
26  * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE
27  */
28
29 /*
30  * To-Do List
31  * -> Port the Sleep/Wakeup dependencies for the domains
32  *    from the Power domain framework
33  */
34
35 #include <linux/kernel.h>
36 #include <linux/io.h>
37
38 #include "clockdomain.h"
39 #include "prm2xxx_3xxx.h"
40 #include "cm2xxx_3xxx.h"
41 #include "cm-regbits-24xx.h"
42 #include "cm-regbits-34xx.h"
43 #include "cm-regbits-44xx.h"
44 #include "prm-regbits-24xx.h"
45 #include "prm-regbits-34xx.h"
46
47 /*
48  * Clockdomain dependencies for wkdeps/sleepdeps
49  *
50  * XXX Hardware dependencies (e.g., dependencies that cannot be
51  * changed in software) are not included here yet, but should be.
52  */
53
54 /* OMAP2/3-common wakeup dependencies */
55
56 /*
57  * 2420/2430 PM_WKDEP_GFX: CORE, MPU, WKUP
58  * 3430ES1 PM_WKDEP_GFX: adds IVA2, removes CORE
59  * 3430ES2 PM_WKDEP_SGX: adds IVA2, removes CORE
60  * These can share data since they will never be present simultaneously
61  * on the same device.
62  */
63 static struct clkdm_dep gfx_sgx_wkdeps[] = {
64         {
65                 .clkdm_name = "core_l3_clkdm",
66                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
67         },
68         {
69                 .clkdm_name = "core_l4_clkdm",
70                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
71         },
72         {
73                 .clkdm_name = "iva2_clkdm",
74                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
75         },
76         {
77                 .clkdm_name = "mpu_clkdm",
78                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
79                                             CHIP_IS_OMAP3430)
80         },
81         {
82                 .clkdm_name = "wkup_clkdm",
83                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
84                                             CHIP_IS_OMAP3430)
85         },
86         { NULL },
87 };
88
89
90 /* 24XX-specific possible dependencies */
91
92 #ifdef CONFIG_ARCH_OMAP2
93
94 /* Wakeup dependency source arrays */
95
96 /* 2420/2430 PM_WKDEP_DSP: CORE, MPU, WKUP */
97 static struct clkdm_dep dsp_24xx_wkdeps[] = {
98         {
99                 .clkdm_name = "core_l3_clkdm",
100                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
101         },
102         {
103                 .clkdm_name = "core_l4_clkdm",
104                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
105         },
106         {
107                 .clkdm_name = "mpu_clkdm",
108                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
109         },
110         {
111                 .clkdm_name = "wkup_clkdm",
112                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
113         },
114         { NULL },
115 };
116
117 /*
118  * 2420 PM_WKDEP_MPU: CORE, DSP, WKUP
119  * 2430 adds MDM
120  */
121 static struct clkdm_dep mpu_24xx_wkdeps[] = {
122         {
123                 .clkdm_name = "core_l3_clkdm",
124                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
125         },
126         {
127                 .clkdm_name = "core_l4_clkdm",
128                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
129         },
130         {
131                 .clkdm_name = "dsp_clkdm",
132                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
133         },
134         {
135                 .clkdm_name = "wkup_clkdm",
136                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
137         },
138         {
139                 .clkdm_name = "mdm_clkdm",
140                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
141         },
142         { NULL },
143 };
144
145 /*
146  * 2420 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP
147  * 2430 adds MDM
148  */
149 static struct clkdm_dep core_24xx_wkdeps[] = {
150         {
151                 .clkdm_name = "dsp_clkdm",
152                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
153         },
154         {
155                 .clkdm_name = "gfx_clkdm",
156                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
157         },
158         {
159                 .clkdm_name = "mpu_clkdm",
160                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
161         },
162         {
163                 .clkdm_name = "wkup_clkdm",
164                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
165         },
166         {
167                 .clkdm_name = "mdm_clkdm",
168                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
169         },
170         { NULL },
171 };
172
173 #endif /* CONFIG_ARCH_OMAP2 */
174
175 /* 2430-specific possible wakeup dependencies */
176
177 #ifdef CONFIG_SOC_OMAP2430
178
179 /* 2430 PM_WKDEP_MDM: CORE, MPU, WKUP */
180 static struct clkdm_dep mdm_2430_wkdeps[] = {
181         {
182                 .clkdm_name = "core_l3_clkdm",
183                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
184         },
185         {
186                 .clkdm_name = "core_l4_clkdm",
187                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
188         },
189         {
190                 .clkdm_name = "mpu_clkdm",
191                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
192         },
193         {
194                 .clkdm_name = "wkup_clkdm",
195                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
196         },
197         { NULL },
198 };
199
200 #endif /* CONFIG_SOC_OMAP2430 */
201
202
203 /* OMAP3-specific possible dependencies */
204
205 #ifdef CONFIG_ARCH_OMAP3
206
207 /* 3430: PM_WKDEP_PER: CORE, IVA2, MPU, WKUP */
208 static struct clkdm_dep per_wkdeps[] = {
209         {
210                 .clkdm_name = "core_l3_clkdm",
211                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
212         },
213         {
214                 .clkdm_name = "core_l4_clkdm",
215                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
216         },
217         {
218                 .clkdm_name = "iva2_clkdm",
219                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
220         },
221         {
222                 .clkdm_name = "mpu_clkdm",
223                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
224         },
225         {
226                 .clkdm_name = "wkup_clkdm",
227                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
228         },
229         { NULL },
230 };
231
232 /* 3430ES2: PM_WKDEP_USBHOST: CORE, IVA2, MPU, WKUP */
233 static struct clkdm_dep usbhost_wkdeps[] = {
234         {
235                 .clkdm_name = "core_l3_clkdm",
236                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
237         },
238         {
239                 .clkdm_name = "core_l4_clkdm",
240                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
241         },
242         {
243                 .clkdm_name = "iva2_clkdm",
244                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
245         },
246         {
247                 .clkdm_name = "mpu_clkdm",
248                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
249         },
250         {
251                 .clkdm_name = "wkup_clkdm",
252                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
253         },
254         { NULL },
255 };
256
257 /* 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER */
258 static struct clkdm_dep mpu_3xxx_wkdeps[] = {
259         {
260                 .clkdm_name = "core_l3_clkdm",
261                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
262         },
263         {
264                 .clkdm_name = "core_l4_clkdm",
265                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
266         },
267         {
268                 .clkdm_name = "iva2_clkdm",
269                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
270         },
271         {
272                 .clkdm_name = "dss_clkdm",
273                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
274         },
275         {
276                 .clkdm_name = "per_clkdm",
277                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
278         },
279         { NULL },
280 };
281
282 /* 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER */
283 static struct clkdm_dep iva2_wkdeps[] = {
284         {
285                 .clkdm_name = "core_l3_clkdm",
286                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
287         },
288         {
289                 .clkdm_name = "core_l4_clkdm",
290                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
291         },
292         {
293                 .clkdm_name = "mpu_clkdm",
294                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
295         },
296         {
297                 .clkdm_name = "wkup_clkdm",
298                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
299         },
300         {
301                 .clkdm_name = "dss_clkdm",
302                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
303         },
304         {
305                 .clkdm_name = "per_clkdm",
306                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
307         },
308         { NULL },
309 };
310
311
312 /* 3430 PM_WKDEP_CAM: IVA2, MPU, WKUP */
313 static struct clkdm_dep cam_wkdeps[] = {
314         {
315                 .clkdm_name = "iva2_clkdm",
316                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
317         },
318         {
319                 .clkdm_name = "mpu_clkdm",
320                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
321         },
322         {
323                 .clkdm_name = "wkup_clkdm",
324                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
325         },
326         { NULL },
327 };
328
329 /* 3430 PM_WKDEP_DSS: IVA2, MPU, WKUP */
330 static struct clkdm_dep dss_wkdeps[] = {
331         {
332                 .clkdm_name = "iva2_clkdm",
333                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
334         },
335         {
336                 .clkdm_name = "mpu_clkdm",
337                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
338         },
339         {
340                 .clkdm_name = "wkup_clkdm",
341                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
342         },
343         { NULL },
344 };
345
346 /* 3430: PM_WKDEP_NEON: MPU */
347 static struct clkdm_dep neon_wkdeps[] = {
348         {
349                 .clkdm_name = "mpu_clkdm",
350                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
351         },
352         { NULL },
353 };
354
355
356 /* Sleep dependency source arrays for OMAP3-specific clkdms */
357
358 /* 3430: CM_SLEEPDEP_DSS: MPU, IVA */
359 static struct clkdm_dep dss_sleepdeps[] = {
360         {
361                 .clkdm_name = "mpu_clkdm",
362                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
363         },
364         {
365                 .clkdm_name = "iva2_clkdm",
366                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
367         },
368         { NULL },
369 };
370
371 /* 3430: CM_SLEEPDEP_PER: MPU, IVA */
372 static struct clkdm_dep per_sleepdeps[] = {
373         {
374                 .clkdm_name = "mpu_clkdm",
375                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
376         },
377         {
378                 .clkdm_name = "iva2_clkdm",
379                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
380         },
381         { NULL },
382 };
383
384 /* 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA */
385 static struct clkdm_dep usbhost_sleepdeps[] = {
386         {
387                 .clkdm_name = "mpu_clkdm",
388                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
389         },
390         {
391                 .clkdm_name = "iva2_clkdm",
392                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
393         },
394         { NULL },
395 };
396
397 /* 3430: CM_SLEEPDEP_CAM: MPU */
398 static struct clkdm_dep cam_sleepdeps[] = {
399         {
400                 .clkdm_name = "mpu_clkdm",
401                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
402         },
403         { NULL },
404 };
405
406 /*
407  * 3430ES1: CM_SLEEPDEP_GFX: MPU
408  * 3430ES2: CM_SLEEPDEP_SGX: MPU
409  * These can share data since they will never be present simultaneously
410  * on the same device.
411  */
412 static struct clkdm_dep gfx_sgx_sleepdeps[] = {
413         {
414                 .clkdm_name = "mpu_clkdm",
415                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
416         },
417         { NULL },
418 };
419
420 #endif /* CONFIG_ARCH_OMAP3 */
421
422
423 /*
424  * OMAP2/3-common clockdomains
425  *
426  * Even though the 2420 has a single PRCM module from the
427  * interconnect's perspective, internally it does appear to have
428  * separate PRM and CM clockdomains.  The usual test case is
429  * sys_clkout/sys_clkout2.
430  */
431
432 /* This is an implicit clockdomain - it is never defined as such in TRM */
433 static struct clockdomain wkup_clkdm = {
434         .name           = "wkup_clkdm",
435         .pwrdm          = { .name = "wkup_pwrdm" },
436         .dep_bit        = OMAP_EN_WKUP_SHIFT,
437         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
438 };
439
440 static struct clockdomain prm_clkdm = {
441         .name           = "prm_clkdm",
442         .pwrdm          = { .name = "wkup_pwrdm" },
443         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
444 };
445
446 static struct clockdomain cm_clkdm = {
447         .name           = "cm_clkdm",
448         .pwrdm          = { .name = "core_pwrdm" },
449         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
450 };
451
452 /*
453  * 2420-only clockdomains
454  */
455
456 #if defined(CONFIG_SOC_OMAP2420)
457
458 static struct clockdomain mpu_2420_clkdm = {
459         .name           = "mpu_clkdm",
460         .pwrdm          = { .name = "mpu_pwrdm" },
461         .flags          = CLKDM_CAN_HWSUP,
462         .wkdep_srcs     = mpu_24xx_wkdeps,
463         .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
464         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
465 };
466
467 static struct clockdomain iva1_2420_clkdm = {
468         .name           = "iva1_clkdm",
469         .pwrdm          = { .name = "dsp_pwrdm" },
470         .flags          = CLKDM_CAN_HWSUP_SWSUP,
471         .dep_bit        = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
472         .wkdep_srcs     = dsp_24xx_wkdeps,
473         .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK,
474         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
475 };
476
477 static struct clockdomain dsp_2420_clkdm = {
478         .name           = "dsp_clkdm",
479         .pwrdm          = { .name = "dsp_pwrdm" },
480         .flags          = CLKDM_CAN_HWSUP_SWSUP,
481         .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
482         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
483 };
484
485 static struct clockdomain gfx_2420_clkdm = {
486         .name           = "gfx_clkdm",
487         .pwrdm          = { .name = "gfx_pwrdm" },
488         .flags          = CLKDM_CAN_HWSUP_SWSUP,
489         .wkdep_srcs     = gfx_sgx_wkdeps,
490         .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
491         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
492 };
493
494 static struct clockdomain core_l3_2420_clkdm = {
495         .name           = "core_l3_clkdm",
496         .pwrdm          = { .name = "core_pwrdm" },
497         .flags          = CLKDM_CAN_HWSUP,
498         .wkdep_srcs     = core_24xx_wkdeps,
499         .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
500         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
501 };
502
503 static struct clockdomain core_l4_2420_clkdm = {
504         .name           = "core_l4_clkdm",
505         .pwrdm          = { .name = "core_pwrdm" },
506         .flags          = CLKDM_CAN_HWSUP,
507         .wkdep_srcs     = core_24xx_wkdeps,
508         .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
509         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
510 };
511
512 static struct clockdomain dss_2420_clkdm = {
513         .name           = "dss_clkdm",
514         .pwrdm          = { .name = "core_pwrdm" },
515         .flags          = CLKDM_CAN_HWSUP,
516         .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
517         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
518 };
519
520 #endif   /* CONFIG_SOC_OMAP2420 */
521
522
523 /*
524  * 2430-only clockdomains
525  */
526
527 #if defined(CONFIG_SOC_OMAP2430)
528
529 static struct clockdomain mpu_2430_clkdm = {
530         .name           = "mpu_clkdm",
531         .pwrdm          = { .name = "mpu_pwrdm" },
532         .flags          = CLKDM_CAN_HWSUP_SWSUP,
533         .wkdep_srcs     = mpu_24xx_wkdeps,
534         .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
535         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
536 };
537
538 /* Another case of bit name collisions between several registers: EN_MDM */
539 static struct clockdomain mdm_clkdm = {
540         .name           = "mdm_clkdm",
541         .pwrdm          = { .name = "mdm_pwrdm" },
542         .flags          = CLKDM_CAN_HWSUP_SWSUP,
543         .dep_bit        = OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT,
544         .wkdep_srcs     = mdm_2430_wkdeps,
545         .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK,
546         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
547 };
548
549 static struct clockdomain dsp_2430_clkdm = {
550         .name           = "dsp_clkdm",
551         .pwrdm          = { .name = "dsp_pwrdm" },
552         .flags          = CLKDM_CAN_HWSUP_SWSUP,
553         .dep_bit        = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
554         .wkdep_srcs     = dsp_24xx_wkdeps,
555         .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
556         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
557 };
558
559 static struct clockdomain gfx_2430_clkdm = {
560         .name           = "gfx_clkdm",
561         .pwrdm          = { .name = "gfx_pwrdm" },
562         .flags          = CLKDM_CAN_HWSUP_SWSUP,
563         .wkdep_srcs     = gfx_sgx_wkdeps,
564         .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
565         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
566 };
567
568 /*
569  * XXX add usecounting for clkdm dependencies, otherwise the presence
570  * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
571  * could cause trouble
572  */
573 static struct clockdomain core_l3_2430_clkdm = {
574         .name           = "core_l3_clkdm",
575         .pwrdm          = { .name = "core_pwrdm" },
576         .flags          = CLKDM_CAN_HWSUP,
577         .dep_bit        = OMAP24XX_EN_CORE_SHIFT,
578         .wkdep_srcs     = core_24xx_wkdeps,
579         .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
580         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
581 };
582
583 /*
584  * XXX add usecounting for clkdm dependencies, otherwise the presence
585  * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
586  * could cause trouble
587  */
588 static struct clockdomain core_l4_2430_clkdm = {
589         .name           = "core_l4_clkdm",
590         .pwrdm          = { .name = "core_pwrdm" },
591         .flags          = CLKDM_CAN_HWSUP,
592         .dep_bit        = OMAP24XX_EN_CORE_SHIFT,
593         .wkdep_srcs     = core_24xx_wkdeps,
594         .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
595         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
596 };
597
598 static struct clockdomain dss_2430_clkdm = {
599         .name           = "dss_clkdm",
600         .pwrdm          = { .name = "core_pwrdm" },
601         .flags          = CLKDM_CAN_HWSUP,
602         .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
603         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
604 };
605
606 #endif    /* CONFIG_SOC_OMAP2430 */
607
608
609 /*
610  * OMAP3 clockdomains
611  */
612
613 #if defined(CONFIG_ARCH_OMAP3)
614
615 static struct clockdomain mpu_3xxx_clkdm = {
616         .name           = "mpu_clkdm",
617         .pwrdm          = { .name = "mpu_pwrdm" },
618         .flags          = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
619         .dep_bit        = OMAP3430_EN_MPU_SHIFT,
620         .wkdep_srcs     = mpu_3xxx_wkdeps,
621         .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
622         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
623 };
624
625 static struct clockdomain neon_clkdm = {
626         .name           = "neon_clkdm",
627         .pwrdm          = { .name = "neon_pwrdm" },
628         .flags          = CLKDM_CAN_HWSUP_SWSUP,
629         .wkdep_srcs     = neon_wkdeps,
630         .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
631         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
632 };
633
634 static struct clockdomain iva2_clkdm = {
635         .name           = "iva2_clkdm",
636         .pwrdm          = { .name = "iva2_pwrdm" },
637         .flags          = CLKDM_CAN_HWSUP_SWSUP,
638         .dep_bit        = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
639         .wkdep_srcs     = iva2_wkdeps,
640         .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
641         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
642 };
643
644 static struct clockdomain gfx_3430es1_clkdm = {
645         .name           = "gfx_clkdm",
646         .pwrdm          = { .name = "gfx_pwrdm" },
647         .flags          = CLKDM_CAN_HWSUP_SWSUP,
648         .wkdep_srcs     = gfx_sgx_wkdeps,
649         .sleepdep_srcs  = gfx_sgx_sleepdeps,
650         .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
651         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1),
652 };
653
654 static struct clockdomain sgx_clkdm = {
655         .name           = "sgx_clkdm",
656         .pwrdm          = { .name = "sgx_pwrdm" },
657         .flags          = CLKDM_CAN_HWSUP_SWSUP,
658         .wkdep_srcs     = gfx_sgx_wkdeps,
659         .sleepdep_srcs  = gfx_sgx_sleepdeps,
660         .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
661         .omap_chip      = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
662 };
663
664 /*
665  * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but
666  * then that information was removed from the 34xx ES2+ TRM.  It is
667  * unclear whether the core is still there, but the clockdomain logic
668  * is there, and must be programmed to an appropriate state if the
669  * CORE clockdomain is to become inactive.
670  */
671 static struct clockdomain d2d_clkdm = {
672         .name           = "d2d_clkdm",
673         .pwrdm          = { .name = "core_pwrdm" },
674         .flags          = CLKDM_CAN_HWSUP_SWSUP,
675         .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
676         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
677 };
678
679 /*
680  * XXX add usecounting for clkdm dependencies, otherwise the presence
681  * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
682  * could cause trouble
683  */
684 static struct clockdomain core_l3_3xxx_clkdm = {
685         .name           = "core_l3_clkdm",
686         .pwrdm          = { .name = "core_pwrdm" },
687         .flags          = CLKDM_CAN_HWSUP,
688         .dep_bit        = OMAP3430_EN_CORE_SHIFT,
689         .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
690         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
691 };
692
693 /*
694  * XXX add usecounting for clkdm dependencies, otherwise the presence
695  * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
696  * could cause trouble
697  */
698 static struct clockdomain core_l4_3xxx_clkdm = {
699         .name           = "core_l4_clkdm",
700         .pwrdm          = { .name = "core_pwrdm" },
701         .flags          = CLKDM_CAN_HWSUP,
702         .dep_bit        = OMAP3430_EN_CORE_SHIFT,
703         .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
704         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
705 };
706
707 /* Another case of bit name collisions between several registers: EN_DSS */
708 static struct clockdomain dss_3xxx_clkdm = {
709         .name           = "dss_clkdm",
710         .pwrdm          = { .name = "dss_pwrdm" },
711         .flags          = CLKDM_CAN_HWSUP_SWSUP,
712         .dep_bit        = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
713         .wkdep_srcs     = dss_wkdeps,
714         .sleepdep_srcs  = dss_sleepdeps,
715         .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
716         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
717 };
718
719 static struct clockdomain cam_clkdm = {
720         .name           = "cam_clkdm",
721         .pwrdm          = { .name = "cam_pwrdm" },
722         .flags          = CLKDM_CAN_HWSUP_SWSUP,
723         .wkdep_srcs     = cam_wkdeps,
724         .sleepdep_srcs  = cam_sleepdeps,
725         .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
726         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
727 };
728
729 static struct clockdomain usbhost_clkdm = {
730         .name           = "usbhost_clkdm",
731         .pwrdm          = { .name = "usbhost_pwrdm" },
732         .flags          = CLKDM_CAN_HWSUP_SWSUP,
733         .wkdep_srcs     = usbhost_wkdeps,
734         .sleepdep_srcs  = usbhost_sleepdeps,
735         .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
736         .omap_chip      = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
737 };
738
739 static struct clockdomain per_clkdm = {
740         .name           = "per_clkdm",
741         .pwrdm          = { .name = "per_pwrdm" },
742         .flags          = CLKDM_CAN_HWSUP_SWSUP,
743         .dep_bit        = OMAP3430_EN_PER_SHIFT,
744         .wkdep_srcs     = per_wkdeps,
745         .sleepdep_srcs  = per_sleepdeps,
746         .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
747         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
748 };
749
750 /*
751  * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is
752  * switched of even if sdti is in use
753  */
754 static struct clockdomain emu_clkdm = {
755         .name           = "emu_clkdm",
756         .pwrdm          = { .name = "emu_pwrdm" },
757         .flags          = /* CLKDM_CAN_ENABLE_AUTO |  */CLKDM_CAN_SWSUP,
758         .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
759         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
760 };
761
762 static struct clockdomain dpll1_clkdm = {
763         .name           = "dpll1_clkdm",
764         .pwrdm          = { .name = "dpll1_pwrdm" },
765         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
766 };
767
768 static struct clockdomain dpll2_clkdm = {
769         .name           = "dpll2_clkdm",
770         .pwrdm          = { .name = "dpll2_pwrdm" },
771         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
772 };
773
774 static struct clockdomain dpll3_clkdm = {
775         .name           = "dpll3_clkdm",
776         .pwrdm          = { .name = "dpll3_pwrdm" },
777         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
778 };
779
780 static struct clockdomain dpll4_clkdm = {
781         .name           = "dpll4_clkdm",
782         .pwrdm          = { .name = "dpll4_pwrdm" },
783         .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
784 };
785
786 static struct clockdomain dpll5_clkdm = {
787         .name           = "dpll5_clkdm",
788         .pwrdm          = { .name = "dpll5_pwrdm" },
789         .omap_chip      = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
790 };
791
792 #endif   /* CONFIG_ARCH_OMAP3 */
793
794 /*
795  * Clockdomain hwsup dependencies (OMAP3 only)
796  */
797
798 static struct clkdm_autodep clkdm_autodeps[] = {
799         {
800                 .clkdm     = { .name = "mpu_clkdm" },
801                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
802         },
803         {
804                 .clkdm     = { .name = "iva2_clkdm" },
805                 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
806         },
807         {
808                 .clkdm     = { .name = NULL },
809         }
810 };
811
812 static struct clockdomain *clockdomains_omap2[] __initdata = {
813         &wkup_clkdm,
814         &cm_clkdm,
815         &prm_clkdm,
816
817 #ifdef CONFIG_SOC_OMAP2420
818         &mpu_2420_clkdm,
819         &iva1_2420_clkdm,
820         &dsp_2420_clkdm,
821         &gfx_2420_clkdm,
822         &core_l3_2420_clkdm,
823         &core_l4_2420_clkdm,
824         &dss_2420_clkdm,
825 #endif
826
827 #ifdef CONFIG_SOC_OMAP2430
828         &mpu_2430_clkdm,
829         &mdm_clkdm,
830         &dsp_2430_clkdm,
831         &gfx_2430_clkdm,
832         &core_l3_2430_clkdm,
833         &core_l4_2430_clkdm,
834         &dss_2430_clkdm,
835 #endif
836
837 #ifdef CONFIG_ARCH_OMAP3
838         &mpu_3xxx_clkdm,
839         &neon_clkdm,
840         &iva2_clkdm,
841         &gfx_3430es1_clkdm,
842         &sgx_clkdm,
843         &d2d_clkdm,
844         &core_l3_3xxx_clkdm,
845         &core_l4_3xxx_clkdm,
846         &dss_3xxx_clkdm,
847         &cam_clkdm,
848         &usbhost_clkdm,
849         &per_clkdm,
850         &emu_clkdm,
851         &dpll1_clkdm,
852         &dpll2_clkdm,
853         &dpll3_clkdm,
854         &dpll4_clkdm,
855         &dpll5_clkdm,
856 #endif
857         NULL,
858 };
859
860 void __init omap2xxx_clockdomains_init(void)
861 {
862         clkdm_init(clockdomains_omap2, clkdm_autodeps, &omap2_clkdm_operations);
863 }
864
865 void __init omap3xxx_clockdomains_init(void)
866 {
867         clkdm_init(clockdomains_omap2, clkdm_autodeps, &omap3_clkdm_operations);
868 }