commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=d25e55c03c045b3e94c43465eb815510311f6032
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk

add bf609 cpu pm implementation in sleep.S
tweak Makefile

Signed-off-by: Steven Miao <[email protected]>
Signed-off-by: Bob Liu <[email protected]>
---
 arch/blackfin/mach-bf609/Makefile          |    2 +-
 arch/blackfin/mach-bf609/include/mach/pm.h |    2 ++
 arch/blackfin/mach-bf609/pm.c              |    9 +++++++--
 arch/blackfin/mach-bf609/sleep.S           |   14 ++++++++++++++
 4 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/arch/blackfin/mach-bf609/Makefile b/arch/blackfin/mach-bf609/Makefile
index 91a66bb..04a32f2 100644
--- a/arch/blackfin/mach-bf609/Makefile
+++ b/arch/blackfin/mach-bf609/Makefile
@@ -3,4 +3,4 @@
 #
 
 obj-y := dma.o clock.o
-obj-$(CONFIG_PM) += pm.o
+obj-$(CONFIG_PM) += pm.o sleep.o
diff --git a/arch/blackfin/mach-bf609/include/mach/pm.h b/arch/blackfin/mach-bf609/include/mach/pm.h
index cc37980..4a687cd 100644
--- a/arch/blackfin/mach-bf609/include/mach/pm.h
+++ b/arch/blackfin/mach-bf609/include/mach/pm.h
@@ -25,4 +25,6 @@ extern struct bfin_cpu_pm_fns *bfin_cpu_pm;
 extern int bfin609_pm_enter(suspend_state_t state);
 extern int bf609_pm_prepare(void);
 extern void bf609_pm_finish(void);
+
+extern void bf609_hibernate(void);
 #endif
diff --git a/arch/blackfin/mach-bf609/pm.c b/arch/blackfin/mach-bf609/pm.c
index 3c5d0e3..3a63a09 100644
--- a/arch/blackfin/mach-bf609/pm.c
+++ b/arch/blackfin/mach-bf609/pm.c
@@ -25,6 +25,8 @@ void bfin_deepsleep(unsigned long mask)
 {
 	uint32_t dpm0_ctl;
 
+	bfin_write32(DPM0_WAKE_EN, mask);
+
 	dpm0_ctl = bfin_read32(DPM0_CTL);
 	dpm0_ctl |= 0x00000004;
 	bfin_write32(DPM0_CTL, dpm0_ctl);
@@ -39,7 +41,7 @@ void bfin_hibernate(unsigned long mask)
 	dpm0_ctl = bfin_read32(DPM0_CTL);
 	dpm0_ctl |= 0x00000010;
 	bfin_write32(DPM0_CTL, dpm0_ctl);
-	bfin_cpu_suspend();
+	bf609_hibernate();
 }
 
 void bf609_ddr_sr(void)
@@ -87,7 +89,10 @@ void bf609_ddr_sr_exit(void)
 
 void bf609_cpu_pm_enter(suspend_state_t state)
 {
-	bfin_deepsleep(0xffff);
+	if (state == PM_SUSPEND_STANDBY)
+		bfin_deepsleep(0xffff);
+	else
+		bfin_hibernate(0xffff);
 }
 
 int bf609_cpu_pm_prepare(void)
diff --git a/arch/blackfin/mach-bf609/sleep.S b/arch/blackfin/mach-bf609/sleep.S
new file mode 100644
index 0000000..c785dab
--- /dev/null
+++ b/arch/blackfin/mach-bf609/sleep.S
@@ -0,0 +1,14 @@
+#include <linux/linkage.h>
+#include <asm/blackfin.h>
+#include <asm/dpmc.h>
+
+.section .text
+ENTRY(_bf609_hibernate)
+	bfin_cpu_reg_save;
+	idle;
+
+.Lpm_resume_here:
+
+	bfin_cpu_reg_restore;
+ENDPROC(_bf609_hibernate)
+
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to