Merge branch 'stable/generic' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen
[pandora-kernel.git] / arch / arm / plat-omap / omap-pm-noop.c
index e129ce8..b0471bb 100644 (file)
 #include <linux/init.h>
 #include <linux/cpufreq.h>
 #include <linux/device.h>
+#include <linux/platform_device.h>
 
 /* Interface documentation is in mach/omap-pm.h */
 #include <plat/omap-pm.h>
+#include <plat/omap_device.h>
 
-#include <plat/powerdomain.h>
-
-struct omap_opp *dsp_opps;
-struct omap_opp *mpu_opps;
-struct omap_opp *l3_opps;
+static bool off_mode_enabled;
+static u32 dummy_context_loss_counter;
 
 /*
  * Device-driver-originated constraints (via board-*.c files)
@@ -284,37 +283,70 @@ unsigned long omap_pm_cpu_get_freq(void)
        return 0;
 }
 
+/**
+ * omap_pm_enable_off_mode - notify OMAP PM that off-mode is enabled
+ *
+ * Intended for use only by OMAP PM core code to notify this layer
+ * that off mode has been enabled.
+ */
+void omap_pm_enable_off_mode(void)
+{
+       off_mode_enabled = true;
+}
+
+/**
+ * omap_pm_disable_off_mode - notify OMAP PM that off-mode is disabled
+ *
+ * Intended for use only by OMAP PM core code to notify this layer
+ * that off mode has been disabled.
+ */
+void omap_pm_disable_off_mode(void)
+{
+       off_mode_enabled = false;
+}
+
 /*
  * Device context loss tracking
  */
 
-int omap_pm_get_dev_context_loss_count(struct device *dev)
+#ifdef CONFIG_ARCH_OMAP2PLUS
+
+u32 omap_pm_get_dev_context_loss_count(struct device *dev)
 {
-       if (!dev) {
-               WARN_ON(1);
-               return -EINVAL;
-       };
+       struct platform_device *pdev = to_platform_device(dev);
+       u32 count;
+
+       if (WARN_ON(!dev))
+               return 0;
+
+       if (dev->parent == &omap_device_parent) {
+               count = omap_device_get_context_loss_count(pdev);
+       } else {
+               WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device",
+                         dev_name(dev));
+               if (off_mode_enabled)
+                       dummy_context_loss_counter++;
+               count = dummy_context_loss_counter;
+       }
 
-       pr_debug("OMAP PM: returning context loss count for dev %s\n",
-                dev_name(dev));
+       pr_debug("OMAP PM: context loss count for dev %s = %d\n",
+                dev_name(dev), count);
 
-       /*
-        * Map the device to the powerdomain.  Return the powerdomain
-        * off counter.
-        */
+       return count;
+}
 
-       return 0;
+#else
+
+u32 omap_pm_get_dev_context_loss_count(struct device *dev)
+{
+       return dummy_context_loss_counter;
 }
 
+#endif
 
 /* Should be called before clk framework init */
-int __init omap_pm_if_early_init(struct omap_opp *mpu_opp_table,
-                                struct omap_opp *dsp_opp_table,
-                                struct omap_opp *l3_opp_table)
+int __init omap_pm_if_early_init(void)
 {
-       mpu_opps = mpu_opp_table;
-       dsp_opps = dsp_opp_table;
-       l3_opps = l3_opp_table;
        return 0;
 }