.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * HID driver for multitouch panels |
---|
3 | 4 | * |
---|
.. | .. |
---|
17 | 18 | * Copyright (c) 2009-2010 Stephane Chatty <chatty@enac.fr> |
---|
18 | 19 | * Copyright (c) 2010 Henrik Rydberg <rydberg@euromail.se> |
---|
19 | 20 | * Copyright (c) 2010 Canonical, Ltd. |
---|
20 | | - * |
---|
21 | 21 | */ |
---|
22 | 22 | |
---|
23 | 23 | /* |
---|
24 | | - * This program is free software; you can redistribute it and/or modify it |
---|
25 | | - * under the terms of the GNU General Public License as published by the Free |
---|
26 | | - * Software Foundation; either version 2 of the License, or (at your option) |
---|
27 | | - * any later version. |
---|
28 | 24 | */ |
---|
29 | 25 | |
---|
30 | 26 | /* |
---|
.. | .. |
---|
72 | 68 | #define MT_QUIRK_STICKY_FINGERS BIT(16) |
---|
73 | 69 | #define MT_QUIRK_ASUS_CUSTOM_UP BIT(17) |
---|
74 | 70 | #define MT_QUIRK_WIN8_PTP_BUTTONS BIT(18) |
---|
| 71 | +#define MT_QUIRK_SEPARATE_APP_REPORT BIT(19) |
---|
| 72 | +#define MT_QUIRK_FORCE_MULTI_INPUT BIT(20) |
---|
75 | 73 | |
---|
76 | 74 | #define MT_INPUTMODE_TOUCHSCREEN 0x02 |
---|
77 | 75 | #define MT_INPUTMODE_TOUCHPAD 0x03 |
---|
.. | .. |
---|
107 | 105 | struct mt_application { |
---|
108 | 106 | struct list_head list; |
---|
109 | 107 | unsigned int application; |
---|
| 108 | + unsigned int report_id; |
---|
110 | 109 | struct list_head mt_usages; /* mt usages list */ |
---|
111 | 110 | |
---|
112 | 111 | __s32 quirks; |
---|
.. | .. |
---|
190 | 189 | /* reserved 0x0011 */ |
---|
191 | 190 | #define MT_CLS_WIN_8 0x0012 |
---|
192 | 191 | #define MT_CLS_EXPORT_ALL_INPUTS 0x0013 |
---|
193 | | -#define MT_CLS_WIN_8_DUAL 0x0014 |
---|
| 192 | +/* reserved 0x0014 */ |
---|
| 193 | +#define MT_CLS_WIN_8_FORCE_MULTI_INPUT 0x0015 |
---|
194 | 194 | |
---|
195 | 195 | /* vendor specific classes */ |
---|
196 | 196 | #define MT_CLS_3M 0x0101 |
---|
.. | .. |
---|
207 | 207 | #define MT_CLS_VTL 0x0110 |
---|
208 | 208 | #define MT_CLS_GOOGLE 0x0111 |
---|
209 | 209 | #define MT_CLS_RAZER_BLADE_STEALTH 0x0112 |
---|
| 210 | +#define MT_CLS_SMART_TECH 0x0113 |
---|
210 | 211 | |
---|
211 | 212 | #define MT_DEFAULT_MAXCONTACT 10 |
---|
212 | 213 | #define MT_MAX_MAXCONTACT 250 |
---|
.. | .. |
---|
267 | 268 | MT_QUIRK_HOVERING | |
---|
268 | 269 | MT_QUIRK_CONTACT_CNT_ACCURATE | |
---|
269 | 270 | MT_QUIRK_STICKY_FINGERS | |
---|
270 | | - MT_QUIRK_WIN8_PTP_BUTTONS }, |
---|
| 271 | + MT_QUIRK_WIN8_PTP_BUTTONS, |
---|
| 272 | + .export_all_inputs = true }, |
---|
271 | 273 | { .name = MT_CLS_EXPORT_ALL_INPUTS, |
---|
272 | 274 | .quirks = MT_QUIRK_ALWAYS_VALID | |
---|
273 | 275 | MT_QUIRK_CONTACT_CNT_ACCURATE, |
---|
274 | 276 | .export_all_inputs = true }, |
---|
275 | | - { .name = MT_CLS_WIN_8_DUAL, |
---|
| 277 | + { .name = MT_CLS_WIN_8_FORCE_MULTI_INPUT, |
---|
276 | 278 | .quirks = MT_QUIRK_ALWAYS_VALID | |
---|
277 | 279 | MT_QUIRK_IGNORE_DUPLICATES | |
---|
278 | 280 | MT_QUIRK_HOVERING | |
---|
279 | 281 | MT_QUIRK_CONTACT_CNT_ACCURATE | |
---|
280 | | - MT_QUIRK_WIN8_PTP_BUTTONS, |
---|
| 282 | + MT_QUIRK_STICKY_FINGERS | |
---|
| 283 | + MT_QUIRK_WIN8_PTP_BUTTONS | |
---|
| 284 | + MT_QUIRK_FORCE_MULTI_INPUT, |
---|
281 | 285 | .export_all_inputs = true }, |
---|
282 | 286 | |
---|
283 | 287 | /* |
---|
.. | .. |
---|
356 | 360 | MT_QUIRK_HOVERING | |
---|
357 | 361 | MT_QUIRK_CONTACT_CNT_ACCURATE | |
---|
358 | 362 | MT_QUIRK_WIN8_PTP_BUTTONS, |
---|
| 363 | + }, |
---|
| 364 | + { .name = MT_CLS_SMART_TECH, |
---|
| 365 | + .quirks = MT_QUIRK_ALWAYS_VALID | |
---|
| 366 | + MT_QUIRK_IGNORE_DUPLICATES | |
---|
| 367 | + MT_QUIRK_CONTACT_CNT_ACCURATE | |
---|
| 368 | + MT_QUIRK_SEPARATE_APP_REPORT, |
---|
359 | 369 | }, |
---|
360 | 370 | { } |
---|
361 | 371 | }; |
---|
.. | .. |
---|
513 | 523 | } |
---|
514 | 524 | |
---|
515 | 525 | static struct mt_application *mt_allocate_application(struct mt_device *td, |
---|
516 | | - unsigned int application) |
---|
| 526 | + struct hid_report *report) |
---|
517 | 527 | { |
---|
| 528 | + unsigned int application = report->application; |
---|
518 | 529 | struct mt_application *mt_application; |
---|
519 | 530 | |
---|
520 | 531 | mt_application = devm_kzalloc(&td->hdev->dev, sizeof(*mt_application), |
---|
.. | .. |
---|
539 | 550 | mt_application->scantime = DEFAULT_ZERO; |
---|
540 | 551 | mt_application->raw_cc = DEFAULT_ZERO; |
---|
541 | 552 | mt_application->quirks = td->mtclass.quirks; |
---|
| 553 | + mt_application->report_id = report->id; |
---|
542 | 554 | |
---|
543 | 555 | list_add_tail(&mt_application->list, &td->applications); |
---|
544 | 556 | |
---|
.. | .. |
---|
546 | 558 | } |
---|
547 | 559 | |
---|
548 | 560 | static struct mt_application *mt_find_application(struct mt_device *td, |
---|
549 | | - unsigned int application) |
---|
| 561 | + struct hid_report *report) |
---|
550 | 562 | { |
---|
| 563 | + unsigned int application = report->application; |
---|
551 | 564 | struct mt_application *tmp, *mt_application = NULL; |
---|
552 | 565 | |
---|
553 | 566 | list_for_each_entry(tmp, &td->applications, list) { |
---|
554 | 567 | if (application == tmp->application) { |
---|
555 | | - mt_application = tmp; |
---|
556 | | - break; |
---|
| 568 | + if (!(td->mtclass.quirks & MT_QUIRK_SEPARATE_APP_REPORT) || |
---|
| 569 | + tmp->report_id == report->id) { |
---|
| 570 | + mt_application = tmp; |
---|
| 571 | + break; |
---|
| 572 | + } |
---|
557 | 573 | } |
---|
558 | 574 | } |
---|
559 | 575 | |
---|
560 | 576 | if (!mt_application) |
---|
561 | | - mt_application = mt_allocate_application(td, application); |
---|
| 577 | + mt_application = mt_allocate_application(td, report); |
---|
562 | 578 | |
---|
563 | 579 | return mt_application; |
---|
564 | 580 | } |
---|
.. | .. |
---|
575 | 591 | return NULL; |
---|
576 | 592 | |
---|
577 | 593 | rdata->report = report; |
---|
578 | | - rdata->application = mt_find_application(td, report->application); |
---|
| 594 | + rdata->application = mt_find_application(td, report); |
---|
579 | 595 | |
---|
580 | 596 | if (!rdata->application) { |
---|
581 | 597 | devm_kfree(&td->hdev->dev, rdata); |
---|
.. | .. |
---|
747 | 763 | return 1; |
---|
748 | 764 | case HID_DG_CONFIDENCE: |
---|
749 | 765 | if ((cls->name == MT_CLS_WIN_8 || |
---|
750 | | - cls->name == MT_CLS_WIN_8_DUAL) && |
---|
| 766 | + cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT) && |
---|
751 | 767 | (field->application == HID_DG_TOUCHPAD || |
---|
752 | 768 | field->application == HID_DG_TOUCHSCREEN)) |
---|
753 | 769 | app->quirks |= MT_QUIRK_CONFIDENCE; |
---|
.. | .. |
---|
890 | 906 | clear_bit(slotnum, app->pending_palm_slots); |
---|
891 | 907 | |
---|
892 | 908 | input_mt_slot(input, slotnum); |
---|
893 | | - input_mt_report_slot_state(input, MT_TOOL_PALM, false); |
---|
| 909 | + input_mt_report_slot_inactive(input); |
---|
894 | 910 | |
---|
895 | 911 | need_sync = true; |
---|
896 | 912 | } |
---|
.. | .. |
---|
1139 | 1155 | int contact_count = -1; |
---|
1140 | 1156 | |
---|
1141 | 1157 | /* sticky fingers release in progress, abort */ |
---|
1142 | | - if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) |
---|
| 1158 | + if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) |
---|
1143 | 1159 | return; |
---|
1144 | 1160 | |
---|
1145 | 1161 | scantime = *app->scantime; |
---|
.. | .. |
---|
1220 | 1236 | del_timer(&td->release_timer); |
---|
1221 | 1237 | } |
---|
1222 | 1238 | |
---|
1223 | | - clear_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags); |
---|
| 1239 | + clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags); |
---|
1224 | 1240 | } |
---|
1225 | 1241 | |
---|
1226 | 1242 | static int mt_touch_input_configured(struct hid_device *hdev, |
---|
.. | .. |
---|
1331 | 1347 | if (rdata->is_mt_collection) |
---|
1332 | 1348 | return mt_touch_input_mapping(hdev, hi, field, usage, bit, max, |
---|
1333 | 1349 | application); |
---|
| 1350 | + |
---|
| 1351 | + /* |
---|
| 1352 | + * some egalax touchscreens have "application == DG_TOUCHSCREEN" |
---|
| 1353 | + * for the stylus. Overwrite the hid_input application |
---|
| 1354 | + */ |
---|
| 1355 | + if (field->physical == HID_DG_STYLUS) |
---|
| 1356 | + hi->application = HID_DG_STYLUS; |
---|
1334 | 1357 | |
---|
1335 | 1358 | /* let hid-core decide for the others */ |
---|
1336 | 1359 | return 0; |
---|
.. | .. |
---|
1518 | 1541 | static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi) |
---|
1519 | 1542 | { |
---|
1520 | 1543 | struct mt_device *td = hid_get_drvdata(hdev); |
---|
1521 | | - char *name; |
---|
1522 | 1544 | const char *suffix = NULL; |
---|
1523 | | - unsigned int application = 0; |
---|
1524 | 1545 | struct mt_report_data *rdata; |
---|
1525 | 1546 | struct mt_application *mt_application = NULL; |
---|
1526 | 1547 | struct hid_report *report; |
---|
1527 | 1548 | int ret; |
---|
1528 | 1549 | |
---|
1529 | 1550 | list_for_each_entry(report, &hi->reports, hidinput_list) { |
---|
1530 | | - application = report->application; |
---|
1531 | 1551 | rdata = mt_find_report_data(td, report); |
---|
1532 | 1552 | if (!rdata) { |
---|
1533 | 1553 | hid_err(hdev, "failed to allocate data for report\n"); |
---|
.. | .. |
---|
1542 | 1562 | if (ret) |
---|
1543 | 1563 | return ret; |
---|
1544 | 1564 | } |
---|
1545 | | - |
---|
1546 | | - /* |
---|
1547 | | - * some egalax touchscreens have "application == DG_TOUCHSCREEN" |
---|
1548 | | - * for the stylus. Check this first, and then rely on |
---|
1549 | | - * the application field. |
---|
1550 | | - */ |
---|
1551 | | - if (report->field[0]->physical == HID_DG_STYLUS) { |
---|
1552 | | - suffix = "Pen"; |
---|
1553 | | - /* force BTN_STYLUS to allow tablet matching in udev */ |
---|
1554 | | - __set_bit(BTN_STYLUS, hi->input->keybit); |
---|
1555 | | - } |
---|
1556 | 1565 | } |
---|
1557 | 1566 | |
---|
1558 | | - if (!suffix) { |
---|
1559 | | - switch (application) { |
---|
1560 | | - case HID_GD_KEYBOARD: |
---|
1561 | | - case HID_GD_KEYPAD: |
---|
1562 | | - case HID_GD_MOUSE: |
---|
1563 | | - case HID_DG_TOUCHPAD: |
---|
1564 | | - case HID_GD_SYSTEM_CONTROL: |
---|
1565 | | - case HID_CP_CONSUMER_CONTROL: |
---|
1566 | | - case HID_GD_WIRELESS_RADIO_CTLS: |
---|
1567 | | - case HID_GD_SYSTEM_MULTIAXIS: |
---|
1568 | | - /* already handled by hid core */ |
---|
1569 | | - break; |
---|
1570 | | - case HID_DG_TOUCHSCREEN: |
---|
1571 | | - /* we do not set suffix = "Touchscreen" */ |
---|
1572 | | - hi->input->name = hdev->name; |
---|
1573 | | - break; |
---|
1574 | | - case HID_DG_STYLUS: |
---|
1575 | | - /* force BTN_STYLUS to allow tablet matching in udev */ |
---|
1576 | | - __set_bit(BTN_STYLUS, hi->input->keybit); |
---|
1577 | | - break; |
---|
1578 | | - case HID_VD_ASUS_CUSTOM_MEDIA_KEYS: |
---|
1579 | | - suffix = "Custom Media Keys"; |
---|
1580 | | - break; |
---|
1581 | | - default: |
---|
1582 | | - suffix = "UNKNOWN"; |
---|
1583 | | - break; |
---|
1584 | | - } |
---|
| 1567 | + switch (hi->application) { |
---|
| 1568 | + case HID_GD_KEYBOARD: |
---|
| 1569 | + case HID_GD_KEYPAD: |
---|
| 1570 | + case HID_GD_MOUSE: |
---|
| 1571 | + case HID_DG_TOUCHPAD: |
---|
| 1572 | + case HID_GD_SYSTEM_CONTROL: |
---|
| 1573 | + case HID_CP_CONSUMER_CONTROL: |
---|
| 1574 | + case HID_GD_WIRELESS_RADIO_CTLS: |
---|
| 1575 | + case HID_GD_SYSTEM_MULTIAXIS: |
---|
| 1576 | + /* already handled by hid core */ |
---|
| 1577 | + break; |
---|
| 1578 | + case HID_DG_TOUCHSCREEN: |
---|
| 1579 | + /* we do not set suffix = "Touchscreen" */ |
---|
| 1580 | + hi->input->name = hdev->name; |
---|
| 1581 | + break; |
---|
| 1582 | + case HID_VD_ASUS_CUSTOM_MEDIA_KEYS: |
---|
| 1583 | + suffix = "Custom Media Keys"; |
---|
| 1584 | + break; |
---|
| 1585 | + case HID_DG_STYLUS: |
---|
| 1586 | + /* force BTN_STYLUS to allow tablet matching in udev */ |
---|
| 1587 | + __set_bit(BTN_STYLUS, hi->input->keybit); |
---|
| 1588 | + fallthrough; |
---|
| 1589 | + case HID_DG_PEN: |
---|
| 1590 | + suffix = "Stylus"; |
---|
| 1591 | + break; |
---|
| 1592 | + default: |
---|
| 1593 | + suffix = "UNKNOWN"; |
---|
| 1594 | + break; |
---|
1585 | 1595 | } |
---|
1586 | 1596 | |
---|
1587 | | - if (suffix) { |
---|
1588 | | - name = devm_kzalloc(&hi->input->dev, |
---|
1589 | | - strlen(hdev->name) + strlen(suffix) + 2, |
---|
1590 | | - GFP_KERNEL); |
---|
1591 | | - if (name) { |
---|
1592 | | - sprintf(name, "%s %s", hdev->name, suffix); |
---|
1593 | | - hi->input->name = name; |
---|
1594 | | - } |
---|
1595 | | - } |
---|
| 1597 | + if (suffix) |
---|
| 1598 | + hi->input->name = devm_kasprintf(&hdev->dev, GFP_KERNEL, |
---|
| 1599 | + "%s %s", hdev->name, suffix); |
---|
1596 | 1600 | |
---|
1597 | 1601 | return 0; |
---|
1598 | 1602 | } |
---|
.. | .. |
---|
1639 | 1643 | if (mt) { |
---|
1640 | 1644 | for (i = 0; i < mt->num_slots; i++) { |
---|
1641 | 1645 | input_mt_slot(input_dev, i); |
---|
1642 | | - input_mt_report_slot_state(input_dev, |
---|
1643 | | - MT_TOOL_FINGER, |
---|
1644 | | - false); |
---|
| 1646 | + input_mt_report_slot_inactive(input_dev); |
---|
1645 | 1647 | } |
---|
1646 | 1648 | input_mt_sync_frame(input_dev); |
---|
1647 | 1649 | input_sync(input_dev); |
---|
.. | .. |
---|
1662 | 1664 | * An input report came in just before we release the sticky fingers, |
---|
1663 | 1665 | * it will take care of the sticky fingers. |
---|
1664 | 1666 | */ |
---|
1665 | | - if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) |
---|
| 1667 | + if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) |
---|
1666 | 1668 | return; |
---|
1667 | 1669 | if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags)) |
---|
1668 | 1670 | mt_release_contacts(hdev); |
---|
1669 | | - clear_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags); |
---|
| 1671 | + clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags); |
---|
1670 | 1672 | } |
---|
1671 | 1673 | |
---|
1672 | 1674 | static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) |
---|
.. | .. |
---|
1712 | 1714 | |
---|
1713 | 1715 | if (id->group != HID_GROUP_MULTITOUCH_WIN_8) |
---|
1714 | 1716 | hdev->quirks |= HID_QUIRK_MULTI_INPUT; |
---|
| 1717 | + |
---|
| 1718 | + if (mtclass->quirks & MT_QUIRK_FORCE_MULTI_INPUT) { |
---|
| 1719 | + hdev->quirks &= ~HID_QUIRK_INPUT_PER_APP; |
---|
| 1720 | + hdev->quirks |= HID_QUIRK_MULTI_INPUT; |
---|
| 1721 | + } |
---|
1715 | 1722 | |
---|
1716 | 1723 | timer_setup(&td->release_timer, mt_expired_timeout, 0); |
---|
1717 | 1724 | |
---|
.. | .. |
---|
1785 | 1792 | MT_USB_DEVICE(USB_VENDOR_ID_3M, |
---|
1786 | 1793 | USB_DEVICE_ID_3M3266) }, |
---|
1787 | 1794 | |
---|
1788 | | - /* Alps devices */ |
---|
1789 | | - { .driver_data = MT_CLS_WIN_8_DUAL, |
---|
1790 | | - HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
1791 | | - USB_VENDOR_ID_ALPS_JP, |
---|
1792 | | - HID_DEVICE_ID_ALPS_U1_DUAL_PTP) }, |
---|
1793 | | - { .driver_data = MT_CLS_WIN_8_DUAL, |
---|
1794 | | - HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
1795 | | - USB_VENDOR_ID_ALPS_JP, |
---|
1796 | | - HID_DEVICE_ID_ALPS_U1_DUAL_3BTN_PTP) }, |
---|
1797 | | - { .driver_data = MT_CLS_WIN_8_DUAL, |
---|
1798 | | - HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
1799 | | - USB_VENDOR_ID_ALPS_JP, |
---|
1800 | | - HID_DEVICE_ID_ALPS_1222) }, |
---|
1801 | | - |
---|
1802 | | - /* Lenovo X1 TAB Gen 2 */ |
---|
1803 | | - { .driver_data = MT_CLS_WIN_8_DUAL, |
---|
1804 | | - HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, |
---|
1805 | | - USB_VENDOR_ID_LENOVO, |
---|
1806 | | - USB_DEVICE_ID_LENOVO_X1_TAB) }, |
---|
1807 | | - |
---|
1808 | 1795 | /* Anton devices */ |
---|
1809 | 1796 | { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, |
---|
1810 | 1797 | MT_USB_DEVICE(USB_VENDOR_ID_ANTON, |
---|
.. | .. |
---|
1838 | 1825 | { .driver_data = MT_CLS_NSMU, |
---|
1839 | 1826 | MT_USB_DEVICE(USB_VENDOR_ID_CHUNGHWAT, |
---|
1840 | 1827 | USB_DEVICE_ID_CHUNGHWAT_MULTITOUCH) }, |
---|
1841 | | - |
---|
1842 | | - /* Cirque devices */ |
---|
1843 | | - { .driver_data = MT_CLS_WIN_8_DUAL, |
---|
1844 | | - HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
1845 | | - I2C_VENDOR_ID_CIRQUE, |
---|
1846 | | - I2C_PRODUCT_ID_CIRQUE_121F) }, |
---|
1847 | 1828 | |
---|
1848 | 1829 | /* CJTouch panels */ |
---|
1849 | 1830 | { .driver_data = MT_CLS_NSMU, |
---|
.. | .. |
---|
1919 | 1900 | MT_USB_DEVICE(USB_VENDOR_ID_DWAV, |
---|
1920 | 1901 | USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_C002) }, |
---|
1921 | 1902 | |
---|
| 1903 | + /* Elan devices */ |
---|
| 1904 | + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, |
---|
| 1905 | + HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
| 1906 | + USB_VENDOR_ID_ELAN, 0x313a) }, |
---|
| 1907 | + |
---|
| 1908 | + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, |
---|
| 1909 | + HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
| 1910 | + USB_VENDOR_ID_ELAN, 0x3148) }, |
---|
| 1911 | + |
---|
1922 | 1912 | /* Elitegroup panel */ |
---|
1923 | 1913 | { .driver_data = MT_CLS_SERIAL, |
---|
1924 | 1914 | MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP, |
---|
.. | .. |
---|
1985 | 1975 | HID_DEVICE(BUS_I2C, HID_GROUP_GENERIC, |
---|
1986 | 1976 | USB_VENDOR_ID_LG, I2C_DEVICE_ID_LG_7010) }, |
---|
1987 | 1977 | |
---|
| 1978 | + /* Lenovo X1 TAB Gen 2 */ |
---|
| 1979 | + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, |
---|
| 1980 | + HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, |
---|
| 1981 | + USB_VENDOR_ID_LENOVO, |
---|
| 1982 | + USB_DEVICE_ID_LENOVO_X1_TAB) }, |
---|
| 1983 | + |
---|
| 1984 | + /* Lenovo X1 TAB Gen 3 */ |
---|
| 1985 | + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, |
---|
| 1986 | + HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, |
---|
| 1987 | + USB_VENDOR_ID_LENOVO, |
---|
| 1988 | + USB_DEVICE_ID_LENOVO_X1_TAB3) }, |
---|
| 1989 | + |
---|
| 1990 | + /* Lenovo X12 TAB Gen 1 */ |
---|
| 1991 | + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, |
---|
| 1992 | + HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, |
---|
| 1993 | + USB_VENDOR_ID_LENOVO, |
---|
| 1994 | + USB_DEVICE_ID_LENOVO_X12_TAB) }, |
---|
| 1995 | + |
---|
1988 | 1996 | /* MosArt panels */ |
---|
1989 | 1997 | { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, |
---|
1990 | 1998 | MT_USB_DEVICE(USB_VENDOR_ID_ASUS, |
---|
.. | .. |
---|
2040 | 2048 | HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
2041 | 2049 | USB_VENDOR_ID_SYNAPTICS, 0x8323) }, |
---|
2042 | 2050 | |
---|
| 2051 | + /* Smart Tech panels */ |
---|
| 2052 | + { .driver_data = MT_CLS_SMART_TECH, |
---|
| 2053 | + MT_USB_DEVICE(0x0b8c, 0x0092)}, |
---|
| 2054 | + |
---|
2043 | 2055 | /* Stantum panels */ |
---|
2044 | 2056 | { .driver_data = MT_CLS_CONFIDENCE, |
---|
2045 | 2057 | MT_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, |
---|
2046 | 2058 | USB_DEVICE_ID_MTP_STM)}, |
---|
| 2059 | + |
---|
| 2060 | + /* Synaptics devices */ |
---|
| 2061 | + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, |
---|
| 2062 | + HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
| 2063 | + USB_VENDOR_ID_SYNAPTICS, 0xce08) }, |
---|
| 2064 | + |
---|
| 2065 | + { .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT, |
---|
| 2066 | + HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, |
---|
| 2067 | + USB_VENDOR_ID_SYNAPTICS, 0xce09) }, |
---|
2047 | 2068 | |
---|
2048 | 2069 | /* TopSeed panels */ |
---|
2049 | 2070 | { .driver_data = MT_CLS_TOPSEED, |
---|
.. | .. |
---|
2111 | 2132 | { .driver_data = MT_CLS_GOOGLE, |
---|
2112 | 2133 | HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, USB_VENDOR_ID_GOOGLE, |
---|
2113 | 2134 | USB_DEVICE_ID_GOOGLE_TOUCH_ROSE) }, |
---|
| 2135 | + { .driver_data = MT_CLS_GOOGLE, |
---|
| 2136 | + HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8, USB_VENDOR_ID_GOOGLE, |
---|
| 2137 | + USB_DEVICE_ID_GOOGLE_WHISKERS) }, |
---|
2114 | 2138 | |
---|
2115 | 2139 | /* Generic MT device */ |
---|
2116 | 2140 | { HID_DEVICE(HID_BUS_ANY, HID_GROUP_MULTITOUCH, HID_ANY_ID, HID_ANY_ID) }, |
---|