aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-input.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/hid-input.c')
-rw-r--r--drivers/hid/hid-input.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 28689e3eb552..c7a6833f6821 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -30,12 +30,16 @@
30#include <linux/module.h> 30#include <linux/module.h>
31#include <linux/slab.h> 31#include <linux/slab.h>
32#include <linux/kernel.h> 32#include <linux/kernel.h>
33#include <linux/usb/input.h>
34 33
35#undef DEBUG 34#undef DEBUG
36 35
37#include <linux/hid.h> 36#include <linux/hid.h>
38 37
38static int hid_pb_fnmode = 1;
39module_param_named(pb_fnmode, hid_pb_fnmode, int, 0644);
40MODULE_PARM_DESC(pb_fnmode,
41 "Mode of fn key on PowerBooks (0 = disabled, 1 = fkeyslast, 2 = fkeysfirst)");
42
39#define unk KEY_UNKNOWN 43#define unk KEY_UNKNOWN
40 44
41static const unsigned char hid_keyboard[256] = { 45static const unsigned char hid_keyboard[256] = {
@@ -155,7 +159,7 @@ static int hidinput_pb_event(struct hid_device *hid, struct input_dev *input,
155 return 1; 159 return 1;
156 } 160 }
157 161
158 if (hid->pb_fnmode) { 162 if (hid_pb_fnmode) {
159 int do_translate; 163 int do_translate;
160 164
161 trans = find_translation(powerbook_fn_keys, usage->code); 165 trans = find_translation(powerbook_fn_keys, usage->code);
@@ -164,8 +168,8 @@ static int hidinput_pb_event(struct hid_device *hid, struct input_dev *input,
164 do_translate = 1; 168 do_translate = 1;
165 else if (trans->flags & POWERBOOK_FLAG_FKEY) 169 else if (trans->flags & POWERBOOK_FLAG_FKEY)
166 do_translate = 170 do_translate =
167 (hid->pb_fnmode == 2 && (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON)) || 171 (hid_pb_fnmode == 2 && (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON)) ||
168 (hid->pb_fnmode == 1 && !(hid->quirks & HID_QUIRK_POWERBOOK_FN_ON)); 172 (hid_pb_fnmode == 1 && !(hid->quirks & HID_QUIRK_POWERBOOK_FN_ON));
169 else 173 else
170 do_translate = (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON); 174 do_translate = (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON);
171 175
@@ -364,9 +368,22 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
364 break; 368 break;
365 369
366 case HID_UP_LED: 370 case HID_UP_LED:
367 if (((usage->hid - 1) & 0xffff) >= LED_MAX) 371
368 goto ignore; 372 switch (usage->hid & 0xffff) { /* HID-Value: */
369 map_led((usage->hid - 1) & 0xffff); 373 case 0x01: map_led (LED_NUML); break; /* "Num Lock" */
374 case 0x02: map_led (LED_CAPSL); break; /* "Caps Lock" */
375 case 0x03: map_led (LED_SCROLLL); break; /* "Scroll Lock" */
376 case 0x04: map_led (LED_COMPOSE); break; /* "Compose" */
377 case 0x05: map_led (LED_KANA); break; /* "Kana" */
378 case 0x27: map_led (LED_SLEEP); break; /* "Stand-By" */
379 case 0x4c: map_led (LED_SUSPEND); break; /* "System Suspend" */
380 case 0x09: map_led (LED_MUTE); break; /* "Mute" */
381 case 0x4b: map_led (LED_MISC); break; /* "Generic Indicator" */
382 case 0x19: map_led (LED_MAIL); break; /* "Message Waiting" */
383 case 0x4d: map_led (LED_CHARGING); break; /* "External Power Connected" */
384
385 default: goto ignore;
386 }
370 break; 387 break;
371 388
372 case HID_UP_DIGITIZER: 389 case HID_UP_DIGITIZER:
@@ -419,6 +436,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
419 case 0x040: map_key_clear(KEY_MENU); break; 436 case 0x040: map_key_clear(KEY_MENU); break;
420 case 0x045: map_key_clear(KEY_RADIO); break; 437 case 0x045: map_key_clear(KEY_RADIO); break;
421 438
439 case 0x083: map_key_clear(KEY_LAST); break;
422 case 0x088: map_key_clear(KEY_PC); break; 440 case 0x088: map_key_clear(KEY_PC); break;
423 case 0x089: map_key_clear(KEY_TV); break; 441 case 0x089: map_key_clear(KEY_TV); break;
424 case 0x08a: map_key_clear(KEY_WWW); break; 442 case 0x08a: map_key_clear(KEY_WWW); break;
@@ -436,6 +454,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
436 case 0x096: map_key_clear(KEY_TAPE); break; 454 case 0x096: map_key_clear(KEY_TAPE); break;
437 case 0x097: map_key_clear(KEY_TV2); break; 455 case 0x097: map_key_clear(KEY_TV2); break;
438 case 0x098: map_key_clear(KEY_SAT); break; 456 case 0x098: map_key_clear(KEY_SAT); break;
457 case 0x09a: map_key_clear(KEY_PVR); break;
439 458
440 case 0x09c: map_key_clear(KEY_CHANNELUP); break; 459 case 0x09c: map_key_clear(KEY_CHANNELUP); break;
441 case 0x09d: map_key_clear(KEY_CHANNELDOWN); break; 460 case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;