Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp4356962ybi; Tue, 11 Jun 2019 05:27:10 -0700 (PDT) X-Google-Smtp-Source: APXvYqzVxH7TA7aHeeh30ygEzST83P4IXYD924rqOURw099bOzr6MOned4k6i5+k11zdKtrJ1l9t X-Received: by 2002:a17:902:860c:: with SMTP id f12mr76048819plo.127.1560256030539; Tue, 11 Jun 2019 05:27:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1560256030; cv=none; d=google.com; s=arc-20160816; b=mO4S+QiBNDkZlIEn6D4vsOk0a7/4haC6OQ6hEeVXuOv4Op/c1upGXad9/1sPOZrF+0 Qw5U201K/5BUzCYp7nmFPeeY7x9ZrCyS9gcKESAAA+Ou89kRHcDnAflkIM2+hLzN4JBn RKlC0QW5NC767+q/zKWC1lgxNDyXWaa8QoyTLGl2sFbldhfvaHPSoW+uAzkFO/Uvf4lo rx1A8eP0WfnzX6HJ+LM0kYWh0Syzh6oE6PEidBaezjExfmbKQnzb6W202m7c1RZ+4t2i vZ9Gcq1HLJega6Tq8TbcPRcFDRrLFbw/tyN48eXegNUGoqwVccD2bdWYGYQ4WWMHZyv+ asOw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=MWyucZl/DCsataz+6sT+cfbeJccXji/R4YqjcXFIN/E=; b=HRY1/hvG7Cz9DaO2m+Qr5HOQiB7isr+yNXE3kOkzbWVMC/jzeSzahF6tT4vz2flrtv AzvHHOanWouSZ+hK4NRlqSsfujurso6o2lLSRrbRnPX3YkWOM/deysBmEdTBY8ivgz1/ o+yUZqA35XsXrJL14ZDJs9M3Cv886NlY7zthXMBROuQommHxOUqAalo+fKLZ7gPulOgq uZvf22Hw/zdOnjpLv4+StSTcpYcn59cBJT+akUiNdzlHEnRcto+yZAnGtxTmnr7WvIws wL7OOgEqR3RYu82i2k8FAkDKVkCEMafCxHhhDRgcmxqPR2CFKlaLnzCS2p+PLtGKk45O dj4w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 34si12597871plp.305.2019.06.11.05.26.55; Tue, 11 Jun 2019 05:27:10 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387770AbfFKMN1 (ORCPT + 99 others); Tue, 11 Jun 2019 08:13:27 -0400 Received: from mx2.suse.de ([195.135.220.15]:44798 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2387538AbfFKMN1 (ORCPT ); Tue, 11 Jun 2019 08:13:27 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 5E5D7B00C; Tue, 11 Jun 2019 12:13:25 +0000 (UTC) From: Nicolas Saenz Julienne To: Jiri Kosina , Benjamin Tissoires Cc: dmitry.torokhov@gmail.com, wbauer@tmo.at, Nicolas Saenz Julienne , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] HID: input: fix a4tech horizontal wheel custom usage Date: Tue, 11 Jun 2019 14:13:20 +0200 Message-Id: <20190611121320.30267-1-nsaenzjulienne@suse.de> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some a4tech mice use the 'GenericDesktop.00b8' usage to inform whether the previous wheel report was horizontal or vertical. Before c01908a14bf73 ("HID: input: add mapping for "Toggle Display" key") this usage was being mapped to 'Relative.Misc'. After the patch it's simply ignored (usage->type == 0 & usage->code == 0). Which ultimately makes hid-a4tech ignore the WHEEL/HWHEEL selection event, as it has no usage->type. We shouldn't rely on a mapping for that usage as it's nonstandard and doesn't really map to an input event. So we bypass the mapping and make sure the custom event handling properly handles both reports. Fixes: c01908a14bf73 ("HID: input: add mapping for "Toggle Display" key") Signed-off-by: Nicolas Saenz Julienne --- NOTE: I CC'd Wolfgang as he's the one who can test this. Changes since v1: - new approach, moved fix into hid-a4tech drivers/hid/hid-a4tech.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/drivers/hid/hid-a4tech.c b/drivers/hid/hid-a4tech.c index 98bf694626f7..3a8c4a5971f7 100644 --- a/drivers/hid/hid-a4tech.c +++ b/drivers/hid/hid-a4tech.c @@ -23,12 +23,36 @@ #define A4_2WHEEL_MOUSE_HACK_7 0x01 #define A4_2WHEEL_MOUSE_HACK_B8 0x02 +#define A4_WHEEL_ORIENTATION (HID_UP_GENDESK | 0x000000b8) + struct a4tech_sc { unsigned long quirks; unsigned int hw_wheel; __s32 delayed_value; }; +static int a4_input_mapping(struct hid_device *hdev, struct hid_input *hi, + struct hid_field *field, struct hid_usage *usage, + unsigned long **bit, int *max) +{ + struct a4tech_sc *a4 = hid_get_drvdata(hdev); + + if (a4->quirks & A4_2WHEEL_MOUSE_HACK_B8 && + usage->hid == A4_WHEEL_ORIENTATION) { + /* + * We do not want to have this usage mapped to anything as it's + * nonstandard and doesn't really behave like an HID report. + * It's only selecting the orientation (vertical/horizontal) of + * the previous mouse wheel report. The input_events will be + * generated once both reports are recorded in a4_event(). + */ + return -1; + } + + return 0; + +} + static int a4_input_mapped(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) @@ -52,8 +76,7 @@ static int a4_event(struct hid_device *hdev, struct hid_field *field, struct a4tech_sc *a4 = hid_get_drvdata(hdev); struct input_dev *input; - if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput || - !usage->type) + if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput) return 0; input = field->hidinput->input; @@ -64,7 +87,7 @@ static int a4_event(struct hid_device *hdev, struct hid_field *field, return 1; } - if (usage->hid == 0x000100b8) { + if (usage->hid == A4_WHEEL_ORIENTATION) { input_event(input, EV_REL, value ? REL_HWHEEL : REL_WHEEL, a4->delayed_value); input_event(input, EV_REL, value ? REL_HWHEEL_HI_RES : @@ -131,6 +154,7 @@ MODULE_DEVICE_TABLE(hid, a4_devices); static struct hid_driver a4_driver = { .name = "a4tech", .id_table = a4_devices, + .input_mapping = a4_input_mapping, .input_mapped = a4_input_mapped, .event = a4_event, .probe = a4_probe, -- 2.21.0