| .. | .. |
|---|
| 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) }, |
|---|