diff options
author | Paul Walmsley <paul@pwsan.com> | 2010-12-21 21:05:15 -0700 |
---|---|---|
committer | Paul Walmsley <paul@pwsan.com> | 2010-12-21 21:05:15 -0700 |
commit | bd2122ca358fbd5c8e94869ae731a0951b36c757 (patch) | |
tree | c94a8080157eaaf52880187bbe5ce31fabb7161f /arch/arm/mach-omap2/clockdomain.c | |
parent | e4156ee52fe617c2c2d80b5db993ff4bf07d7c3c (diff) | |
download | linux-bd2122ca358fbd5c8e94869ae731a0951b36c757.tar.gz linux-bd2122ca358fbd5c8e94869ae731a0951b36c757.tar.bz2 linux-bd2122ca358fbd5c8e94869ae731a0951b36c757.zip |
OMAP4: clockdomains: add OMAP4 PRCM data and OMAP4 support
Add PRCM partition, CM instance register address offset, and clockdomain
register address offset to each OMAP4 struct clockdomain record. Add OMAP4
clockdomain code to use this new data to access registers properly.
While here, clean up some nearby clockdomain code to allocate auto variables
in my recollection of Linus's preferred style.
The autogeneration scripts have been updated.
Signed-off-by: Paul Walmsley <paul@pwsan.com>
Cc: Rajendra Nayak <rnayak@ti.com>
Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: BenoƮt Cousson <b-cousson@ti.com>
Tested-by: Rajendra Nayak <rnayak@ti.com>
Tested-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Diffstat (limited to 'arch/arm/mach-omap2/clockdomain.c')
-rw-r--r-- | arch/arm/mach-omap2/clockdomain.c | 75 |
1 files changed, 57 insertions, 18 deletions
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index 8e3276bfed25..555a518836b9 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c @@ -29,6 +29,9 @@ #include "prm2xxx_3xxx.h" #include "prm-regbits-24xx.h" #include "cm2xxx_3xxx.h" +#include "cm-regbits-34xx.h" +#include "cminst44xx.h" +#include "prcm44xx.h" #include <plat/clock.h> #include <plat/powerdomain.h> @@ -247,13 +250,21 @@ static void _enable_hwsup(struct clockdomain *clkdm) if (cpu_is_omap24xx()) bits = OMAP24XX_CLKSTCTRL_ENABLE_AUTO; - else if (cpu_is_omap34xx() || cpu_is_omap44xx()) + else if (cpu_is_omap34xx()) bits = OMAP34XX_CLKSTCTRL_ENABLE_AUTO; + else if (cpu_is_omap44xx()) + return omap4_cminst_clkdm_enable_hwsup(clkdm->prcm_partition, + clkdm->cm_inst, + clkdm->clkdm_offs); else BUG(); bits = bits << __ffs(clkdm->clktrctrl_mask); + /* + * XXX clkstctrl_reg is known on OMAP2 - this clkdm + * field is not needed + */ v = __raw_readl(clkdm->clkstctrl_reg); v &= ~(clkdm->clktrctrl_mask); v |= bits; @@ -275,21 +286,27 @@ static void _disable_hwsup(struct clockdomain *clkdm) { u32 bits, v; - if (cpu_is_omap24xx()) { + if (cpu_is_omap24xx()) bits = OMAP24XX_CLKSTCTRL_DISABLE_AUTO; - } else if (cpu_is_omap34xx() || cpu_is_omap44xx()) { + else if (cpu_is_omap34xx()) bits = OMAP34XX_CLKSTCTRL_DISABLE_AUTO; - } else { + else if (cpu_is_omap44xx()) + return omap4_cminst_clkdm_disable_hwsup(clkdm->prcm_partition, + clkdm->cm_inst, + clkdm->clkdm_offs); + else BUG(); - } bits = bits << __ffs(clkdm->clktrctrl_mask); + /* + * XXX clkstctrl_reg is known on OMAP2 - this clkdm + * field is not needed + */ v = __raw_readl(clkdm->clkstctrl_reg); v &= ~(clkdm->clktrctrl_mask); v |= bits; __raw_writel(v, clkdm->clkstctrl_reg); - } /* Public functions */ @@ -727,14 +744,20 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) */ static int omap2_clkdm_clktrctrl_read(struct clockdomain *clkdm) { - u32 v; + u32 v = 0; if (!clkdm) return -EINVAL; - v = __raw_readl(clkdm->clkstctrl_reg); - v &= clkdm->clktrctrl_mask; - v >>= __ffs(clkdm->clktrctrl_mask); + if (cpu_is_omap24xx() || cpu_is_omap34xx()) { + v = __raw_readl(clkdm->clkstctrl_reg); + v &= clkdm->clktrctrl_mask; + v >>= __ffs(clkdm->clktrctrl_mask); + } else if (cpu_is_omap44xx()) { + pr_warn("OMAP4 clockdomain: missing wakeup/sleep deps\n"); + } else { + BUG(); + } return v; } @@ -750,6 +773,8 @@ static int omap2_clkdm_clktrctrl_read(struct clockdomain *clkdm) */ int omap2_clkdm_sleep(struct clockdomain *clkdm) { + u32 bits, v; + if (!clkdm) return -EINVAL; @@ -766,16 +791,22 @@ int omap2_clkdm_sleep(struct clockdomain *clkdm) omap2_cm_set_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL); - } else if (cpu_is_omap34xx() || cpu_is_omap44xx()) { + } else if (cpu_is_omap34xx()) { - u32 bits = (OMAP34XX_CLKSTCTRL_FORCE_SLEEP << - __ffs(clkdm->clktrctrl_mask)); + bits = (OMAP34XX_CLKSTCTRL_FORCE_SLEEP << + __ffs(clkdm->clktrctrl_mask)); - u32 v = __raw_readl(clkdm->clkstctrl_reg); + v = __raw_readl(clkdm->clkstctrl_reg); v &= ~(clkdm->clktrctrl_mask); v |= bits; __raw_writel(v, clkdm->clkstctrl_reg); + } else if (cpu_is_omap44xx()) { + + omap4_cminst_clkdm_force_sleep(clkdm->prcm_partition, + clkdm->cm_inst, + clkdm->clkdm_offs); + } else { BUG(); }; @@ -794,6 +825,8 @@ int omap2_clkdm_sleep(struct clockdomain *clkdm) */ int omap2_clkdm_wakeup(struct clockdomain *clkdm) { + u32 bits, v; + if (!clkdm) return -EINVAL; @@ -810,16 +843,22 @@ int omap2_clkdm_wakeup(struct clockdomain *clkdm) omap2_cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE_MASK, clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL); - } else if (cpu_is_omap34xx() || cpu_is_omap44xx()) { + } else if (cpu_is_omap34xx()) { - u32 bits = (OMAP34XX_CLKSTCTRL_FORCE_WAKEUP << - __ffs(clkdm->clktrctrl_mask)); + bits = (OMAP34XX_CLKSTCTRL_FORCE_WAKEUP << + __ffs(clkdm->clktrctrl_mask)); - u32 v = __raw_readl(clkdm->clkstctrl_reg); + v = __raw_readl(clkdm->clkstctrl_reg); v &= ~(clkdm->clktrctrl_mask); v |= bits; __raw_writel(v, clkdm->clkstctrl_reg); + } else if (cpu_is_omap44xx()) { + + omap4_cminst_clkdm_force_wakeup(clkdm->prcm_partition, + clkdm->cm_inst, + clkdm->clkdm_offs); + } else { BUG(); }; |