Merge tag 'for-5.15/parisc' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[linux-2.6-microblaze.git] / arch / arm / mach-omap2 / pm34xx.c
index f5dfddf..d73c7b6 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/omap-gpmc.h>
+#include <linux/of.h>
 
 #include <trace/events/power.h>
 
@@ -80,8 +80,6 @@ static void omap3_core_save_context(void)
 
        /* Save the Interrupt controller context */
        omap_intc_save_context();
-       /* Save the GPMC context */
-       omap3_gpmc_save_context();
        /* Save the system control module context, padconf already save above*/
        omap3_control_save_context();
 }
@@ -90,8 +88,6 @@ static void omap3_core_restore_context(void)
 {
        /* Restore the control module context, padconf restored by h/w */
        omap3_control_restore_context();
-       /* Restore the GPMC context */
-       omap3_gpmc_restore_context();
        /* Restore the interrupt controller context */
        omap_intc_restore_context();
 }
@@ -410,7 +406,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))
@@ -444,6 +445,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;
@@ -477,6 +494,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");