ARM: omap3: enable off mode automatically
authorAndreas Kemnade <andreas@kemnade.info>
Fri, 11 Sep 2020 16:12:09 +0000 (18:12 +0200)
committerTony Lindgren <tony@atomide.com>
Thu, 24 Sep 2020 11:26:20 +0000 (14:26 +0300)
Enabling off mode was only reachable deeply hidden
in the debugfs. As powersaving is an important feature,
move the option out of its shady place.
The debugfs file can still be used to override the default.

Use the presence of a device compatible to ti,twl4030-idle or
ti,twl4030-idle-osc-off as an indicator that the board is wired correctly
for off mode.

Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
[tony@atomide.com: updated to fix a checkpatch warning]
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap2/pm-debug.c
arch/arm/mach-omap2/pm.c
arch/arm/mach-omap2/pm.h
arch/arm/mach-omap2/pm34xx.c

index fceb1e525d26b9541859c906b79e369c95681186..919d35d5b325ddce3c59d25fa1a4b246bd894186 100644 (file)
@@ -34,8 +34,6 @@
 #include "prm2xxx_3xxx.h"
 #include "pm.h"
 
-u32 enable_off_mode;
-
 #ifdef CONFIG_DEBUG_FS
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
index 01ec1ba4878b2f05f5bc690b9d27503f5cf0e35f..da829a90fe8c1abcaee4fe33e28e1c844d540291 100644 (file)
@@ -28,6 +28,8 @@
 #include "clockdomain.h"
 #include "pm.h"
 
+u32 enable_off_mode;
+
 #ifdef CONFIG_SUSPEND
 /*
  * omap_pm_suspend: points to a function that does the SoC-specific
index 2a883a0c1fcdb3a8300643f094beb496568f5a05..80e84ae66aeef05d83bcbd63fa3791f88888e9f1 100644 (file)
@@ -49,11 +49,7 @@ static inline int omap4_opp_init(void)
 extern int omap3_pm_get_suspend_state(struct powerdomain *pwrdm);
 extern int omap3_pm_set_suspend_state(struct powerdomain *pwrdm, int state);
 
-#ifdef CONFIG_PM_DEBUG
 extern u32 enable_off_mode;
-#else
-#define enable_off_mode 0
-#endif
 
 #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
 extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev);
index 6df395fff971b08f5b24cc67dec547d710ab9845..155b6a86fac52fe0d68749c6ac1a09517e3d0d66 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");