diff options
author | Vaibhav Hiremath <hvaibhav@ti.com> | 2012-06-18 02:47:27 -0400 |
---|---|---|
committer | Paul Walmsley <paul@pwsan.com> | 2012-06-18 14:08:06 -0400 |
commit | 9c80f3aa8b7828c89c5bae5c769955d1ac58630b (patch) | |
tree | 4380085c128ab80d28fbb96806bfc4f85cd3cbb3 | |
parent | 3f0ea7645ae6d7111ebc3e83f47fbc0f2c8a8964 (diff) |
ARM: OMAP AM33xx: clockdomains: Add clockdomain data and respective operations
AM33XX PRCM module consists of various clockdomains, in all
total we have 18 clockdomains available, with following
controlling options,
- SW Sleep: sw forced sleep transition
- SW Wakeup: sw forced wakeup transition
This patch adds all available clockdomain data, respective
clockdomain operations for AM33XX family of device, and also
integrates it into existing OMAP framework.
Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
Signed-off-by: Afzal Mohammed <afzal@ti.com>
Signed-off-by: Vaibhav Bedia <vaibhav.bedia@ti.com>
Cc: Kevin Hilman <khilman@ti.com>
Cc: Rajendra Nayak <rnayak@ti.com>
CC: Tony Lindgren <tony@atomide.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
[paul@pwsan.com: removed CLKDM_NO_AUTODEPS from clockdomain flags, removed
unnecessary .clktrctrl_offs field; updated for 3.5]
Signed-off-by: Paul Walmsley <paul@pwsan.com>
-rw-r--r-- | arch/arm/mach-omap2/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clockdomain.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clockdomain33xx.c | 74 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clockdomains33xx_data.c | 196 | ||||
-rw-r--r-- | arch/arm/mach-omap2/io.c | 1 |
5 files changed, 275 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index b664dc8722aa..a4cf93242b0b 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -133,6 +133,8 @@ obj-$(CONFIG_ARCH_OMAP3) += clockdomains3xxx_data.o | |||
133 | obj-$(CONFIG_ARCH_OMAP4) += $(clockdomain-common) | 133 | obj-$(CONFIG_ARCH_OMAP4) += $(clockdomain-common) |
134 | obj-$(CONFIG_ARCH_OMAP4) += clockdomain44xx.o | 134 | obj-$(CONFIG_ARCH_OMAP4) += clockdomain44xx.o |
135 | obj-$(CONFIG_ARCH_OMAP4) += clockdomains44xx_data.o | 135 | obj-$(CONFIG_ARCH_OMAP4) += clockdomains44xx_data.o |
136 | obj-$(CONFIG_SOC_AM33XX) += clockdomain33xx.o | ||
137 | obj-$(CONFIG_SOC_AM33XX) += clockdomains33xx_data.o | ||
136 | 138 | ||
137 | # Clock framework | 139 | # Clock framework |
138 | obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o | 140 | obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o |
diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index f7b58609bad8..72cb12bbb9c3 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h | |||
@@ -195,6 +195,7 @@ int clkdm_hwmod_disable(struct clockdomain *clkdm, struct omap_hwmod *oh); | |||
195 | extern void __init omap242x_clockdomains_init(void); | 195 | extern void __init omap242x_clockdomains_init(void); |
196 | extern void __init omap243x_clockdomains_init(void); | 196 | extern void __init omap243x_clockdomains_init(void); |
197 | extern void __init omap3xxx_clockdomains_init(void); | 197 | extern void __init omap3xxx_clockdomains_init(void); |
198 | extern void __init am33xx_clockdomains_init(void); | ||
198 | extern void __init omap44xx_clockdomains_init(void); | 199 | extern void __init omap44xx_clockdomains_init(void); |
199 | extern void _clkdm_add_autodeps(struct clockdomain *clkdm); | 200 | extern void _clkdm_add_autodeps(struct clockdomain *clkdm); |
200 | extern void _clkdm_del_autodeps(struct clockdomain *clkdm); | 201 | extern void _clkdm_del_autodeps(struct clockdomain *clkdm); |
@@ -202,6 +203,7 @@ extern void _clkdm_del_autodeps(struct clockdomain *clkdm); | |||
202 | extern struct clkdm_ops omap2_clkdm_operations; | 203 | extern struct clkdm_ops omap2_clkdm_operations; |
203 | extern struct clkdm_ops omap3_clkdm_operations; | 204 | extern struct clkdm_ops omap3_clkdm_operations; |
204 | extern struct clkdm_ops omap4_clkdm_operations; | 205 | extern struct clkdm_ops omap4_clkdm_operations; |
206 | extern struct clkdm_ops am33xx_clkdm_operations; | ||
205 | 207 | ||
206 | extern struct clkdm_dep gfx_24xx_wkdeps[]; | 208 | extern struct clkdm_dep gfx_24xx_wkdeps[]; |
207 | extern struct clkdm_dep dsp_24xx_wkdeps[]; | 209 | extern struct clkdm_dep dsp_24xx_wkdeps[]; |
diff --git a/arch/arm/mach-omap2/clockdomain33xx.c b/arch/arm/mach-omap2/clockdomain33xx.c new file mode 100644 index 000000000000..aca6388fad76 --- /dev/null +++ b/arch/arm/mach-omap2/clockdomain33xx.c | |||
@@ -0,0 +1,74 @@ | |||
1 | /* | ||
2 | * AM33XX clockdomain control | ||
3 | * | ||
4 | * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ | ||
5 | * Vaibhav Hiremath <hvaibhav@ti.com> | ||
6 | * | ||
7 | * Derived from mach-omap2/clockdomain44xx.c written by Rajendra Nayak | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License as | ||
11 | * published by the Free Software Foundation version 2. | ||
12 | * | ||
13 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
14 | * kind, whether express or implied; without even the implied warranty | ||
15 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | |||
21 | #include "clockdomain.h" | ||
22 | #include "cm33xx.h" | ||
23 | |||
24 | |||
25 | static int am33xx_clkdm_sleep(struct clockdomain *clkdm) | ||
26 | { | ||
27 | am33xx_cm_clkdm_force_sleep(clkdm->cm_inst, clkdm->clkdm_offs); | ||
28 | return 0; | ||
29 | } | ||
30 | |||
31 | static int am33xx_clkdm_wakeup(struct clockdomain *clkdm) | ||
32 | { | ||
33 | am33xx_cm_clkdm_force_wakeup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
34 | return 0; | ||
35 | } | ||
36 | |||
37 | static void am33xx_clkdm_allow_idle(struct clockdomain *clkdm) | ||
38 | { | ||
39 | am33xx_cm_clkdm_enable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
40 | } | ||
41 | |||
42 | static void am33xx_clkdm_deny_idle(struct clockdomain *clkdm) | ||
43 | { | ||
44 | am33xx_cm_clkdm_disable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
45 | } | ||
46 | |||
47 | static int am33xx_clkdm_clk_enable(struct clockdomain *clkdm) | ||
48 | { | ||
49 | if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) | ||
50 | return am33xx_clkdm_wakeup(clkdm); | ||
51 | |||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | static int am33xx_clkdm_clk_disable(struct clockdomain *clkdm) | ||
56 | { | ||
57 | bool hwsup = false; | ||
58 | |||
59 | hwsup = am33xx_cm_is_clkdm_in_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
60 | |||
61 | if (!hwsup && (clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) | ||
62 | am33xx_clkdm_sleep(clkdm); | ||
63 | |||
64 | return 0; | ||
65 | } | ||
66 | |||
67 | struct clkdm_ops am33xx_clkdm_operations = { | ||
68 | .clkdm_sleep = am33xx_clkdm_sleep, | ||
69 | .clkdm_wakeup = am33xx_clkdm_wakeup, | ||
70 | .clkdm_allow_idle = am33xx_clkdm_allow_idle, | ||
71 | .clkdm_deny_idle = am33xx_clkdm_deny_idle, | ||
72 | .clkdm_clk_enable = am33xx_clkdm_clk_enable, | ||
73 | .clkdm_clk_disable = am33xx_clkdm_clk_disable, | ||
74 | }; | ||
diff --git a/arch/arm/mach-omap2/clockdomains33xx_data.c b/arch/arm/mach-omap2/clockdomains33xx_data.c new file mode 100644 index 000000000000..32c90fd9eba2 --- /dev/null +++ b/arch/arm/mach-omap2/clockdomains33xx_data.c | |||
@@ -0,0 +1,196 @@ | |||
1 | /* | ||
2 | * AM33XX Clock Domain data. | ||
3 | * | ||
4 | * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ | ||
5 | * Vaibhav Hiremath <hvaibhav@ti.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU General Public License as | ||
9 | * published by the Free Software Foundation version 2. | ||
10 | * | ||
11 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
12 | * kind, whether express or implied; without even the implied warranty | ||
13 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | */ | ||
16 | |||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/io.h> | ||
19 | |||
20 | #include "clockdomain.h" | ||
21 | #include "cm.h" | ||
22 | #include "cm33xx.h" | ||
23 | #include "cm-regbits-33xx.h" | ||
24 | |||
25 | static struct clockdomain l4ls_am33xx_clkdm = { | ||
26 | .name = "l4ls_clkdm", | ||
27 | .pwrdm = { .name = "per_pwrdm" }, | ||
28 | .cm_inst = AM33XX_CM_PER_MOD, | ||
29 | .clkdm_offs = AM33XX_CM_PER_L4LS_CLKSTCTRL_OFFSET, | ||
30 | .flags = CLKDM_CAN_SWSUP, | ||
31 | }; | ||
32 | |||
33 | static struct clockdomain l3s_am33xx_clkdm = { | ||
34 | .name = "l3s_clkdm", | ||
35 | .pwrdm = { .name = "per_pwrdm" }, | ||
36 | .cm_inst = AM33XX_CM_PER_MOD, | ||
37 | .clkdm_offs = AM33XX_CM_PER_L3S_CLKSTCTRL_OFFSET, | ||
38 | .flags = CLKDM_CAN_SWSUP, | ||
39 | }; | ||
40 | |||
41 | static struct clockdomain l4fw_am33xx_clkdm = { | ||
42 | .name = "l4fw_clkdm", | ||
43 | .pwrdm = { .name = "per_pwrdm" }, | ||
44 | .cm_inst = AM33XX_CM_PER_MOD, | ||
45 | .clkdm_offs = AM33XX_CM_PER_L4FW_CLKSTCTRL_OFFSET, | ||
46 | .flags = CLKDM_CAN_SWSUP, | ||
47 | }; | ||
48 | |||
49 | static struct clockdomain l3_am33xx_clkdm = { | ||
50 | .name = "l3_clkdm", | ||
51 | .pwrdm = { .name = "per_pwrdm" }, | ||
52 | .cm_inst = AM33XX_CM_PER_MOD, | ||
53 | .clkdm_offs = AM33XX_CM_PER_L3_CLKSTCTRL_OFFSET, | ||
54 | .flags = CLKDM_CAN_SWSUP, | ||
55 | }; | ||
56 | |||
57 | static struct clockdomain l4hs_am33xx_clkdm = { | ||
58 | .name = "l4hs_clkdm", | ||
59 | .pwrdm = { .name = "per_pwrdm" }, | ||
60 | .cm_inst = AM33XX_CM_PER_MOD, | ||
61 | .clkdm_offs = AM33XX_CM_PER_L4HS_CLKSTCTRL_OFFSET, | ||
62 | .flags = CLKDM_CAN_SWSUP, | ||
63 | }; | ||
64 | |||
65 | static struct clockdomain ocpwp_l3_am33xx_clkdm = { | ||
66 | .name = "ocpwp_l3_clkdm", | ||
67 | .pwrdm = { .name = "per_pwrdm" }, | ||
68 | .cm_inst = AM33XX_CM_PER_MOD, | ||
69 | .clkdm_offs = AM33XX_CM_PER_OCPWP_L3_CLKSTCTRL_OFFSET, | ||
70 | .flags = CLKDM_CAN_SWSUP, | ||
71 | }; | ||
72 | |||
73 | static struct clockdomain pruss_ocp_am33xx_clkdm = { | ||
74 | .name = "pruss_ocp_clkdm", | ||
75 | .pwrdm = { .name = "per_pwrdm" }, | ||
76 | .cm_inst = AM33XX_CM_PER_MOD, | ||
77 | .clkdm_offs = AM33XX_CM_PER_PRUSS_CLKSTCTRL_OFFSET, | ||
78 | .flags = CLKDM_CAN_SWSUP, | ||
79 | }; | ||
80 | |||
81 | static struct clockdomain cpsw_125mhz_am33xx_clkdm = { | ||
82 | .name = "cpsw_125mhz_clkdm", | ||
83 | .pwrdm = { .name = "per_pwrdm" }, | ||
84 | .cm_inst = AM33XX_CM_PER_MOD, | ||
85 | .clkdm_offs = AM33XX_CM_PER_CPSW_CLKSTCTRL_OFFSET, | ||
86 | .flags = CLKDM_CAN_SWSUP, | ||
87 | }; | ||
88 | |||
89 | static struct clockdomain lcdc_am33xx_clkdm = { | ||
90 | .name = "lcdc_clkdm", | ||
91 | .pwrdm = { .name = "per_pwrdm" }, | ||
92 | .cm_inst = AM33XX_CM_PER_MOD, | ||
93 | .clkdm_offs = AM33XX_CM_PER_LCDC_CLKSTCTRL_OFFSET, | ||
94 | .flags = CLKDM_CAN_SWSUP, | ||
95 | }; | ||
96 | |||
97 | static struct clockdomain clk_24mhz_am33xx_clkdm = { | ||
98 | .name = "clk_24mhz_clkdm", | ||
99 | .pwrdm = { .name = "per_pwrdm" }, | ||
100 | .cm_inst = AM33XX_CM_PER_MOD, | ||
101 | .clkdm_offs = AM33XX_CM_PER_CLK_24MHZ_CLKSTCTRL_OFFSET, | ||
102 | .flags = CLKDM_CAN_SWSUP, | ||
103 | }; | ||
104 | |||
105 | static struct clockdomain l4_wkup_am33xx_clkdm = { | ||
106 | .name = "l4_wkup_clkdm", | ||
107 | .pwrdm = { .name = "wkup_pwrdm" }, | ||
108 | .cm_inst = AM33XX_CM_WKUP_MOD, | ||
109 | .clkdm_offs = AM33XX_CM_WKUP_CLKSTCTRL_OFFSET, | ||
110 | .flags = CLKDM_CAN_SWSUP, | ||
111 | }; | ||
112 | |||
113 | static struct clockdomain l3_aon_am33xx_clkdm = { | ||
114 | .name = "l3_aon_clkdm", | ||
115 | .pwrdm = { .name = "wkup_pwrdm" }, | ||
116 | .cm_inst = AM33XX_CM_WKUP_MOD, | ||
117 | .clkdm_offs = AM33XX_CM_L3_AON_CLKSTCTRL_OFFSET, | ||
118 | .flags = CLKDM_CAN_SWSUP, | ||
119 | }; | ||
120 | |||
121 | static struct clockdomain l4_wkup_aon_am33xx_clkdm = { | ||
122 | .name = "l4_wkup_aon_clkdm", | ||
123 | .pwrdm = { .name = "wkup_pwrdm" }, | ||
124 | .cm_inst = AM33XX_CM_WKUP_MOD, | ||
125 | .clkdm_offs = AM33XX_CM_L4_WKUP_AON_CLKSTCTRL_OFFSET, | ||
126 | .flags = CLKDM_CAN_SWSUP, | ||
127 | }; | ||
128 | |||
129 | static struct clockdomain mpu_am33xx_clkdm = { | ||
130 | .name = "mpu_clkdm", | ||
131 | .pwrdm = { .name = "mpu_pwrdm" }, | ||
132 | .cm_inst = AM33XX_CM_MPU_MOD, | ||
133 | .clkdm_offs = AM33XX_CM_MPU_CLKSTCTRL_OFFSET, | ||
134 | .flags = CLKDM_CAN_SWSUP, | ||
135 | }; | ||
136 | |||
137 | static struct clockdomain l4_rtc_am33xx_clkdm = { | ||
138 | .name = "l4_rtc_clkdm", | ||
139 | .pwrdm = { .name = "rtc_pwrdm" }, | ||
140 | .cm_inst = AM33XX_CM_RTC_MOD, | ||
141 | .clkdm_offs = AM33XX_CM_RTC_CLKSTCTRL_OFFSET, | ||
142 | .flags = CLKDM_CAN_SWSUP, | ||
143 | }; | ||
144 | |||
145 | static struct clockdomain gfx_l3_am33xx_clkdm = { | ||
146 | .name = "gfx_l3_clkdm", | ||
147 | .pwrdm = { .name = "gfx_pwrdm" }, | ||
148 | .cm_inst = AM33XX_CM_GFX_MOD, | ||
149 | .clkdm_offs = AM33XX_CM_GFX_L3_CLKSTCTRL_OFFSET, | ||
150 | .flags = CLKDM_CAN_SWSUP, | ||
151 | }; | ||
152 | |||
153 | static struct clockdomain gfx_l4ls_gfx_am33xx_clkdm = { | ||
154 | .name = "gfx_l4ls_gfx_clkdm", | ||
155 | .pwrdm = { .name = "gfx_pwrdm" }, | ||
156 | .cm_inst = AM33XX_CM_GFX_MOD, | ||
157 | .clkdm_offs = AM33XX_CM_GFX_L4LS_GFX_CLKSTCTRL__1_OFFSET, | ||
158 | .flags = CLKDM_CAN_SWSUP, | ||
159 | }; | ||
160 | |||
161 | static struct clockdomain l4_cefuse_am33xx_clkdm = { | ||
162 | .name = "l4_cefuse_clkdm", | ||
163 | .pwrdm = { .name = "cefuse_pwrdm" }, | ||
164 | .cm_inst = AM33XX_CM_CEFUSE_MOD, | ||
165 | .clkdm_offs = AM33XX_CM_CEFUSE_CLKSTCTRL_OFFSET, | ||
166 | .flags = CLKDM_CAN_SWSUP, | ||
167 | }; | ||
168 | |||
169 | static struct clockdomain *clockdomains_am33xx[] __initdata = { | ||
170 | &l4ls_am33xx_clkdm, | ||
171 | &l3s_am33xx_clkdm, | ||
172 | &l4fw_am33xx_clkdm, | ||
173 | &l3_am33xx_clkdm, | ||
174 | &l4hs_am33xx_clkdm, | ||
175 | &ocpwp_l3_am33xx_clkdm, | ||
176 | &pruss_ocp_am33xx_clkdm, | ||
177 | &cpsw_125mhz_am33xx_clkdm, | ||
178 | &lcdc_am33xx_clkdm, | ||
179 | &clk_24mhz_am33xx_clkdm, | ||
180 | &l4_wkup_am33xx_clkdm, | ||
181 | &l3_aon_am33xx_clkdm, | ||
182 | &l4_wkup_aon_am33xx_clkdm, | ||
183 | &mpu_am33xx_clkdm, | ||
184 | &l4_rtc_am33xx_clkdm, | ||
185 | &gfx_l3_am33xx_clkdm, | ||
186 | &gfx_l4ls_gfx_am33xx_clkdm, | ||
187 | &l4_cefuse_am33xx_clkdm, | ||
188 | NULL, | ||
189 | }; | ||
190 | |||
191 | void __init am33xx_clockdomains_init(void) | ||
192 | { | ||
193 | clkdm_register_platform_funcs(&am33xx_clkdm_operations); | ||
194 | clkdm_register_clkdms(clockdomains_am33xx); | ||
195 | clkdm_complete_init(); | ||
196 | } | ||
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 3c885248b984..cb6c11cd8df9 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
@@ -486,6 +486,7 @@ void __init am33xx_init_early(void) | |||
486 | omap_common_init_early(); | 486 | omap_common_init_early(); |
487 | am33xx_voltagedomains_init(); | 487 | am33xx_voltagedomains_init(); |
488 | am33xx_powerdomains_init(); | 488 | am33xx_powerdomains_init(); |
489 | am33xx_clockdomains_init(); | ||
489 | } | 490 | } |
490 | #endif | 491 | #endif |
491 | 492 | ||