All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
To: linux-pm <linux-pm@vger.kernel.org>,
	Linux ARM <linux-arm-kernel@lists.infradead.org>
Cc: Sudeep Holla <sudeep.holla@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Kevin Hilman <khilman@kernel.org>,
	Thibaud Cornic <thibaud_cornic@sigmadesigns.com>,
	Mason <slash.tmp@free.fr>, Sebastian Frias <sf84@laposte.net>,
	Robin Murphy <robin.murphy@arm.com>,
	Arnd Bergmann <arnd@arndb.de>
Subject: Re: [RFC PATCH v2] ARM: tango: add Suspend-to-RAM support
Date: Mon, 4 Jul 2016 11:01:44 +0200	[thread overview]
Message-ID: <577A25F8.80702@sigmadesigns.com> (raw)
In-Reply-To: <5774DBDE.1070605@sigmadesigns.com>

On 30/06/2016 10:44, Marc Gonzalez wrote:

> Ask firmware to put RAM in self-refresh mode and power system down.
> 
>     echo mem > /sys/power/state
> 
> See Documentation/power/states.txt
> 
> Signed-off-by: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
> ---
> 
> This is a RFC because I have a few doubts:
> 
> 1) return value when tango_suspend() fails and unexpectedly returns (I used -EIO)
> Is there a better error to return?
> 
> 2) conditionally building pm.c (using CONFIG_SUSPEND? CONFIG_PM_SLEEP? other?)
> Is there a better config knob to use?
> 
> 3) .valid is required, right?
> AFAICS, the answer is "yes", .valid is indeed required:
> ("no valid callback implies that none are valid")
> 
> static bool valid_state(suspend_state_t state)
> {
> 	/*
> 	 * PM_SUSPEND_STANDBY and PM_SUSPEND_MEM states need low level
> 	 * support and need to be valid to the low level
> 	 * implementation, no valid callback implies that none are valid.
> 	 */
> 	return suspend_ops && suspend_ops->valid && suspend_ops->valid(state);
> }
> 
> ---
>  arch/arm/mach-tango/Makefile |  1 +
>  arch/arm/mach-tango/pm.c     | 32 ++++++++++++++++++++++++++++++++
>  arch/arm/mach-tango/smc.h    |  1 +
>  3 files changed, 34 insertions(+)
>  create mode 100644 arch/arm/mach-tango/pm.c
> 
> diff --git a/arch/arm/mach-tango/Makefile b/arch/arm/mach-tango/Makefile
> index 7ca753aa9fb6..822b7ca803c6 100644
> --- a/arch/arm/mach-tango/Makefile
> +++ b/arch/arm/mach-tango/Makefile
> @@ -3,3 +3,4 @@ AFLAGS_smc.o := -Wa,-march=armv7-a$(plus_sec)
>  
>  obj-y += setup.o smc.o xenv.o
>  obj-$(CONFIG_SMP) += platsmp.o
> +obj-$(CONFIG_SUSPEND) += pm.o
> diff --git a/arch/arm/mach-tango/pm.c b/arch/arm/mach-tango/pm.c
> new file mode 100644
> index 000000000000..b05c6d6f99d0
> --- /dev/null
> +++ b/arch/arm/mach-tango/pm.c
> @@ -0,0 +1,32 @@
> +#include <linux/init.h>
> +#include <linux/suspend.h>
> +#include <asm/suspend.h>
> +#include "smc.h"
> +
> +static int tango_pm_powerdown(unsigned long arg)
> +{
> +	tango_suspend(virt_to_phys(cpu_resume));
> +
> +	return -EIO; /* tango_suspend has failed */
> +}
> +
> +static int tango_pm_enter(suspend_state_t state)
> +{
> +	if (state == PM_SUSPEND_MEM)
> +		return cpu_suspend(0, tango_pm_powerdown);
> +
> +	return -EINVAL;
> +}
> +
> +static const struct platform_suspend_ops tango_pm_ops = {
> +	.enter = tango_pm_enter,
> +	.valid = suspend_valid_only_mem,
> +};
> +
> +static int __init tango_pm_init(void)
> +{
> +	suspend_set_ops(&tango_pm_ops);
> +	return 0;
> +}
> +
> +late_initcall(tango_pm_init);
> diff --git a/arch/arm/mach-tango/smc.h b/arch/arm/mach-tango/smc.h
> index 3d31f984f44c..57919539da1b 100644
> --- a/arch/arm/mach-tango/smc.h
> +++ b/arch/arm/mach-tango/smc.h
> @@ -3,5 +3,6 @@ extern int tango_smc(unsigned int val, unsigned int service);
>  #define tango_set_l2_control(val)	tango_smc(val, 0x102)
>  #define tango_start_aux_core(val)	tango_smc(val, 0x104)
>  #define tango_set_aux_boot_addr(val)	tango_smc(val, 0x105)
> +#define tango_suspend(val)		tango_smc(val, 0x120)
>  #define tango_aux_core_die(val)		tango_smc(val, 0x121)
>  #define tango_aux_core_kill(val)	tango_smc(val, 0x122)
> 

Hello everyone,

I'll wait a few more days for comments, then I'll submit the patch
to arm-soc for inclusion in v4.8 (if no issues are raised).

(I suppose the return value for tango_pm_powerdown() is not that
big a deal.)

Regards.


WARNING: multiple messages have this Message-ID (diff)
From: marc_gonzalez@sigmadesigns.com (Marc Gonzalez)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH v2] ARM: tango: add Suspend-to-RAM support
Date: Mon, 4 Jul 2016 11:01:44 +0200	[thread overview]
Message-ID: <577A25F8.80702@sigmadesigns.com> (raw)
In-Reply-To: <5774DBDE.1070605@sigmadesigns.com>

