diff options
Diffstat (limited to 'arch/arm/mach-tegra/board-harmony-kbc.c')
-rw-r--r-- | arch/arm/mach-tegra/board-harmony-kbc.c | 375 |
1 files changed, 375 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-harmony-kbc.c b/arch/arm/mach-tegra/board-harmony-kbc.c new file mode 100644 index 00000000000..156da22bfec --- /dev/null +++ b/arch/arm/mach-tegra/board-harmony-kbc.c | |||
@@ -0,0 +1,375 @@ | |||
1 | /* | ||
2 | * arch/arm/mach-tegra/board-harmony-kbc.c | ||
3 | * Keys configuration for Nvidia tegra2 harmony platform. | ||
4 | * | ||
5 | * Copyright (C) 2011 NVIDIA, Inc. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
19 | * 02111-1307, USA | ||
20 | */ | ||
21 | |||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/platform_device.h> | ||
24 | #include <linux/input.h> | ||
25 | #include <mach/io.h> | ||
26 | #include <mach/iomap.h> | ||
27 | #include <mach/kbc.h> | ||
28 | |||
29 | #include "board.h" | ||
30 | #include "board-harmony.h" | ||
31 | #include "devices.h" | ||
32 | |||
33 | #define HARMONY_ROW_COUNT 16 | ||
34 | #define HARMONY_COL_COUNT 8 | ||
35 | |||
36 | static const u32 kbd_keymap[] = { | ||
37 | KEY(0, 0, KEY_RESERVED), | ||
38 | KEY(0, 1, KEY_RESERVED), | ||
39 | KEY(0, 2, KEY_W), | ||
40 | KEY(0, 3, KEY_S), | ||
41 | KEY(0, 4, KEY_A), | ||
42 | KEY(0, 5, KEY_Z), | ||
43 | KEY(0, 6, KEY_RESERVED), | ||
44 | KEY(0, 7, KEY_FN), | ||
45 | |||
46 | KEY(1, 0, KEY_RESERVED), | ||
47 | KEY(1, 1, KEY_RESERVED), | ||
48 | KEY(1, 2, KEY_RESERVED), | ||
49 | KEY(1, 3, KEY_RESERVED), | ||
50 | KEY(1, 4, KEY_RESERVED), | ||
51 | KEY(1, 5, KEY_RESERVED), | ||
52 | KEY(1, 6, KEY_RESERVED), | ||
53 | KEY(1, 7, KEY_MENU), | ||
54 | |||
55 | KEY(2, 0, KEY_RESERVED), | ||
56 | KEY(2, 1, KEY_RESERVED), | ||
57 | KEY(2, 2, KEY_RESERVED), | ||
58 | KEY(2, 3, KEY_RESERVED), | ||
59 | KEY(2, 4, KEY_RESERVED), | ||
60 | KEY(2, 5, KEY_RESERVED), | ||
61 | KEY(2, 6, KEY_LEFTALT), | ||
62 | KEY(2, 7, KEY_RIGHTALT), | ||
63 | |||
64 | KEY(3, 0, KEY_5), | ||
65 | KEY(3, 1, KEY_4), | ||
66 | KEY(3, 2, KEY_R), | ||
67 | KEY(3, 3, KEY_E), | ||
68 | KEY(3, 4, KEY_F), | ||
69 | KEY(3, 5, KEY_D), | ||
70 | KEY(3, 6, KEY_X), | ||
71 | KEY(3, 7, KEY_RESERVED), | ||
72 | |||
73 | KEY(4, 0, KEY_7), | ||
74 | KEY(4, 1, KEY_6), | ||
75 | KEY(4, 2, KEY_T), | ||
76 | KEY(4, 3, KEY_H), | ||
77 | KEY(4, 4, KEY_G), | ||
78 | KEY(4, 5, KEY_V), | ||
79 | KEY(4, 6, KEY_C), | ||
80 | KEY(4, 7, KEY_SPACE), | ||
81 | |||
82 | KEY(5, 0, KEY_9), | ||
83 | KEY(5, 1, KEY_8), | ||
84 | KEY(5, 2, KEY_U), | ||
85 | KEY(5, 3, KEY_Y), | ||
86 | KEY(5, 4, KEY_J), | ||
87 | KEY(5, 5, KEY_N), | ||
88 | KEY(5, 6, KEY_B), | ||
89 | KEY(5, 7, KEY_BACKSLASH), | ||
90 | |||
91 | KEY(6, 0, KEY_MINUS), | ||
92 | KEY(6, 1, KEY_0), | ||
93 | KEY(6, 2, KEY_O), | ||
94 | KEY(6, 3, KEY_I), | ||
95 | KEY(6, 4, KEY_L), | ||
96 | KEY(6, 5, KEY_K), | ||
97 | KEY(6, 6, KEY_COMMA), | ||
98 | KEY(6, 7, KEY_M), | ||
99 | |||
100 | KEY(7, 0, KEY_RESERVED), | ||
101 | KEY(7, 1, KEY_EQUAL), | ||
102 | KEY(7, 2, KEY_RIGHTBRACE), | ||
103 | KEY(7, 3, KEY_ENTER), | ||
104 | KEY(7, 4, KEY_RESERVED), | ||
105 | KEY(7, 5, KEY_RESERVED), | ||
106 | KEY(7, 6, KEY_RESERVED), | ||
107 | KEY(7, 7, KEY_MENU), | ||
108 | |||
109 | KEY(8, 0, KEY_RESERVED), | ||
110 | KEY(8, 1, KEY_RESERVED), | ||
111 | KEY(8, 2, KEY_RESERVED), | ||
112 | KEY(8, 3, KEY_RESERVED), | ||
113 | KEY(8, 4, KEY_LEFTSHIFT), | ||
114 | KEY(8, 5, KEY_RIGHTSHIFT), | ||
115 | KEY(8, 6, KEY_RESERVED), | ||
116 | KEY(8, 7, KEY_RESERVED), | ||
117 | |||
118 | KEY(9, 0, KEY_RESERVED), | ||
119 | KEY(9, 1, KEY_RESERVED), | ||
120 | KEY(9, 2, KEY_RESERVED), | ||
121 | KEY(9, 3, KEY_RESERVED), | ||
122 | KEY(9, 4, KEY_RESERVED), | ||
123 | KEY(9, 5, KEY_LEFTCTRL), | ||
124 | KEY(9, 6, KEY_RESERVED), | ||
125 | KEY(9, 7, KEY_RIGHTCTRL), | ||
126 | |||
127 | KEY(10, 0, KEY_RESERVED), | ||
128 | KEY(10, 1, KEY_RESERVED), | ||
129 | KEY(10, 2, KEY_RESERVED), | ||
130 | KEY(10, 3, KEY_RESERVED), | ||
131 | KEY(10, 4, KEY_RESERVED), | ||
132 | KEY(10, 5, KEY_RESERVED), | ||
133 | KEY(10, 6, KEY_RESERVED), | ||
134 | KEY(10, 7, KEY_RESERVED), | ||
135 | |||
136 | KEY(11, 0, KEY_LEFTBRACE), | ||
137 | KEY(11, 1, KEY_P), | ||
138 | KEY(11, 2, KEY_APOSTROPHE), | ||
139 | KEY(11, 3, KEY_SEMICOLON), | ||
140 | KEY(11, 4, KEY_SLASH), | ||
141 | KEY(11, 5, KEY_DOT), | ||
142 | KEY(11, 6, KEY_RESERVED), | ||
143 | KEY(11, 7, KEY_RESERVED), | ||
144 | |||
145 | KEY(12, 0, KEY_F10), | ||
146 | KEY(12, 1, KEY_F9), | ||
147 | KEY(12, 2, KEY_BACKSPACE), | ||
148 | KEY(12, 3, KEY_3), | ||
149 | KEY(12, 4, KEY_2), | ||
150 | KEY(12, 5, KEY_UP), | ||
151 | KEY(12, 6, KEY_PRINT), | ||
152 | KEY(12, 7, KEY_PAUSE), | ||
153 | |||
154 | KEY(13, 0, KEY_INSERT), | ||
155 | KEY(13, 1, KEY_DELETE), | ||
156 | KEY(13, 2, KEY_RESERVED), | ||
157 | KEY(13, 3, KEY_PAGEUP), | ||
158 | KEY(13, 4, KEY_PAGEDOWN), | ||
159 | KEY(13, 5, KEY_RIGHT), | ||
160 | KEY(13, 6, KEY_DOWN), | ||
161 | KEY(13, 7, KEY_LEFT), | ||
162 | |||
163 | KEY(14, 0, KEY_F11), | ||
164 | KEY(14, 1, KEY_F12), | ||
165 | KEY(14, 2, KEY_F8), | ||
166 | KEY(14, 3, KEY_Q), | ||
167 | KEY(14, 4, KEY_F4), | ||
168 | KEY(14, 5, KEY_F3), | ||
169 | KEY(14, 6, KEY_1), | ||
170 | KEY(14, 7, KEY_F7), | ||
171 | |||
172 | KEY(15, 0, KEY_ESC), | ||
173 | KEY(15, 1, KEY_GRAVE), | ||
174 | KEY(15, 2, KEY_F5), | ||
175 | KEY(15, 3, KEY_TAB), | ||
176 | KEY(15, 4, KEY_F1), | ||
177 | KEY(15, 5, KEY_F2), | ||
178 | KEY(15, 6, KEY_CAPSLOCK), | ||
179 | KEY(15, 7, KEY_F6), | ||
180 | |||
181 | KEY(16, 0, KEY_RESERVED), | ||
182 | KEY(16, 1, KEY_RESERVED), | ||
183 | KEY(16, 2, KEY_RESERVED), | ||
184 | KEY(16, 3, KEY_RESERVED), | ||
185 | KEY(16, 4, KEY_RESERVED), | ||
186 | KEY(16, 5, KEY_RESERVED), | ||
187 | KEY(16, 6, KEY_RESERVED), | ||
188 | KEY(16, 7, KEY_RESERVED), | ||
189 | |||
190 | KEY(17, 0, KEY_RESERVED), | ||
191 | KEY(17, 1, KEY_RESERVED), | ||
192 | KEY(17, 2, KEY_RESERVED), | ||
193 | KEY(17, 3, KEY_RESERVED), | ||
194 | KEY(17, 4, KEY_RESERVED), | ||
195 | KEY(17, 5, KEY_RESERVED), | ||
196 | KEY(17, 6, KEY_RESERVED), | ||
197 | KEY(17, 7, KEY_RESERVED), | ||
198 | |||
199 | KEY(18, 0, KEY_RESERVED), | ||
200 | KEY(18, 1, KEY_RESERVED), | ||
201 | KEY(18, 2, KEY_RESERVED), | ||
202 | KEY(18, 3, KEY_RESERVED), | ||
203 | KEY(18, 4, KEY_RESERVED), | ||
204 | KEY(18, 5, KEY_RESERVED), | ||
205 | KEY(18, 6, KEY_RESERVED), | ||
206 | KEY(18, 7, KEY_RESERVED), | ||
207 | |||
208 | KEY(19, 0, KEY_RESERVED), | ||
209 | KEY(19, 1, KEY_RESERVED), | ||
210 | KEY(19, 2, KEY_RESERVED), | ||
211 | KEY(19, 3, KEY_RESERVED), | ||
212 | KEY(19, 4, KEY_RESERVED), | ||
213 | KEY(19, 5, KEY_RESERVED), | ||
214 | KEY(19, 6, KEY_RESERVED), | ||
215 | KEY(19, 7, KEY_RESERVED), | ||
216 | |||
217 | KEY(20, 0, KEY_7), | ||
218 | KEY(20, 1, KEY_RESERVED), | ||
219 | KEY(20, 2, KEY_RESERVED), | ||
220 | KEY(20, 3, KEY_RESERVED), | ||
221 | KEY(20, 4, KEY_RESERVED), | ||
222 | KEY(20, 5, KEY_RESERVED), | ||
223 | KEY(20, 6, KEY_RESERVED), | ||
224 | KEY(20, 7, KEY_RESERVED), | ||
225 | |||
226 | KEY(21, 0, KEY_9), | ||
227 | KEY(21, 1, KEY_8), | ||
228 | KEY(21, 2, KEY_4), | ||
229 | KEY(21, 3, KEY_RESERVED), | ||
230 | KEY(21, 4, KEY_1), | ||
231 | KEY(21, 5, KEY_RESERVED), | ||
232 | KEY(21, 6, KEY_RESERVED), | ||
233 | KEY(21, 7, KEY_RESERVED), | ||
234 | |||
235 | KEY(22, 0, KEY_RESERVED), | ||
236 | KEY(22, 1, KEY_SLASH), | ||
237 | KEY(22, 2, KEY_6), | ||
238 | KEY(22, 3, KEY_5), | ||
239 | KEY(22, 4, KEY_3), | ||
240 | KEY(22, 5, KEY_2), | ||
241 | KEY(22, 6, KEY_RESERVED), | ||
242 | KEY(22, 7, KEY_0), | ||
243 | |||
244 | KEY(23, 0, KEY_RESERVED), | ||
245 | KEY(23, 1, KEY_RESERVED), | ||
246 | KEY(23, 2, KEY_RESERVED), | ||
247 | KEY(23, 3, KEY_RESERVED), | ||
248 | KEY(23, 4, KEY_RESERVED), | ||
249 | KEY(23, 5, KEY_RESERVED), | ||
250 | KEY(23, 6, KEY_RESERVED), | ||
251 | KEY(23, 7, KEY_RESERVED), | ||
252 | |||
253 | KEY(24, 0, KEY_RESERVED), | ||
254 | KEY(24, 1, KEY_RESERVED), | ||
255 | KEY(24, 2, KEY_RESERVED), | ||
256 | KEY(24, 3, KEY_RESERVED), | ||
257 | KEY(24, 4, KEY_RESERVED), | ||
258 | KEY(24, 5, KEY_RESERVED), | ||
259 | KEY(24, 6, KEY_RESERVED), | ||
260 | KEY(24, 7, KEY_RESERVED), | ||
261 | |||
262 | KEY(25, 0, KEY_RESERVED), | ||
263 | KEY(25, 1, KEY_RESERVED), | ||
264 | KEY(25, 2, KEY_RESERVED), | ||
265 | KEY(25, 3, KEY_RESERVED), | ||
266 | KEY(25, 4, KEY_RESERVED), | ||
267 | KEY(25, 5, KEY_RESERVED), | ||
268 | KEY(25, 6, KEY_RESERVED), | ||
269 | KEY(25, 7, KEY_RESERVED), | ||
270 | |||
271 | KEY(26, 0, KEY_RESERVED), | ||
272 | KEY(26, 1, KEY_RESERVED), | ||
273 | KEY(26, 2, KEY_RESERVED), | ||
274 | KEY(26, 3, KEY_RESERVED), | ||
275 | KEY(26, 4, KEY_RESERVED), | ||
276 | KEY(26, 5, KEY_RESERVED), | ||
277 | KEY(26, 6, KEY_RESERVED), | ||
278 | KEY(26, 7, KEY_RESERVED), | ||
279 | |||
280 | KEY(27, 0, KEY_RESERVED), | ||
281 | KEY(27, 1, KEY_KPASTERISK), | ||
282 | KEY(27, 2, KEY_RESERVED), | ||
283 | KEY(27, 3, KEY_KPMINUS), | ||
284 | KEY(27, 4, KEY_KPPLUS), | ||
285 | KEY(27, 5, KEY_DOT), | ||
286 | KEY(27, 6, KEY_RESERVED), | ||
287 | KEY(27, 7, KEY_RESERVED), | ||
288 | |||
289 | KEY(28, 0, KEY_RESERVED), | ||
290 | KEY(28, 1, KEY_RESERVED), | ||
291 | KEY(28, 2, KEY_RESERVED), | ||
292 | KEY(28, 3, KEY_RESERVED), | ||
293 | KEY(28, 4, KEY_RESERVED), | ||
294 | KEY(28, 5, KEY_VOLUMEUP), | ||
295 | KEY(28, 6, KEY_RESERVED), | ||
296 | KEY(28, 7, KEY_RESERVED), | ||
297 | |||
298 | KEY(29, 0, KEY_RESERVED), | ||
299 | KEY(29, 1, KEY_RESERVED), | ||
300 | KEY(29, 2, KEY_RESERVED), | ||
301 | KEY(29, 3, KEY_HOME), | ||
302 | KEY(29, 4, KEY_END), | ||
303 | KEY(29, 5, KEY_BRIGHTNESSUP), | ||
304 | KEY(29, 6, KEY_VOLUMEDOWN), | ||
305 | KEY(29, 7, KEY_BRIGHTNESSDOWN), | ||
306 | |||
307 | KEY(30, 0, KEY_NUMLOCK), | ||
308 | KEY(30, 1, KEY_SCROLLLOCK), | ||
309 | KEY(30, 2, KEY_MUTE), | ||
310 | KEY(30, 3, KEY_RESERVED), | ||
311 | KEY(30, 4, KEY_RESERVED), | ||
312 | KEY(30, 5, KEY_RESERVED), | ||
313 | KEY(30, 6, KEY_RESERVED), | ||
314 | KEY(30, 7, KEY_RESERVED), | ||
315 | |||
316 | KEY(31, 0, KEY_RESERVED), | ||
317 | KEY(31, 1, KEY_RESERVED), | ||
318 | KEY(31, 2, KEY_RESERVED), | ||
319 | KEY(31, 3, KEY_RESERVED), | ||
320 | KEY(31, 4, KEY_QUESTION), | ||
321 | KEY(31, 5, KEY_RESERVED), | ||
322 | KEY(31, 6, KEY_RESERVED), | ||
323 | KEY(31, 7, KEY_RESERVED), | ||
324 | }; | ||
325 | |||
326 | static const struct matrix_keymap_data keymap_data = { | ||
327 | .keymap = kbd_keymap, | ||
328 | .keymap_size = ARRAY_SIZE(kbd_keymap), | ||
329 | }; | ||
330 | |||
331 | static struct tegra_kbc_wake_key harmony_wake_cfg[] = { | ||
332 | [0] = { | ||
333 | .row = 1, | ||
334 | .col = 7, | ||
335 | }, | ||
336 | [1] = { | ||
337 | .row = 15, | ||
338 | .col = 0, | ||
339 | }, | ||
340 | }; | ||
341 | |||
342 | static struct tegra_kbc_platform_data harmony_kbc_platform_data = { | ||
343 | .debounce_cnt = 2, | ||
344 | .repeat_cnt = 5 * 32, | ||
345 | .wakeup = true, | ||
346 | .keymap_data = &keymap_data, | ||
347 | .use_fn_map = true, | ||
348 | .wake_cnt = 2, | ||
349 | .wake_cfg = &harmony_wake_cfg[0], | ||
350 | #ifdef CONFIG_ANDROID | ||
351 | .disable_ev_rep = true, | ||
352 | #endif | ||
353 | }; | ||
354 | |||
355 | int __init harmony_kbc_init(void) | ||
356 | { | ||
357 | struct tegra_kbc_platform_data *data = &harmony_kbc_platform_data; | ||
358 | int i; | ||
359 | tegra_kbc_device.dev.platform_data = &harmony_kbc_platform_data; | ||
360 | pr_info("Registering tegra-kbc\n"); | ||
361 | |||
362 | BUG_ON((KBC_MAX_ROW + KBC_MAX_COL) > KBC_MAX_GPIO); | ||
363 | for (i = 0; i < KBC_MAX_ROW; i++) { | ||
364 | data->pin_cfg[i].num = i; | ||
365 | data->pin_cfg[i].is_row = true; | ||
366 | } | ||
367 | |||
368 | for (i = 0; i < KBC_MAX_COL; i++) | ||
369 | data->pin_cfg[i + KBC_MAX_ROW].num = i; | ||
370 | |||
371 | platform_device_register(&tegra_kbc_device); | ||
372 | pr_info("Registering successful tegra-kbc\n"); | ||
373 | return 0; | ||
374 | } | ||
375 | |||