Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp5223211ybl; Tue, 27 Aug 2019 01:04:18 -0700 (PDT) X-Google-Smtp-Source: APXvYqwxU+UkdYunIe8h0NfAaRqSWHqusdBjb3D8VPxexsQ8j1E7e8s5r1ZkCBHmwL87qpFC3KU2 X-Received: by 2002:a17:902:a714:: with SMTP id w20mr22720082plq.135.1566893058189; Tue, 27 Aug 2019 01:04:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1566893058; cv=none; d=google.com; s=arc-20160816; b=qpNaxUWvtFrhWzAB/JUIaj88bwD10z6rsMFYDQ0q0bqcrwKndYna5/nOj3XPXJYjBO 7q/nr+0jIC//WFC7DUZcgOC+FLZ1BzRxSRfCuL9cn0+HYAhSVtVgt8USk798HSSvw19N GFOmb1M/6YfqyMigf1znD3VfimzzSXB38cUuJkiOe3Yye+/nfxCnyOVDPlUf5ZoDz5dA WSHNP0bUG3F2n8NcmvXtp53a/T7hIZMFXY8tTSMAnJAEidSJPqJidba3Es499hLd6dGe PtW8gRauqBPATGGp7QIjc8NfiwuT88WcJxFH8v/Mu6Lq+dCBQcL1VSJTkfYFnnceMHSc Q0DA== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Uscp7fHKPLjkzvReOEF3l+otbE8MKxE70oCEURaiUUM=; b=rWbk/19NFNs74hXjB3TcOQdiK6RmmFzCztg1CLSZVziySQNPFIikEqnmixDlguGX+u qt9WPNlMOztLcy4IbOVet+WSbWhSYyq40JhkrEfQKHykx1mdY3eORuNPNVWekBYGzPzZ 8Y4mSXF2KemBUE1RT2j28DDxCTiGHNwg6xgD0oipK0TvfW+KsJBMcHYWzhfyiVEf3Fmu I9vG/jML9pshlQQCZ9YiF6LHgfw5YTYespcTzAjfzKMucXCGrn1HAWjQPpSV8YHvRjbi S266jecYkYznzk+kJOz2MViOC/ezgo3AqUDXyea9rOUEHQWd2ZQLM4on8J9vGTOgyYwb 8rfQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ltY9rHUk; 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 77si10935482pge.315.2019.08.27.01.04.02; Tue, 27 Aug 2019 01:04:18 -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; dkim=pass header.i=@kernel.org header.s=default header.b=ltY9rHUk; 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 S1732122AbfH0ICx (ORCPT + 99 others); Tue, 27 Aug 2019 04:02:53 -0400 Received: from mail.kernel.org ([198.145.29.99]:60134 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732105AbfH0ICw (ORCPT ); Tue, 27 Aug 2019 04:02:52 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id C575A206BA; Tue, 27 Aug 2019 08:02:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1566892971; bh=Ukv4brZdGM42HfUZT6W8kPNYBms1FG4tRRvHta1or4k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ltY9rHUks82CvpRzq567HkC9bzvW17L5TThmzZhtL5D/I3qAsbbimlDhZPDUyTkcq lBpODAIlLMcYugtWQ9iobGh/9hFuVCk4yjHedtP467SgQaOmKH8/sliWQjbFd5AJ9w SU9GjlhPdq5FxIkfDiz6FoOGXFvU1VET1ay9XELs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nicolas Saenz Julienne , Jiri Kosina , Sasha Levin Subject: [PATCH 5.2 078/162] HID: input: fix a4tech horizontal wheel custom usage Date: Tue, 27 Aug 2019 09:50:06 +0200 Message-Id: <20190827072740.828534419@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190827072738.093683223@linuxfoundation.org> References: <20190827072738.093683223@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit 1c703b53e5bfb5c2205c30f0fb157ce271fd42fb ] 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 Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- 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 98bf694626f71..3a8c4a5971f70 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.20.1