On 30/06/2016 10:44, Marc Gonzalez wrote:

> Ask firmware to put RAM in self-refresh mode and power system down.
> 
>     echo mem > /sys/power/state
> 
> See Documentation/power/states.txt
> 
> Signed-off-by: Marc Gonzalez <marc_gonzalez@sigmadesigns.com>
> ---
> 
> This is a RFC because I have a few doubts:
> 
> 1) return value when tango_suspend() fails and unexpectedly returns (I used -EIO)
> Is there a better error to return?
> 
> 2) conditionally building pm.c (using CONFIG_SUSPEND? CONFIG_PM_SLEEP? other?)
> Is there a better config knob to use?
> 
> 3) .valid is required, right?
> AFAICS, the answer is "yes", .valid is indeed required:
> ("no valid callback implies that none are valid")
> 
> static bool valid_state(suspend_state_t state)
> {
> 	/*
> 	 * PM_SUSPEND_STANDBY and PM_SUSPEND_MEM states need low level
> 	 * support and need to be valid to the low level
> 	 * implementation, no valid callback implies that none are valid.
> 	 */
> 	return suspend_ops && suspend_ops->valid && suspend_ops->valid(state);
> }
> 
> ---
>  arch/arm/mach-tango/Makefile |  1 +
>  arch/arm/mach-tango/pm.c     | 32 ++++++++++++++++++++++++++++++++
>  arch/arm/mach-tango/smc.h    |  1 +
>  3 files changed, 34 insertions(+)
>  create mode 100644 arch/arm/mach-tango/pm.c
> 
> diff --git a/arch/arm/mach-tango/Makefile b/arch/arm/mach-tango/Makefile
> index 7ca753aa9fb6..822b7ca803c6 100644
> --- a/arch/arm/mach-tango/Makefile
> +++ b/arch/arm/mach-tango/Makefile
> @@ -3,3 +3,4 @@ AFLAGS_smc.o := -Wa,-march=armv7-a$(plus_sec)
>  
>  obj-y += setup.o smc.o xenv.o
>  obj-$(CONFIG_SMP) += platsmp.o
> +obj-$(CONFIG_SUSPEND) += pm.o
> diff --git a/arch/arm/mach-tango/pm.c b/arch/arm/mach-tango/pm.c
> new file mode 100644
> index 000000000000..b05c6d6f99d0
> --- /dev/null
> +++ b/arch/arm/mach-tango/pm.c
> @@ -0,0 +1,32 @@
> +#include <linux/init.h>
> +#include <linux/suspend.h>
> +#include <asm/suspend.h>
> +#include "smc.h"
> +
> +static int tango_pm_powerdown(unsigned long arg)
> +{
> +	tango_suspend(virt_to_phys(cpu_resume));
> +
> +	return -EIO; /* tango_suspend has failed */
> +}
> +
> +static int tango_pm_enter(suspend_state_t state)
> +{
> +	if (state == PM_SUSPEND_MEM)
> +		return cpu_suspend(0, tango_pm_powerdown);
> +
> +	return -EINVAL;
> +}
> +
> +static const struct platform_suspend_ops tango_pm_ops = {
> +	.enter = tango_pm_enter,
> +	.valid = suspend_valid_only_mem,
> +};
> +
> +static int __init tango_pm_init(void)
> +{
> +	suspend_set_ops(&tango_pm_ops);
> +	return 0;
> +}
> +
> +late_initcall(tango_pm_init);
> diff --git a/arch/arm/mach-tango/smc.h b/arch/arm/mach-tango/smc.h
> index 3d31f984f44c..57919539da1b 100644
> --- a/arch/arm/mach-tango/smc.h
> +++ b/arch/arm/mach-tango/smc.h
> @@ -3,5 +3,6 @@ extern int tango_smc(unsigned int val, unsigned int service);
>  #define tango_set_l2_control(val)	tango_smc(val, 0x102)
>  #define tango_start_aux_core(val)	tango_smc(val, 0x104)
>  #define tango_set_aux_boot_addr(val)	tango_smc(val, 0x105)
> +#define tango_suspend(val)		tango_smc(val, 0x120)
>  #define tango_aux_core_die(val)		tango_smc(val, 0x121)
>  #define tango_aux_core_kill(val)	tango_smc(val, 0x122)
> 

Hello everyone,

I'll wait a few more days for comments, then I'll submit the patch
to arm-soc for inclusion in v4.8 (if no issues are raised).

(I suppose the return value for tango_pm_powerdown() is not that
big a deal.)

Regards.

  reply	other threads:[~2016-07-04  9:01 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-29 13:58 [RFC PATCH v1] ARM: tango: add Suspend-to-RAM support Marc Gonzalez
2016-06-29 13:58 ` Marc Gonzalez
2016-06-29 17:48 ` Sudeep Holla
2016-06-29 17:48   ` Sudeep Holla
2016-06-30  8:44   ` [RFC PATCH v2] " Marc Gonzalez
2016-06-30  8:44     ` Marc Gonzalez
2016-07-04  9:01     ` Marc Gonzalez [this message]
2016-07-04  9:01       ` Marc Gonzalez
2016-07-07 13:08       ` [PATCH v3] " Marc Gonzalez
2016-07-07 13:08         ` Marc Gonzalez
2016-07-07 14:01         ` Arnd Bergmann
2016-07-07 14:01           ` Arnd Bergmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=577A25F8.80702@sigmadesigns.com \
    --to=marc_gonzalez@sigmadesigns.com \
    --cc=arnd@arndb.de \
    --cc=khilman@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=robin.murphy@arm.com \
    --cc=sf84@laposte.net \
    --cc=slash.tmp@free.fr \
    --cc=sudeep.holla@arm.com \
    --cc=thibaud_cornic@sigmadesigns.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.