Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec...
[pandora-kernel.git] / arch / arm / mach-omap2 / clockdomain.c
index 8e3276b..e20b986 100644 (file)
 #include "prm2xxx_3xxx.h"
 #include "prm-regbits-24xx.h"
 #include "cm2xxx_3xxx.h"
+#include "cm-regbits-24xx.h"
+#include "cminst44xx.h"
+#include "prcm44xx.h"
 
 #include <plat/clock.h>
-#include <plat/powerdomain.h>
-#include <plat/clockdomain.h>
+#include "powerdomain.h"
+#include "clockdomain.h"
 #include <plat/prcm.h>
 
 /* clkdm_list contains all registered struct clockdomains */
@@ -243,22 +246,18 @@ static void _clkdm_del_autodeps(struct clockdomain *clkdm)
  */
 static void _enable_hwsup(struct clockdomain *clkdm)
 {
-       u32 bits, v;
-
        if (cpu_is_omap24xx())
-               bits = OMAP24XX_CLKSTCTRL_ENABLE_AUTO;
-       else if (cpu_is_omap34xx() || cpu_is_omap44xx())
-               bits = OMAP34XX_CLKSTCTRL_ENABLE_AUTO;
+               omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
+                                              clkdm->clktrctrl_mask);
+       else if (cpu_is_omap34xx())
+               omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
+                                              clkdm->clktrctrl_mask);
+       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);
-
-       v = __raw_readl(clkdm->clkstctrl_reg);
-       v &= ~(clkdm->clktrctrl_mask);
-       v |= bits;
-       __raw_writel(v, clkdm->clkstctrl_reg);
-
 }
 
 /**
@@ -273,23 +272,18 @@ static void _enable_hwsup(struct clockdomain *clkdm)
  */
 static void _disable_hwsup(struct clockdomain *clkdm)
 {
-       u32 bits, v;
-
-       if (cpu_is_omap24xx()) {
-               bits = OMAP24XX_CLKSTCTRL_DISABLE_AUTO;
-       } else if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
-               bits = OMAP34XX_CLKSTCTRL_DISABLE_AUTO;
-       } else {
+       if (cpu_is_omap24xx())
+               omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
+                                               clkdm->clktrctrl_mask);
+       else if (cpu_is_omap34xx())
+               omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
+                                               clkdm->clktrctrl_mask);
+       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);
-
-       v = __raw_readl(clkdm->clkstctrl_reg);
-       v &= ~(clkdm->clktrctrl_mask);
-       v |= bits;
-       __raw_writel(v, clkdm->clkstctrl_reg);
-
 }
 
 /* Public functions */
@@ -717,28 +711,6 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm)
        return 0;
 }
 
-/**
- * omap2_clkdm_clktrctrl_read - read the clkdm's current state transition mode
- * @clkdm: struct clkdm * of a clockdomain
- *
- * Return the clockdomain @clkdm current state transition mode from the
- * corresponding domain CM_CLKSTCTRL register. Returns -EINVAL if @clkdm
- * is NULL or the current mode upon success.
- */
-static int omap2_clkdm_clktrctrl_read(struct clockdomain *clkdm)
-{
-       u32 v;
-
-       if (!clkdm)
-               return -EINVAL;
-
-       v = __raw_readl(clkdm->clkstctrl_reg);
-       v &= clkdm->clktrctrl_mask;
-       v >>= __ffs(clkdm->clktrctrl_mask);
-
-       return v;
-}
-
 /**
  * omap2_clkdm_sleep - force clockdomain sleep transition
  * @clkdm: struct clockdomain *
@@ -766,15 +738,16 @@ 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));
+               omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs,
+                                             clkdm->clktrctrl_mask);
 
-               u32 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();
@@ -810,15 +783,16 @@ 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()) {
+
+               omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs,
+                                              clkdm->clktrctrl_mask);
 
-               u32 bits = (OMAP34XX_CLKSTCTRL_FORCE_WAKEUP <<
-                        __ffs(clkdm->clktrctrl_mask));
+       } else if (cpu_is_omap44xx()) {
 
-               u32 v = __raw_readl(clkdm->clkstctrl_reg);
-               v &= ~(clkdm->clktrctrl_mask);
-               v |= bits;
-               __raw_writel(v, clkdm->clkstctrl_reg);
+               omap4_cminst_clkdm_force_wakeup(clkdm->prcm_partition,
+                                               clkdm->cm_inst,
+                                               clkdm->clkdm_offs);
 
        } else {
                BUG();
@@ -925,7 +899,7 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
  */
 int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
 {
-       int v;
+       bool hwsup = false;
 
        /*
         * XXX Rewrite this code to maintain a list of enabled
@@ -943,13 +917,23 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
        pr_debug("clockdomain: clkdm %s: clk %s now enabled\n", clkdm->name,
                 clk->name);
 
-       if (!clkdm->clkstctrl_reg)
-               return 0;
+       if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
+
+               if (!clkdm->clktrctrl_mask)
+                       return 0;
+
+               hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs,
+                                                  clkdm->clktrctrl_mask);
 
-       v = omap2_clkdm_clktrctrl_read(clkdm);
+       } else if (cpu_is_omap44xx()) {
 
-       if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ||
-           (cpu_is_omap24xx() && v == OMAP24XX_CLKSTCTRL_ENABLE_AUTO)) {
+               hwsup = omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition,
+                                                      clkdm->cm_inst,
+                                                      clkdm->clkdm_offs);
+
+       }
+
+       if (hwsup) {
                /* Disable HW transitions when we are changing deps */
                _disable_hwsup(clkdm);
                _clkdm_add_autodeps(clkdm);
@@ -980,7 +964,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
  */
 int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
 {
-       int v;
+       bool hwsup = false;
 
        /*
         * XXX Rewrite this code to maintain a list of enabled
@@ -1005,13 +989,23 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
        pr_debug("clockdomain: clkdm %s: clk %s now disabled\n", clkdm->name,
                 clk->name);
 
-       if (!clkdm->clkstctrl_reg)
-               return 0;
+       if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
+
+               if (!clkdm->clktrctrl_mask)
+                       return 0;
 
-       v = omap2_clkdm_clktrctrl_read(clkdm);
+               hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs,
+                                                  clkdm->clktrctrl_mask);
+
+       } else if (cpu_is_omap44xx()) {
+
+               hwsup = omap4_cminst_is_clkdm_in_hwsup(clkdm->prcm_partition,
+                                                      clkdm->cm_inst,
+                                                      clkdm->clkdm_offs);
+
+       }
 
-       if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ||
-           (cpu_is_omap24xx() && v == OMAP24XX_CLKSTCTRL_ENABLE_AUTO)) {
+       if (hwsup) {
                /* Disable HW transitions when we are changing deps */
                _disable_hwsup(clkdm);
                _clkdm_del_autodeps(clkdm);