summary refs log tree commit diff
path: root/arch/blackfin/mach-bf609
diff options
context:
space:
mode:
authorSteven Miao <realmz6@gmail.com>2012-05-17 17:29:54 +0800
committerBob Liu <lliubbo@gmail.com>2012-05-21 14:54:50 +0800
commit0fbd88ca20a68a633b565e1f5ba18ca64afb0c78 (patch)
tree0c97e9c20a71ba20750f4e51d8e0e4a07e845ddd /arch/blackfin/mach-bf609
parent7c141c1c5c148419eef8972688e86e2e3115ea13 (diff)
downloadlinux-0fbd88ca20a68a633b565e1f5ba18ca64afb0c78.tar.gz
blackfin: bf60x: add wakeup source select
Support select the wakeup source for power management on bf60x.

Signed-off-by: Steven Miao <realmz6@gmail.com>
Signed-off-by: Bob Liu <lliubbo@gmail.com>
Diffstat (limited to 'arch/blackfin/mach-bf609')
-rw-r--r--arch/blackfin/mach-bf609/pm.c83
1 files changed, 62 insertions, 21 deletions
diff --git a/arch/blackfin/mach-bf609/pm.c b/arch/blackfin/mach-bf609/pm.c
index bbc5a79b5e22..79cdf41096c2 100644
--- a/arch/blackfin/mach-bf609/pm.c
+++ b/arch/blackfin/mach-bf609/pm.c
@@ -212,6 +212,65 @@ void bfin_hibernate(unsigned long mask)
 void bf609_cpu_pm_enter(suspend_state_t state)
 {
 	int error;
+	unsigned long wakeup = 0;
+	unsigned long wakeup_pol = 0;
+
+#ifdef CONFIG_PM_BFIN_WAKE_PA15
+	wakeup |= PA15WE;
+# if CONFIG_PM_BFIN_WAKE_PA15_POL
+	wakeup_pol |= PA15WE;
+# endif
+#endif
+
+#ifdef CONFIG_PM_BFIN_WAKE_PB15
+	wakeup |= PB15WE;
+# if CONFIG_PM_BFIN_WAKE_PA15_POL
+	wakeup_pol |= PB15WE;
+# endif
+#endif
+
+#ifdef CONFIG_PM_BFIN_WAKE_PC15
+	wakeup |= PC15WE;
+# if CONFIG_PM_BFIN_WAKE_PC15_POL
+	wakeup_pol |= PC15WE;
+# endif
+#endif
+
+#ifdef CONFIG_PM_BFIN_WAKE_PD06
+	wakeup |= PD06WE;
+# if CONFIG_PM_BFIN_WAKE_PD06_POL
+	wakeup_pol |= PD06WE;
+# endif
+#endif
+
+#ifdef CONFIG_PM_BFIN_WAKE_PE12
+	wakeup |= PE12WE;
+# if CONFIG_PM_BFIN_WAKE_PE12_POL
+	wakeup_pol |= PE12WE;
+# endif
+#endif
+
+#ifdef CONFIG_PM_BFIN_WAKE_PG04
+	wakeup |= PG04WE;
+# if CONFIG_PM_BFIN_WAKE_PG04_POL
+	wakeup_pol |= PG04WE;
+# endif
+#endif
+
+#ifdef CONFIG_PM_BFIN_WAKE_PG13
+	wakeup |= PG13WE;
+# if CONFIG_PM_BFIN_WAKE_PG13_POL
+	wakeup_pol |= PG13WE;
+# endif
+#endif
+
+#ifdef CONFIG_PM_BFIN_WAKE_USB
+	wakeup |= USBWE;
+# if CONFIG_PM_BFIN_WAKE_USB_POL
+	wakeup_pol |= USBWE;
+# endif
+#endif
+
 	error = irq_set_irq_wake(255, 1);
 	if(error < 0)
 		printk(KERN_DEBUG "Unable to get irq wake\n");
@@ -220,9 +279,9 @@ void bf609_cpu_pm_enter(suspend_state_t state)
 		printk(KERN_DEBUG "Unable to get irq wake\n");
 
 	if (state == PM_SUSPEND_STANDBY)
-		bfin_deepsleep(0xffff);
+		bfin_deepsleep(wakeup);
 	else {
-		bfin_hibernate(0xffff);
+		bfin_hibernate(wakeup);
 	}
 }
 
@@ -263,26 +322,8 @@ static int __init bf609_init_pm(void)
 {
 	int irq;
 	int error;
-	error = gpio_request(GPIO_PG4, "gpiopg4");
-	if (error < 0) {
-		printk(KERN_DEBUG "failed to request GPIO %d, error %d\n",
-				GPIO_PG4, error);
-	}
-
-	irq = gpio_to_irq(GPIO_PG4);
-	if (irq < 0) {
-		error = irq;
-		printk(KERN_DEBUG "Unable to get irq number for GPIO %d, error %d\n",
-				GPIO_PG4, error);
-	}
-
-	printk(KERN_DEBUG "%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(KERN_DEBUG "Unable to get irq\n");
 
-#if 1
+#if CONFIG_PM_BFIN_WAKE_PE12
 	irq = gpio_to_irq(GPIO_PE12);
 	if (irq < 0) {
 		error = irq;