Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp4769356pxu; Mon, 21 Dec 2020 23:43:59 -0800 (PST) X-Google-Smtp-Source: ABdhPJynjq3iOmAbYDAQVJbjM6HHR1+AV6kts+aUG/r8q2QAdfWWyP5f3O5eNDOXyH9jXOsEyFAi X-Received: by 2002:a50:9f4e:: with SMTP id b72mr19489635edf.200.1608623039679; Mon, 21 Dec 2020 23:43:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1608623039; cv=none; d=google.com; s=arc-20160816; b=pPWERaPNB6bsNxBV2aTDKUBvDHoU14isGnI26CktEcybQ+nkqmleg+SMx24NO4hdPx DNWl/K23OM8+l89E0ky3HoUul2/3s+TMo/H6P4mtjMxiL0xe0Ve/qSuSvghrwaEDCfoz qBh1J1TRkUqvf+JSJfEMWHxpfl8n9g88V2yQHQDS0O1l9Uc5WwinH1Tu9WGd4pAcA29J FLUvsrCDMoJKfrGNXNfoDk1hpRWI1gBLQs0/aAUD+66b0btLiw5KUj9Qxj41G1G1D/rm TWbhWqz69823YEAgLKBP8JX3+xno/GlG4NuJkoFxrPV4vIMJQLGvYHGv6q1JUiprTx5a br7A== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=msNvM5pzbAJYWbn5mWuzMEGirWXPRzYqMruqrj8OX6c=; b=ftH5bJxvzKj78mYALPYCUhqJG9btzYIcO5vvyvg9xfYGsB/Q1UL3EjGpKGoby2Vo+X 2AsW5oBPwHchweOk0Irzs1PB2XVl4073cgUgIVdr/8OSpEvuDePFkYmEAMC/aFGwdGmg OPg9nPQGT7UJlGaEE0NFVIC2kVeRrK+wYwpVZIwSA2T/ZbFs9M0lNyJQv6RjZm5Cmcfe sY9KpGlaA8PKV4N31qh6Aj5IQ95gSp3BAVdSVmI/QOKQ540iUy1nXMJOZPl4ENwPhgSd tEGMOnRMLUJKfel7bQF/crr7oyqaQEo4RSBM8fkwACwopX815piZ4IPYQ9dARgtQGrWo ycDQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@endlessos.org header.s=google header.b=lQXUHk2F; 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=endlessos.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bu21si12038881edb.199.2020.12.21.23.43.37; Mon, 21 Dec 2020 23:43:59 -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=@endlessos.org header.s=google header.b=lQXUHk2F; 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=endlessos.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725947AbgLVHmO (ORCPT + 99 others); Tue, 22 Dec 2020 02:42:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33508 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725865AbgLVHmO (ORCPT ); Tue, 22 Dec 2020 02:42:14 -0500 Received: from mail-pf1-x42d.google.com (mail-pf1-x42d.google.com [IPv6:2607:f8b0:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DD52FC0613D6 for ; Mon, 21 Dec 2020 23:41:33 -0800 (PST) Received: by mail-pf1-x42d.google.com with SMTP id w6so8000306pfu.1 for ; Mon, 21 Dec 2020 23:41:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=endlessos.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=msNvM5pzbAJYWbn5mWuzMEGirWXPRzYqMruqrj8OX6c=; b=lQXUHk2Fsfs1sA+mkfafYI2CaAd1zQA6DfenVJTnQTN0i9Ss480VRYI/ng1ieVmoQ8 3PbGUHzhrLuxq2RX8DXV4q8TCLxDfx5wmJ3HV/aAvkT6mhJeugfpSea5sXsksPncLx1H OskM58B1/4bzJjCExLl1lORWvSY2WCp8O5UUzALyeB5Uu8UyBJ50FurGtspMylRjGFBx RYlDZZ16+RcXVb2ISf/QG//OQSVQtXrCnbJzRqTpyxmBOASWgan3o4bUFVEjJLJ5tDsS 6kXktKT5TcUL0QXyuo/fY70EZWzT3bbGR0b4dJPibUSwEHx+VWG+zn/4Ht7WWDQgtDYC 9c8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=msNvM5pzbAJYWbn5mWuzMEGirWXPRzYqMruqrj8OX6c=; b=iYpdGvzFwx8jiU5y9xoGwn1woOUqDf9yFjxY+PldejsCmkYI3MNTLkMGrk9m2p2vq1 0SX8tgUHWpLuQrlb4RUXl7mTRrV/L4Zqk+Eq9+XU9CIyU/dFlYk42RoF9uwJk2Kuzjja ltjrrU30XDiyXNgYwY/97FXcu2pGujk0ruF7VY6ZXgMDCFD6Jyd705SJNS1ccC9Ezxi7 OcyeDeM72acHIfIj+TYvaybORWcJiKTXiksw9PiTXJv7f3QaALYyUnVQv1Ne76xezN2j diO+o+kJ0FaE6PCNYlpEsEYUEI784KwUlbE4Ig56K+XWXobOyDvt+h4o3UOchP8JP4eE fxSw== X-Gm-Message-State: AOAM533dO9zLyZMKPEszTw+Ny/8RrJp+AjS06ONTpec4lASr/xBhK8T0 4Ei7AIINPRbp6/obbDh/RXn7nn1BHYKBa+c5 X-Received: by 2002:a63:da58:: with SMTP id l24mr18497739pgj.178.1608622893189; Mon, 21 Dec 2020 23:41:33 -0800 (PST) Received: from starnight.localdomain (123-204-46-122.static.seed.net.tw. [123.204.46.122]) by smtp.googlemail.com with ESMTPSA id cq15sm17680984pjb.27.2020.12.21.23.41.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Dec 2020 23:41:32 -0800 (PST) From: Jian-Hong Pan To: Jiri Kosina , Benjamin Tissoires Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, linux@endlessos.org, Jian-Hong Pan Subject: [PATCH] HID: Add Wireless Radio Control feature for Chicony devices Date: Tue, 22 Dec 2020 15:38:56 +0800 Message-Id: <20201222073855.98490-1-jhp@endlessos.org> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some Chicony's keyboards support airplane mode hotkey (Fn+F2) with "Wireless Radio Control" feature. For example, the wireless keyboard [04f2:1236] shipped with ASUS all-in-one desktop. After consulting Chicony for this hotkey, learned the device will send with 0x11 as the report ID and 0x1 as the value when the key is pressed down. This patch maps the event as KEY_RFKILL. Signed-off-by: Jian-Hong Pan --- drivers/hid/hid-chicony.c | 58 +++++++++++++++++++++++++++++++++++++++ drivers/hid/hid-ids.h | 1 + 2 files changed, 59 insertions(+) diff --git a/drivers/hid/hid-chicony.c b/drivers/hid/hid-chicony.c index 3f0ed6a95223..aca963aa0f1e 100644 --- a/drivers/hid/hid-chicony.c +++ b/drivers/hid/hid-chicony.c @@ -21,6 +21,42 @@ #include "hid-ids.h" +#define KEY_PRESSED 0x01 +#define CH_WIRELESS_CTL_REPORT_ID 0x11 + +static int ch_report_wireless(struct hid_report *report, u8 *data, int size) +{ + struct hid_device *hdev = report->device; + struct input_dev *input; + + if (report->id != CH_WIRELESS_CTL_REPORT_ID || + report->maxfield != 1 || + *report->field[0]->value != KEY_PRESSED) + return 0; + + input = report->field[0]->hidinput->input; + if (!input) { + hid_warn(hdev, "can't find wireless radio control's input"); + return 0; + } + + input_report_key(input, KEY_RFKILL, 1); + input_sync(input); + input_report_key(input, KEY_RFKILL, 0); + input_sync(input); + + return 1; +} + +static int ch_raw_event(struct hid_device *hdev, + struct hid_report *report, u8 *data, int size) +{ + if (report->application == HID_GD_WIRELESS_RADIO_CTLS) + return ch_report_wireless(report, data, size); + + return 0; +} + #define ch_map_key_clear(c) hid_map_usage_clear(hi, usage, bit, max, \ EV_KEY, (c)) static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi, @@ -77,10 +113,30 @@ static __u8 *ch_switch12_report_fixup(struct hid_device *hdev, __u8 *rdesc, return rdesc; } +static int ch_probe(struct hid_device *hdev, const struct hid_device_id *id) +{ + int ret; + + hdev->quirks |= HID_QUIRK_INPUT_PER_APP; + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "Chicony hid parse failed: %d\n", ret); + return ret; + } + + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); + if (ret) { + hid_err(hdev, "Chicony hw start failed: %d\n", ret); + return ret; + } + + return 0; +} static const struct hid_device_id ch_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) }, { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) }, + { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS3) }, { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_ACER_SWITCH12) }, { } }; @@ -91,6 +147,8 @@ static struct hid_driver ch_driver = { .id_table = ch_devices, .report_fixup = ch_switch12_report_fixup, .input_mapping = ch_input_mapping, + .probe = ch_probe, + .raw_event = ch_raw_event, }; module_hid_driver(ch_driver); diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 4c5f23640f9c..06d90301a3dc 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -270,6 +270,7 @@ #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE 0x1053 #define USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE2 0x0939 #define USB_DEVICE_ID_CHICONY_WIRELESS2 0x1123 +#define USB_DEVICE_ID_CHICONY_WIRELESS3 0x1236 #define USB_DEVICE_ID_ASUS_AK1D 0x1125 #define USB_DEVICE_ID_CHICONY_TOSHIBA_WT10A 0x1408 #define USB_DEVICE_ID_CHICONY_ACER_SWITCH12 0x1421 -- 2.29.2