diff options
-rw-r--r-- | drivers/input/misc/wistron_btns.c | 595 | ||||
-rw-r--r-- | include/linux/input.h | 1 |
2 files changed, 524 insertions, 72 deletions
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index 39e437599d35..47de377330b8 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -233,10 +233,20 @@ static void bios_set_state(u8 subsys, int enable) | |||
233 | struct key_entry { | 233 | struct key_entry { |
234 | char type; /* See KE_* below */ | 234 | char type; /* See KE_* below */ |
235 | u8 code; | 235 | u8 code; |
236 | unsigned keycode; /* For KE_KEY */ | 236 | union { |
237 | u16 keycode; /* For KE_KEY */ | ||
238 | struct { /* For KE_SW */ | ||
239 | u8 code; | ||
240 | u8 value; | ||
241 | } sw; | ||
242 | }; | ||
237 | }; | 243 | }; |
238 | 244 | ||
239 | enum { KE_END, KE_KEY, KE_WIFI, KE_BLUETOOTH }; | 245 | enum { KE_END, KE_KEY, KE_SW, KE_WIFI, KE_BLUETOOTH }; |
246 | |||
247 | #define FE_MAIL_LED 0x01 | ||
248 | #define FE_WIFI_LED 0x02 | ||
249 | #define FE_UNTESTED 0x80 | ||
240 | 250 | ||
241 | static const struct key_entry *keymap; /* = NULL; Current key map */ | 251 | static const struct key_entry *keymap; /* = NULL; Current key map */ |
242 | static int have_wifi; | 252 | static int have_wifi; |
@@ -261,104 +271,301 @@ static struct key_entry keymap_empty[] = { | |||
261 | }; | 271 | }; |
262 | 272 | ||
263 | static struct key_entry keymap_fs_amilo_pro_v2000[] = { | 273 | static struct key_entry keymap_fs_amilo_pro_v2000[] = { |
264 | { KE_KEY, 0x01, KEY_HELP }, | 274 | { KE_KEY, 0x01, {KEY_HELP} }, |
265 | { KE_KEY, 0x11, KEY_PROG1 }, | 275 | { KE_KEY, 0x11, {KEY_PROG1} }, |
266 | { KE_KEY, 0x12, KEY_PROG2 }, | 276 | { KE_KEY, 0x12, {KEY_PROG2} }, |
267 | { KE_WIFI, 0x30, 0 }, | 277 | { KE_WIFI, 0x30 }, |
268 | { KE_KEY, 0x31, KEY_MAIL }, | 278 | { KE_KEY, 0x31, {KEY_MAIL} }, |
269 | { KE_KEY, 0x36, KEY_WWW }, | 279 | { KE_KEY, 0x36, {KEY_WWW} }, |
270 | { KE_END, 0 } | 280 | { KE_END, 0 } |
271 | }; | 281 | }; |
272 | 282 | ||
273 | static struct key_entry keymap_fujitsu_n3510[] = { | 283 | static struct key_entry keymap_fujitsu_n3510[] = { |
274 | { KE_KEY, 0x11, KEY_PROG1 }, | 284 | { KE_KEY, 0x11, {KEY_PROG1} }, |
275 | { KE_KEY, 0x12, KEY_PROG2 }, | 285 | { KE_KEY, 0x12, {KEY_PROG2} }, |
276 | { KE_KEY, 0x36, KEY_WWW }, | 286 | { KE_KEY, 0x36, {KEY_WWW} }, |
277 | { KE_KEY, 0x31, KEY_MAIL }, | 287 | { KE_KEY, 0x31, {KEY_MAIL} }, |
278 | { KE_KEY, 0x71, KEY_STOPCD }, | 288 | { KE_KEY, 0x71, {KEY_STOPCD} }, |
279 | { KE_KEY, 0x72, KEY_PLAYPAUSE }, | 289 | { KE_KEY, 0x72, {KEY_PLAYPAUSE} }, |
280 | { KE_KEY, 0x74, KEY_REWIND }, | 290 | { KE_KEY, 0x74, {KEY_REWIND} }, |
281 | { KE_KEY, 0x78, KEY_FORWARD }, | 291 | { KE_KEY, 0x78, {KEY_FORWARD} }, |
282 | { KE_END, 0 } | 292 | { KE_END, 0 } |
283 | }; | 293 | }; |
284 | 294 | ||
285 | static struct key_entry keymap_wistron_ms2111[] = { | 295 | static struct key_entry keymap_wistron_ms2111[] = { |
286 | { KE_KEY, 0x11, KEY_PROG1 }, | 296 | { KE_KEY, 0x11, {KEY_PROG1} }, |
287 | { KE_KEY, 0x12, KEY_PROG2 }, | 297 | { KE_KEY, 0x12, {KEY_PROG2} }, |
288 | { KE_KEY, 0x13, KEY_PROG3 }, | 298 | { KE_KEY, 0x13, {KEY_PROG3} }, |
289 | { KE_KEY, 0x31, KEY_MAIL }, | 299 | { KE_KEY, 0x31, {KEY_MAIL} }, |
290 | { KE_KEY, 0x36, KEY_WWW }, | 300 | { KE_KEY, 0x36, {KEY_WWW} }, |
291 | { KE_END, 0 } | 301 | { KE_END, FE_MAIL_LED } |
302 | }; | ||
303 | |||
304 | static struct key_entry keymap_wistron_md40100[] = { | ||
305 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
306 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
307 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
308 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
309 | { KE_KEY, 0x37, {KEY_DISPLAYTOGGLE} }, /* Display on/off */ | ||
310 | { KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED } | ||
292 | }; | 311 | }; |
293 | 312 | ||
294 | static struct key_entry keymap_wistron_ms2141[] = { | 313 | static struct key_entry keymap_wistron_ms2141[] = { |
295 | { KE_KEY, 0x11, KEY_PROG1 }, | 314 | { KE_KEY, 0x11, {KEY_PROG1} }, |
296 | { KE_KEY, 0x12, KEY_PROG2 }, | 315 | { KE_KEY, 0x12, {KEY_PROG2} }, |
297 | { KE_WIFI, 0x30, 0 }, | 316 | { KE_WIFI, 0x30 }, |
298 | { KE_KEY, 0x22, KEY_REWIND }, | 317 | { KE_KEY, 0x22, {KEY_REWIND} }, |
299 | { KE_KEY, 0x23, KEY_FORWARD }, | 318 | { KE_KEY, 0x23, {KEY_FORWARD} }, |
300 | { KE_KEY, 0x24, KEY_PLAYPAUSE }, | 319 | { KE_KEY, 0x24, {KEY_PLAYPAUSE} }, |
301 | { KE_KEY, 0x25, KEY_STOPCD }, | 320 | { KE_KEY, 0x25, {KEY_STOPCD} }, |
302 | { KE_KEY, 0x31, KEY_MAIL }, | 321 | { KE_KEY, 0x31, {KEY_MAIL} }, |
303 | { KE_KEY, 0x36, KEY_WWW }, | 322 | { KE_KEY, 0x36, {KEY_WWW} }, |
304 | { KE_END, 0 } | 323 | { KE_END, 0 } |
305 | }; | 324 | }; |
306 | 325 | ||
307 | static struct key_entry keymap_acer_aspire_1500[] = { | 326 | static struct key_entry keymap_acer_aspire_1500[] = { |
308 | { KE_KEY, 0x11, KEY_PROG1 }, | 327 | { KE_KEY, 0x01, {KEY_HELP} }, |
309 | { KE_KEY, 0x12, KEY_PROG2 }, | 328 | { KE_KEY, 0x03, {KEY_POWER} }, |
310 | { KE_WIFI, 0x30, 0 }, | 329 | { KE_KEY, 0x11, {KEY_PROG1} }, |
311 | { KE_KEY, 0x31, KEY_MAIL }, | 330 | { KE_KEY, 0x12, {KEY_PROG2} }, |
312 | { KE_KEY, 0x36, KEY_WWW }, | 331 | { KE_WIFI, 0x30 }, |
313 | { KE_BLUETOOTH, 0x44, 0 }, | 332 | { KE_KEY, 0x31, {KEY_MAIL} }, |
314 | { KE_END, 0 } | 333 | { KE_KEY, 0x36, {KEY_WWW} }, |
334 | { KE_KEY, 0x49, {KEY_CONFIG} }, | ||
335 | { KE_BLUETOOTH, 0x44 }, | ||
336 | { KE_END, FE_UNTESTED } | ||
337 | }; | ||
338 | |||
339 | static struct key_entry keymap_acer_aspire_1600[] = { | ||
340 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
341 | { KE_KEY, 0x03, {KEY_POWER} }, | ||
342 | { KE_KEY, 0x08, {KEY_MUTE} }, | ||
343 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
344 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
345 | { KE_KEY, 0x13, {KEY_PROG3} }, | ||
346 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
347 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
348 | { KE_KEY, 0x49, {KEY_CONFIG} }, | ||
349 | { KE_WIFI, 0x30 }, | ||
350 | { KE_BLUETOOTH, 0x44 }, | ||
351 | { KE_END, FE_MAIL_LED | FE_UNTESTED } | ||
352 | }; | ||
353 | |||
354 | /* 3020 has been tested */ | ||
355 | static struct key_entry keymap_acer_aspire_5020[] = { | ||
356 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
357 | { KE_KEY, 0x03, {KEY_POWER} }, | ||
358 | { KE_KEY, 0x05, {KEY_SWITCHVIDEOMODE} }, /* Display selection */ | ||
359 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
360 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
361 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
362 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
363 | { KE_KEY, 0x6a, {KEY_CONFIG} }, | ||
364 | { KE_WIFI, 0x30 }, | ||
365 | { KE_BLUETOOTH, 0x44 }, | ||
366 | { KE_END, FE_MAIL_LED | FE_UNTESTED } | ||
367 | }; | ||
368 | |||
369 | static struct key_entry keymap_acer_travelmate_2410[] = { | ||
370 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
371 | { KE_KEY, 0x6d, {KEY_POWER} }, | ||
372 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
373 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
374 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
375 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
376 | { KE_KEY, 0x6a, {KEY_CONFIG} }, | ||
377 | { KE_WIFI, 0x30 }, | ||
378 | { KE_BLUETOOTH, 0x44 }, | ||
379 | { KE_END, FE_MAIL_LED | FE_UNTESTED } | ||
380 | }; | ||
381 | |||
382 | static struct key_entry keymap_acer_travelmate_110[] = { | ||
383 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
384 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
385 | { KE_KEY, 0x03, {KEY_POWER} }, | ||
386 | { KE_KEY, 0x08, {KEY_MUTE} }, | ||
387 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
388 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
389 | { KE_KEY, 0x20, {KEY_VOLUMEUP} }, | ||
390 | { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, | ||
391 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
392 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
393 | { KE_SW, 0x4a, {.sw = {SW_LID, 1}} }, /* lid close */ | ||
394 | { KE_SW, 0x4b, {.sw = {SW_LID, 0}} }, /* lid open */ | ||
395 | { KE_WIFI, 0x30 }, | ||
396 | { KE_END, FE_MAIL_LED | FE_UNTESTED } | ||
397 | }; | ||
398 | |||
399 | static struct key_entry keymap_acer_travelmate_300[] = { | ||
400 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
401 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
402 | { KE_KEY, 0x03, {KEY_POWER} }, | ||
403 | { KE_KEY, 0x08, {KEY_MUTE} }, | ||
404 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
405 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
406 | { KE_KEY, 0x20, {KEY_VOLUMEUP} }, | ||
407 | { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, | ||
408 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
409 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
410 | { KE_WIFI, 0x30 }, | ||
411 | { KE_BLUETOOTH, 0x44 }, | ||
412 | { KE_END, FE_MAIL_LED | FE_UNTESTED } | ||
413 | }; | ||
414 | |||
415 | static struct key_entry keymap_acer_travelmate_380[] = { | ||
416 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
417 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
418 | { KE_KEY, 0x03, {KEY_POWER} }, /* not 370 */ | ||
419 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
420 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
421 | { KE_KEY, 0x13, {KEY_PROG3} }, | ||
422 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
423 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
424 | { KE_WIFI, 0x30 }, | ||
425 | { KE_END, FE_MAIL_LED | FE_UNTESTED } | ||
426 | }; | ||
427 | |||
428 | /* unusual map */ | ||
429 | static struct key_entry keymap_acer_travelmate_220[] = { | ||
430 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
431 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
432 | { KE_KEY, 0x11, {KEY_MAIL} }, | ||
433 | { KE_KEY, 0x12, {KEY_WWW} }, | ||
434 | { KE_KEY, 0x13, {KEY_PROG2} }, | ||
435 | { KE_KEY, 0x31, {KEY_PROG1} }, | ||
436 | { KE_END, FE_WIFI_LED | FE_UNTESTED } | ||
437 | }; | ||
438 | |||
439 | static struct key_entry keymap_acer_travelmate_230[] = { | ||
440 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
441 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
442 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
443 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
444 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
445 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
446 | { KE_END, FE_WIFI_LED | FE_UNTESTED } | ||
315 | }; | 447 | }; |
316 | 448 | ||
317 | static struct key_entry keymap_acer_travelmate_240[] = { | 449 | static struct key_entry keymap_acer_travelmate_240[] = { |
318 | { KE_KEY, 0x31, KEY_MAIL }, | 450 | { KE_KEY, 0x01, {KEY_HELP} }, |
319 | { KE_KEY, 0x36, KEY_WWW }, | 451 | { KE_KEY, 0x02, {KEY_CONFIG} }, |
320 | { KE_KEY, 0x11, KEY_PROG1 }, | 452 | { KE_KEY, 0x03, {KEY_POWER} }, |
321 | { KE_KEY, 0x12, KEY_PROG2 }, | 453 | { KE_KEY, 0x08, {KEY_MUTE} }, |
322 | { KE_BLUETOOTH, 0x44, 0 }, | 454 | { KE_KEY, 0x31, {KEY_MAIL} }, |
323 | { KE_WIFI, 0x30, 0 }, | 455 | { KE_KEY, 0x36, {KEY_WWW} }, |
324 | { KE_END, 0 } | 456 | { KE_KEY, 0x11, {KEY_PROG1} }, |
457 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
458 | { KE_BLUETOOTH, 0x44 }, | ||
459 | { KE_WIFI, 0x30 }, | ||
460 | { KE_END, FE_UNTESTED } | ||
461 | }; | ||
462 | |||
463 | static struct key_entry keymap_acer_travelmate_350[] = { | ||
464 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
465 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
466 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
467 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
468 | { KE_KEY, 0x13, {KEY_MAIL} }, | ||
469 | { KE_KEY, 0x14, {KEY_PROG3} }, | ||
470 | { KE_KEY, 0x15, {KEY_WWW} }, | ||
471 | { KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED } | ||
472 | }; | ||
473 | |||
474 | static struct key_entry keymap_acer_travelmate_360[] = { | ||
475 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
476 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
477 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
478 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
479 | { KE_KEY, 0x13, {KEY_MAIL} }, | ||
480 | { KE_KEY, 0x14, {KEY_PROG3} }, | ||
481 | { KE_KEY, 0x15, {KEY_WWW} }, | ||
482 | { KE_KEY, 0x40, {KEY_WLAN} }, | ||
483 | { KE_END, FE_WIFI_LED | FE_UNTESTED } /* no mail led */ | ||
325 | }; | 484 | }; |
326 | 485 | ||
327 | /* Wifi subsystem only activates the led. Therefore we need to pass | 486 | /* Wifi subsystem only activates the led. Therefore we need to pass |
328 | * wifi event as a normal key, then userspace can really change the wifi state. | 487 | * wifi event as a normal key, then userspace can really change the wifi state. |
329 | * TODO we need to export led state to userspace (wifi and mail) */ | 488 | * TODO we need to export led state to userspace (wifi and mail) */ |
330 | static struct key_entry keymap_acer_travelmate_610[] = { | 489 | static struct key_entry keymap_acer_travelmate_610[] = { |
331 | { KE_KEY, 0x01, KEY_HELP }, | 490 | { KE_KEY, 0x01, {KEY_HELP} }, |
332 | { KE_KEY, 0x02, KEY_CONFIG }, | 491 | { KE_KEY, 0x02, {KEY_CONFIG} }, |
333 | { KE_KEY, 0x11, KEY_PROG1 }, | 492 | { KE_KEY, 0x11, {KEY_PROG1} }, |
334 | { KE_KEY, 0x12, KEY_PROG2 }, | 493 | { KE_KEY, 0x12, {KEY_PROG3} }, |
335 | { KE_KEY, 0x13, KEY_PROG3 }, | 494 | { KE_KEY, 0x13, {KEY_PROG3} }, |
336 | { KE_KEY, 0x14, KEY_MAIL }, | 495 | { KE_KEY, 0x14, {KEY_MAIL} }, |
337 | { KE_KEY, 0x15, KEY_WWW }, | 496 | { KE_KEY, 0x15, {KEY_WWW} }, |
338 | { KE_KEY, 0x40, KEY_WLAN }, /* Wifi */ | 497 | { KE_KEY, 0x40, {KEY_WLAN} }, |
339 | { KE_END, 0 } | 498 | { KE_END, FE_MAIL_LED | FE_WIFI_LED } |
499 | }; | ||
500 | |||
501 | static struct key_entry keymap_acer_travelmate_630[] = { | ||
502 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
503 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
504 | { KE_KEY, 0x03, {KEY_POWER} }, | ||
505 | { KE_KEY, 0x08, {KEY_MUTE} }, /* not 620 */ | ||
506 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
507 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
508 | { KE_KEY, 0x13, {KEY_PROG3} }, | ||
509 | { KE_KEY, 0x20, {KEY_VOLUMEUP} }, | ||
510 | { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, | ||
511 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
512 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
513 | { KE_WIFI, 0x30 }, | ||
514 | { KE_END, FE_MAIL_LED | FE_UNTESTED } | ||
340 | }; | 515 | }; |
341 | 516 | ||
342 | static struct key_entry keymap_aopen_1559as[] = { | 517 | static struct key_entry keymap_aopen_1559as[] = { |
343 | { KE_KEY, 0x01, KEY_HELP }, | 518 | { KE_KEY, 0x01, {KEY_HELP} }, |
344 | { KE_KEY, 0x06, KEY_PROG3 }, | 519 | { KE_KEY, 0x06, {KEY_PROG3} }, |
345 | { KE_KEY, 0x11, KEY_PROG1 }, | 520 | { KE_KEY, 0x11, {KEY_PROG1} }, |
346 | { KE_KEY, 0x12, KEY_PROG2 }, | 521 | { KE_KEY, 0x12, {KEY_PROG2} }, |
347 | { KE_WIFI, 0x30, 0 }, | 522 | { KE_WIFI, 0x30 }, |
348 | { KE_KEY, 0x31, KEY_MAIL }, | 523 | { KE_KEY, 0x31, {KEY_MAIL} }, |
349 | { KE_KEY, 0x36, KEY_WWW }, | 524 | { KE_KEY, 0x36, {KEY_WWW} }, |
350 | { KE_END, 0 }, | 525 | { KE_END, 0 }, |
351 | }; | 526 | }; |
352 | 527 | ||
353 | static struct key_entry keymap_fs_amilo_d88x0[] = { | 528 | static struct key_entry keymap_fs_amilo_d88x0[] = { |
354 | { KE_KEY, 0x01, KEY_HELP }, | 529 | { KE_KEY, 0x01, {KEY_HELP} }, |
355 | { KE_KEY, 0x08, KEY_MUTE }, | 530 | { KE_KEY, 0x08, {KEY_MUTE} }, |
356 | { KE_KEY, 0x31, KEY_MAIL }, | 531 | { KE_KEY, 0x31, {KEY_MAIL} }, |
357 | { KE_KEY, 0x36, KEY_WWW }, | 532 | { KE_KEY, 0x36, {KEY_WWW} }, |
358 | { KE_KEY, 0x11, KEY_PROG1 }, | 533 | { KE_KEY, 0x11, {KEY_PROG1} }, |
359 | { KE_KEY, 0x12, KEY_PROG2 }, | 534 | { KE_KEY, 0x12, {KEY_PROG2} }, |
360 | { KE_KEY, 0x13, KEY_PROG3 }, | 535 | { KE_KEY, 0x13, {KEY_PROG3} }, |
361 | { KE_END, 0 } | 536 | { KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED } |
537 | }; | ||
538 | |||
539 | static struct key_entry keymap_wistron_md2900[] = { | ||
540 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
541 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
542 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
543 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
544 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
545 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
546 | { KE_WIFI, 0x30 }, | ||
547 | { KE_END, FE_MAIL_LED | FE_UNTESTED } | ||
548 | }; | ||
549 | |||
550 | static struct key_entry keymap_wistron_md96500[] = { | ||
551 | { KE_KEY, 0x01, {KEY_HELP} }, | ||
552 | { KE_KEY, 0x02, {KEY_CONFIG} }, | ||
553 | { KE_KEY, 0x05, {KEY_SWITCHVIDEOMODE} }, /* Display selection */ | ||
554 | { KE_KEY, 0x06, {KEY_DISPLAYTOGGLE} }, /* Display on/off */ | ||
555 | { KE_KEY, 0x08, {KEY_MUTE} }, | ||
556 | { KE_KEY, 0x11, {KEY_PROG1} }, | ||
557 | { KE_KEY, 0x12, {KEY_PROG2} }, | ||
558 | { KE_KEY, 0x20, {KEY_VOLUMEUP} }, | ||
559 | { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, | ||
560 | { KE_KEY, 0x22, {KEY_REWIND} }, | ||
561 | { KE_KEY, 0x23, {KEY_FORWARD} }, | ||
562 | { KE_KEY, 0x24, {KEY_PLAYPAUSE} }, | ||
563 | { KE_KEY, 0x25, {KEY_STOPCD} }, | ||
564 | { KE_KEY, 0x31, {KEY_MAIL} }, | ||
565 | { KE_KEY, 0x36, {KEY_WWW} }, | ||
566 | { KE_WIFI, 0x30 }, | ||
567 | { KE_BLUETOOTH, 0x44 }, | ||
568 | { KE_END, FE_UNTESTED } | ||
362 | }; | 569 | }; |
363 | 570 | ||
364 | /* | 571 | /* |
@@ -405,6 +612,133 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
405 | }, | 612 | }, |
406 | { | 613 | { |
407 | .callback = dmi_matched, | 614 | .callback = dmi_matched, |
615 | .ident = "Acer Aspire 1600", | ||
616 | .matches = { | ||
617 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
618 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1600"), | ||
619 | }, | ||
620 | .driver_data = keymap_acer_aspire_1600 | ||
621 | }, | ||
622 | { | ||
623 | .callback = dmi_matched, | ||
624 | .ident = "Acer Aspire 3020", | ||
625 | .matches = { | ||
626 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
627 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3020"), | ||
628 | }, | ||
629 | .driver_data = keymap_acer_aspire_5020 | ||
630 | }, | ||
631 | { | ||
632 | .callback = dmi_matched, | ||
633 | .ident = "Acer Aspire 5020", | ||
634 | .matches = { | ||
635 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
636 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5020"), | ||
637 | }, | ||
638 | .driver_data = keymap_acer_aspire_5020 | ||
639 | }, | ||
640 | { | ||
641 | .callback = dmi_matched, | ||
642 | .ident = "Acer TravelMate 2100", | ||
643 | .matches = { | ||
644 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
645 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2100"), | ||
646 | }, | ||
647 | .driver_data = keymap_acer_aspire_5020 | ||
648 | }, | ||
649 | { | ||
650 | .callback = dmi_matched, | ||
651 | .ident = "Acer TravelMate 2410", | ||
652 | .matches = { | ||
653 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
654 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2410"), | ||
655 | }, | ||
656 | .driver_data = keymap_acer_travelmate_2410 | ||
657 | }, | ||
658 | { | ||
659 | .callback = dmi_matched, | ||
660 | .ident = "Acer TravelMate C300", | ||
661 | .matches = { | ||
662 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
663 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C300"), | ||
664 | }, | ||
665 | .driver_data = keymap_acer_travelmate_300 | ||
666 | }, | ||
667 | { | ||
668 | .callback = dmi_matched, | ||
669 | .ident = "Acer TravelMate C100", | ||
670 | .matches = { | ||
671 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
672 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C100"), | ||
673 | }, | ||
674 | .driver_data = keymap_acer_travelmate_300 | ||
675 | }, | ||
676 | { | ||
677 | .callback = dmi_matched, | ||
678 | .ident = "Acer TravelMate C110", | ||
679 | .matches = { | ||
680 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
681 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C110"), | ||
682 | }, | ||
683 | .driver_data = keymap_acer_travelmate_110 | ||
684 | }, | ||
685 | { | ||
686 | .callback = dmi_matched, | ||
687 | .ident = "Acer TravelMate 380", | ||
688 | .matches = { | ||
689 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
690 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 380"), | ||
691 | }, | ||
692 | .driver_data = keymap_acer_travelmate_380 | ||
693 | }, | ||
694 | { | ||
695 | .callback = dmi_matched, | ||
696 | .ident = "Acer TravelMate 370", | ||
697 | .matches = { | ||
698 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
699 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 370"), | ||
700 | }, | ||
701 | .driver_data = keymap_acer_travelmate_380 /* keyboard minus 1 key */ | ||
702 | }, | ||
703 | { | ||
704 | .callback = dmi_matched, | ||
705 | .ident = "Acer TravelMate 220", | ||
706 | .matches = { | ||
707 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
708 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 220"), | ||
709 | }, | ||
710 | .driver_data = keymap_acer_travelmate_220 | ||
711 | }, | ||
712 | { | ||
713 | .callback = dmi_matched, | ||
714 | .ident = "Acer TravelMate 260", | ||
715 | .matches = { | ||
716 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
717 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 260"), | ||
718 | }, | ||
719 | .driver_data = keymap_acer_travelmate_220 | ||
720 | }, | ||
721 | { | ||
722 | .callback = dmi_matched, | ||
723 | .ident = "Acer TravelMate 230", | ||
724 | .matches = { | ||
725 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
726 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 230"), | ||
727 | /* acerhk looks for "TravelMate F4..." ?! */ | ||
728 | }, | ||
729 | .driver_data = keymap_acer_travelmate_230 | ||
730 | }, | ||
731 | { | ||
732 | .callback = dmi_matched, | ||
733 | .ident = "Acer TravelMate 280", | ||
734 | .matches = { | ||
735 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
736 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 280"), | ||
737 | }, | ||
738 | .driver_data = keymap_acer_travelmate_230 | ||
739 | }, | ||
740 | { | ||
741 | .callback = dmi_matched, | ||
408 | .ident = "Acer TravelMate 240", | 742 | .ident = "Acer TravelMate 240", |
409 | .matches = { | 743 | .matches = { |
410 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 744 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
@@ -414,6 +748,15 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
414 | }, | 748 | }, |
415 | { | 749 | { |
416 | .callback = dmi_matched, | 750 | .callback = dmi_matched, |
751 | .ident = "Acer TravelMate 250", | ||
752 | .matches = { | ||
753 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
754 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 250"), | ||
755 | }, | ||
756 | .driver_data = keymap_acer_travelmate_240 | ||
757 | }, | ||
758 | { | ||
759 | .callback = dmi_matched, | ||
417 | .ident = "Acer TravelMate 2424NWXCi", | 760 | .ident = "Acer TravelMate 2424NWXCi", |
418 | .matches = { | 761 | .matches = { |
419 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 762 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
@@ -423,6 +766,24 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
423 | }, | 766 | }, |
424 | { | 767 | { |
425 | .callback = dmi_matched, | 768 | .callback = dmi_matched, |
769 | .ident = "Acer TravelMate 350", | ||
770 | .matches = { | ||
771 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
772 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 350"), | ||
773 | }, | ||
774 | .driver_data = keymap_acer_travelmate_350 | ||
775 | }, | ||
776 | { | ||
777 | .callback = dmi_matched, | ||
778 | .ident = "Acer TravelMate 360", | ||
779 | .matches = { | ||
780 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
781 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), | ||
782 | }, | ||
783 | .driver_data = keymap_acer_travelmate_360 | ||
784 | }, | ||
785 | { | ||
786 | .callback = dmi_matched, | ||
426 | .ident = "Acer TravelMate 610", | 787 | .ident = "Acer TravelMate 610", |
427 | .matches = { | 788 | .matches = { |
428 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), | 789 | DMI_MATCH(DMI_SYS_VENDOR, "ACER"), |
@@ -432,6 +793,24 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
432 | }, | 793 | }, |
433 | { | 794 | { |
434 | .callback = dmi_matched, | 795 | .callback = dmi_matched, |
796 | .ident = "Acer TravelMate 620", | ||
797 | .matches = { | ||
798 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
799 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 620"), | ||
800 | }, | ||
801 | .driver_data = keymap_acer_travelmate_630 | ||
802 | }, | ||
803 | { | ||
804 | .callback = dmi_matched, | ||
805 | .ident = "Acer TravelMate 630", | ||
806 | .matches = { | ||
807 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
808 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 630"), | ||
809 | }, | ||
810 | .driver_data = keymap_acer_travelmate_630 | ||
811 | }, | ||
812 | { | ||
813 | .callback = dmi_matched, | ||
435 | .ident = "AOpen 1559AS", | 814 | .ident = "AOpen 1559AS", |
436 | .matches = { | 815 | .matches = { |
437 | DMI_MATCH(DMI_PRODUCT_NAME, "E2U"), | 816 | DMI_MATCH(DMI_PRODUCT_NAME, "E2U"), |
@@ -450,6 +829,51 @@ static struct dmi_system_id dmi_ids[] __initdata = { | |||
450 | }, | 829 | }, |
451 | { | 830 | { |
452 | .callback = dmi_matched, | 831 | .callback = dmi_matched, |
832 | .ident = "Medion MD 40100", | ||
833 | .matches = { | ||
834 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | ||
835 | DMI_MATCH(DMI_PRODUCT_NAME, "WID2000"), | ||
836 | }, | ||
837 | .driver_data = keymap_wistron_md40100 | ||
838 | }, | ||
839 | { | ||
840 | .callback = dmi_matched, | ||
841 | .ident = "Medion MD 2900", | ||
842 | .matches = { | ||
843 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), | ||
844 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2000"), | ||
845 | }, | ||
846 | .driver_data = keymap_wistron_md2900 | ||
847 | }, | ||
848 | { | ||
849 | .callback = dmi_matched, | ||
850 | .ident = "Medion MD 96500", | ||
851 | .matches = { | ||
852 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), | ||
853 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2040"), | ||
854 | }, | ||
855 | .driver_data = keymap_wistron_md96500 | ||
856 | }, | ||
857 | { | ||
858 | .callback = dmi_matched, | ||
859 | .ident = "Medion MD 95400", | ||
860 | .matches = { | ||
861 | DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), | ||
862 | DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2050"), | ||
863 | }, | ||
864 | .driver_data = keymap_wistron_md96500 | ||
865 | }, | ||
866 | { | ||
867 | .callback = dmi_matched, | ||
868 | .ident = "Fujitsu Siemens Amilo D7820", | ||
869 | .matches = { | ||
870 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), /* not sure */ | ||
871 | DMI_MATCH(DMI_PRODUCT_NAME, "Amilo D"), | ||
872 | }, | ||
873 | .driver_data = keymap_fs_amilo_d88x0 | ||
874 | }, | ||
875 | { | ||
876 | .callback = dmi_matched, | ||
453 | .ident = "Fujitsu Siemens Amilo D88x0", | 877 | .ident = "Fujitsu Siemens Amilo D88x0", |
454 | .matches = { | 878 | .matches = { |
455 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | 879 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), |
@@ -500,12 +924,28 @@ static int __devinit setup_input_dev(void) | |||
500 | input_dev->cdev.dev = &wistron_device->dev; | 924 | input_dev->cdev.dev = &wistron_device->dev; |
501 | 925 | ||
502 | for (key = keymap; key->type != KE_END; key++) { | 926 | for (key = keymap; key->type != KE_END; key++) { |
503 | if (key->type == KE_KEY) { | 927 | switch (key->type) { |
504 | input_dev->evbit[LONG(EV_KEY)] = BIT(EV_KEY); | 928 | case KE_KEY: |
505 | set_bit(key->keycode, input_dev->keybit); | 929 | set_bit(EV_KEY, input_dev->evbit); |
930 | set_bit(key->keycode, input_dev->keybit); | ||
931 | break; | ||
932 | |||
933 | case KE_SW: | ||
934 | set_bit(EV_SW, input_dev->evbit); | ||
935 | set_bit(key->sw.code, input_dev->swbit); | ||
936 | break; | ||
937 | |||
938 | default: | ||
939 | ; | ||
506 | } | 940 | } |
507 | } | 941 | } |
508 | 942 | ||
943 | /* reads information flags on KE_END */ | ||
944 | if (key->code & FE_UNTESTED) | ||
945 | printk(KERN_WARNING "Untested laptop multimedia keys, " | ||
946 | "please report success or failure to eric.piel" | ||
947 | "@tremplin-utc.net\n"); | ||
948 | |||
509 | error = input_register_device(input_dev); | 949 | error = input_register_device(input_dev); |
510 | if (error) { | 950 | if (error) { |
511 | input_free_device(input_dev); | 951 | input_free_device(input_dev); |
@@ -523,6 +963,12 @@ static void report_key(unsigned keycode) | |||
523 | input_sync(input_dev); | 963 | input_sync(input_dev); |
524 | } | 964 | } |
525 | 965 | ||
966 | static void report_switch(unsigned code, int value) | ||
967 | { | ||
968 | input_report_switch(input_dev, code, value); | ||
969 | input_sync(input_dev); | ||
970 | } | ||
971 | |||
526 | /* Driver core */ | 972 | /* Driver core */ |
527 | 973 | ||
528 | static int wifi_enabled; | 974 | static int wifi_enabled; |
@@ -543,6 +989,10 @@ static void handle_key(u8 code) | |||
543 | report_key(key->keycode); | 989 | report_key(key->keycode); |
544 | break; | 990 | break; |
545 | 991 | ||
992 | case KE_SW: | ||
993 | report_switch(key->sw.code, key->sw.value); | ||
994 | break; | ||
995 | |||
546 | case KE_WIFI: | 996 | case KE_WIFI: |
547 | if (have_wifi) { | 997 | if (have_wifi) { |
548 | wifi_enabled = !wifi_enabled; | 998 | wifi_enabled = !wifi_enabled; |
@@ -558,6 +1008,7 @@ static void handle_key(u8 code) | |||
558 | break; | 1008 | break; |
559 | 1009 | ||
560 | case KE_END: | 1010 | case KE_END: |
1011 | break; | ||
561 | default: | 1012 | default: |
562 | BUG(); | 1013 | BUG(); |
563 | } | 1014 | } |
diff --git a/include/linux/input.h b/include/linux/input.h index a51d6cf6824c..9bd984b2d122 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -506,6 +506,7 @@ struct input_absinfo { | |||
506 | #define KEY_VOICEMAIL 0x1ac | 506 | #define KEY_VOICEMAIL 0x1ac |
507 | #define KEY_ADDRESSBOOK 0x1ad | 507 | #define KEY_ADDRESSBOOK 0x1ad |
508 | #define KEY_MESSENGER 0x1ae | 508 | #define KEY_MESSENGER 0x1ae |
509 | #define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */ | ||
509 | 510 | ||
510 | #define KEY_DEL_EOL 0x1c0 | 511 | #define KEY_DEL_EOL 0x1c0 |
511 | #define KEY_DEL_EOS 0x1c1 | 512 | #define KEY_DEL_EOS 0x1c1 |