diff options
Diffstat (limited to 'arch/arm/mach-omap2/cm33xx.c')
-rw-r--r-- | arch/arm/mach-omap2/cm33xx.c | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/cm33xx.c b/arch/arm/mach-omap2/cm33xx.c index 13f56eafef03..058ce3c0873e 100644 --- a/arch/arm/mach-omap2/cm33xx.c +++ b/arch/arm/mach-omap2/cm33xx.c | |||
@@ -22,8 +22,7 @@ | |||
22 | #include <linux/err.h> | 22 | #include <linux/err.h> |
23 | #include <linux/io.h> | 23 | #include <linux/io.h> |
24 | 24 | ||
25 | #include <plat/common.h> | 25 | #include "clockdomain.h" |
26 | |||
27 | #include "cm.h" | 26 | #include "cm.h" |
28 | #include "cm33xx.h" | 27 | #include "cm33xx.h" |
29 | #include "cm-regbits-34xx.h" | 28 | #include "cm-regbits-34xx.h" |
@@ -311,3 +310,58 @@ void am33xx_cm_module_disable(u16 inst, s16 cdoffs, u16 clkctrl_offs) | |||
311 | v &= ~AM33XX_MODULEMODE_MASK; | 310 | v &= ~AM33XX_MODULEMODE_MASK; |
312 | am33xx_cm_write_reg(v, inst, clkctrl_offs); | 311 | am33xx_cm_write_reg(v, inst, clkctrl_offs); |
313 | } | 312 | } |
313 | |||
314 | /* | ||
315 | * Clockdomain low-level functions | ||
316 | */ | ||
317 | |||
318 | static int am33xx_clkdm_sleep(struct clockdomain *clkdm) | ||
319 | { | ||
320 | am33xx_cm_clkdm_force_sleep(clkdm->cm_inst, clkdm->clkdm_offs); | ||
321 | return 0; | ||
322 | } | ||
323 | |||
324 | static int am33xx_clkdm_wakeup(struct clockdomain *clkdm) | ||
325 | { | ||
326 | am33xx_cm_clkdm_force_wakeup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
327 | return 0; | ||
328 | } | ||
329 | |||
330 | static void am33xx_clkdm_allow_idle(struct clockdomain *clkdm) | ||
331 | { | ||
332 | am33xx_cm_clkdm_enable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
333 | } | ||
334 | |||
335 | static void am33xx_clkdm_deny_idle(struct clockdomain *clkdm) | ||
336 | { | ||
337 | am33xx_cm_clkdm_disable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
338 | } | ||
339 | |||
340 | static int am33xx_clkdm_clk_enable(struct clockdomain *clkdm) | ||
341 | { | ||
342 | if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) | ||
343 | return am33xx_clkdm_wakeup(clkdm); | ||
344 | |||
345 | return 0; | ||
346 | } | ||
347 | |||
348 | static int am33xx_clkdm_clk_disable(struct clockdomain *clkdm) | ||
349 | { | ||
350 | bool hwsup = false; | ||
351 | |||
352 | hwsup = am33xx_cm_is_clkdm_in_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
353 | |||
354 | if (!hwsup && (clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) | ||
355 | am33xx_clkdm_sleep(clkdm); | ||
356 | |||
357 | return 0; | ||
358 | } | ||
359 | |||
360 | struct clkdm_ops am33xx_clkdm_operations = { | ||
361 | .clkdm_sleep = am33xx_clkdm_sleep, | ||
362 | .clkdm_wakeup = am33xx_clkdm_wakeup, | ||
363 | .clkdm_allow_idle = am33xx_clkdm_allow_idle, | ||
364 | .clkdm_deny_idle = am33xx_clkdm_deny_idle, | ||
365 | .clkdm_clk_enable = am33xx_clkdm_clk_enable, | ||
366 | .clkdm_clk_disable = am33xx_clkdm_clk_disable, | ||
367 | }; | ||