ARM: shmobile: r8a7740: Add CPU sleep suspend
authorBastian Hecht <hechtb@gmail.com>
Wed, 5 Dec 2012 12:13:07 +0000 (12:13 +0000)
committerSimon Horman <horms+renesas@verge.net.au>
Fri, 25 Jan 2013 03:43:46 +0000 (12:43 +0900)
Add the lighest possible sleep mode on Cortex-A9 cores: CPU sleep.
It is entered by a simple dsb and wfi instruction via cpu_do_idle(). As
just clocks are stopped there is no need to save or restore any state of
the system.

Signed-off-by: Bastian Hecht <hechtb+renesas@gmail.com>
Acked-by: Magnus Damm <damm@opensource.se>
[ horms@verge.net.au: Added missing includes ]
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
arch/arm/mach-shmobile/board-armadillo800eva.c
arch/arm/mach-shmobile/include/mach/common.h
arch/arm/mach-shmobile/pm-r8a7740.c

index e791244..6573137 100644 (file)
@@ -1181,6 +1181,8 @@ static void __init eva_init(void)
        rmobile_add_device_to_domain("A4LC", &hdmi_lcdc_device);
        if (usb)
                rmobile_add_device_to_domain("A3SP", usb);
+
+       r8a7740_pm_init();
 }
 
 static void __init eva_earlytimer_init(void)
index f221c11..c0ab595 100644 (file)
@@ -52,6 +52,7 @@ extern void r8a7740_add_early_devices(void);
 extern void r8a7740_add_standard_devices(void);
 extern void r8a7740_clock_init(u8 md_ck);
 extern void r8a7740_pinmux_init(void);
+extern void r8a7740_pm_init(void);
 
 extern void r8a7779_init_irq(void);
 extern void r8a7779_map_io(void);
index 21e5316..40b87aa 100644 (file)
@@ -9,7 +9,9 @@
  * for more details.
  */
 #include <linux/console.h>
+#include <linux/suspend.h>
 #include <mach/pm-rmobile.h>
+#include <mach/common.h>
 
 #ifdef CONFIG_PM
 static int r8a7740_pd_a4s_suspend(void)
@@ -58,3 +60,23 @@ void __init r8a7740_init_pm_domains(void)
 }
 
 #endif /* CONFIG_PM */
+
+#ifdef CONFIG_SUSPEND
+static int r8a7740_enter_suspend(suspend_state_t suspend_state)
+{
+       cpu_do_idle();
+       return 0;
+}
+
+static void r8a7740_suspend_init(void)
+{
+       shmobile_suspend_ops.enter = r8a7740_enter_suspend;
+}
+#else
+static void r8a7740_suspend_init(void) {}
+#endif
+
+void __init r8a7740_pm_init(void)
+{
+       r8a7740_suspend_init();
+}