Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp4305971pxu; Tue, 1 Dec 2020 01:26:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJzbJyrUScOtdyxPq/0hh+d75/Mha1K3XbtgZroGb8PoLws1jlwFE61WRhBT45Qi1GGqKuXp X-Received: by 2002:aa7:d54b:: with SMTP id u11mr2013642edr.341.1606814787870; Tue, 01 Dec 2020 01:26:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606814787; cv=none; d=google.com; s=arc-20160816; b=m4stAzrdPvhb92zZ8L2QwwlJv3988yS/ef9B8xhFI44EObxmEO0tKnAb74uSEr12mp SCsXcDPF7Xi+WPN+qv7xLKUd+Vgx/cT2xn0oafYaKCbfrP9kEG3VxGxc3SrABTL1OKWr pvVX8j0SkmPMEBBitE/W7PaQwjPAHwG90F/L0PPbxlXMj44aamFNo9epC94GsjMc2QJ6 9QmGjAGW3OFIpN0Ww/LghEKo1EG9Xo/txisGIC3mTd4ZjW5KsODyfBiw8SSiB0vVKOYc 9ZYB/in+FhQ8EfuwEvajZS6zVrkiYpL7q82aorH2YTA/OkQDKrkeITmnuAcU+ShFLVgm WMDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Pfl35zWCqO5brvjfz3SeA5vJf6Y0BbND7rjeISPpZ+o=; b=QUT6eExA72FgHv4KQ5ouNWtOXgPkF912aILmW16jD6+iwYD/kq5xCV1HIjD2ct1mC5 E67Xsx2CMgQG1kPJrcFzOuqIMgEt1RsFiGen49KbHrnerMHG3O71tlfQHg3xPs6hYswB 57+ZbrZ2PiRQJsfu1JB/yPfmORvbmXsYxnpgmsric3RLHFrCutUSVwSf+fBS7fSaLGTe ZkOzqhEG2mWYaZAvvKq74WApA3X2yEqLVYUYGH9EhDrpncQiZEfDEVHVPwWgfNGqg1n0 heTqh52aRZWucBMWkZQNX0jNlI1XHnAEDizL6eq2d+IRi89p5BC6pKSdg/m8oH5mf7ca tvRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=QmhI9ZtJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e16si589800ejd.747.2020.12.01.01.26.05; Tue, 01 Dec 2020 01:26:27 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=QmhI9ZtJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389398AbgLAJUl (ORCPT + 99 others); Tue, 1 Dec 2020 04:20:41 -0500 Received: from mail.kernel.org ([198.145.29.99]:45484 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389401AbgLAJJO (ORCPT ); Tue, 1 Dec 2020 04:09:14 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (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 A4F4621D46; Tue, 1 Dec 2020 09:08:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1606813739; bh=ErGtvAJBYNa4Ac9KDyX92WZqLH+s7XdUhKvoKPnNVCE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QmhI9ZtJ562ANOBdnGnU6HpOWdLu9ZC/M/Q1Mufa9nXhONjlUTLWCViHkFX+32vxd tS6YsW2jJmYa5DdFdfURnODdM05aNqhHvzHI+TSeEvAKLIovtbaCJiO2RTfw9wffb/ sbSzx3wzTXOjnJwOzDC941mW115Q5m9+rD0/j2Tg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Frank Yang , Jiri Kosina , Sasha Levin Subject: [PATCH 5.9 041/152] HID: cypress: Support Varmilo Keyboards media hotkeys Date: Tue, 1 Dec 2020 09:52:36 +0100 Message-Id: <20201201084717.217366711@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201201084711.707195422@linuxfoundation.org> References: <20201201084711.707195422@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Frank Yang [ Upstream commit 652f3d00de523a17b0cebe7b90debccf13aa8c31 ] The Varmilo VA104M Keyboard (04b4:07b1, reported as Varmilo Z104M) exposes media control hotkeys as a USB HID consumer control device, but these keys do not work in the current (5.8-rc1) kernel due to the incorrect HID report descriptor. Fix the problem by modifying the internal HID report descriptor. More specifically, the keyboard report descriptor specifies the logical boundary as 572~10754 (0x023c ~ 0x2a02) while the usage boundary is specified as 0~10754 (0x00 ~ 0x2a02). This results in an incorrect interpretation of input reports, causing inputs to be ignored. By setting the Logical Minimum to zero, we align the logical boundary with the Usage ID boundary. Some notes: * There seem to be multiple variants of the VA104M keyboard. This patch specifically targets 04b4:07b1 variant. * The device works out-of-the-box on Windows platform with the generic consumer control device driver (hidserv.inf). This suggests that Windows either ignores the Logical Minimum/Logical Maximum or interprets the Usage ID assignment differently from the linux implementation; Maybe there are other devices out there that only works on Windows due to this problem? Signed-off-by: Frank Yang Signed-off-by: Jiri Kosina Signed-off-by: Sasha Levin --- drivers/hid/hid-cypress.c | 44 ++++++++++++++++++++++++++++++++++----- drivers/hid/hid-ids.h | 2 ++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/drivers/hid/hid-cypress.c b/drivers/hid/hid-cypress.c index a50ba4a4a1d71..b88f889b3932e 100644 --- a/drivers/hid/hid-cypress.c +++ b/drivers/hid/hid-cypress.c @@ -23,19 +23,17 @@ #define CP_2WHEEL_MOUSE_HACK 0x02 #define CP_2WHEEL_MOUSE_HACK_ON 0x04 +#define VA_INVAL_LOGICAL_BOUNDARY 0x08 + /* * Some USB barcode readers from cypress have usage min and usage max in * the wrong order */ -static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc, +static __u8 *cp_rdesc_fixup(struct hid_device *hdev, __u8 *rdesc, unsigned int *rsize) { - unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); unsigned int i; - if (!(quirks & CP_RDESC_SWAPPED_MIN_MAX)) - return rdesc; - if (*rsize < 4) return rdesc; @@ -48,6 +46,40 @@ static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc, return rdesc; } +static __u8 *va_logical_boundary_fixup(struct hid_device *hdev, __u8 *rdesc, + unsigned int *rsize) +{ + /* + * Varmilo VA104M (with VID Cypress and device ID 07B1) incorrectly + * reports Logical Minimum of its Consumer Control device as 572 + * (0x02 0x3c). Fix this by setting its Logical Minimum to zero. + */ + if (*rsize == 25 && + rdesc[0] == 0x05 && rdesc[1] == 0x0c && + rdesc[2] == 0x09 && rdesc[3] == 0x01 && + rdesc[6] == 0x19 && rdesc[7] == 0x00 && + rdesc[11] == 0x16 && rdesc[12] == 0x3c && rdesc[13] == 0x02) { + hid_info(hdev, + "fixing up varmilo VA104M consumer control report descriptor\n"); + rdesc[12] = 0x00; + rdesc[13] = 0x00; + } + return rdesc; +} + +static __u8 *cp_report_fixup(struct hid_device *hdev, __u8 *rdesc, + unsigned int *rsize) +{ + unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); + + if (quirks & CP_RDESC_SWAPPED_MIN_MAX) + rdesc = cp_rdesc_fixup(hdev, rdesc, rsize); + if (quirks & VA_INVAL_LOGICAL_BOUNDARY) + rdesc = va_logical_boundary_fixup(hdev, rdesc, rsize); + + return rdesc; +} + static int cp_input_mapped(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) @@ -128,6 +160,8 @@ static const struct hid_device_id cp_devices[] = { .driver_data = CP_RDESC_SWAPPED_MIN_MAX }, { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE), .driver_data = CP_2WHEEL_MOUSE_HACK }, + { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1), + .driver_data = VA_INVAL_LOGICAL_BOUNDARY }, { } }; MODULE_DEVICE_TABLE(hid, cp_devices); diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 6b7f90a4721f0..8e7bd9f1b029c 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -331,6 +331,8 @@ #define USB_DEVICE_ID_CYPRESS_BARCODE_4 0xed81 #define USB_DEVICE_ID_CYPRESS_TRUETOUCH 0xc001 +#define USB_DEVICE_ID_CYPRESS_VARMILO_VA104M_07B1 0X07b1 + #define USB_VENDOR_ID_DATA_MODUL 0x7374 #define USB_VENDOR_ID_DATA_MODUL_EASYMAXTOUCH 0x1201 -- 2.27.0