aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/hid-input.c28
-rw-r--r--drivers/hid/usbhid/hid-quirks.c3
-rw-r--r--include/linux/hid.h2
3 files changed, 33 insertions, 0 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 1b8b33341408..60de16a83c3e 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -60,6 +60,19 @@ static const unsigned char hid_keyboard[256] = {
60 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk 60 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
61}; 61};
62 62
63/* extended mapping for certain Logitech hardware (Logitech cordless desktop LX500) */
64#define LOGITECH_EXPANDED_KEYMAP_SIZE 80
65static int logitech_expanded_keymap[LOGITECH_EXPANDED_KEYMAP_SIZE] = {
66 0,216, 0,213,175,156, 0, 0, 0, 0,
67 144, 0, 0, 0, 0, 0, 0, 0, 0,212,
68 174,167,152,161,112, 0, 0, 0,154, 0,
69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
70 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
71 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72 0, 0, 0, 0, 0,183,184,185,186,187,
73 188,189,190,191,192,193,194, 0, 0, 0
74};
75
63static const struct { 76static const struct {
64 __s32 x; 77 __s32 x;
65 __s32 y; 78 __s32 y;
@@ -378,6 +391,21 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
378 } 391 }
379 } 392 }
380 393
394 /* Special handling for Logitech Cordless Desktop */
395 if (field->application != HID_GD_MOUSE) {
396 if (device->quirks & HID_QUIRK_LOGITECH_EXPANDED_KEYMAP) {
397 int hid = usage->hid & HID_USAGE;
398 if (hid < LOGITECH_EXPANDED_KEYMAP_SIZE && logitech_expanded_keymap[hid] != 0)
399 code = logitech_expanded_keymap[hid];
400 }
401 } else {
402 if (device->quirks & HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL) {
403 int hid = usage->hid & HID_USAGE;
404 if (hid == 7 || hid == 8)
405 goto ignore;
406 }
407 }
408
381 map_key(code); 409 map_key(code);
382 break; 410 break;
383 411
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index a75c236fcafc..5614a70f564f 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -201,6 +201,7 @@
201#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 201#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294
202#define USB_DEVICE_ID_S510_RECEIVER 0xc50c 202#define USB_DEVICE_ID_S510_RECEIVER 0xc50c
203#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 203#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
204#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512
204#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513 205#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513
205#define USB_DEVICE_ID_DINOVO_EDGE 0xc714 206#define USB_DEVICE_ID_DINOVO_EDGE 0xc714
206 207
@@ -422,6 +423,8 @@ static const struct hid_blacklist {
422 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE }, 423 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE },
423 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE }, 424 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE },
424 425
426 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
427
425 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, 428 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
426 429
427 { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS }, 430 { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 4daf5eea78a1..44b64f0d0555 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -274,6 +274,8 @@ struct hid_item {
274#define HID_QUIRK_DUPLICATE_USAGES 0x00080000 274#define HID_QUIRK_DUPLICATE_USAGES 0x00080000
275#define HID_QUIRK_RESET_LEDS 0x00100000 275#define HID_QUIRK_RESET_LEDS 0x00100000
276#define HID_QUIRK_HIDINPUT 0x00200000 276#define HID_QUIRK_HIDINPUT 0x00200000
277#define HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL 0x00400000
278#define HID_QUIRK_LOGITECH_EXPANDED_KEYMAP 0x00800000
277 279
278/* 280/*
279 * Separate quirks for runtime report descriptor fixup 281 * Separate quirks for runtime report descriptor fixup