mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-23 16:53:58 -05:00
HID: wacom: generic: read HID_DG_CONTACTMAX from any feature report
In the generic code path, HID_DG_CONTACTMAX was previously
only read from the second byte of report 0x23.
Another report (0x82) has the HID_DG_CONTACTMAX in the
higher nibble of the third byte. We should support reading the
value of HID_DG_CONTACTMAX no matter what report we are reading
or which position that value is in.
To do this we submit the feature report as a event report
using hid_report_raw_event(). Our modified finger event path
records the value of HID_DG_CONTACTMAX when it sees that usage.
Fixes: 8ffffd5212
("HID: wacom: fix timeout on probe for some wacoms")
Signed-off-by: Aaron Armstrong Skomra <aaron.skomra@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
912c6aa67a
commit
184eccd403
2 changed files with 10 additions and 4 deletions
|
@ -314,14 +314,16 @@ static void wacom_feature_mapping(struct hid_device *hdev,
|
|||
/* leave touch_max as is if predefined */
|
||||
if (!features->touch_max) {
|
||||
/* read manually */
|
||||
data = kzalloc(2, GFP_KERNEL);
|
||||
n = hid_report_len(field->report);
|
||||
data = hid_alloc_report_buf(field->report, GFP_KERNEL);
|
||||
if (!data)
|
||||
break;
|
||||
data[0] = field->report->id;
|
||||
ret = wacom_get_report(hdev, HID_FEATURE_REPORT,
|
||||
data, 2, WAC_CMD_RETRIES);
|
||||
if (ret == 2) {
|
||||
features->touch_max = data[1];
|
||||
data, n, WAC_CMD_RETRIES);
|
||||
if (ret == n) {
|
||||
ret = hid_report_raw_event(hdev,
|
||||
HID_FEATURE_REPORT, data, n, 0);
|
||||
} else {
|
||||
features->touch_max = 16;
|
||||
hid_warn(hdev, "wacom_feature_mapping: "
|
||||
|
|
|
@ -2492,6 +2492,7 @@ static void wacom_wac_finger_event(struct hid_device *hdev,
|
|||
struct wacom *wacom = hid_get_drvdata(hdev);
|
||||
struct wacom_wac *wacom_wac = &wacom->wacom_wac;
|
||||
unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
|
||||
struct wacom_features *features = &wacom->wacom_wac.features;
|
||||
|
||||
switch (equivalent_usage) {
|
||||
case HID_GD_X:
|
||||
|
@ -2512,6 +2513,9 @@ static void wacom_wac_finger_event(struct hid_device *hdev,
|
|||
case HID_DG_TIPSWITCH:
|
||||
wacom_wac->hid_data.tipswitch = value;
|
||||
break;
|
||||
case HID_DG_CONTACTMAX:
|
||||
features->touch_max = value;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue