| From 8ffffd5212846b72f116f7a9572e83d580e25802 Mon Sep 17 00:00:00 2001 |
| From: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| Date: Tue, 16 Sep 2014 16:56:39 -0400 |
| Subject: HID: wacom: fix timeout on probe for some wacoms |
| |
| From: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| |
| commit 8ffffd5212846b72f116f7a9572e83d580e25802 upstream. |
| |
| Some Wacom tablets (at least the ISDv4 found in the Lenovo X230) timeout |
| during probe while retrieving the input reports. |
| The only time this information is valuable is during the feature_mapping |
| stage, so we can ask for it there and discard the generic input reports |
| retrieval. |
| |
| This gives a code path closer to the wacom.ko driver when it was in the |
| input subtree (not HID). |
| |
| Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> |
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/hid/wacom_sys.c | 18 ++++++++++++++++-- |
| 1 file changed, 16 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/hid/wacom_sys.c |
| +++ b/drivers/hid/wacom_sys.c |
| @@ -106,12 +106,24 @@ static void wacom_feature_mapping(struct |
| { |
| struct wacom *wacom = hid_get_drvdata(hdev); |
| struct wacom_features *features = &wacom->wacom_wac.features; |
| + u8 *data; |
| + int ret; |
| |
| switch (usage->hid) { |
| case HID_DG_CONTACTMAX: |
| /* leave touch_max as is if predefined */ |
| - if (!features->touch_max) |
| - features->touch_max = field->value[0]; |
| + if (!features->touch_max) { |
| + /* read manually */ |
| + data = kzalloc(2, GFP_KERNEL); |
| + if (!data) |
| + break; |
| + data[0] = field->report->id; |
| + ret = wacom_get_report(hdev, HID_FEATURE_REPORT, |
| + data, 2, 0); |
| + if (ret == 2) |
| + features->touch_max = data[1]; |
| + kfree(data); |
| + } |
| break; |
| } |
| } |
| @@ -1245,6 +1257,8 @@ static int wacom_probe(struct hid_device |
| if (!id->driver_data) |
| return -EINVAL; |
| |
| + hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS; |
| + |
| wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); |
| if (!wacom) |
| return -ENOMEM; |