aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm63xx/patches-3.18/300-reset_buttons.patch
blob: c64d40549674cc483892560f0838ab785d031a2a (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
126
127
128
129
130
131
132
133
134
135
--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
@@ -10,6 +10,8 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
+#include <linux/gpio_keys.h>
+#include <linux/input.h>
 #include <asm/addrspace.h>
 #include <bcm63xx_board.h>
 #include <bcm63xx_cpu.h>
@@ -26,6 +28,9 @@
 
 #define HCS_OFFSET_128K			0x20000
 
+#define BCM963XX_KEYS_POLL_INTERVAL	20
+#define BCM963XX_KEYS_DEBOUNCE_INTERVAL	(BCM963XX_KEYS_POLL_INTERVAL * 3)
+
 /*
  * known 3368 boards
  */
@@ -367,6 +372,16 @@ static struct board_info __initdata boar
 			.active_low	= 1,
 		},
 	},
+	.buttons = {
+		{
+			.desc		= "reset",
+			.gpio		= 33,
+			.active_low	= 1,
+			.type		= EV_KEY,
+			.code		= KEY_RESTART,
+			.debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
+		},
+	},
 };
 
 static struct board_info __initdata board_96348gw = {
@@ -425,6 +440,16 @@ static struct board_info __initdata boar
 			.active_low	= 1,
 		},
 	},
+	.buttons = {
+		{
+			.desc		= "reset",
+			.gpio		= 36,
+			.active_low	= 1,
+			.type		= EV_KEY,
+			.code		= KEY_RESTART,
+			.debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
+		},
+	},
 };
 
 static struct board_info __initdata board_FAST2404 = {
--- a/arch/mips/bcm63xx/boards/board_common.c
+++ b/arch/mips/bcm63xx/boards/board_common.c
@@ -12,6 +12,7 @@
 #include <linux/string.h>
 #include <linux/platform_device.h>
 #include <linux/ssb/ssb.h>
+#include <linux/gpio_keys.h>
 #include <asm/addrspace.h>
 #include <bcm63xx_board.h>
 #include <bcm63xx_cpu.h>
@@ -32,6 +33,8 @@
 
 #define PFX	"board: "
 
+#define BCM963XX_KEYS_POLL_INTERVAL	20
+
 static struct board_info board;
 
 /*
@@ -151,11 +154,23 @@ static struct platform_device bcm63xx_gp
 	.dev.platform_data	= &bcm63xx_led_data,
 };
 
+static struct gpio_keys_platform_data bcm63xx_gpio_keys_data = {
+	.poll_interval  = BCM963XX_KEYS_POLL_INTERVAL,
+};
+
+static struct platform_device bcm63xx_gpio_keys_device = {
+	.name		= "gpio-keys-polled",
+	.id		= 0,
+	.dev.platform_data = &bcm63xx_gpio_keys_data,
+};
+
 /*
  * third stage init callback, register all board devices.
  */
 int __init board_register_devices(void)
 {
+	int button_count = 0;
+
 	if (board.has_uart0)
 		bcm63xx_uart_register(0);
 
@@ -217,5 +232,16 @@ int __init board_register_devices(void)
 		gpio_request_one(board.ephy_reset_gpio,
 				board.ephy_reset_gpio_flags, "ephy-reset");
 
+	/* count number of BUTTONs defined by this device */
+	while (button_count < ARRAY_SIZE(board.buttons) && board.buttons[button_count].desc)
+		button_count++;
+
+	if (button_count) {
+		bcm63xx_gpio_keys_data.nbuttons = button_count;
+		bcm63xx_gpio_keys_data.buttons = board.buttons;
+
+		platform_device_register(&bcm63xx_gpio_keys_device);
+	}
+
 	return 0;
 }
--- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
+++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h
@@ -3,6 +3,7 @@
 
 #include <linux/types.h>
 #include <linux/gpio.h>
+#include <linux/gpio_keys.h>
 #include <linux/leds.h>
 #include <bcm63xx_dev_enet.h>
 #include <bcm63xx_dev_usb_usbd.h>
@@ -48,6 +49,9 @@ struct board_info {
 	/* GPIO LEDs */
 	struct gpio_led leds[5];
 
+	/* Buttons */
+	struct gpio_keys_button buttons[4];
+
 	/* External PHY reset GPIO */
 	unsigned int ephy_reset_gpio;