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

Signed-off-by: Steven Miao <[email protected]>
Signed-off-by: Bob Liu <[email protected]>
---
 arch/blackfin/mach-bf609/pm.c |   99 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 97 insertions(+), 2 deletions(-)

diff --git a/arch/blackfin/mach-bf609/pm.c b/arch/blackfin/mach-bf609/pm.c
index 3a63a09..576721b 100644
--- a/arch/blackfin/mach-bf609/pm.c
+++ b/arch/blackfin/mach-bf609/pm.c
@@ -8,8 +8,13 @@
 
 #include <linux/suspend.h>
 #include <linux/io.h>
+#include <linux/interrupt.h>
+#include <linux/gpio.h>
+
+#include <linux/delay.h>
 
 #include <asm/dpmc.h>
+#include <asm/pm.h>
 #include <mach/pm.h>
 
 void bfin_cpu_suspend(void)
@@ -21,6 +26,13 @@ void bfin_cpu_suspend(void)
 			);
 }
 
+void pm_dump_reg(void)
+{
+	uint32_t reg;
+	reg = bfin_read32(SEC_SCTL1);
+	printk("SEC_SCTL1 %08x %08x\n", SEC_SCTL1, reg);
+}
+
 void bfin_deepsleep(unsigned long mask)
 {
 	uint32_t dpm0_ctl;
@@ -28,8 +40,18 @@ void bfin_deepsleep(unsigned long mask)
 	bfin_write32(DPM0_WAKE_EN, mask);
 
 	dpm0_ctl = bfin_read32(DPM0_CTL);
-	dpm0_ctl |= 0x00000004;
+	dpm0_ctl = 0x00000008;
 	bfin_write32(DPM0_CTL, dpm0_ctl);
+	bfin_write32(DPM0_WAKE_EN, mask);
+	bfin_write32(DPM0_WAKE_POL, 0);
+	SSYNC();
+	pm_dump_reg();
+#if 1
+	while (1) {
+		mdelay(500);
+		printk("idle\n");
+	}
+#endif
 	bfin_cpu_suspend();
 
 }
@@ -37,10 +59,29 @@ void bfin_deepsleep(unsigned long mask)
 void bfin_hibernate(unsigned long mask)
 {
 	uint32_t dpm0_ctl;
+	int i = 100000000;
+
+	bfin_write32(DPM0_WAKE_EN, mask);
+	bfin_write32(DPM0_WAKE_POL, 0);
+	bfin_write32(DPM0_RESTORE0, 0xFFAABBCC);
+	bfin_write32(DPM0_PGCNTR, 0x0000FFFF);
+	bfin_write32(DPM0_HIB_DIS, 0xFFFF);
+	SSYNC();
+
+	printk("hibernate: restore %x pgcnt %x\n", bfin_read32(DPM0_RESTORE0), bfin_read32(DPM0_PGCNTR));
 
 	dpm0_ctl = bfin_read32(DPM0_CTL);
-	dpm0_ctl |= 0x00000010;
+	dpm0_ctl = 0x00000010;
 	bfin_write32(DPM0_CTL, dpm0_ctl);
+	SSYNC();
+
+#if 1
+	while (1) {
+		mdelay(500);
+		printk("idle\n");
+	}
+#endif
+
 	bf609_hibernate();
 }
 
@@ -89,6 +130,11 @@ void bf609_ddr_sr_exit(void)
 
 void bf609_cpu_pm_enter(suspend_state_t state)
 {
+	int error;
+	error = irq_set_irq_wake(255, 1);
+	if (error < 0)
+		printk("Unable to get irq wake\n");
+
 	if (state == PM_SUSPEND_STANDBY)
 		bfin_deepsleep(0xffff);
 	else
@@ -111,8 +157,57 @@ static struct bfin_cpu_pm_fns bf609_cpu_pm = {
 	.finish         = bf609_cpu_pm_finish,
 };
 
+static irqreturn_t test_isr(int irq, void *dev_id)
+{
+	printk("gpio irq %d\n", irq);
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t dummy_isr(int irq, void *dev_id)
+{
+	printk("enter %s\n", __func__);
+	return IRQ_HANDLED;
+}
+
 static int __init bf609_init_pm(void)
 {
+	int irq;
+	int error;
+	error = gpio_request(GPIO_PG4, "gpiopg4");
+	if (error < 0) {
+		printk("failed to request GPIO %d, error %d\n",
+				GPIO_PG4, error);
+	}
+
+	error = gpio_direction_input(GPIO_PG4);
+	if (error < 0) {
+		printk("failed to configure"
+				" direction for GPIO %d, error %d\n",
+				GPIO_PG4, error);
+	}
+
+	irq = gpio_to_irq(GPIO_PG4);
+	if (irq < 0) {
+		error = irq;
+		printk("Unable to get irq number for GPIO %d, error %d\n",
+				GPIO_PG4, error);
+	}
+
+	printk("%s gpio %d irq %d\n", __func__, GPIO_PG4, irq);
+
+	error = request_irq(irq, test_isr, IRQF_TRIGGER_FALLING | IRQF_NO_SUSPEND, "gpiopg4", NULL);
+	if (error < 0)
+		printk("Unable to get irq\n");
+
+	error = request_irq(IRQ_CGU_EVT, dummy_isr, IRQF_NO_SUSPEND, "cgu0 event", NULL);
+	if (error < 0)
+		printk("Unable to get irq\n");
+
+	error = request_irq(IRQ_DPM, dummy_isr, IRQF_NO_SUSPEND, "dpm0 event", NULL);
+	if (error < 0)
+		printk("Unable to get irq\n");
+
+
 	bfin_cpu_pm = &bf609_cpu_pm;
 	return 0;
 }
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to