diff options
Diffstat (limited to 'drivers/hid/hid-input.c')
-rw-r--r-- | drivers/hid/hid-input.c | 33 |
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 | ||
38 | static int hid_pb_fnmode = 1; | ||
39 | module_param_named(pb_fnmode, hid_pb_fnmode, int, 0644); | ||
40 | MODULE_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 | ||
41 | static const unsigned char hid_keyboard[256] = { | 45 | static 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; |