ARM: omap3: enable off mode automatically
[linux-2.6-microblaze.git] / arch / arm / mach-omap2 / pm34xx.c
index 6df395f..155b6a8 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
+#include <linux/of.h>
 #include <linux/omap-gpmc.h>
 
 #include <trace/events/power.h>
@@ -414,7 +415,12 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
        if (!pwrst)
                return -ENOMEM;
        pwrst->pwrdm = pwrdm;
-       pwrst->next_state = PWRDM_POWER_RET;
+
+       if (enable_off_mode)
+               pwrst->next_state = PWRDM_POWER_OFF;
+       else
+               pwrst->next_state = PWRDM_POWER_RET;
+
        list_add(&pwrst->node, &pwrst_list);
 
        if (pwrdm_has_hdwr_sar(pwrdm))
@@ -448,6 +454,22 @@ static void __init pm_errata_configure(void)
        }
 }
 
+static void __init omap3_pm_check_pmic(void)
+{
+       struct device_node *np;
+
+       np = of_find_compatible_node(NULL, NULL, "ti,twl4030-power-idle");
+       if (!np)
+               np = of_find_compatible_node(NULL, NULL, "ti,twl4030-power-idle-osc-off");
+
+       if (np) {
+               of_node_put(np);
+               enable_off_mode = 1;
+       } else {
+               enable_off_mode = 0;
+       }
+}
+
 int __init omap3_pm_init(void)
 {
        struct power_state *pwrst, *tmp;
@@ -481,6 +503,8 @@ int __init omap3_pm_init(void)
                goto err2;
        }
 
+       omap3_pm_check_pmic();
+
        ret = pwrdm_for_each(pwrdms_setup, NULL);
        if (ret) {
                pr_err("Failed to setup powerdomains\n");