linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] omap3: enable off mode automatically
@ 2020-09-11  6:49 Andreas Kemnade
  2020-09-11 10:33 ` Tony Lindgren
  0 siblings, 1 reply; 3+ messages in thread
From: Andreas Kemnade @ 2020-09-11  6:49 UTC (permalink / raw)
  To: khilman, tony, linux, linux-omap, linux-arm-kernel, linux-kernel,
	letux-kernel
  Cc: Andreas Kemnade

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.

 arch/arm/mach-omap2/pm.h     |  4 ----
 arch/arm/mach-omap2/pm34xx.c | 29 ++++++++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 5 deletions(-)

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..d069d581c372 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>
@@ -51,6 +52,10 @@
 /* pm34xx errata defined in pm.h */
 u16 pm34xx_errata;
 
+#ifndef CONFIG_PM_DEBUG
+u32 enable_off_mode;
+#endif
+
 struct power_state {
 	struct powerdomain *pwrdm;
 	u32 next_state;
@@ -410,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))
@@ -444,6 +454,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 +502,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");
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] omap3: enable off mode automatically
  2020-09-11  6:49 [PATCH] omap3: enable off mode automatically Andreas Kemnade
@ 2020-09-11 10:33 ` Tony Lindgren
  2020-09-11 14:27   ` Andreas Kemnade
  0 siblings, 1 reply; 3+ messages in thread
From: Tony Lindgren @ 2020-09-11 10:33 UTC (permalink / raw)
  To: Andreas Kemnade
  Cc: khilman, linux, linux-omap, linux-arm-kernel, linux-kernel, letux-kernel

* Andreas Kemnade <andreas@kemnade.info> [200911 09:50]:
> --- 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

Hmm isn't the above still needed for the other SoCs? Or is omap3 the only
user?

Otherwise looks good to me :)

Tony

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] omap3: enable off mode automatically
  2020-09-11 10:33 ` Tony Lindgren
@ 2020-09-11 14:27   ` Andreas Kemnade
  0 siblings, 0 replies; 3+ messages in thread
From: Andreas Kemnade @ 2020-09-11 14:27 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: khilman, linux, linux-omap, linux-arm-kernel, linux-kernel, letux-kernel

On Fri, 11 Sep 2020 13:33:37 +0300
Tony Lindgren <tony@atomide.com> wrote:

> * Andreas Kemnade <andreas@kemnade.info> [200911 09:50]:
> > --- 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  
> 
> Hmm isn't the above still needed for the other SoCs? Or is omap3 the only
> user?
> 
well, the linker moans about undefined symbols if
CONFIG_ARCH_OMAP3 is not enabled.
I will send a v2.

Regards,
Andreas

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-09-11 16:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-11  6:49 [PATCH] omap3: enable off mode automatically Andreas Kemnade
2020-09-11 10:33 ` Tony Lindgren
2020-09-11 14:27   ` Andreas Kemnade

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).