From nobody Fri Dec 19 07:00:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D3D93ECAAD1 for ; Thu, 25 Aug 2022 23:23:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244275AbiHYXXQ (ORCPT ); Thu, 25 Aug 2022 19:23:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35134 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244112AbiHYXXL (ORCPT ); Thu, 25 Aug 2022 19:23:11 -0400 Received: from wout3-smtp.messagingengine.com (wout3-smtp.messagingengine.com [64.147.123.19]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 24137C3F4C; Thu, 25 Aug 2022 16:23:11 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.west.internal (Postfix) with ESMTP id F19CF3200A1B; Thu, 25 Aug 2022 19:23:09 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Thu, 25 Aug 2022 19:23:10 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ljones.dev; h=cc :cc:content-transfer-encoding:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:sender :subject:subject:to:to; s=fm2; t=1661469789; x=1661556189; bh=S9 kA9f3RrN4pzDILQYmWRcHqGqYS1qPA1S5oVRNyBgg=; b=FWg34/D0Jxlyyieryq M/2mlcJNFyS8bAQE5Vg4Q443kmzaGl0y7o70ZPP1wmWzQa1177yCt8Cvynms+MIG pQxoY62+fQHPO1vn41roxpmAAAO7OI9IF9AMaU+pvBAf3gJjVZWMjYH5GotptX/L tSu31Bd3XBfp5kvEVPJoNH8uLymoTOoR4DYQUf6rI0lWaxD1tmtX2XNY9tvQBwUF iFVOB7gzwTagZ78/IkL9etCzvDHHUw4CKKrRG2T34ReYIIF3fEftwoFXjs1HUa4e raXDSW74IAJ/7/ZcbcY6vJl1L0BgKUKkx0pJ93p6xu1kbMw9caHP5We3gmjG7UBj RiVg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:sender:subject :subject:to:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm1; t=1661469789; x=1661556189; bh=S9kA9f3RrN4pz DILQYmWRcHqGqYS1qPA1S5oVRNyBgg=; b=t2+6zCPuwt9LB7JQ8kBpKtz9QwhVF qUwSb4u1jJXetgwGY+OX1g5WOkBG1rYCiAMTsbERVCg9WR41EuUeBBaKwDZRkGFN f+m3HhhOn/cSfmXMQea10kR1SL4bsSoGB58Flqi/+EQS8v3XMY/wykBn5lxWiDpa ixYUX9ZtIJej1uTa72BOG4PWzcoW+J00M/uTvCaU2Rr5KPLGRshq2GBk+Dvt/aH7 XUNk8wPamEH7TPunsmFkOByTm8zHZIK+5QpRVwhjq4hGINTGAYJV8317wZF1IwAj mOBkC+lFUHFsrb46NuTeTSlPjXm/cvhBVz9GB2kWbTrF7+0NI40u2tgiQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdejgedgvdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedfnfhukhgvucffrdculfhonhgvshdfuceolhhukhgvsehl jhhonhgvshdruggvvheqnecuggftrfgrthhtvghrnhepgfetfedugfetudeuheetjefhue fggfelleetvdevtefhueeujeefvdegleevhefgnecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomheplhhukhgvsehljhhonhgvshdruggvvh X-ME-Proxy: Feedback-ID: i5ec1447f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 25 Aug 2022 19:23:05 -0400 (EDT) From: "Luke D. Jones" To: hdegoede@redhat.com Cc: markgross@kernel.org, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, andy.shevchenko@gmail.com, pobrn@protonmail.com, pavel@ucw.cz, "Luke D. Jones" Subject: [PATCH v4 1/2] asus-wmi: Implement TUF laptop keyboard LED modes Date: Fri, 26 Aug 2022 11:22:50 +1200 Message-Id: <20220825232251.345893-2-luke@ljones.dev> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220825232251.345893-1-luke@ljones.dev> References: <20220825232251.345893-1-luke@ljones.dev> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Adds support for changing the laptop keyboard LED mode and colour. The modes are visible effects such as static, rainbow, pulsing, colour cycles. These sysfs attributes are added to asus::kbd_backlight: - kbd_rgb_mode - kbd_rgb_mode_index Signed-off-by: Luke D. Jones --- drivers/platform/x86/asus-wmi.c | 76 +++++++++++++++++++++- include/linux/platform_data/x86/asus-wmi.h | 3 + 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 0f9f79f249c7..92f16bb9b4ef 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -237,6 +237,8 @@ struct asus_wmi { bool dgpu_disable_available; bool gpu_mux_mode_available; =20 + bool kbd_rgb_mode_available; + bool throttle_thermal_policy_available; u8 throttle_thermal_policy_mode; =20 @@ -720,6 +722,69 @@ static ssize_t gpu_mux_mode_store(struct device *dev, } static DEVICE_ATTR_RW(gpu_mux_mode); =20 +/* TUF Laptop Keyboard RGB Modes *****************************************= *****/ +static ssize_t kbd_rgb_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + u32 cmd, mode, r, g, b, speed; + int err; + + if (sscanf(buf, "%d %d %d %d %d %d", &cmd, &mode, &r, &g, &b, &speed) != =3D 6) + return -EINVAL; + + cmd =3D !!cmd; + + /* These are the known usable modes across all TUF/ROG */ + if (mode >=3D 12 || mode =3D=3D 9) + mode =3D 10; + + switch (speed) { + case 0: + speed =3D 0xe1; + break; + case 1: + speed =3D 0xeb; + break; + case 2: + speed =3D 0xf5; + break; + default: + speed =3D 0xeb; + } + + err =3D asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, ASUS_WMI_DEVID_= TUF_RGB_MODE, + cmd | (mode << 8) | (r << 16) | (g << 24), b | (speed << 8), NULL); + if (err) + return err; + + return count; +} +static DEVICE_ATTR_WO(kbd_rgb_mode); + +static ssize_t kbd_rgb_mode_index_show(struct device *device, + struct device_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%s\n", "cmd mode red green blue speed"); +} +static DEVICE_ATTR_RO(kbd_rgb_mode_index); + +static struct attribute *kbd_rgb_mode_attrs[] =3D { + &dev_attr_kbd_rgb_mode.attr, + &dev_attr_kbd_rgb_mode_index.attr, + NULL, +}; + +static const struct attribute_group kbd_rgb_mode_group =3D { + .attrs =3D kbd_rgb_mode_attrs, +}; + +const struct attribute_group *kbd_rgb_mode_groups[] =3D { + NULL, + NULL, +}; + /* Battery ***************************************************************= *****/ =20 /* The battery maximum charging percentage */ @@ -1038,7 +1103,10 @@ static void asus_wmi_led_exit(struct asus_wmi *asus) =20 static int asus_wmi_led_init(struct asus_wmi *asus) { - int rv =3D 0, led_val; + int rv =3D 0, num_rgb_groups =3D 0, led_val; + + if (asus->kbd_rgb_mode_available) + kbd_rgb_mode_groups[num_rgb_groups++] =3D &kbd_rgb_mode_group; =20 asus->led_workqueue =3D create_singlethread_workqueue("led_workqueue"); if (!asus->led_workqueue) @@ -1066,6 +1134,9 @@ static int asus_wmi_led_init(struct asus_wmi *asus) asus->kbd_led.brightness_get =3D kbd_led_get; asus->kbd_led.max_brightness =3D 3; =20 + if (num_rgb_groups !=3D 0) + asus->kbd_led.groups =3D kbd_rgb_mode_groups; + rv =3D led_classdev_register(&asus->platform_device->dev, &asus->kbd_led); if (rv) @@ -3253,6 +3324,8 @@ static umode_t asus_sysfs_is_visible(struct kobject *= kobj, ok =3D asus->egpu_enable_available; else if (attr =3D=3D &dev_attr_dgpu_disable.attr) ok =3D asus->dgpu_disable_available; + else if (attr =3D=3D &dev_attr_dgpu_disable.attr) + ok =3D asus->dgpu_disable_available; else if (attr =3D=3D &dev_attr_gpu_mux_mode.attr) ok =3D asus->gpu_mux_mode_available; else if (attr =3D=3D &dev_attr_fan_boost_mode.attr) @@ -3519,6 +3592,7 @@ static int asus_wmi_add(struct platform_device *pdev) asus->egpu_enable_available =3D asus_wmi_dev_is_present(asus, ASUS_WMI_DE= VID_EGPU); asus->dgpu_disable_available =3D asus_wmi_dev_is_present(asus, ASUS_WMI_D= EVID_DGPU); asus->gpu_mux_mode_available =3D asus_wmi_dev_is_present(asus, ASUS_WMI_D= EVID_GPU_MUX); + asus->kbd_rgb_mode_available =3D asus_wmi_dev_is_present(asus, ASUS_WMI_D= EVID_TUF_RGB_MODE); asus->panel_overdrive_available =3D asus_wmi_dev_is_present(asus, ASUS_WM= I_DEVID_PANEL_OD); =20 err =3D fan_boost_mode_check_present(asus); diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index 6e8a95c10d17..3d861477cb20 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -103,6 +103,9 @@ /* gpu mux switch, 0 =3D dGPU, 1 =3D Optimus */ #define ASUS_WMI_DEVID_GPU_MUX 0x00090016 =20 +/* TUF laptop RGB modes/colours */ +#define ASUS_WMI_DEVID_TUF_RGB_MODE 0x00100056 + /* DSTS masks */ #define ASUS_WMI_DSTS_STATUS_BIT 0x00000001 #define ASUS_WMI_DSTS_UNKNOWN_BIT 0x00000002 --=20 2.37.2 From nobody Fri Dec 19 07:00:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 699F7ECAAA3 for ; Thu, 25 Aug 2022 23:23:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244239AbiHYXXZ (ORCPT ); Thu, 25 Aug 2022 19:23:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35276 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244325AbiHYXXS (ORCPT ); Thu, 25 Aug 2022 19:23:18 -0400 Received: from wout3-smtp.messagingengine.com (wout3-smtp.messagingengine.com [64.147.123.19]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E11C7C4815; Thu, 25 Aug 2022 16:23:16 -0700 (PDT) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.west.internal (Postfix) with ESMTP id 5DC1E3200A19; Thu, 25 Aug 2022 19:23:15 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Thu, 25 Aug 2022 19:23:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ljones.dev; h=cc :cc:content-transfer-encoding:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:sender :subject:subject:to:to; s=fm2; t=1661469794; x=1661556194; bh=4S EfGe1WfPg31P1a2x3Br6XvscZ6geTJiVSUsk5tb5Y=; b=nwJ7VWHgt5GbJOSuqC /LcuDnLFM/GlftKuv/SFzcw4FEongdTPkL7qbpVgMI/hyXhilxZ3+uYcojRx8tA5 wbuleL1aIVEydSuYrNE0kNW+ks7SozkuovYO4QzMx4aC4BGAKKO/OD/uATtiKbFK p01RM2Jt6/x4mc4VWJt8B/SiuOyWbkRhRSTum/zPAwwY0FiAwfJYBDlnSuTWEkap FhqThHnStvroMtmRSkvoAUk0GUkZgUEb7ZQmQSDPsz9G3I8kthmtNkcgyUfE65Jk XCkSH5LmZiq9XHj/S5uur/TTTRmSk893UoTMfauim9ThCH7cEMMExGuHOqB3PwM0 3E1A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:sender:subject :subject:to:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm1; t=1661469794; x=1661556194; bh=4SEfGe1WfPg31 P1a2x3Br6XvscZ6geTJiVSUsk5tb5Y=; b=ab2WlGrR8Zgk6qF7qBm06lmapbgKE MZ30DzjZ3s+XQHrCln0o9IJDOkW5qTZB4eNh00dL8ctuzoUOyqXfUnk40Jk0lXtZ uoAhPcv7BGRd6KeNDzlfo1DHqhmHirG3dlg7Yvt41/QAG7Z9GBmVL2u0swGd4sgt UbaMS46rPLh9jw4PQ1uAidILqW48ib49AxheqQo5FjuiiPdZfzF1HwYCDk9rk+F1 tY3iZB50/6WctaA/jWYXjCK8xXsiLQRY6X8x3iuZsi3eC2FknwMjpzsm5SBQG9sq JokfpXt+OihkjMvCpOU7iLoYxY6DIgXh70tP+AXDBjv/ik1FqIhPeW3EA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdejgedgvdduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedfnfhukhgvucffrdculfhonhgvshdfuceolhhukhgvsehl jhhonhgvshdruggvvheqnecuggftrfgrthhtvghrnhepgfetfedugfetudeuheetjefhue fggfelleetvdevtefhueeujeefvdegleevhefgnecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomheplhhukhgvsehljhhonhgvshdruggvvh X-ME-Proxy: Feedback-ID: i5ec1447f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 25 Aug 2022 19:23:11 -0400 (EDT) From: "Luke D. Jones" To: hdegoede@redhat.com Cc: markgross@kernel.org, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, andy.shevchenko@gmail.com, pobrn@protonmail.com, pavel@ucw.cz, "Luke D. Jones" Subject: [PATCH v4 2/2] asus-wmi: Implement TUF laptop keyboard power states Date: Fri, 26 Aug 2022 11:22:51 +1200 Message-Id: <20220825232251.345893-3-luke@ljones.dev> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220825232251.345893-1-luke@ljones.dev> References: <20220825232251.345893-1-luke@ljones.dev> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Adds support for setting various power states of TUF keyboards. These states are combinations of: - boot, set if a boot animation is shown on keyboard - awake, set if the keyboard LEDs are visible while laptop is on - sleep, set if an animation is displayed while the laptop is suspended - keyboard (unknown effect) Adds two sysfs attributes to asus::kbd_backlight: - kbd_rgb_state - kbd_rgb_state_index Signed-off-by: Luke D. Jones --- drivers/platform/x86/asus-wmi.c | 57 ++++++++++++++++++++++ include/linux/platform_data/x86/asus-wmi.h | 3 ++ 2 files changed, 60 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 92f16bb9b4ef..f608a4467d99 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -238,6 +238,7 @@ struct asus_wmi { bool gpu_mux_mode_available; =20 bool kbd_rgb_mode_available; + bool kbd_rgb_state_available; =20 bool throttle_thermal_policy_available; u8 throttle_thermal_policy_mode; @@ -780,9 +781,62 @@ static const struct attribute_group kbd_rgb_mode_group= =3D { .attrs =3D kbd_rgb_mode_attrs, }; =20 +/* TUF Laptop Keyboard RGB State *****************************************= *****/ +static ssize_t kbd_rgb_state_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + u32 flags, cmd, boot, awake, sleep, keyboard; + int err; + + if (sscanf(buf, "%d %d %d %d %d", &cmd, &boot, &awake, &sleep, &keyboard)= !=3D 5) + return -EINVAL; + + if (cmd) + cmd =3D BIT(2); + + flags =3D 0; + if (boot) + flags |=3D BIT(1); + if (awake) + flags |=3D BIT(3); + if (sleep) + flags |=3D BIT(5); + if (keyboard) + flags |=3D BIT(7); + + /* 0xbd is the required default arg0 for the method. Nothing happens othe= rwise */ + err =3D asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, + ASUS_WMI_DEVID_TUF_RGB_STATE, 0xbd | cmd << 8 | (flags << 16), 0, NULL); + if (err) + return err; + + return count; +} +static DEVICE_ATTR_WO(kbd_rgb_state); + +static ssize_t kbd_rgb_state_index_show(struct device *device, + struct device_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%s\n", "cmd boot awake sleep keyboard"); +} +static DEVICE_ATTR_RO(kbd_rgb_state_index); + +static struct attribute *kbd_rgb_state_attrs[] =3D { + &dev_attr_kbd_rgb_state.attr, + &dev_attr_kbd_rgb_state_index.attr, + NULL, +}; + +static const struct attribute_group kbd_rgb_state_group =3D { + .attrs =3D kbd_rgb_state_attrs, +}; + const struct attribute_group *kbd_rgb_mode_groups[] =3D { NULL, NULL, + NULL, }; =20 /* Battery ***************************************************************= *****/ @@ -1107,6 +1161,8 @@ static int asus_wmi_led_init(struct asus_wmi *asus) =20 if (asus->kbd_rgb_mode_available) kbd_rgb_mode_groups[num_rgb_groups++] =3D &kbd_rgb_mode_group; + if (asus->kbd_rgb_state_available) + kbd_rgb_mode_groups[num_rgb_groups++] =3D &kbd_rgb_state_group; =20 asus->led_workqueue =3D create_singlethread_workqueue("led_workqueue"); if (!asus->led_workqueue) @@ -3593,6 +3649,7 @@ static int asus_wmi_add(struct platform_device *pdev) asus->dgpu_disable_available =3D asus_wmi_dev_is_present(asus, ASUS_WMI_D= EVID_DGPU); asus->gpu_mux_mode_available =3D asus_wmi_dev_is_present(asus, ASUS_WMI_D= EVID_GPU_MUX); asus->kbd_rgb_mode_available =3D asus_wmi_dev_is_present(asus, ASUS_WMI_D= EVID_TUF_RGB_MODE); + asus->kbd_rgb_state_available =3D asus_wmi_dev_is_present(asus, ASUS_WMI_= DEVID_TUF_RGB_STATE); asus->panel_overdrive_available =3D asus_wmi_dev_is_present(asus, ASUS_WM= I_DEVID_PANEL_OD); =20 err =3D fan_boost_mode_check_present(asus); diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index 3d861477cb20..7dd580fdc61c 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -106,6 +106,9 @@ /* TUF laptop RGB modes/colours */ #define ASUS_WMI_DEVID_TUF_RGB_MODE 0x00100056 =20 +/* TUF laptop RGB power/state */ +#define ASUS_WMI_DEVID_TUF_RGB_STATE 0x00100057 + /* DSTS masks */ #define ASUS_WMI_DSTS_STATUS_BIT 0x00000001 #define ASUS_WMI_DSTS_UNKNOWN_BIT 0x00000002 --=20 2.37.2