Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg...
[pandora-kernel.git] / arch / arm / mach-omap2 / powerdomain.c
index 77f42b9..eaed0df 100644 (file)
 #include <linux/list.h>
 #include <linux/errno.h>
 #include <linux/string.h>
+#include "cm2xxx_3xxx.h"
+#include "prcm44xx.h"
+#include "cm44xx.h"
+#include "prm2xxx_3xxx.h"
 #include "prm44xx.h"
 
 #include <plat/cpu.h>
-#include <plat/powerdomain.h>
-#include <plat/clockdomain.h>
+#include "powerdomain.h"
+#include "clockdomain.h"
 #include <plat/prcm.h>
 
 #include "pm.h"
@@ -69,12 +73,19 @@ static int _pwrdm_register(struct powerdomain *pwrdm)
 {
        int i;
 
-       if (!pwrdm)
+       if (!pwrdm || !pwrdm->name)
                return -EINVAL;
 
        if (!omap_chip_is(pwrdm->omap_chip))
                return -EINVAL;
 
+       if (cpu_is_omap44xx() &&
+           pwrdm->prcm_partition == OMAP4430_INVALID_PRCM_PARTITION) {
+               pr_err("powerdomain: %s: missing OMAP4 PRCM partition ID\n",
+                      pwrdm->name);
+               return -EINVAL;
+       }
+
        if (_pwrdm_lookup(pwrdm->name))
                return -EEXIST;
 
@@ -898,3 +909,32 @@ int pwrdm_post_transition(void)
        pwrdm_for_each(_pwrdm_post_transition_cb, NULL);
        return 0;
 }
+
+/**
+ * pwrdm_get_context_loss_count - get powerdomain's context loss count
+ * @pwrdm: struct powerdomain * to wait for
+ *
+ * Context loss count is the sum of powerdomain off-mode counter, the
+ * logic off counter and the per-bank memory off counter.  Returns 0
+ * (and WARNs) upon error, otherwise, returns the context loss count.
+ */
+u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm)
+{
+       int i, count;
+
+       if (!pwrdm) {
+               WARN(1, "powerdomain: %s: pwrdm is null\n", __func__);
+               return 0;
+       }
+
+       count = pwrdm->state_counter[PWRDM_POWER_OFF];
+       count += pwrdm->ret_logic_off_counter;
+
+       for (i = 0; i < pwrdm->banks; i++)
+               count += pwrdm->ret_mem_off_counter[i];
+
+       pr_debug("powerdomain: %s: context loss count = %u\n",
+                pwrdm->name, count);
+
+       return count;
+}