diff options
| -rw-r--r-- | drivers/hid/hid-ids.h | 3 | ||||
| -rw-r--r-- | drivers/hid/hid-multitouch.c | 27 |
2 files changed, 30 insertions, 0 deletions
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 7c863738e419..d6cc6a9cf10f 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -931,6 +931,9 @@ | |||
| 931 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 | 931 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 |
| 932 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 | 932 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 |
| 933 | 933 | ||
| 934 | #define USB_VENDOR_ID_VTL 0x0306 | ||
| 935 | #define USB_DEVICE_ID_VTL_MULTITOUCH_FF3F 0xff3f | ||
| 936 | |||
| 934 | #define USB_VENDOR_ID_WACOM 0x056a | 937 | #define USB_VENDOR_ID_WACOM 0x056a |
| 935 | #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81 | 938 | #define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81 |
| 936 | #define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0x00BD | 939 | #define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0x00BD |
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index 51e25b9407f2..683cda6c60ce 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c | |||
| @@ -67,6 +67,7 @@ MODULE_LICENSE("GPL"); | |||
| 67 | #define MT_QUIRK_IGNORE_DUPLICATES (1 << 10) | 67 | #define MT_QUIRK_IGNORE_DUPLICATES (1 << 10) |
| 68 | #define MT_QUIRK_HOVERING (1 << 11) | 68 | #define MT_QUIRK_HOVERING (1 << 11) |
| 69 | #define MT_QUIRK_CONTACT_CNT_ACCURATE (1 << 12) | 69 | #define MT_QUIRK_CONTACT_CNT_ACCURATE (1 << 12) |
| 70 | #define MT_QUIRK_FORCE_GET_FEATURE (1 << 13) | ||
| 70 | 71 | ||
| 71 | #define MT_INPUTMODE_TOUCHSCREEN 0x02 | 72 | #define MT_INPUTMODE_TOUCHSCREEN 0x02 |
| 72 | #define MT_INPUTMODE_TOUCHPAD 0x03 | 73 | #define MT_INPUTMODE_TOUCHPAD 0x03 |
| @@ -150,6 +151,7 @@ static void mt_post_parse(struct mt_device *td); | |||
| 150 | #define MT_CLS_FLATFROG 0x0107 | 151 | #define MT_CLS_FLATFROG 0x0107 |
| 151 | #define MT_CLS_GENERALTOUCH_TWOFINGERS 0x0108 | 152 | #define MT_CLS_GENERALTOUCH_TWOFINGERS 0x0108 |
| 152 | #define MT_CLS_GENERALTOUCH_PWT_TENFINGERS 0x0109 | 153 | #define MT_CLS_GENERALTOUCH_PWT_TENFINGERS 0x0109 |
| 154 | #define MT_CLS_VTL 0x0110 | ||
| 153 | 155 | ||
| 154 | #define MT_DEFAULT_MAXCONTACT 10 | 156 | #define MT_DEFAULT_MAXCONTACT 10 |
| 155 | #define MT_MAX_MAXCONTACT 250 | 157 | #define MT_MAX_MAXCONTACT 250 |
| @@ -255,6 +257,11 @@ static struct mt_class mt_classes[] = { | |||
| 255 | .sn_move = 2048, | 257 | .sn_move = 2048, |
| 256 | .maxcontacts = 40, | 258 | .maxcontacts = 40, |
| 257 | }, | 259 | }, |
| 260 | { .name = MT_CLS_VTL, | ||
| 261 | .quirks = MT_QUIRK_ALWAYS_VALID | | ||
| 262 | MT_QUIRK_CONTACT_CNT_ACCURATE | | ||
| 263 | MT_QUIRK_FORCE_GET_FEATURE, | ||
| 264 | }, | ||
| 258 | { } | 265 | { } |
| 259 | }; | 266 | }; |
| 260 | 267 | ||
| @@ -809,6 +816,9 @@ static void mt_set_input_mode(struct hid_device *hdev) | |||
| 809 | struct mt_device *td = hid_get_drvdata(hdev); | 816 | struct mt_device *td = hid_get_drvdata(hdev); |
| 810 | struct hid_report *r; | 817 | struct hid_report *r; |
| 811 | struct hid_report_enum *re; | 818 | struct hid_report_enum *re; |
| 819 | struct mt_class *cls = &td->mtclass; | ||
| 820 | char *buf; | ||
| 821 | int report_len; | ||
| 812 | 822 | ||
| 813 | if (td->inputmode < 0) | 823 | if (td->inputmode < 0) |
| 814 | return; | 824 | return; |
| @@ -816,6 +826,18 @@ static void mt_set_input_mode(struct hid_device *hdev) | |||
| 816 | re = &(hdev->report_enum[HID_FEATURE_REPORT]); | 826 | re = &(hdev->report_enum[HID_FEATURE_REPORT]); |
| 817 | r = re->report_id_hash[td->inputmode]; | 827 | r = re->report_id_hash[td->inputmode]; |
| 818 | if (r) { | 828 | if (r) { |
| 829 | if (cls->quirks & MT_QUIRK_FORCE_GET_FEATURE) { | ||
| 830 | report_len = ((r->size - 1) >> 3) + 1 + (r->id > 0); | ||
| 831 | buf = hid_alloc_report_buf(r, GFP_KERNEL); | ||
| 832 | if (!buf) { | ||
| 833 | hid_err(hdev, "failed to allocate buffer for report\n"); | ||
| 834 | return; | ||
| 835 | } | ||
| 836 | hid_hw_raw_request(hdev, r->id, buf, report_len, | ||
| 837 | HID_FEATURE_REPORT, | ||
| 838 | HID_REQ_GET_REPORT); | ||
| 839 | kfree(buf); | ||
| 840 | } | ||
| 819 | r->field[0]->value[td->inputmode_index] = td->inputmode_value; | 841 | r->field[0]->value[td->inputmode_index] = td->inputmode_value; |
| 820 | hid_hw_request(hdev, r, HID_REQ_SET_REPORT); | 842 | hid_hw_request(hdev, r, HID_REQ_SET_REPORT); |
| 821 | } | 843 | } |
| @@ -1281,6 +1303,11 @@ static const struct hid_device_id mt_devices[] = { | |||
| 1281 | MT_USB_DEVICE(USB_VENDOR_ID_UNITEC, | 1303 | MT_USB_DEVICE(USB_VENDOR_ID_UNITEC, |
| 1282 | USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) }, | 1304 | USB_DEVICE_ID_UNITEC_USB_TOUCH_0A19) }, |
| 1283 | 1305 | ||
| 1306 | /* VTL panels */ | ||
| 1307 | { .driver_data = MT_CLS_VTL, | ||
| 1308 | MT_USB_DEVICE(USB_VENDOR_ID_VTL, | ||
| 1309 | USB_DEVICE_ID_VTL_MULTITOUCH_FF3F) }, | ||
| 1310 | |||
| 1284 | /* Wistron panels */ | 1311 | /* Wistron panels */ |
| 1285 | { .driver_data = MT_CLS_NSMU, | 1312 | { .driver_data = MT_CLS_NSMU, |
| 1286 | MT_USB_DEVICE(USB_VENDOR_ID_WISTRON, | 1313 | MT_USB_DEVICE(USB_VENDOR_ID_WISTRON, |
