diff options
Diffstat (limited to 'drivers/hid')
-rw-r--r-- | drivers/hid/hid-core.c | 1 | ||||
-rw-r--r-- | drivers/hid/hid-ids.h | 2 | ||||
-rw-r--r-- | drivers/hid/hid-tivo.c | 1 | ||||
-rw-r--r-- | drivers/hid/usbhid/hid-quirks.c | 1 | ||||
-rw-r--r-- | drivers/hid/wacom_wac.c | 84 |
5 files changed, 56 insertions, 33 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 7c669c328c4c..56ce8c2b5530 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1959,6 +1959,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1959 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) }, | 1959 | { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) }, |
1960 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, | 1960 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, |
1961 | { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, | 1961 | { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, |
1962 | { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_PRO) }, | ||
1962 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, | 1963 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, |
1963 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) }, | 1964 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) }, |
1964 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, | 1965 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 204312bfab2c..9c4786759f16 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -586,6 +586,7 @@ | |||
586 | #define USB_VENDOR_ID_LOGITECH 0x046d | 586 | #define USB_VENDOR_ID_LOGITECH 0x046d |
587 | #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e | 587 | #define USB_DEVICE_ID_LOGITECH_AUDIOHUB 0x0a0e |
588 | #define USB_DEVICE_ID_LOGITECH_T651 0xb00c | 588 | #define USB_DEVICE_ID_LOGITECH_T651 0xb00c |
589 | #define USB_DEVICE_ID_LOGITECH_C077 0xc007 | ||
589 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 | 590 | #define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 |
590 | #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 | 591 | #define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110 |
591 | #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f | 592 | #define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f |
@@ -898,6 +899,7 @@ | |||
898 | #define USB_VENDOR_ID_TIVO 0x150a | 899 | #define USB_VENDOR_ID_TIVO 0x150a |
899 | #define USB_DEVICE_ID_TIVO_SLIDE_BT 0x1200 | 900 | #define USB_DEVICE_ID_TIVO_SLIDE_BT 0x1200 |
900 | #define USB_DEVICE_ID_TIVO_SLIDE 0x1201 | 901 | #define USB_DEVICE_ID_TIVO_SLIDE 0x1201 |
902 | #define USB_DEVICE_ID_TIVO_SLIDE_PRO 0x1203 | ||
901 | 903 | ||
902 | #define USB_VENDOR_ID_TOPSEED 0x0766 | 904 | #define USB_VENDOR_ID_TOPSEED 0x0766 |
903 | #define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204 | 905 | #define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204 |
diff --git a/drivers/hid/hid-tivo.c b/drivers/hid/hid-tivo.c index d790d8d71f7f..d98696927453 100644 --- a/drivers/hid/hid-tivo.c +++ b/drivers/hid/hid-tivo.c | |||
@@ -64,6 +64,7 @@ static const struct hid_device_id tivo_devices[] = { | |||
64 | /* TiVo Slide Bluetooth remote, pairs with a Broadcom dongle */ | 64 | /* TiVo Slide Bluetooth remote, pairs with a Broadcom dongle */ |
65 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, | 65 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) }, |
66 | { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, | 66 | { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) }, |
67 | { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_PRO) }, | ||
67 | { } | 68 | { } |
68 | }; | 69 | }; |
69 | MODULE_DEVICE_TABLE(hid, tivo_devices); | 70 | MODULE_DEVICE_TABLE(hid, tivo_devices); |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 9be99a67bfe2..a82127753461 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
@@ -78,6 +78,7 @@ static const struct hid_blacklist { | |||
78 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, | 78 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, |
79 | { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, | 79 | { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, |
80 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, | 80 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, |
81 | { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_C077, HID_QUIRK_ALWAYS_POLL }, | ||
81 | { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, | 82 | { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, |
82 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS }, | 83 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS }, |
83 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3_JP, HID_QUIRK_NO_INIT_REPORTS }, | 84 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3_JP, HID_QUIRK_NO_INIT_REPORTS }, |
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 046351cf17f3..bbe32d66e500 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c | |||
@@ -551,9 +551,13 @@ static int wacom_intuos_inout(struct wacom_wac *wacom) | |||
551 | (features->type == CINTIQ && !(data[1] & 0x40))) | 551 | (features->type == CINTIQ && !(data[1] & 0x40))) |
552 | return 1; | 552 | return 1; |
553 | 553 | ||
554 | if (features->quirks & WACOM_QUIRK_MULTI_INPUT) | 554 | if (wacom->shared) { |
555 | wacom->shared->stylus_in_proximity = true; | 555 | wacom->shared->stylus_in_proximity = true; |
556 | 556 | ||
557 | if (wacom->shared->touch_down) | ||
558 | return 1; | ||
559 | } | ||
560 | |||
557 | /* in Range while exiting */ | 561 | /* in Range while exiting */ |
558 | if (((data[1] & 0xfe) == 0x20) && wacom->reporting_data) { | 562 | if (((data[1] & 0xfe) == 0x20) && wacom->reporting_data) { |
559 | input_report_key(input, BTN_TOUCH, 0); | 563 | input_report_key(input, BTN_TOUCH, 0); |
@@ -1043,27 +1047,28 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom) | |||
1043 | struct input_dev *input = wacom->input; | 1047 | struct input_dev *input = wacom->input; |
1044 | unsigned char *data = wacom->data; | 1048 | unsigned char *data = wacom->data; |
1045 | int i; | 1049 | int i; |
1046 | int current_num_contacts = 0; | 1050 | int current_num_contacts = data[61]; |
1047 | int contacts_to_send = 0; | 1051 | int contacts_to_send = 0; |
1048 | int num_contacts_left = 4; /* maximum contacts per packet */ | 1052 | int num_contacts_left = 4; /* maximum contacts per packet */ |
1049 | int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET; | 1053 | int byte_per_packet = WACOM_BYTES_PER_24HDT_PACKET; |
1050 | int y_offset = 2; | 1054 | int y_offset = 2; |
1055 | static int contact_with_no_pen_down_count = 0; | ||
1051 | 1056 | ||
1052 | if (wacom->features.type == WACOM_27QHDT) { | 1057 | if (wacom->features.type == WACOM_27QHDT) { |
1053 | current_num_contacts = data[63]; | 1058 | current_num_contacts = data[63]; |
1054 | num_contacts_left = 10; | 1059 | num_contacts_left = 10; |
1055 | byte_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET; | 1060 | byte_per_packet = WACOM_BYTES_PER_QHDTHID_PACKET; |
1056 | y_offset = 0; | 1061 | y_offset = 0; |
1057 | } else { | ||
1058 | current_num_contacts = data[61]; | ||
1059 | } | 1062 | } |
1060 | 1063 | ||
1061 | /* | 1064 | /* |
1062 | * First packet resets the counter since only the first | 1065 | * First packet resets the counter since only the first |
1063 | * packet in series will have non-zero current_num_contacts. | 1066 | * packet in series will have non-zero current_num_contacts. |
1064 | */ | 1067 | */ |
1065 | if (current_num_contacts) | 1068 | if (current_num_contacts) { |
1066 | wacom->num_contacts_left = current_num_contacts; | 1069 | wacom->num_contacts_left = current_num_contacts; |
1070 | contact_with_no_pen_down_count = 0; | ||
1071 | } | ||
1067 | 1072 | ||
1068 | contacts_to_send = min(num_contacts_left, wacom->num_contacts_left); | 1073 | contacts_to_send = min(num_contacts_left, wacom->num_contacts_left); |
1069 | 1074 | ||
@@ -1096,15 +1101,16 @@ static int wacom_24hdt_irq(struct wacom_wac *wacom) | |||
1096 | input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h)); | 1101 | input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h)); |
1097 | input_report_abs(input, ABS_MT_ORIENTATION, w > h); | 1102 | input_report_abs(input, ABS_MT_ORIENTATION, w > h); |
1098 | } | 1103 | } |
1104 | contact_with_no_pen_down_count++; | ||
1099 | } | 1105 | } |
1100 | } | 1106 | } |
1101 | input_mt_report_pointer_emulation(input, true); | 1107 | input_mt_report_pointer_emulation(input, true); |
1102 | 1108 | ||
1103 | wacom->num_contacts_left -= contacts_to_send; | 1109 | wacom->num_contacts_left -= contacts_to_send; |
1104 | if (wacom->num_contacts_left <= 0) | 1110 | if (wacom->num_contacts_left <= 0) { |
1105 | wacom->num_contacts_left = 0; | 1111 | wacom->num_contacts_left = 0; |
1106 | 1112 | wacom->shared->touch_down = (contact_with_no_pen_down_count > 0); | |
1107 | wacom->shared->touch_down = (wacom->num_contacts_left > 0); | 1113 | } |
1108 | return 1; | 1114 | return 1; |
1109 | } | 1115 | } |
1110 | 1116 | ||
@@ -1116,6 +1122,7 @@ static int wacom_mt_touch(struct wacom_wac *wacom) | |||
1116 | int current_num_contacts = data[2]; | 1122 | int current_num_contacts = data[2]; |
1117 | int contacts_to_send = 0; | 1123 | int contacts_to_send = 0; |
1118 | int x_offset = 0; | 1124 | int x_offset = 0; |
1125 | static int contact_with_no_pen_down_count = 0; | ||
1119 | 1126 | ||
1120 | /* MTTPC does not support Height and Width */ | 1127 | /* MTTPC does not support Height and Width */ |
1121 | if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B) | 1128 | if (wacom->features.type == MTTPC || wacom->features.type == MTTPC_B) |
@@ -1125,8 +1132,10 @@ static int wacom_mt_touch(struct wacom_wac *wacom) | |||
1125 | * First packet resets the counter since only the first | 1132 | * First packet resets the counter since only the first |
1126 | * packet in series will have non-zero current_num_contacts. | 1133 | * packet in series will have non-zero current_num_contacts. |
1127 | */ | 1134 | */ |
1128 | if (current_num_contacts) | 1135 | if (current_num_contacts) { |
1129 | wacom->num_contacts_left = current_num_contacts; | 1136 | wacom->num_contacts_left = current_num_contacts; |
1137 | contact_with_no_pen_down_count = 0; | ||
1138 | } | ||
1130 | 1139 | ||
1131 | /* There are at most 5 contacts per packet */ | 1140 | /* There are at most 5 contacts per packet */ |
1132 | contacts_to_send = min(5, wacom->num_contacts_left); | 1141 | contacts_to_send = min(5, wacom->num_contacts_left); |
@@ -1147,15 +1156,16 @@ static int wacom_mt_touch(struct wacom_wac *wacom) | |||
1147 | int y = get_unaligned_le16(&data[offset + x_offset + 9]); | 1156 | int y = get_unaligned_le16(&data[offset + x_offset + 9]); |
1148 | input_report_abs(input, ABS_MT_POSITION_X, x); | 1157 | input_report_abs(input, ABS_MT_POSITION_X, x); |
1149 | input_report_abs(input, ABS_MT_POSITION_Y, y); | 1158 | input_report_abs(input, ABS_MT_POSITION_Y, y); |
1159 | contact_with_no_pen_down_count++; | ||
1150 | } | 1160 | } |
1151 | } | 1161 | } |
1152 | input_mt_report_pointer_emulation(input, true); | 1162 | input_mt_report_pointer_emulation(input, true); |
1153 | 1163 | ||
1154 | wacom->num_contacts_left -= contacts_to_send; | 1164 | wacom->num_contacts_left -= contacts_to_send; |
1155 | if (wacom->num_contacts_left < 0) | 1165 | if (wacom->num_contacts_left <= 0) { |
1156 | wacom->num_contacts_left = 0; | 1166 | wacom->num_contacts_left = 0; |
1157 | 1167 | wacom->shared->touch_down = (contact_with_no_pen_down_count > 0); | |
1158 | wacom->shared->touch_down = (wacom->num_contacts_left > 0); | 1168 | } |
1159 | return 1; | 1169 | return 1; |
1160 | } | 1170 | } |
1161 | 1171 | ||
@@ -1193,29 +1203,25 @@ static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len) | |||
1193 | { | 1203 | { |
1194 | unsigned char *data = wacom->data; | 1204 | unsigned char *data = wacom->data; |
1195 | struct input_dev *input = wacom->input; | 1205 | struct input_dev *input = wacom->input; |
1196 | bool prox; | 1206 | bool prox = !wacom->shared->stylus_in_proximity; |
1197 | int x = 0, y = 0; | 1207 | int x = 0, y = 0; |
1198 | 1208 | ||
1199 | if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG) | 1209 | if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG) |
1200 | return 0; | 1210 | return 0; |
1201 | 1211 | ||
1202 | if (!wacom->shared->stylus_in_proximity) { | 1212 | if (len == WACOM_PKGLEN_TPC1FG) { |
1203 | if (len == WACOM_PKGLEN_TPC1FG) { | 1213 | prox = prox && (data[0] & 0x01); |
1204 | prox = data[0] & 0x01; | 1214 | x = get_unaligned_le16(&data[1]); |
1205 | x = get_unaligned_le16(&data[1]); | 1215 | y = get_unaligned_le16(&data[3]); |
1206 | y = get_unaligned_le16(&data[3]); | 1216 | } else if (len == WACOM_PKGLEN_TPC1FG_B) { |
1207 | } else if (len == WACOM_PKGLEN_TPC1FG_B) { | 1217 | prox = prox && (data[2] & 0x01); |
1208 | prox = data[2] & 0x01; | 1218 | x = get_unaligned_le16(&data[3]); |
1209 | x = get_unaligned_le16(&data[3]); | 1219 | y = get_unaligned_le16(&data[5]); |
1210 | y = get_unaligned_le16(&data[5]); | 1220 | } else { |
1211 | } else { | 1221 | prox = prox && (data[1] & 0x01); |
1212 | prox = data[1] & 0x01; | 1222 | x = le16_to_cpup((__le16 *)&data[2]); |
1213 | x = le16_to_cpup((__le16 *)&data[2]); | 1223 | y = le16_to_cpup((__le16 *)&data[4]); |
1214 | y = le16_to_cpup((__le16 *)&data[4]); | 1224 | } |
1215 | } | ||
1216 | } else | ||
1217 | /* force touch out when pen is in prox */ | ||
1218 | prox = 0; | ||
1219 | 1225 | ||
1220 | if (prox) { | 1226 | if (prox) { |
1221 | input_report_abs(input, ABS_X, x); | 1227 | input_report_abs(input, ABS_X, x); |
@@ -1613,6 +1619,7 @@ static int wacom_bpt_touch(struct wacom_wac *wacom) | |||
1613 | struct input_dev *pad_input = wacom->pad_input; | 1619 | struct input_dev *pad_input = wacom->pad_input; |
1614 | unsigned char *data = wacom->data; | 1620 | unsigned char *data = wacom->data; |
1615 | int i; | 1621 | int i; |
1622 | int contact_with_no_pen_down_count = 0; | ||
1616 | 1623 | ||
1617 | if (data[0] != 0x02) | 1624 | if (data[0] != 0x02) |
1618 | return 0; | 1625 | return 0; |
@@ -1640,6 +1647,7 @@ static int wacom_bpt_touch(struct wacom_wac *wacom) | |||
1640 | } | 1647 | } |
1641 | input_report_abs(input, ABS_MT_POSITION_X, x); | 1648 | input_report_abs(input, ABS_MT_POSITION_X, x); |
1642 | input_report_abs(input, ABS_MT_POSITION_Y, y); | 1649 | input_report_abs(input, ABS_MT_POSITION_Y, y); |
1650 | contact_with_no_pen_down_count++; | ||
1643 | } | 1651 | } |
1644 | } | 1652 | } |
1645 | 1653 | ||
@@ -1649,11 +1657,12 @@ static int wacom_bpt_touch(struct wacom_wac *wacom) | |||
1649 | input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0); | 1657 | input_report_key(pad_input, BTN_FORWARD, (data[1] & 0x04) != 0); |
1650 | input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0); | 1658 | input_report_key(pad_input, BTN_BACK, (data[1] & 0x02) != 0); |
1651 | input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0); | 1659 | input_report_key(pad_input, BTN_RIGHT, (data[1] & 0x01) != 0); |
1660 | wacom->shared->touch_down = (contact_with_no_pen_down_count > 0); | ||
1652 | 1661 | ||
1653 | return 1; | 1662 | return 1; |
1654 | } | 1663 | } |
1655 | 1664 | ||
1656 | static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) | 1665 | static int wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data, int last_touch_count) |
1657 | { | 1666 | { |
1658 | struct wacom_features *features = &wacom->features; | 1667 | struct wacom_features *features = &wacom->features; |
1659 | struct input_dev *input = wacom->input; | 1668 | struct input_dev *input = wacom->input; |
@@ -1661,7 +1670,7 @@ static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) | |||
1661 | int slot = input_mt_get_slot_by_key(input, data[0]); | 1670 | int slot = input_mt_get_slot_by_key(input, data[0]); |
1662 | 1671 | ||
1663 | if (slot < 0) | 1672 | if (slot < 0) |
1664 | return; | 1673 | return 0; |
1665 | 1674 | ||
1666 | touch = touch && !wacom->shared->stylus_in_proximity; | 1675 | touch = touch && !wacom->shared->stylus_in_proximity; |
1667 | 1676 | ||
@@ -1693,7 +1702,9 @@ static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) | |||
1693 | input_report_abs(input, ABS_MT_POSITION_Y, y); | 1702 | input_report_abs(input, ABS_MT_POSITION_Y, y); |
1694 | input_report_abs(input, ABS_MT_TOUCH_MAJOR, width); | 1703 | input_report_abs(input, ABS_MT_TOUCH_MAJOR, width); |
1695 | input_report_abs(input, ABS_MT_TOUCH_MINOR, height); | 1704 | input_report_abs(input, ABS_MT_TOUCH_MINOR, height); |
1705 | last_touch_count++; | ||
1696 | } | 1706 | } |
1707 | return last_touch_count; | ||
1697 | } | 1708 | } |
1698 | 1709 | ||
1699 | static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data) | 1710 | static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data) |
@@ -1718,6 +1729,7 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom) | |||
1718 | unsigned char *data = wacom->data; | 1729 | unsigned char *data = wacom->data; |
1719 | int count = data[1] & 0x07; | 1730 | int count = data[1] & 0x07; |
1720 | int i; | 1731 | int i; |
1732 | int contact_with_no_pen_down_count = 0; | ||
1721 | 1733 | ||
1722 | if (data[0] != 0x02) | 1734 | if (data[0] != 0x02) |
1723 | return 0; | 1735 | return 0; |
@@ -1728,12 +1740,15 @@ static int wacom_bpt3_touch(struct wacom_wac *wacom) | |||
1728 | int msg_id = data[offset]; | 1740 | int msg_id = data[offset]; |
1729 | 1741 | ||
1730 | if (msg_id >= 2 && msg_id <= 17) | 1742 | if (msg_id >= 2 && msg_id <= 17) |
1731 | wacom_bpt3_touch_msg(wacom, data + offset); | 1743 | contact_with_no_pen_down_count = |
1744 | wacom_bpt3_touch_msg(wacom, data + offset, | ||
1745 | contact_with_no_pen_down_count); | ||
1732 | else if (msg_id == 128) | 1746 | else if (msg_id == 128) |
1733 | wacom_bpt3_button_msg(wacom, data + offset); | 1747 | wacom_bpt3_button_msg(wacom, data + offset); |
1734 | 1748 | ||
1735 | } | 1749 | } |
1736 | input_mt_report_pointer_emulation(input, true); | 1750 | input_mt_report_pointer_emulation(input, true); |
1751 | wacom->shared->touch_down = (contact_with_no_pen_down_count > 0); | ||
1737 | 1752 | ||
1738 | return 1; | 1753 | return 1; |
1739 | } | 1754 | } |
@@ -1759,6 +1774,9 @@ static int wacom_bpt_pen(struct wacom_wac *wacom) | |||
1759 | return 0; | 1774 | return 0; |
1760 | } | 1775 | } |
1761 | 1776 | ||
1777 | if (wacom->shared->touch_down) | ||
1778 | return 0; | ||
1779 | |||
1762 | prox = (data[1] & 0x20) == 0x20; | 1780 | prox = (data[1] & 0x20) == 0x20; |
1763 | 1781 | ||
1764 | /* | 1782 | /* |