diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-22 03:22:40 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-22 03:22:40 -0400 |
commit | 1c241131a126df9bfb930f27d2fe8887971af0c7 (patch) | |
tree | 32387adc81cc28741aad801affc2398d1061267d | |
parent | 19eddab9d94b5a47f154b6a244c7294a505b946f (diff) | |
parent | 86b84167d4e67372376a57ea9955c5d53dae232f (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
Pull HID fixes from Jiri Kosina:
- a partial revert of exponent parsing changes to make "Unit" exponent
item work properly again, by Nikolai Kondrashov
- a few new device IDs additions piggy-backing, by AceLan Kao and David
Herrmann
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid:
HID: wiimote: add LEGO-wiimote VID
HID: Fix unit exponent parsing again
HID: usbhid: quirk for SiS Touchscreen
HID: usbhid: quirk for Synaptics Large Touchccreen
-rw-r--r-- | drivers/hid/hid-core.c | 12 | ||||
-rw-r--r-- | drivers/hid/hid-ids.h | 6 | ||||
-rw-r--r-- | drivers/hid/hid-input.c | 13 | ||||
-rw-r--r-- | drivers/hid/hid-wiimote-core.c | 5 | ||||
-rw-r--r-- | drivers/hid/usbhid/hid-quirks.c | 3 |
5 files changed, 24 insertions, 15 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 5a8c01112a23..e80da62363bc 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -319,7 +319,7 @@ static s32 item_sdata(struct hid_item *item) | |||
319 | 319 | ||
320 | static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) | 320 | static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) |
321 | { | 321 | { |
322 | __u32 raw_value; | 322 | __s32 raw_value; |
323 | switch (item->tag) { | 323 | switch (item->tag) { |
324 | case HID_GLOBAL_ITEM_TAG_PUSH: | 324 | case HID_GLOBAL_ITEM_TAG_PUSH: |
325 | 325 | ||
@@ -370,10 +370,11 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) | |||
370 | return 0; | 370 | return 0; |
371 | 371 | ||
372 | case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT: | 372 | case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT: |
373 | /* Units exponent negative numbers are given through a | 373 | /* Many devices provide unit exponent as a two's complement |
374 | * two's complement. | 374 | * nibble due to the common misunderstanding of HID |
375 | * See "6.2.2.7 Global Items" for more information. */ | 375 | * specification 1.11, 6.2.2.7 Global Items. Attempt to handle |
376 | raw_value = item_udata(item); | 376 | * both this and the standard encoding. */ |
377 | raw_value = item_sdata(item); | ||
377 | if (!(raw_value & 0xfffffff0)) | 378 | if (!(raw_value & 0xfffffff0)) |
378 | parser->global.unit_exponent = hid_snto32(raw_value, 4); | 379 | parser->global.unit_exponent = hid_snto32(raw_value, 4); |
379 | else | 380 | else |
@@ -1870,6 +1871,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1870 | 1871 | ||
1871 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, | 1872 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) }, |
1872 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) }, | 1873 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) }, |
1874 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO2, USB_DEVICE_ID_NINTENDO_WIIMOTE) }, | ||
1873 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE2) }, | 1875 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE2) }, |
1874 | { } | 1876 | { } |
1875 | }; | 1877 | }; |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 9cbc7ab07dfa..f0296a50be5f 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -633,6 +633,7 @@ | |||
633 | #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003 | 633 | #define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003 |
634 | 634 | ||
635 | #define USB_VENDOR_ID_NINTENDO 0x057e | 635 | #define USB_VENDOR_ID_NINTENDO 0x057e |
636 | #define USB_VENDOR_ID_NINTENDO2 0x054c | ||
636 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE 0x0306 | 637 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE 0x0306 |
637 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE2 0x0330 | 638 | #define USB_DEVICE_ID_NINTENDO_WIIMOTE2 0x0330 |
638 | 639 | ||
@@ -792,6 +793,8 @@ | |||
792 | #define USB_DEVICE_ID_SYNAPTICS_COMP_TP 0x0009 | 793 | #define USB_DEVICE_ID_SYNAPTICS_COMP_TP 0x0009 |
793 | #define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010 | 794 | #define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010 |
794 | #define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013 | 795 | #define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013 |
796 | #define USB_DEVICE_ID_SYNAPTICS_LTS1 0x0af8 | ||
797 | #define USB_DEVICE_ID_SYNAPTICS_LTS2 0x1d10 | ||
795 | 798 | ||
796 | #define USB_VENDOR_ID_THINGM 0x27b8 | 799 | #define USB_VENDOR_ID_THINGM 0x27b8 |
797 | #define USB_DEVICE_ID_BLINK1 0x01ed | 800 | #define USB_DEVICE_ID_BLINK1 0x01ed |
@@ -919,4 +922,7 @@ | |||
919 | #define USB_VENDOR_ID_PRIMAX 0x0461 | 922 | #define USB_VENDOR_ID_PRIMAX 0x0461 |
920 | #define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 | 923 | #define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 |
921 | 924 | ||
925 | #define USB_VENDOR_ID_SIS 0x0457 | ||
926 | #define USB_DEVICE_ID_SIS_TS 0x1013 | ||
927 | |||
922 | #endif | 928 | #endif |
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 8741d953dcc8..d97f2323af57 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c | |||
@@ -192,6 +192,7 @@ static int hidinput_setkeycode(struct input_dev *dev, | |||
192 | return -EINVAL; | 192 | return -EINVAL; |
193 | } | 193 | } |
194 | 194 | ||
195 | |||
195 | /** | 196 | /** |
196 | * hidinput_calc_abs_res - calculate an absolute axis resolution | 197 | * hidinput_calc_abs_res - calculate an absolute axis resolution |
197 | * @field: the HID report field to calculate resolution for | 198 | * @field: the HID report field to calculate resolution for |
@@ -234,23 +235,17 @@ __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code) | |||
234 | case ABS_MT_TOOL_Y: | 235 | case ABS_MT_TOOL_Y: |
235 | case ABS_MT_TOUCH_MAJOR: | 236 | case ABS_MT_TOUCH_MAJOR: |
236 | case ABS_MT_TOUCH_MINOR: | 237 | case ABS_MT_TOUCH_MINOR: |
237 | if (field->unit & 0xffffff00) /* Not a length */ | 238 | if (field->unit == 0x11) { /* If centimeters */ |
238 | return 0; | ||
239 | unit_exponent += hid_snto32(field->unit >> 4, 4) - 1; | ||
240 | switch (field->unit & 0xf) { | ||
241 | case 0x1: /* If centimeters */ | ||
242 | /* Convert to millimeters */ | 239 | /* Convert to millimeters */ |
243 | unit_exponent += 1; | 240 | unit_exponent += 1; |
244 | break; | 241 | } else if (field->unit == 0x13) { /* If inches */ |
245 | case 0x3: /* If inches */ | ||
246 | /* Convert to millimeters */ | 242 | /* Convert to millimeters */ |
247 | prev = physical_extents; | 243 | prev = physical_extents; |
248 | physical_extents *= 254; | 244 | physical_extents *= 254; |
249 | if (physical_extents < prev) | 245 | if (physical_extents < prev) |
250 | return 0; | 246 | return 0; |
251 | unit_exponent -= 1; | 247 | unit_exponent -= 1; |
252 | break; | 248 | } else { |
253 | default: | ||
254 | return 0; | 249 | return 0; |
255 | } | 250 | } |
256 | break; | 251 | break; |
diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c index abb20db2b443..1446f526ee8b 100644 --- a/drivers/hid/hid-wiimote-core.c +++ b/drivers/hid/hid-wiimote-core.c | |||
@@ -834,7 +834,8 @@ static void wiimote_init_set_type(struct wiimote_data *wdata, | |||
834 | goto done; | 834 | goto done; |
835 | } | 835 | } |
836 | 836 | ||
837 | if (vendor == USB_VENDOR_ID_NINTENDO) { | 837 | if (vendor == USB_VENDOR_ID_NINTENDO || |
838 | vendor == USB_VENDOR_ID_NINTENDO2) { | ||
838 | if (product == USB_DEVICE_ID_NINTENDO_WIIMOTE) { | 839 | if (product == USB_DEVICE_ID_NINTENDO_WIIMOTE) { |
839 | devtype = WIIMOTE_DEV_GEN10; | 840 | devtype = WIIMOTE_DEV_GEN10; |
840 | goto done; | 841 | goto done; |
@@ -1855,6 +1856,8 @@ static void wiimote_hid_remove(struct hid_device *hdev) | |||
1855 | static const struct hid_device_id wiimote_hid_devices[] = { | 1856 | static const struct hid_device_id wiimote_hid_devices[] = { |
1856 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, | 1857 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, |
1857 | USB_DEVICE_ID_NINTENDO_WIIMOTE) }, | 1858 | USB_DEVICE_ID_NINTENDO_WIIMOTE) }, |
1859 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO2, | ||
1860 | USB_DEVICE_ID_NINTENDO_WIIMOTE) }, | ||
1858 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, | 1861 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, |
1859 | USB_DEVICE_ID_NINTENDO_WIIMOTE2) }, | 1862 | USB_DEVICE_ID_NINTENDO_WIIMOTE2) }, |
1860 | { } | 1863 | { } |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 07345521f421..3fca3be08337 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
@@ -110,6 +110,9 @@ static const struct hid_blacklist { | |||
110 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, | 110 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, |
111 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, | 111 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, |
112 | { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, | 112 | { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, |
113 | { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS }, | ||
114 | { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS2, HID_QUIRK_NO_INIT_REPORTS }, | ||
115 | { USB_VENDOR_ID_SIS, USB_DEVICE_ID_SIS_TS, HID_QUIRK_NO_INIT_REPORTS }, | ||
113 | 116 | ||
114 | { 0, 0 } | 117 | { 0, 0 } |
115 | }; | 118 | }; |