aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-microsoft.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/hid-microsoft.c')
-rw-r--r--drivers/hid/hid-microsoft.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c
index 0f6fc54dc196..e5c699b6c6f3 100644
--- a/drivers/hid/hid-microsoft.c
+++ b/drivers/hid/hid-microsoft.c
@@ -23,11 +23,12 @@
23 23
24#include "hid-ids.h" 24#include "hid-ids.h"
25 25
26#define MS_HIDINPUT 0x01 26#define MS_HIDINPUT 0x01
27#define MS_ERGONOMY 0x02 27#define MS_ERGONOMY 0x02
28#define MS_PRESENTER 0x04 28#define MS_PRESENTER 0x04
29#define MS_RDESC 0x08 29#define MS_RDESC 0x08
30#define MS_NOGET 0x10 30#define MS_NOGET 0x10
31#define MS_DUPLICATE_USAGES 0x20
31 32
32/* 33/*
33 * Microsoft Wireless Desktop Receiver (Model 1028) has 34 * Microsoft Wireless Desktop Receiver (Model 1028) has
@@ -109,6 +110,18 @@ static int ms_input_mapping(struct hid_device *hdev, struct hid_input *hi,
109 return 0; 110 return 0;
110} 111}
111 112
113static int ms_input_mapped(struct hid_device *hdev, struct hid_input *hi,
114 struct hid_field *field, struct hid_usage *usage,
115 unsigned long **bit, int *max)
116{
117 unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
118
119 if (quirks & MS_DUPLICATE_USAGES)
120 clear_bit(usage->code, *bit);
121
122 return 0;
123}
124
112static int ms_event(struct hid_device *hdev, struct hid_field *field, 125static int ms_event(struct hid_device *hdev, struct hid_field *field,
113 struct hid_usage *usage, __s32 value) 126 struct hid_usage *usage, __s32 value)
114{ 127{
@@ -179,8 +192,12 @@ static const struct hid_device_id ms_devices[] = {
179 .driver_data = MS_ERGONOMY | MS_RDESC }, 192 .driver_data = MS_ERGONOMY | MS_RDESC },
180 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB), 193 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB),
181 .driver_data = MS_PRESENTER }, 194 .driver_data = MS_PRESENTER },
195 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K),
196 .driver_data = MS_ERGONOMY },
182 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0), 197 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0),
183 .driver_data = MS_NOGET }, 198 .driver_data = MS_NOGET },
199 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500),
200 .driver_data = MS_DUPLICATE_USAGES },
184 201
185 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT), 202 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT),
186 .driver_data = MS_PRESENTER }, 203 .driver_data = MS_PRESENTER },
@@ -193,6 +210,7 @@ static struct hid_driver ms_driver = {
193 .id_table = ms_devices, 210 .id_table = ms_devices,
194 .report_fixup = ms_report_fixup, 211 .report_fixup = ms_report_fixup,
195 .input_mapping = ms_input_mapping, 212 .input_mapping = ms_input_mapping,
213 .input_mapped = ms_input_mapped,
196 .event = ms_event, 214 .event = ms_event,
197 .probe = ms_probe, 215 .probe = ms_probe,
198}; 216};