aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gerecke <killertofu@gmail.com>2015-10-07 19:54:21 -0400
committerJiri Kosina <jkosina@suse.cz>2015-10-21 07:13:11 -0400
commit499522c8c015de995aabce3d0f0bf4b9b17f44c3 (patch)
tree71ee15c9be4502d28e4618e7316ce29299f606a7
parente8e88438008375b17561dcc6a22abc24decf04ac (diff)
HID: wacom: Tie cached HID_DG_CONTACTCOUNT indices to report ID
The cached indicies 'cc_index' and 'cc_value_index' introduced in 1b5d514 are only valid for a single report ID. If a touchscreen has multiple reports with a HID_DG_CONTACTCOUNT usage, its possible that the values will not be correct for the report we're handling, resulting in an incorrect value for 'num_expected'. This has been observed with the Cintiq Companion 2. To address this, we store the ID of the report those indicies are valid for in a new 'cc_report' variable. Before using them to get the expected contact count, we first check if the ID of the report we're processing matches 'cc_report'. If it doesn't, we update the indicies to point to the HID_DG_CONTACTCOUNT usage of the current report (if it has one). Cc: stable@vger.kernel.org Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/wacom_wac.c26
-rw-r--r--drivers/hid/wacom_wac.h1
2 files changed, 27 insertions, 0 deletions
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 0215ab62bb93..9c3b14496c97 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -1628,6 +1628,7 @@ static void wacom_wac_finger_usage_mapping(struct hid_device *hdev,
1628 wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0); 1628 wacom_map_usage(input, usage, field, EV_KEY, BTN_TOUCH, 0);
1629 break; 1629 break;
1630 case HID_DG_CONTACTCOUNT: 1630 case HID_DG_CONTACTCOUNT:
1631 wacom_wac->hid_data.cc_report = field->report->id;
1631 wacom_wac->hid_data.cc_index = field->index; 1632 wacom_wac->hid_data.cc_index = field->index;
1632 wacom_wac->hid_data.cc_value_index = usage->usage_index; 1633 wacom_wac->hid_data.cc_value_index = usage->usage_index;
1633 break; 1634 break;
@@ -1715,6 +1716,31 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev,
1715 struct wacom_wac *wacom_wac = &wacom->wacom_wac; 1716 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1716 struct hid_data* hid_data = &wacom_wac->hid_data; 1717 struct hid_data* hid_data = &wacom_wac->hid_data;
1717 1718
1719 if (hid_data->cc_report != 0 &&
1720 hid_data->cc_report != report->id) {
1721 int i;
1722
1723 hid_data->cc_report = report->id;
1724 hid_data->cc_index = -1;
1725 hid_data->cc_value_index = -1;
1726
1727 for (i = 0; i < report->maxfield; i++) {
1728 struct hid_field *field = report->field[i];
1729 int j;
1730
1731 for (j = 0; j < field->maxusage; j++) {
1732 if (field->usage[j].hid == HID_DG_CONTACTCOUNT) {
1733 hid_data->cc_index = i;
1734 hid_data->cc_value_index = j;
1735
1736 /* break */
1737 i = report->maxfield;
1738 j = field->maxusage;
1739 }
1740 }
1741 }
1742 }
1743
1718 if (hid_data->cc_index >= 0) { 1744 if (hid_data->cc_index >= 0) {
1719 struct hid_field *field = report->field[hid_data->cc_index]; 1745 struct hid_field *field = report->field[hid_data->cc_index];
1720 int value = field->value[hid_data->cc_value_index]; 1746 int value = field->value[hid_data->cc_value_index];
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index 1e270d401e18..809c03e34f74 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -198,6 +198,7 @@ struct hid_data {
198 int width; 198 int width;
199 int height; 199 int height;
200 int id; 200 int id;
201 int cc_report;
201 int cc_index; 202 int cc_index;
202 int cc_value_index; 203 int cc_value_index;
203 int num_expected; 204 int num_expected;