ARM: tango: add Suspend-to-RAM support
Subsystems (2)
RFC PATCH 1/1 ARM: tango: add Suspend-to-RAM support
Ask firmware to put RAM in self-refresh mode and power system down.
echo mem > /sys/power/state
See Documentation/power/states.txt
---
This is a RFC because I have a few doubts:
1) return value when tango_suspend() fails and unexpectedly returns (I used -EIO)
2) conditionally building pm.c (using CONFIG_SUSPEND? CONFIG_PM_SLEEP? other?)
3) .valid is required, right?
--- arch/arm/mach-tango/Makefile | 1 + arch/arm/mach-tango/pm.c | 37 +++++++++++++++++++++++++++++++++++++ arch/arm/mach-tango/smc.h | 1 + 3 files changed, 39 insertions(+) create mode 100644 arch/arm/mach-tango/pm.c
arch/arm/mach-tango/Makefile +1 -0
@@ -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
arch/arm/mach-tango/pm.c new file +37 -0
@@ -0,0 +1,37 @@ +#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 int tango_pm_valid (suspend_state_t state) +{ +return state ==PM_SUSPEND_MEM ; +} + +static const struct platform_suspend_ops tango_pm_ops = { + .enter = tango_pm_enter, + .valid = tango_pm_valid, +}; + +static int __init tango_pm_init (void ) +{ +suspend_set_ops (&tango_pm_ops); +return 0 ; +} + +late_initcall (tango_pm_init);
arch/arm/mach-tango/smc.h +1 -0
@@ -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)
Signature · 1 line
2.9.0
RFC PATCH 1/1 ARM: tango: add Suspend-to-RAM support
Quoted 52 lines · Marc Gonzalez
Ask firmware to put RAM in self-refresh mode and power system down.
echo mem >
/sys/power/stateSee
Documentation/power/states.txtSigned-off-by Marc Gonzalez <[email protected]>---
This is a RFC because I have a few doubts:
1) return value whentango_suspend()fails and unexpectedly returns (I used-EIO)
2) conditionally buildingpm.c(usingCONFIG_SUSPEND?CONFIG_PM_SLEEP? other?)
3) .valid is required, right?--- arch/arm/mach-tango/Makefile | 1 + arch/arm/mach-tango/pm.c | 37 +++++++++++++++++++++++++++++++++++++ arch/arm/mach-tango/smc.h | 1 + 3 files changed, 39 insertions(+)create mode 100644
arch/arm/mach-tango/pm.carch/arm/mach-tango/Makefile +1
-0@@ -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.oarch/arm/mach-tango/pm.c new file +18
-0@@ -0,0 +1,37 @@ +#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 ;
arch/arm/mach-tango/pm.c line 28
Quoted 10 lines
arch/arm/mach-tango/pm.c new file +10
-0+} + +static int tango_pm_valid (suspend_state_t state) +{ +return state ==PM_SUSPEND_MEM ; +} + +static const struct platform_suspend_ops tango_pm_ops = { + .enter = tango_pm_enter, + .valid = tango_pm_valid,
You can use suspend_valid_only_mem instead which does exactly same thing.
Signature · 6 lines
Regards, Sudeep -- Regards, Sudeep
RFC PATCH v2 1/1 ARM: tango: add Suspend-to-RAM support
Ask firmware to put RAM in self-refresh mode and power system down.
echo mem > /sys/power/state
See Documentation/power/states.txt
---
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
arch/arm/mach-tango/Makefile +1 -0
@@ -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
arch/arm/mach-tango/pm.c new file +32 -0
@@ -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);
arch/arm/mach-tango/smc.h +1 -0
@@ -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)
Signature · 1 line
2.9.0
RFC PATCH v2 1/1 ARM: tango: add Suspend-to-RAM support
Quoted 91 lines · Marc Gonzalez
Ask firmware to put RAM in self-refresh mode and power system down.
echo mem >
/sys/power/stateSee
Documentation/power/states.txtSigned-off-by Marc Gonzalez <[email protected]>---
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(usingCONFIG_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.carch/arm/mach-tango/Makefile +1
-0@@ -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.oarch/arm/mach-tango/pm.c new file +32
-0@@ -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);arch/arm/mach-tango/smc.h +0
-0
arch/arm/mach-tango/smc.h extern int tango_smc(unsigned int val, unsigned int service); · line 8
Quoted 6 lines
arch/arm/mach-tango/smc.h +1
-0@@ -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.
PATCH v3 1/1 ARM: tango: add Suspend-to-RAM support
Ask firmware to put RAM in self-refresh mode and power system down.
echo mem > /sys/power/state
See Documentation/power/states.txt
---
v3 is identical to v2 minus the RFC tag
Olof, if still possible, please merge for v4.8
--- 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
arch/arm/mach-tango/Makefile +1 -0
@@ -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
arch/arm/mach-tango/pm.c new file +32 -0
@@ -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);
arch/arm/mach-tango/smc.h +1 -0
@@ -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)
Signature · 1 line
2.9.0
Arnd Bergmann
AppliedPATCH v3 1/1 ARM: tango: add Suspend-to-RAM support
Quoted 10 lines · CEST Marc Gonzalez
Ask firmware to put RAM in self-refresh mode and power system down.
echo mem >
/sys/power/stateSee
Documentation/power/states.txtSigned-off-by Marc Gonzalez <[email protected]>---
v3 is identical to v2 minus the RFC tag
Olof, if still possible, please merge for v4.8
Applied to next/soc, thanks!
Arnd