From patchwork Mon Jul 11 18:07:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gerecke, Jason" X-Patchwork-Id: 9223929 X-Patchwork-Delegate: jikos@jikos.cz Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2C88A60572 for ; Mon, 11 Jul 2016 18:07:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 21D4B27DCE for ; Mon, 11 Jul 2016 18:07:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1626C27E33; Mon, 11 Jul 2016 18:07:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2012727DCE for ; Mon, 11 Jul 2016 18:07:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751322AbcGKSHW (ORCPT ); Mon, 11 Jul 2016 14:07:22 -0400 Received: from mail-pf0-f193.google.com ([209.85.192.193]:35552 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751327AbcGKSHV (ORCPT ); Mon, 11 Jul 2016 14:07:21 -0400 Received: by mail-pf0-f193.google.com with SMTP id t190so13774082pfb.2 for ; Mon, 11 Jul 2016 11:07:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=o547hCU0JOMKLdZsVPHCl0vjeiC69UvvVurCvuYclzs=; b=FzUwyh5IdtYwE7oLDYxXQvYhOmV1xwCoOlYw7S6vK/LjaNLx2MzGND9eh3M95UV6gx H9PZ5WTcU7Gy/uAGyTSBO1ANiSPh4K72RNBRpVBalVyQOJgRz2HA4gkNPfVqNepLiTYu sKvXG5sfZLxmIG1uzYrGXi3MeUolmfrIzSwCckrw69YVFynWzET7kMM4XwxMoh3KmS0h IoHu80v+6UJShN4uLW8wbiwqp/PcM3dNAVEMECQVa2MBN3MwqmY/HYbya5ERtA10ukCE xmyvjCv7myZFD3nmDhlIBBK1xIVChxbyLSkUssIjN7g1STFyj2fGKsH7ED8FlH5oIYgd SH1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=o547hCU0JOMKLdZsVPHCl0vjeiC69UvvVurCvuYclzs=; b=C468lIVoPfXBy889bZ3zRS3KiUKoOd7pmUgedIHykQvXjeNFgMOa9DADALiJ4J7+Dc tPwOi28ncoumRQHperCCiImcgvX5FLcN7tao8UaxtQ57E+kqJvxicdRgLTkGiCw62SZC URKy8bzWZSr0Qkr7Zx0GXqhVap/yyEt8zxX9uIYdQYyE0oRbVzSnGq6+GD+cDrvN8OVW x1OqBXx6qH4uxZ73LAYUjIn/l9/c1OmkVjmIfoWHo4VhyEazWKvrVmiAA5M2autHqfim VRDPe1ThvdoSm0XcQKGQjkrpKE2y0W+H5JyLNet5bBCFuqP8Nvo/BA+Il6JJru30Oqou V/lA== X-Gm-Message-State: ALyK8tLm2Afi5tkQlIPI8tOtd4wRa1aGg6TGBMgLS7fY3eIMpeTGmUlqBwj+v80/jzgAVg== X-Received: by 10.98.21.149 with SMTP id 143mr35863382pfv.92.1468260440465; Mon, 11 Jul 2016 11:07:20 -0700 (PDT) Received: from wtc005007.corp.onewacom.com (71-34-80-44.ptld.qwest.net. [71.34.80.44]) by smtp.gmail.com with ESMTPSA id cp3sm6356083pad.12.2016.07.11.11.07.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Jul 2016 11:07:19 -0700 (PDT) From: Jason Gerecke To: linux-input@vger.kernel.org Cc: Ping Cheng , Aaron Skomra , Benjamin Tissoires , Jason Gerecke , Jason Gerecke Subject: [PATCH 2/2] HID: wacom: Replace 'oVid' and 'oPid' with heuristics Date: Mon, 11 Jul 2016 11:07:11 -0700 Message-Id: <20160711180711.17537-2-killertofu@gmail.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160711180711.17537-1-killertofu@gmail.com> References: <20160711180711.17537-1-killertofu@gmail.com> Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The 'oVid' and 'oPid' variables used by wacom_are_sibling are a hacky solution to the problem of the driver having few good heuristics to use to determine if two devices should be considered siblings or not. This commit replaces them with heuristics that leverage the information we have available to determine if two devices are likely siblings or not. Written out, the new heuristics are basically: * If a device with the same VID/PID as that being probed already exists, it should be preferentially checked for siblingship. * Two HID devices which have the same VID/PID are not siblings if they are not part of the same logical hardware device. * Two HID devices which have different VID/PIDs are not siblings if they have different parent (e.g. USB hub) devices. * Devices without the WACOM_DEVICETYPE_DIRECT flag set may only be siblings of devies with the same VID/PID (Wacom often splits their direct input tablets into two devices to make it easier to meet Microsoft's touchscreen requirements). * Two devices which have different "directness" are not siblings. * Two devices which do not serve complementary roles (i.e. pen/touch) are not siblings. Signed-off-by: Jason Gerecke --- drivers/hid/wacom_sys.c | 58 +++++++++++++++++++++++++++++++++++++++---------- drivers/hid/wacom_wac.c | 41 ++++++++++++++-------------------- drivers/hid/wacom_wac.h | 2 -- 3 files changed, 62 insertions(+), 39 deletions(-) diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c index 4a0bb6f..a5bc038 100644 --- a/drivers/hid/wacom_sys.c +++ b/drivers/hid/wacom_sys.c @@ -532,31 +532,65 @@ static bool wacom_are_sibling(struct hid_device *hdev, { struct wacom *wacom = hid_get_drvdata(hdev); struct wacom_features *features = &wacom->wacom_wac.features; - int vid = features->oVid; - int pid = features->oPid; - int n1,n2; + struct wacom *sibling_wacom = hid_get_drvdata(sibling); + struct wacom_features *sibling_features = &sibling_wacom->wacom_wac.features; + int n1, n2; - if (vid == 0 && pid == 0) { - vid = hdev->vendor; - pid = hdev->product; + /* Compare the physical path. Require devices with the same + * PID to share the same device, and devices with different + * PIDs to share parent devices. + */ + if (hdev->vendor == sibling->vendor && hdev->product == sibling->product) { + n1 = strrchr(hdev->phys, '/') - hdev->phys; + n2 = strrchr(sibling->phys, '/') - sibling->phys; + } + else { + n1 = strrchr(hdev->phys, '.') - hdev->phys; + n2 = strrchr(sibling->phys, '.') - sibling->phys; } - if (vid != sibling->vendor || pid != sibling->product) + if (n1 != n2 || n1 <= 0 || n2 <= 0) return false; - /* Compare the physical path. */ - n1 = strrchr(hdev->phys, '.') - hdev->phys; - n2 = strrchr(sibling->phys, '.') - sibling->phys; - if (n1 != n2 || n1 <= 0 || n2 <= 0) + if (strncmp(hdev->phys, sibling->phys, n1)) + return false; + + if (hdev->vendor != sibling->vendor || hdev->product != sibling->product) { + if(!(features->device_type & WACOM_DEVICETYPE_DIRECT)) + return false; + } + + if ((features->device_type & WACOM_DEVICETYPE_DIRECT) != + (sibling_features->device_type & WACOM_DEVICETYPE_DIRECT)) return false; - return !strncmp(hdev->phys, sibling->phys, n1); + if ((features->device_type & WACOM_DEVICETYPE_PEN) && + !(sibling_features->device_type & WACOM_DEVICETYPE_TOUCH)) + return false; + + if ((features->device_type & WACOM_DEVICETYPE_TOUCH) && + !(sibling_features->device_type & WACOM_DEVICETYPE_PEN)) + return false; + + return true; } static struct wacom_hdev_data *wacom_get_hdev_data(struct hid_device *hdev) { struct wacom_hdev_data *data; + /* Try to find an already-probed interface from the same device */ + list_for_each_entry(data, &wacom_udev_list, list) { + int n1, n2; + n1 = strrchr(hdev->phys, '/') - hdev->phys; + n2 = strrchr(data->dev->phys, '/') - data->dev->phys; + if (n1 != n2 || n1 <= 0 || n2 <= 0) + continue; + if (!strncmp(hdev->phys, data->dev->phys, n1)) + return data; + } + + /* Fallback to finding devices that appear to be "siblings" */ list_for_each_entry(data, &wacom_udev_list, list) { if (wacom_are_sibling(hdev, data->dev)) { kref_get(&data->kref); diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 2523a29..cb6fc63 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -3229,11 +3229,10 @@ static const struct wacom_features wacom_features_0xF4 = static const struct wacom_features wacom_features_0xF8 = { "Wacom Cintiq 24HD touch", 104080, 65200, 2047, 63, /* Pen */ WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 16, - WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 }; + WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET }; static const struct wacom_features wacom_features_0xF6 = { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */ - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10, + .touch_max = 10, .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; static const struct wacom_features wacom_features_0x32A = { "Wacom Cintiq 27QHD", 119740, 67520, 2047, 63, @@ -3242,11 +3241,10 @@ static const struct wacom_features wacom_features_0x32A = static const struct wacom_features wacom_features_0x32B = { "Wacom Cintiq 27QHD touch", 119740, 67520, 2047, 63, WACOM_27QHD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 0, - WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32C }; + WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET }; static const struct wacom_features wacom_features_0x32C = { "Wacom Cintiq 27QHD touch", .type = WACOM_27QHDT, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x32B, .touch_max = 10 }; + .touch_max = 10 }; static const struct wacom_features wacom_features_0x3F = { "Wacom Cintiq 21UX", 87200, 65600, 1023, 63, CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 8 }; @@ -3263,11 +3261,10 @@ static const struct wacom_features wacom_features_0x304 = static const struct wacom_features wacom_features_0x333 = { "Wacom Cintiq 13HD touch", 59152, 33448, 2047, 63, WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, - WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x335 }; + WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET }; static const struct wacom_features wacom_features_0x335 = { "Wacom Cintiq 13HD touch", .type = WACOM_24HDT, /* Touch */ - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x333, .touch_max = 10, + .touch_max = 10, .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; static const struct wacom_features wacom_features_0xC7 = { "Wacom DTU1931", 37832, 30305, 511, 0, @@ -3298,11 +3295,10 @@ static const struct wacom_features wacom_features_0x57 = static const struct wacom_features wacom_features_0x59 = /* Pen */ { "Wacom DTH2242", 95640, 54060, 2047, 63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 6, - WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5D }; + WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET }; static const struct wacom_features wacom_features_0x5D = /* Touch */ { "Wacom DTH2242", .type = WACOM_24HDT, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10, + .touch_max = 10, .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; static const struct wacom_features wacom_features_0xCC = { "Wacom Cintiq 21UX2", 86800, 65200, 2047, 63, @@ -3315,11 +3311,10 @@ static const struct wacom_features wacom_features_0xFA = static const struct wacom_features wacom_features_0x5B = { "Wacom Cintiq 22HDT", 95440, 53860, 2047, 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 18, - WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e }; + WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET }; static const struct wacom_features wacom_features_0x5E = { "Wacom Cintiq 22HDT", .type = WACOM_24HDT, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10, + .touch_max = 10, .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; static const struct wacom_features wacom_features_0x90 = { "Wacom ISDv4 90", 26202, 16325, 255, 0, @@ -3461,20 +3456,18 @@ static const struct wacom_features wacom_features_0x6004 = static const struct wacom_features wacom_features_0x307 = { "Wacom ISDv5 307", 59152, 33448, 2047, 63, CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, - WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x309 }; + WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET }; static const struct wacom_features wacom_features_0x309 = { "Wacom ISDv5 309", .type = WACOM_24HDT, /* Touch */ - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x0307, .touch_max = 10, + .touch_max = 10, .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; static const struct wacom_features wacom_features_0x30A = { "Wacom ISDv5 30A", 59152, 33448, 2047, 63, CINTIQ_HYBRID, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, - WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x30C }; + WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET }; static const struct wacom_features wacom_features_0x30C = { "Wacom ISDv5 30C", .type = WACOM_24HDT, /* Touch */ - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x30A, .touch_max = 10, + .touch_max = 10, .check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE }; static const struct wacom_features wacom_features_0x318 = { "Wacom USB Bamboo PAD", 4095, 4095, /* Touch */ @@ -3485,11 +3478,9 @@ static const struct wacom_features wacom_features_0x319 = static const struct wacom_features wacom_features_0x325 = { "Wacom ISDv5 325", 59552, 33848, 2047, 63, CINTIQ_COMPANION_2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 11, - WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET, - .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x326 }; + WACOM_CINTIQ_OFFSET, WACOM_CINTIQ_OFFSET }; static const struct wacom_features wacom_features_0x326 = /* Touch */ - { "Wacom ISDv5 326", .type = HID_GENERIC, .oVid = USB_VENDOR_ID_WACOM, - .oPid = 0x325 }; + { "Wacom ISDv5 326", .type = HID_GENERIC }; static const struct wacom_features wacom_features_0x323 = { "Wacom Intuos P M", 21600, 13500, 1023, 31, INTUOSHT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h index 7ad6273..a5bd05a 100644 --- a/drivers/hid/wacom_wac.h +++ b/drivers/hid/wacom_wac.h @@ -181,8 +181,6 @@ struct wacom_features { int tilt_fuzz; unsigned quirks; unsigned touch_max; - int oVid; - int oPid; int pktlen; bool check_for_hid_type; int hid_type;