diff mbox series

[v2] omap3: enable off mode automatically

Message ID 20200911161209.25149-1-andreas@kemnade.info (mailing list archive)
State New, archived
Headers show
Series [v2] omap3: enable off mode automatically | expand

Commit Message

Andreas Kemnade Sept. 11, 2020, 4:12 p.m. UTC
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>
---
An earlier version of this patch was here:
https://patchwork.kernel.org/patch/10794121/

A config option was used instead of the suggested devicetree check.

Changes in v2:
- fix compile without CONFIG_ARCH_OMAP3
  The variable enable_off_mode is now always a real one and not
  a preprocessor constant to avoid trouble with unusual configurations.

 arch/arm/mach-omap2/pm-debug.c |  2 --
 arch/arm/mach-omap2/pm.c       |  2 ++
 arch/arm/mach-omap2/pm.h       |  4 ----
 arch/arm/mach-omap2/pm34xx.c   | 25 ++++++++++++++++++++++++-
 4 files changed, 26 insertions(+), 7 deletions(-)

Comments

Andreas Kemnade Sept. 24, 2020, 7 a.m. UTC | #1
On Fri, 11 Sep 2020 18:12:09 +0200
Andreas Kemnade <andreas@kemnade.info> wrote:

> 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>
> ---
> An earlier version of this patch was here:
> https://patchwork.kernel.org/patch/10794121/
> 
> A config option was used instead of the suggested devicetree check.
> 
> Changes in v2:
> - fix compile without CONFIG_ARCH_OMAP3
>   The variable enable_off_mode is now always a real one and not
>   a preprocessor constant to avoid trouble with unusual configurations.
> 
Anything I still missed here? 

Regards,
Andreas
Tony Lindgren Sept. 24, 2020, 7:05 a.m. UTC | #2
* Andreas Kemnade <andreas@kemnade.info> [200924 07:00]:
> On Fri, 11 Sep 2020 18:12:09 +0200
> Andreas Kemnade <andreas@kemnade.info> wrote:
> 
> > 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>
> > ---
> > An earlier version of this patch was here:
> > https://patchwork.kernel.org/patch/10794121/
> > 
> > A config option was used instead of the suggested devicetree check.
> > 
> > Changes in v2:
> > - fix compile without CONFIG_ARCH_OMAP3
> >   The variable enable_off_mode is now always a real one and not
> >   a preprocessor constant to avoid trouble with unusual configurations.
> > 
> Anything I still missed here? 

No the missing part is just me picking up the remaining patches
for v5.10 that I'll hopefully manage to do today :)

Regards,

Tony
Tony Lindgren Sept. 25, 2020, 11:34 a.m. UTC | #3
* Tony Lindgren <tony@atomide.com> [200924 07:06]:
> * Andreas Kemnade <andreas@kemnade.info> [200924 07:00]:
> > On Fri, 11 Sep 2020 18:12:09 +0200
> > Andreas Kemnade <andreas@kemnade.info> wrote:
> > 
> > > 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>
> > > ---
> > > An earlier version of this patch was here:
> > > https://patchwork.kernel.org/patch/10794121/
> > > 
> > > A config option was used instead of the suggested devicetree check.
> > > 
> > > Changes in v2:
> > > - fix compile without CONFIG_ARCH_OMAP3
> > >   The variable enable_off_mode is now always a real one and not
> > >   a preprocessor constant to avoid trouble with unusual configurations.
> > > 
> > Anything I still missed here? 
> 
> No the missing part is just me picking up the remaining patches
> for v5.10 that I'll hopefully manage to do today :)

Applied now in omap-for-v5.10/soc thanks.

Tony
diff mbox series

Patch

diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c
index fceb1e525d26..919d35d5b325 100644
--- a/arch/arm/mach-omap2/pm-debug.c
+++ b/arch/arm/mach-omap2/pm-debug.c
@@ -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>
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c
index 01ec1ba4878b..da829a90fe8c 100644
--- a/arch/arm/mach-omap2/pm.c
+++ b/arch/arm/mach-omap2/pm.c
@@ -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
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
index 2a883a0c1fcd..80e84ae66aee 100644
--- a/arch/arm/mach-omap2/pm.h
+++ b/arch/arm/mach-omap2/pm.h
@@ -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);
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index f5dfddf492e2..925b8efbf46c 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -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>
@@ -410,7 +411,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 +450,21 @@  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 +498,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");