summaryrefslogtreecommitdiffstats
path: root/target/linux/ixp4xx/patches-2.6.24/016-dsmg600_auto_power_on.patch
blob: 003fed9e62fc25ef453c953baa51cb6cda83773d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
From 67e494e3e03ef807255f084800d8658b89ff5fec Mon Sep 17 00:00:00 2001
From: Rod Whitby <rod@whitby.id.au>
Date: Tue, 29 Jan 2008 10:00:25 +1030
Subject: ixp4xx: Button updates for the dsmg600 board (Patch #4769)

 * Remove the superfluous declaration of ctrl_alt_del().
 * Convert GPIO and IRQ handling to use the <asm/gpio.h> api.
 * Perform the reset on the release of the power button, so that
   NAS devices which have been set to auto-power-on (by solder
   bridging the power button) do not continuously power cycle.
 * Remove all superflous constants from dsmg600.h

Signed-off-by: Rod Whitby <rod@whitby.id.au>
Acked-by: Lennert Buytenhek <buytenh@wantstofly.org>

PATCH FOLLOWS
KernelVersion: 2.6.24-git5

diff --git a/arch/arm/mach-ixp4xx/dsmg600-power.c b/arch/arm/mach-ixp4xx/dsmg600-power.c
index 3471787..db63987 100644
--- a/arch/arm/mach-ixp4xx/dsmg600-power.c
+++ b/arch/arm/mach-ixp4xx/dsmg600-power.c
@@ -26,14 +26,13 @@
 #include <linux/jiffies.h>
 #include <linux/timer.h>
 
+#include <asm/gpio.h>
 #include <asm/mach-types.h>
 
-extern void ctrl_alt_del(void);
-
 /* This is used to make sure the power-button pusher is serious.  The button
  * must be held until the value of this counter reaches zero.
  */
-static volatile int power_button_countdown;
+static int power_button_countdown;
 
 /* Must hold the button down for at least this many counts to be processed */
 #define PBUTTON_HOLDDOWN_COUNT 4 /* 2 secs */
@@ -47,22 +46,27 @@ static void dsmg600_power_handler(unsigned long data)
 	 * state of the power button.
 	 */
 
-	if (*IXP4XX_GPIO_GPINR & DSMG600_PB_BM) {
+	if (gpio_get_value(DSMG600_PB_GPIO)) {
 
 		/* IO Pin is 1 (button pushed) */
+		if (power_button_countdown > 0)
+			power_button_countdown--;
+
+	} else {
+
+		/* Done on button release, to allow for auto-power-on mods. */
 		if (power_button_countdown == 0) {
-			/* Signal init to do the ctrlaltdel action, this will bypass
-			 * init if it hasn't started and do a kernel_restart.
+			/* Signal init to do the ctrlaltdel action,
+			 * this will bypass init if it hasn't started
+			 * and do a kernel_restart.
 			 */
 			ctrl_alt_del();
 
 			/* Change the state of the power LED to "blink" */
 			gpio_line_set(DSMG600_LED_PWR_GPIO, IXP4XX_GPIO_LOW);
+		} else {
+			power_button_countdown = PBUTTON_HOLDDOWN_COUNT;
 		}
-		power_button_countdown--;
-
-	} else {
-		power_button_countdown = PBUTTON_HOLDDOWN_COUNT;
 	}
 
 	mod_timer(&dsmg600_power_timer, jiffies + msecs_to_jiffies(500));
@@ -81,12 +85,12 @@ static int __init dsmg600_power_init(void)
 	if (!(machine_is_dsmg600()))
 		return 0;
 
-	if (request_irq(DSMG600_RB_IRQ, &dsmg600_reset_handler,
+	if (request_irq(gpio_to_irq(DSMG600_RB_GPIO), &dsmg600_reset_handler,
 		IRQF_DISABLED | IRQF_TRIGGER_LOW, "DSM-G600 reset button",
 		NULL) < 0) {
 
 		printk(KERN_DEBUG "Reset Button IRQ %d not available\n",
-			DSMG600_RB_IRQ);
+			gpio_to_irq(DSMG600_RB_GPIO));
 
 		return -EIO;
 	}
@@ -114,7 +118,7 @@ static void __exit dsmg600_power_exit(void)
 
 	del_timer_sync(&dsmg600_power_timer);
 
-	free_irq(DSMG600_RB_IRQ, NULL);
+	free_irq(gpio_to_irq(DSMG600_RB_GPIO), NULL);
 }
 
 module_init(dsmg600_power_init);
diff --git a/include/asm-arm/arch-ixp4xx/dsmg600.h b/include/asm-arm/arch-ixp4xx/dsmg600.h
index a19605a..b7673e1 100644
--- a/include/asm-arm/arch-ixp4xx/dsmg600.h
+++ b/include/asm-arm/arch-ixp4xx/dsmg600.h
@@ -40,18 +40,13 @@
 /* Buttons */
 
 #define DSMG600_PB_GPIO		15	/* power button */
-#define DSMG600_PB_BM		(1L << DSMG600_PB_GPIO)
-
 #define DSMG600_RB_GPIO		3	/* reset button */
 
-#define DSMG600_RB_IRQ		IRQ_IXP4XX_GPIO3
+/* Power control */
 
 #define DSMG600_PO_GPIO		2	/* power off */
 
 /* LEDs */
 
 #define DSMG600_LED_PWR_GPIO	0
-#define DSMG600_LED_PWR_BM	(1L << DSMG600_LED_PWR_GPIO)
-
 #define DSMG600_LED_WLAN_GPIO	14
-#define DSMG600_LED_WLAN_BM	(1L << DSMG600_LED_WLAN_GPIO)
-- 
1.5.2.5