From nobody Fri Dec 19 06:56:52 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 0E53AC19F2A for ; Mon, 8 Aug 2022 03:04:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235456AbiHHDE5 (ORCPT ); Sun, 7 Aug 2022 23:04:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49556 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235144AbiHHDEw (ORCPT ); Sun, 7 Aug 2022 23:04:52 -0400 Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BE5D7BE02; Sun, 7 Aug 2022 20:04:51 -0700 (PDT) Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailout.nyi.internal (Postfix) with ESMTP id 2E3B45C00DA; Sun, 7 Aug 2022 23:04:51 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute2.internal (MEProxy); Sun, 07 Aug 2022 23:04:51 -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=1659927891; x=1660014291; bh=b8 zBqnbjGfkGFv4egHJI0533lSwO5A03klYpq+LVrGI=; b=dbxXsl4WCFuQnSu4BL lqzgHTw6+utL+NPN3q5voJHNAlLO32h7GyVvdk2E4qLR5k2PUg9EHeeYS0K39ByU htPlDjjNezwIQD9YDgxSlRYsvuyEy4zgPHYnHAqQOaFr9p8BwOymSbMg46op/8A4 lNb8EpcJs/n6mi1IBm6HYxK2l7cW7KEsU/f8GqTpHY7AEke0ARzgXetf2IP2SuhL sXQJntftDgAchpJgYltEbH3Rb6W9RKDRxaOazn9//iT7e5zf6U9TIpDve+4IK6rW BfDciHHlvvv/twv42SQtLCN7CXaKBspoFVMNGuPMIbUOpdmzxHnU4yqxBla8oRQy b7eQ== 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=1659927891; x=1660014291; bh=b8zBqnbjGfkGF v4egHJI0533lSwO5A03klYpq+LVrGI=; b=owk211u0JCE1gSsKB+I36FLMwSBAv coI1r0f1QGKTE7RQuA8+5lxn4DSRBjUxrOSK9EOm9r/wYWM8Zi4lBVHHTz1LKz7k wTa6DyIsHNhVwwxZfb+cfjIoY5lV2CNS3/aBq0gSViBjSXNstHv+ecrJ27Ac5IHj ETtwYxXX5XynfgX5vlpuAAqZ63/FHSc1TcSmTFCq+ibr/J6838dsee5ZoM1IXMJ2 Kp3V25kyk60+AoiU+ZD8Qm3/YOh+Jw5sY+TBnpEdRydDjXZJi9SkHnkE+U9NqpGA LgM5CVGk1OlxYQ9Ya/3KUoMS+q01AcRCOQ88EwAPqUGcimM/N6olys8Yw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdefjedgieegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedfnfhukhgvucffrdculfhonhgvshdfuceolhhukhgvsehl jhhonhgvshdruggvvheqnecuggftrfgrthhtvghrnhepgfetfedugfetudeuheetjefhue fggfelleetvdevtefhueeujeefvdegleevhefgnecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomheplhhukhgvsehljhhonhgvshdruggvvh X-ME-Proxy: Feedback-ID: i5ec1447f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 7 Aug 2022 23:04:48 -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, "Luke D. Jones" Subject: [PATCH v2 1/6] asus-wmi: Implement TUF laptop keyboard RGB control Date: Mon, 8 Aug 2022 15:04:15 +1200 Message-Id: <20220808030420.8633-2-luke@ljones.dev> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220808030420.8633-1-luke@ljones.dev> References: <20220808030420.8633-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 TUF laptop RGB control via the multicolor LED API. As this is the bas for adjusting only the RGB values, it sets the default mode of the keyboard to static since there is no way to read any existing settings from the device. These defaults overwrite the booted state of the keyboard when the module is loaded. Signed-off-by: Luke D. Jones --- drivers/platform/x86/asus-wmi.c | 80 ++++++++++++++++++++++ include/linux/platform_data/x86/asus-wmi.h | 3 + 2 files changed, 83 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 0e7fbed8a50d..233e73f4313d 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -117,6 +118,9 @@ static const char * const ashs_ids[] =3D { "ATK4001", "= ATK4002", NULL }; =20 static int throttle_thermal_policy_write(struct asus_wmi *); =20 +static int tuf_rgb_brightness_set(struct led_classdev *cdev, + enum led_brightness brightness); + static bool ashs_present(void) { int i =3D 0; @@ -190,6 +194,14 @@ struct fan_curve_data { u8 percents[FAN_CURVE_POINTS]; }; =20 +struct keyboard_rgb_led { + struct mc_subled subled_info[3]; /* r g b */ + struct led_classdev_mc dev; + u8 save; + u8 mode; + u8 speed; +}; + struct asus_wmi { int dsts_id; int spec; @@ -234,6 +246,8 @@ struct asus_wmi { bool dgpu_disable_available; bool dgpu_disable; =20 + struct keyboard_rgb_led keyboard_rgb_mode; + bool throttle_thermal_policy_available; u8 throttle_thermal_policy_mode; =20 @@ -1028,12 +1042,40 @@ static enum led_brightness lightbar_led_get(struct = led_classdev *led_cdev) return result & ASUS_WMI_DSTS_LIGHTBAR_MASK; } =20 +static int tuf_rgb_brightness_set(struct led_classdev *cdev, + enum led_brightness brightness) +{ + struct led_classdev_mc *mc_cdev =3D lcdev_to_mccdev(cdev); + struct keyboard_rgb_led *rgb =3D container_of(mc_cdev, struct keyboard_rg= b_led, dev); + struct asus_wmi *asus =3D container_of(rgb, struct asus_wmi, keyboard_rgb= _mode); + struct device *dev =3D &asus->platform_device->dev; + u8 r, g, b; + int err; + u32 ret; + + led_mc_calc_color_components(mc_cdev, brightness); + r =3D mc_cdev->subled_info[0].brightness; + g =3D mc_cdev->subled_info[1].brightness; + b =3D mc_cdev->subled_info[2].brightness; + + /* Writing out requires some defaults. This will overwrite boot mode */ + err =3D asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, ASUS_WMI_DEVID_= TUF_RGB_MODE, + rgb->save | (rgb->mode << 8) | (r << 16) | (g << 24), + (b) | (rgb->speed << 8), + &ret); + if (err) + dev_err(dev, "Unable to set TUF RGB data?\n"); + + return err; +} + static void asus_wmi_led_exit(struct asus_wmi *asus) { led_classdev_unregister(&asus->kbd_led); led_classdev_unregister(&asus->tpd_led); led_classdev_unregister(&asus->wlan_led); led_classdev_unregister(&asus->lightbar_led); + led_classdev_multicolor_unregister(&asus->keyboard_rgb_mode.dev); =20 if (asus->led_workqueue) destroy_workqueue(asus->led_workqueue); @@ -1105,6 +1147,44 @@ static int asus_wmi_led_init(struct asus_wmi *asus) &asus->lightbar_led); } =20 + if (asus_wmi_dev_is_present(asus, ASUS_WMI_DEVID_TUF_RGB_MODE)) { + struct mc_subled *mc_led_info =3D asus->keyboard_rgb_mode.subled_info; + struct led_classdev_mc *mc_cdev =3D &asus->keyboard_rgb_mode.dev; + struct device *dev =3D &asus->platform_device->dev; + u8 led_brightness =3D 255; + + /* + * asus::kbd_backlight still controls a base 3-level backlight and when + * it is on 0, the RGB is not visible at all. RGB should be treated as + * an additional step. + */ + mc_cdev->led_cdev.name =3D "asus::multicolour::kbd_backlight"; + mc_cdev->led_cdev.flags =3D LED_CORE_SUSPENDRESUME | LED_RETAIN_AT_SHUTD= OWN; + mc_cdev->led_cdev.brightness_set_blocking =3D tuf_rgb_brightness_set; + mc_cdev->led_cdev.brightness_get =3D NULL; + + mc_cdev->subled_info =3D mc_led_info; + mc_led_info[0].intensity =3D 127; + mc_led_info[0].color_index =3D LED_COLOR_ID_RED; + mc_led_info[1].color_index =3D LED_COLOR_ID_GREEN; + mc_led_info[2].color_index =3D LED_COLOR_ID_BLUE; + mc_cdev->num_colors =3D 3; + + /* + * It's not possible to get last set data from device so set defaults + * to make it safe for a user to change either RGB or modes. + */ + asus->keyboard_rgb_mode.save =3D 1; + asus->keyboard_rgb_mode.mode =3D 0; + asus->keyboard_rgb_mode.speed =3D 0xeb; + + mc_cdev->led_cdev.brightness =3D led_brightness; + mc_cdev->led_cdev.max_brightness =3D led_brightness; + led_mc_calc_color_components(mc_cdev, led_brightness); + + rv =3D led_classdev_multicolor_register(dev, mc_cdev); + } + error: if (rv) asus_wmi_led_exit(asus); diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index a571b47ff362..d63c9945a17d 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -98,6 +98,9 @@ /* dgpu on/off */ #define ASUS_WMI_DEVID_DGPU 0x00090020 =20 +/* TUF laptop RGB control */ +#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.1 From nobody Fri Dec 19 06:56:52 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 65EDBC25B0C for ; Mon, 8 Aug 2022 03:05:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235902AbiHHDFJ (ORCPT ); Sun, 7 Aug 2022 23:05:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49574 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235239AbiHHDEy (ORCPT ); Sun, 7 Aug 2022 23:04:54 -0400 Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 28D35BE00; Sun, 7 Aug 2022 20:04:54 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 8BED45C00BB; Sun, 7 Aug 2022 23:04:53 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Sun, 07 Aug 2022 23:04:53 -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=1659927893; x=1660014293; bh=9y mhlw5OBd0R31OGDXUQIgCyBNoT/mCLY7kSsYdQ0no=; b=T2x+ytYlV7rpiZxIQP 7A6PN4taxbO7UGwxQOTYHc+IcW+4yjtjSHl953e4Txmtxjn9459/6+1D2A8MJ3tp QwvZTfKq+ViFnMU7IPAnkY7QUGs3ZCT1HIDf50MRYxZ2Kg9TJdbCPhzcJfKVmLhv VS7/7B1JbCXUz8V75zle0YfAafBOQ2AOdDLQcVo1DefCrFJBcY7ERI+oqAijV5Ka JbTFjNDIEZ+/N1XBzUkvfWJkPcDlymfOUFrrH7+1dxtaMERgwEnzneeaeBz15tNo oRPKjNGgEtt2fU7iZS8RXXhrLl1H2MJ/4Gdcg6rJvP16qdyrZ7OHsNZY6gbL0ts7 72Cg== 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=1659927893; x=1660014293; bh=9ymhlw5OBd0R3 1OGDXUQIgCyBNoT/mCLY7kSsYdQ0no=; b=tzjv+GKld0GzoeS7Z/5Gqn8RQrgni IrhVgfdnWdiwAORTq3b2vEuZ0VLjrC6MzSnEp0m9e4v6wxH+pkSxYVNDJzXAAIa4 MmEzoPn3A/EyGC97S4moV/n1Gos9s0ZxShI3mJSRdgpbafp0N6eSJFjdyEs8XunQ kdN3fN7TTMh8mq8aXUPdcOdIKzPGt30EhxUZNQ/QzNIxvR6zNU3ynna+g7E6vlrL Oh9Eg0FLWF4J4Gn6JwYI9zyBGEEtLQv+D9SON49sK8KGMqHLXc5usx3G4k8CKoPy wJSwUnTCUHmXaxvB83gs1JkiyP/QWdKgnFh3J7s8L6GFJnWmvNBtD0zkQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdefjedgieefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedfnfhukhgvucffrdculfhonhgvshdfuceolhhukhgvsehl jhhonhgvshdruggvvheqnecuggftrfgrthhtvghrnhepgfetfedugfetudeuheetjefhue fggfelleetvdevtefhueeujeefvdegleevhefgnecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomheplhhukhgvsehljhhonhgvshdruggvvh X-ME-Proxy: Feedback-ID: i5ec1447f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 7 Aug 2022 23:04:51 -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, "Luke D. Jones" Subject: [PATCH v2 2/6] asus-wmi: Implement TUF laptop keyboard LED modes Date: Mon, 8 Aug 2022 15:04:16 +1200 Message-Id: <20220808030420.8633-3-luke@ljones.dev> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220808030420.8633-1-luke@ljones.dev> References: <20220808030420.8633-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 modes. These are visible effects such as static, rainbow, pulsing, colour cycles. Two sysfs attributes are added to asus-nb-wmi: - keyboard_rgb_mode - keyboard_rgb_mode_index Signed-off-by: Luke D. Jones --- drivers/platform/x86/asus-wmi.c | 83 +++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 233e73f4313d..4c2bdd9dac30 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -246,6 +246,7 @@ struct asus_wmi { bool dgpu_disable_available; bool dgpu_disable; =20 + bool keyboard_rgb_mode_available; struct keyboard_rgb_led keyboard_rgb_mode; =20 bool throttle_thermal_policy_available; @@ -748,6 +749,77 @@ static ssize_t egpu_enable_store(struct device *dev, =20 static DEVICE_ATTR_RW(egpu_enable); =20 +/* TUF Laptop Keyboard RGB Modes *****************************************= *****/ +static int keyboard_rgb_mode_check_present(struct asus_wmi *asus) +{ + u32 result; + int err; + + asus->keyboard_rgb_mode_available =3D false; + + err =3D asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_TUF_RGB_MODE, &result); + if (err) { + if (err =3D=3D -ENODEV) + return 0; + return err; + } + + if (result & ASUS_WMI_DSTS_PRESENCE_BIT) + asus->keyboard_rgb_mode_available =3D true; + + return 0; +} + +static ssize_t keyboard_rgb_mode_store(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count) +{ + u8 save, mode, speed; + int err; + + struct asus_wmi *asus =3D dev_get_drvdata(device); + struct led_classdev *cdev =3D &asus->keyboard_rgb_mode.dev.led_cdev; + + if (sscanf(buf, "%hhd %hhd %hhd", &save, &mode, &speed) !=3D 3) + return -EINVAL; + + asus->keyboard_rgb_mode.save =3D !!save; + + /* These are the known usable modes across all TUF/ROG */ + asus->keyboard_rgb_mode.mode =3D mode < 12 && mode !=3D 9 ? mode : 0x0a; + + switch (speed) { + case 0: + asus->keyboard_rgb_mode.speed =3D 0xe1; + break; + case 1: + asus->keyboard_rgb_mode.speed =3D 0xeb; + break; + case 2: + asus->keyboard_rgb_mode.speed =3D 0xf5; + break; + default: + asus->keyboard_rgb_mode.speed =3D 0xeb; + } + + err =3D tuf_rgb_brightness_set(cdev, cdev->brightness); + if (err) + return err; + + return count; +} + +static DEVICE_ATTR_WO(keyboard_rgb_mode); + +static ssize_t keyboard_rgb_mode_index_show(struct device *device, + struct device_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%s\n", "save mode speed"); +} + +static DEVICE_ATTR_RO(keyboard_rgb_mode_index); + /* Battery ***************************************************************= *****/ =20 /* The battery maximum charging percentage */ @@ -3338,6 +3410,8 @@ static struct attribute *platform_attributes[] =3D { &dev_attr_touchpad.attr, &dev_attr_egpu_enable.attr, &dev_attr_dgpu_disable.attr, + &dev_attr_keyboard_rgb_mode.attr, + &dev_attr_keyboard_rgb_mode_index.attr, &dev_attr_lid_resume.attr, &dev_attr_als_enable.attr, &dev_attr_fan_boost_mode.attr, @@ -3368,6 +3442,10 @@ 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_keyboard_rgb_mode.attr) + ok =3D asus->keyboard_rgb_mode_available; + else if (attr =3D=3D &dev_attr_keyboard_rgb_mode_index.attr) + ok =3D asus->keyboard_rgb_mode_available; else if (attr =3D=3D &dev_attr_fan_boost_mode.attr) ok =3D asus->fan_boost_mode_available; else if (attr =3D=3D &dev_attr_throttle_thermal_policy.attr) @@ -3637,6 +3715,10 @@ static int asus_wmi_add(struct platform_device *pdev) if (err) goto fail_dgpu_disable; =20 + err =3D keyboard_rgb_mode_check_present(asus); + if (err) + goto fail_keyboard_rgb_mode; + err =3D fan_boost_mode_check_present(asus); if (err) goto fail_fan_boost_mode; @@ -3751,6 +3833,7 @@ static int asus_wmi_add(struct platform_device *pdev) fail_fan_boost_mode: fail_egpu_enable: fail_dgpu_disable: +fail_keyboard_rgb_mode: fail_platform: fail_panel_od: kfree(asus); --=20 2.37.1 From nobody Fri Dec 19 06:56:52 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 23102C19F2A for ; Mon, 8 Aug 2022 03:05:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236012AbiHHDFS (ORCPT ); Sun, 7 Aug 2022 23:05:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235433AbiHHDE5 (ORCPT ); Sun, 7 Aug 2022 23:04:57 -0400 Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9D993BE00; Sun, 7 Aug 2022 20:04:56 -0700 (PDT) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id 0CAD35C00E6; Sun, 7 Aug 2022 23:04:56 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Sun, 07 Aug 2022 23:04:56 -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=1659927896; x=1660014296; bh=oO 8D9D8rHRPyOxrPkAEHf4nClIeVCnqow+HgTegQJyY=; b=C7bqK3bsgKGCu70jlB VD8m6a9H37vhMf5iA4VQ/9DwLWvKOlTOBqMXhAxDnABgFYSebbtcZphmZN2znTpn zqt2UaqdNZznmD6UkJD+VUJ22VFDLJGX4P9BDU9wEkxrervlx93UCYZ4y6Cx/3OW D8UatXIKazs6IEAi1Bh8wSwY2hG3e9eEV53PfQQTq44QIIfGZw54XAbwLAfSHcDv ycF0tnf6Xwnr24EQB51BelhcvGt5PIuH0Hf/PBBrtMldv6lNOP/6nSfx9xiv64zq USqYevkoLt3FwfH7lRsaPXSF/jheLTSnUundzSSI1niyxFWoyKqFDIu3dYXq6Bqt BV9w== 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=1659927896; x=1660014296; bh=oO8D9D8rHRPyO xrPkAEHf4nClIeVCnqow+HgTegQJyY=; b=pwbJh9i8zcfVITeEFADbY82IF90NZ Nj8XAgRdei1Qnn9NTBzkdew1HvRm5gW+PMVClSNgvMiZGsTZlXERJyMev4aXuTWF vxxTUjwUg4rAqlc0SHllAF+SVW4hSOCjuI2nExSQ9SX9QzLU/B0TMof+dH+Wg7Xm cTV0sEOl5e//U78fhCvVM5knBQyak1P18FDdxKr2FY9+/IO+asgIT5xefbXrfusR Sowbmb2kGi38lN8h53IpIyLTMZBRgkyAo5ah9C/rZFpskpmF/ybi7KdkGpnWE0+8 OO9RQjTs2ax4NN8zWbj7e4Enjx2GVPq0baSe7MqGw7HL9fXBbQ2KsheHw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdefjedgieegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedfnfhukhgvucffrdculfhonhgvshdfuceolhhukhgvsehl jhhonhgvshdruggvvheqnecuggftrfgrthhtvghrnhepgfetfedugfetudeuheetjefhue fggfelleetvdevtefhueeujeefvdegleevhefgnecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomheplhhukhgvsehljhhonhgvshdruggvvh X-ME-Proxy: Feedback-ID: i5ec1447f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 7 Aug 2022 23:04:53 -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, "Luke D. Jones" Subject: [PATCH v2 3/6] asus-wmi: Implement TUF laptop keyboard power states Date: Mon, 8 Aug 2022 15:04:17 +1200 Message-Id: <20220808030420.8633-4-luke@ljones.dev> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220808030420.8633-1-luke@ljones.dev> References: <20220808030420.8633-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-nb-wmi: - keyboard_rgb_state - keyboard_rgb_state_index Signed-off-by: Luke D. Jones --- drivers/platform/x86/asus-wmi.c | 74 ++++++++++++++++++++++ include/linux/platform_data/x86/asus-wmi.h | 2 + 2 files changed, 76 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 4c2bdd9dac30..9b2c54726955 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -246,6 +246,7 @@ struct asus_wmi { bool dgpu_disable_available; bool dgpu_disable; =20 + bool keyboard_rgb_state_available; bool keyboard_rgb_mode_available; struct keyboard_rgb_led keyboard_rgb_mode; =20 @@ -820,6 +821,68 @@ static ssize_t keyboard_rgb_mode_index_show(struct dev= ice *device, =20 static DEVICE_ATTR_RO(keyboard_rgb_mode_index); =20 +/* TUF Laptop Keyboard RGB States ****************************************= *****/ +static int keyboard_rgb_state_check_present(struct asus_wmi *asus) +{ + u32 result; + int err; + + asus->keyboard_rgb_state_available =3D false; + + err =3D asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_TUF_RGB_STATE, &result= ); + if (err) { + if (err =3D=3D -ENODEV) + return 0; + return err; + } + + if (result & ASUS_WMI_DSTS_PRESENCE_BIT) + asus->keyboard_rgb_state_available =3D true; + + return 0; +} + +static ssize_t keyboard_rgb_state_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + u8 flags, save, boot, awake, sleep, keyboard; + int err; + u32 ret; + + flags =3D 0; + if (sscanf(buf, "%hhd %hhd %hhd %hhd %hhd", &save, &boot, &awake, &sleep,= &keyboard) !=3D 5) + return -EINVAL; + + save =3D save =3D=3D 0 ? 0x0100 : 0x0000; + if (boot) + flags |=3D 0x02; + if (awake) + flags |=3D 0x08; + if (sleep) + flags |=3D 0x20; + if (keyboard) + flags |=3D 0x80; + + err =3D asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, + ASUS_WMI_DEVID_TUF_RGB_STATE, 0xBD | save | (flags << 16), 0, &ret); + if (err) + return err; + + return count; +} + +static DEVICE_ATTR_WO(keyboard_rgb_state); + +static ssize_t keyboard_rgb_state_index_show(struct device *device, + struct device_attribute *attr, + char *buf) +{ + return sysfs_emit(buf, "%s\n", "save boot awake sleep keyboard"); +} + +static DEVICE_ATTR_RO(keyboard_rgb_state_index); + /* Battery ***************************************************************= *****/ =20 /* The battery maximum charging percentage */ @@ -3412,6 +3475,8 @@ static struct attribute *platform_attributes[] =3D { &dev_attr_dgpu_disable.attr, &dev_attr_keyboard_rgb_mode.attr, &dev_attr_keyboard_rgb_mode_index.attr, + &dev_attr_keyboard_rgb_state.attr, + &dev_attr_keyboard_rgb_state_index.attr, &dev_attr_lid_resume.attr, &dev_attr_als_enable.attr, &dev_attr_fan_boost_mode.attr, @@ -3446,6 +3511,10 @@ static umode_t asus_sysfs_is_visible(struct kobject = *kobj, ok =3D asus->keyboard_rgb_mode_available; else if (attr =3D=3D &dev_attr_keyboard_rgb_mode_index.attr) ok =3D asus->keyboard_rgb_mode_available; + else if (attr =3D=3D &dev_attr_keyboard_rgb_state.attr) + ok =3D asus->keyboard_rgb_state_available; + else if (attr =3D=3D &dev_attr_keyboard_rgb_state_index.attr) + ok =3D asus->keyboard_rgb_state_available; else if (attr =3D=3D &dev_attr_fan_boost_mode.attr) ok =3D asus->fan_boost_mode_available; else if (attr =3D=3D &dev_attr_throttle_thermal_policy.attr) @@ -3719,6 +3788,10 @@ static int asus_wmi_add(struct platform_device *pdev) if (err) goto fail_keyboard_rgb_mode; =20 + err =3D keyboard_rgb_state_check_present(asus); + if (err) + goto fail_keyboard_rgb_state; + err =3D fan_boost_mode_check_present(asus); if (err) goto fail_fan_boost_mode; @@ -3834,6 +3907,7 @@ static int asus_wmi_add(struct platform_device *pdev) fail_egpu_enable: fail_dgpu_disable: fail_keyboard_rgb_mode: +fail_keyboard_rgb_state: fail_platform: fail_panel_od: kfree(asus); diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index d63c9945a17d..b5c966798ef8 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -100,6 +100,8 @@ =20 /* TUF laptop RGB control */ #define ASUS_WMI_DEVID_TUF_RGB_MODE 0x00100056 +/* TUF laptop RGB state control */ +#define ASUS_WMI_DEVID_TUF_RGB_STATE 0x00100057 =20 /* DSTS masks */ #define ASUS_WMI_DSTS_STATUS_BIT 0x00000001 --=20 2.37.1 From nobody Fri Dec 19 06:56:52 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 96D69C25B0C for ; Mon, 8 Aug 2022 03:05:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236315AbiHHDFZ (ORCPT ); Sun, 7 Aug 2022 23:05:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49632 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235541AbiHHDFA (ORCPT ); Sun, 7 Aug 2022 23:05:00 -0400 Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20847BE26; Sun, 7 Aug 2022 20:04:59 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 7382B5C00BB; Sun, 7 Aug 2022 23:04:58 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Sun, 07 Aug 2022 23:04:58 -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=1659927898; x=1660014298; bh=Fu y+PdPdHN9Bf5D4X8eofeIwHOpq0CD44GhqO7Kk5Jk=; b=XGvpbqBZOJ1FssaCkr kpLARtnCFM98q8pkNbqifkPso/81WaWDUKRq3U4T4zCarKooCUFMpylMX07Zrf7h jyDX3UuylzUzNxli04o3qdYXp28j2gjBvO3DQmPUfl4Vwgmr1pWOQrmE9VNc6414 2Fiv9phmoiU15SPXOnk0kgyV1tcB2TWeBnmcH8n7k7d+9DGkqXRXhi4HyEOYsWS5 /aTEPKyrcUqhhAAQrg0ZbtGUqVGh7mnA+n2L+pwnK0vfWZVj/w00e3ToVy0h7faj dTPQmbm3j7HSVYnL1hyc+kIyWi+aWaHnbw0vuXdiGjVyJqeBBSh3/n+Ff35SZThJ FNGg== 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=1659927898; x=1660014298; bh=Fuy+PdPdHN9Bf 5D4X8eofeIwHOpq0CD44GhqO7Kk5Jk=; b=UcKnjZKE4n0N6QRIshKHBEB+77v1Z hBon5puZgPS3NGlZtWJiJSUub+VjVM/EnWr/vRUFeiqKurrqfovSE4p/0vsiewuo 0odBPDC/Rnzn1MYqLqpeVFnfvf0ptxd7GxIS14HzXu/USetS0zg7bxo4KU0+osEP 7q6Wvx+v73tl2Ucl75MciDtJn3HOfIeKTH5WqPpd9+JHrcQlyG/uBfeR12A+rvJw eWfPML8dt9wuasvU5dYVyWrXG3ATmtCdflO+rXQL2zH8JBF2vOGegmmOOnbjTkH0 A6QfSm2rvghuFt/pfsvXuohHIDCFRvKrV7Hxj3mz3YFgKuCfaluhkCNuw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdefjedgieefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedfnfhukhgvucffrdculfhonhgvshdfuceolhhukhgvsehl jhhonhgvshdruggvvheqnecuggftrfgrthhtvghrnhepgfetfedugfetudeuheetjefhue fggfelleetvdevtefhueeujeefvdegleevhefgnecuvehluhhsthgvrhfuihiivgepuden ucfrrghrrghmpehmrghilhhfrhhomheplhhukhgvsehljhhonhgvshdruggvvh X-ME-Proxy: Feedback-ID: i5ec1447f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 7 Aug 2022 23:04:56 -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, "Luke D. Jones" Subject: [PATCH v2 4/6] asus-wmi: Document previously added attributes Date: Mon, 8 Aug 2022 15:04:18 +1200 Message-Id: <20220808030420.8633-5-luke@ljones.dev> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220808030420.8633-1-luke@ljones.dev> References: <20220808030420.8633-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" Documents some previously added attributes: - dgpu_disable - egpu_enable - panel_od - keyboard_rgb_mode - keyboard_rgb_state Signed-off-by: Luke D. Jones --- .../ABI/testing/sysfs-platform-asus-wmi | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-platform-asus-wmi b/Documentat= ion/ABI/testing/sysfs-platform-asus-wmi index 04885738cf15..66b262476d92 100644 --- a/Documentation/ABI/testing/sysfs-platform-asus-wmi +++ b/Documentation/ABI/testing/sysfs-platform-asus-wmi @@ -57,3 +57,62 @@ Description: * 0 - default, * 1 - overboost, * 2 - silent + +What: /sys/devices/platform//dgpu_disable +Date: Aug 2022 +KernelVersion: 5.17 +Contact: "Luke Jones" +Description: + Disable discrete GPU: + * 0 - Enable dGPU, + * 1 - Disable dGPU, + +What: /sys/devices/platform//egpu_enable +Date: Aug 2022 +KernelVersion: 5.17 +Contact: "Luke Jones" +Description: + Enable the external GPU paired with ROG X-Flow laptops. + Toggling this setting will also trigger ACPI to disable the dGPU: + * 0 - Disable, + * 1 - Enable, + +What: /sys/devices/platform//panel_od +Date: Aug 2022 +KernelVersion: 5.17 +Contact: "Luke Jones" +Description: + Enable an LCD response-time boost to reduce or remove ghosting: + * 0 - Disable, + * 1 - Enable, + +What: /sys/devices/platform//keyboard_rgb_mode +Date: Aug 2022 +KernelVersion: 6.0 +Contact: "Luke Jones" +Description: + Set some RGB keyboard modes and features (write-only). + + The accepted input is "save mode speed", where "n n n" options + are: + * save - 0 or 1, if 0 then settings are not retained on boot + * mode - 0 to 12, each is an RGB such as static, rainbow, pulse. + Not all keyboards accept every mode. + * speed - 0, 1, 2, equal to low, medium, high. + Only applies to certain modes. + +What: /sys/devices/platform//keyboard_rgb_state +Date: Aug 2022 +KernelVersion: 6.0 +Contact: "Luke Jones" +Description: + Set some RGB keyboard power states (write-only). + + The accepted input is "boot awake sleep keyboard", where "n n n n n" + options are: + * save - 0 or 1, if 0 then settings are not retained on boot + * boot - 0 or 1, controls if a boot animation is shown + * awake - 0 or 1, controls if the keyboard LED are on during awake + * sleep - 0 or 1, controls if a suspended animation is shown. + This is only active if the AC is connected. + * keyboard - 0 or 1, unknown what effect this really has --=20 2.37.1 From nobody Fri Dec 19 06:56:52 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 65B1DC19F2A for ; Mon, 8 Aug 2022 03:05:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232538AbiHHDFi (ORCPT ); Sun, 7 Aug 2022 23:05:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49694 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235718AbiHHDFC (ORCPT ); Sun, 7 Aug 2022 23:05:02 -0400 Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 89001BE27; Sun, 7 Aug 2022 20:05:01 -0700 (PDT) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id CCDDE5C00BB; Sun, 7 Aug 2022 23:05:00 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute5.internal (MEProxy); Sun, 07 Aug 2022 23:05:00 -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=1659927900; x=1660014300; bh=Cb kfhbdI8L3C3EeP6YMMpqMtzalfJzOZjgHdKwXmum8=; b=m1cAoTTpCkRHofnlxN 2iBSKnRQl8Vv0SWCuod13eVkHVZtb6+NUN593BJfjo3ELYQzlEVtV/EIfQkfeD+B 8re/ro18I4SLi9B5n2KKj0pdcfjCGyhqBe6xKarR1DYq42nw8sBc/fqbjcvBba7y EkK9vH58CfXf97C5T8lXIf4QfUDGAsOGBUT7gmOmIpW/Qf3l9YEywGW1mQoqj0M9 cm48t/zipn6JnXt00nSLDEplS/SG4YZOeWwLy8pzxZKQ2qW54CSeSKV2JaFdHa1n Txf6C/UxjyIF7TpwhR7COHxGYtK85mzziXG7MjQ/abbjzclK3VT8Fht199xh0RYe NHLQ== 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=1659927900; x=1660014300; bh=CbkfhbdI8L3C3 EeP6YMMpqMtzalfJzOZjgHdKwXmum8=; b=bFrqvcrLCK/YT5mXzdECTb0kZqS12 H4of8HymFe0GjNLfHljlR7VRW6aJ/XEejDoeAqK1SUNjrftbNJkZF7JhEmckxGx+ FHxlguxlsWQZno4FT9NsBzQLN6qrLgJyL4V8rDlE3pNQNAMzdzu28EMf8DBq9Rql iUOl9eYsTnIz0Vanwg2mt57nWxxWI5gI3wcY/0zWd8cvE3V0BwCFEJmEOYWTQ8Te hJYF80SgnIMEyxnZBlIke+TWtkNT7etwDlRKfXoEyahsvKGrz0TaLTpG1W+G7XxO 9NSScyly6+JOiD6orDeNC7ndSrGeGGWysJ5sg2veOF8TbTGBeldCg1oEw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdefjedgieegucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedfnfhukhgvucffrdculfhonhgvshdfuceolhhukhgvsehl jhhonhgvshdruggvvheqnecuggftrfgrthhtvghrnhepgfetfedugfetudeuheetjefhue fggfelleetvdevtefhueeujeefvdegleevhefgnecuvehluhhsthgvrhfuihiivgepuden ucfrrghrrghmpehmrghilhhfrhhomheplhhukhgvsehljhhonhgvshdruggvvh X-ME-Proxy: Feedback-ID: i5ec1447f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 7 Aug 2022 23:04:58 -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, "Luke D. Jones" Subject: [PATCH v2 5/6] asus-wmi: Convert all attr-show to use sysfs_emit Date: Mon, 8 Aug 2022 15:04:19 +1200 Message-Id: <20220808030420.8633-6-luke@ljones.dev> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220808030420.8633-1-luke@ljones.dev> References: <20220808030420.8633-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" This changes all *_show attributes in asus-wmi.c to use sysfs_emit instead of the older method of writing to the output buffer manually. Signed-off-by: Luke D. Jones --- drivers/platform/x86/asus-wmi.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 9b2c54726955..b9e5d87e3e18 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -919,7 +919,7 @@ static ssize_t charge_control_end_threshold_show(struct= device *device, struct device_attribute *attr, char *buf) { - return sprintf(buf, "%d\n", charge_end_threshold); + return sysfs_emit(buf, "%d\n", charge_end_threshold); } =20 static DEVICE_ATTR_RW(charge_control_end_threshold); @@ -2009,7 +2009,7 @@ static ssize_t pwm1_show(struct device *dev, value =3D -1; } =20 - return sprintf(buf, "%d\n", value); + return sysfs_emit(buf, "%d\n", value); } =20 static ssize_t pwm1_store(struct device *dev, @@ -2069,7 +2069,7 @@ static ssize_t fan1_input_show(struct device *dev, return -ENXIO; } =20 - return sprintf(buf, "%d\n", value < 0 ? -1 : value*100); + return sysfs_emit(buf, "%d\n", value < 0 ? -1 : value*100); } =20 static ssize_t pwm1_enable_show(struct device *dev, @@ -2087,7 +2087,7 @@ static ssize_t pwm1_enable_show(struct device *dev, * in practice on X532FL at least (the bit is always 0) and there's * also nothing in the DSDT to indicate that this behaviour exists. */ - return sprintf(buf, "%d\n", asus->fan_pwm_mode); + return sysfs_emit(buf, "%d\n", asus->fan_pwm_mode); } =20 static ssize_t pwm1_enable_store(struct device *dev, @@ -2155,7 +2155,7 @@ static ssize_t fan1_label_show(struct device *dev, struct device_attribute *attr, char *buf) { - return sprintf(buf, "%s\n", ASUS_FAN_DESC); + return sysfs_emit(buf, "%s\n", ASUS_FAN_DESC); } =20 static ssize_t asus_hwmon_temp1(struct device *dev, @@ -2348,7 +2348,7 @@ static ssize_t fan_boost_mode_show(struct device *dev, { struct asus_wmi *asus =3D dev_get_drvdata(dev); =20 - return scnprintf(buf, PAGE_SIZE, "%d\n", asus->fan_boost_mode); + return sysfs_emit(buf, "%d\n", asus->fan_boost_mode); } =20 static ssize_t fan_boost_mode_store(struct device *dev, @@ -2901,7 +2901,7 @@ static ssize_t throttle_thermal_policy_show(struct de= vice *dev, struct asus_wmi *asus =3D dev_get_drvdata(dev); u8 mode =3D asus->throttle_thermal_policy_mode; =20 - return scnprintf(buf, PAGE_SIZE, "%d\n", mode); + return sysfs_emit(buf, "%d\n", mode); } =20 static ssize_t throttle_thermal_policy_store(struct device *dev, --=20 2.37.1 From nobody Fri Dec 19 06:56:52 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 9CE75C19F2A for ; Mon, 8 Aug 2022 03:05:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236634AbiHHDFq (ORCPT ); Sun, 7 Aug 2022 23:05:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49734 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235796AbiHHDFF (ORCPT ); Sun, 7 Aug 2022 23:05:05 -0400 Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0C653BF4A; Sun, 7 Aug 2022 20:05:04 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.nyi.internal (Postfix) with ESMTP id 63E5F5C00DB; Sun, 7 Aug 2022 23:05:03 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute1.internal (MEProxy); Sun, 07 Aug 2022 23:05:03 -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=1659927903; x=1660014303; bh=Ju Ovk8Lzr+ujVQLVhiHHzh/aqucJ9L2XFpYVD94AneE=; b=C3/S7VjZxe9MOK6D1Y cbQW2phj1NUlMslsbKGXOY5pm3ZSDF1jTJy81gQP5PATQCYbWKHJeWLNIYJ36tLI jF5ekWQdgFaXQQ4XEDIrhq4UMSRyis2KYsPMsaNEnC5Bobkn6uLKj00dLJRJU9KI KX+LS2Q9Rh6McqidAdY/F0ky39BrNwPBEUnNdiLRV7zupAGwTaUlPOZXpfyOyzpy iNunJKtLRmbcmd+Fs2MVhTQ4OXmhSYwWpx6IPZrP9JtcztJTBvQvQBdFnjuilz+B 4UyqEeBSLd/+UH58OKEr+i5HbwoED8cTmlTNIBBsxYW5DgplzqeAiBTtNO4w0Oas bEuw== 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=1659927903; x=1660014303; bh=JuOvk8Lzr+ujV QLVhiHHzh/aqucJ9L2XFpYVD94AneE=; b=Umt7XImN8yeVWGxGYnY/MmZdAqTd1 cP523QhgSfEGqGQze0ulWkDWoA85yY1gNdhCIC2lBacGflEc/Adq5d89PekLZjTX 6JsoB5Y92S+q4OVMAkEY5O25pmaiPUaHzboZrV5Ju8JT3qtojyQYeqmDoUKcjyle STykVVJdvn6+Ivcz9E96GYkCnJAs9C6xymOqfBRROwy8LoFRezj7zwOSpwm5Ffsv MAaTiOBK7rcVOmblncbjhlg119pCvB8gJBa1Ae++DQz1aHTVm25RB0uiPeNaIQ3B sOsoGPk2+3JwGu2+UWxqrRS7D5fEc26U7Lc4NofYd7CwwxVFo1tuu40hA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvfedrvdefjedgieefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedfnfhukhgvucffrdculfhonhgvshdfuceolhhukhgvsehl jhhonhgvshdruggvvheqnecuggftrfgrthhtvghrnhepgfetfedugfetudeuheetjefhue fggfelleetvdevtefhueeujeefvdegleevhefgnecuvehluhhsthgvrhfuihiivgepvden ucfrrghrrghmpehmrghilhhfrhhomheplhhukhgvsehljhhonhgvshdruggvvh X-ME-Proxy: Feedback-ID: i5ec1447f:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sun, 7 Aug 2022 23:05:01 -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, "Luke D. Jones" Subject: [PATCH v2 6/6] asus-wmi: Add support for dGPU-only mode Date: Mon, 8 Aug 2022 15:04:20 +1200 Message-Id: <20220808030420.8633-7-luke@ljones.dev> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220808030420.8633-1-luke@ljones.dev> References: <20220808030420.8633-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 a dGPU-only mode on some laptops where when enabled the boot GPU is the dGPU, and the iGPU is not visible. Signed-off-by: Luke D. Jones --- .../ABI/testing/sysfs-platform-asus-wmi | 9 ++ drivers/platform/x86/asus-wmi.c | 92 +++++++++++++++++++ include/linux/platform_data/x86/asus-wmi.h | 3 + 3 files changed, 104 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-platform-asus-wmi b/Documentat= ion/ABI/testing/sysfs-platform-asus-wmi index 66b262476d92..93d111a65313 100644 --- a/Documentation/ABI/testing/sysfs-platform-asus-wmi +++ b/Documentation/ABI/testing/sysfs-platform-asus-wmi @@ -77,6 +77,15 @@ Description: * 0 - Disable, * 1 - Enable, =20 +What: /sys/devices/platform//dgpu_only +Date: Aug 2022 +KernelVersion: 6.0 +Contact: "Luke Jones" +Description: + Set the dGPU to be the only GPU available: + * 0 - Disable, + * 1 - Enable, + What: /sys/devices/platform//panel_od Date: Aug 2022 KernelVersion: 5.17 diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index b9e5d87e3e18..840299828512 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -246,6 +246,9 @@ struct asus_wmi { bool dgpu_disable_available; bool dgpu_disable; =20 + bool dgpu_only_available; + bool dgpu_only; + bool keyboard_rgb_state_available; bool keyboard_rgb_mode_available; struct keyboard_rgb_led keyboard_rgb_mode; @@ -750,6 +753,87 @@ static ssize_t egpu_enable_store(struct device *dev, =20 static DEVICE_ATTR_RW(egpu_enable); =20 +/* dedicated GPU only ****************************************************= *****/ +static int dgpu_only_check_present(struct asus_wmi *asus) +{ + u32 result; + int err; + + asus->dgpu_only_available =3D false; + + err =3D asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_DGPU, &result); + if (err) { + if (err =3D=3D -ENODEV) + return 0; + return err; + } + + if (result & ASUS_WMI_DSTS_PRESENCE_BIT) { + asus->dgpu_only_available =3D true; + asus->dgpu_only =3D result & ASUS_WMI_DSTS_STATUS_BIT; + } + + return 0; +} + +static int dgpu_only_write(struct asus_wmi *asus) +{ + u32 retval; + u8 value; + int err; + + /* Don't rely on type conversion */ + value =3D asus->dgpu_only ? 1 : 0; + + err =3D asus_wmi_set_devstate(ASUS_WMI_DEVID_DGPU, value, &retval); + if (err) { + pr_warn("Failed to set dGPU-only mode: %d\n", err); + return err; + } + + if (retval > 1) { + pr_warn("Failed to set dGPU-only mode (retval): 0x%x\n", retval); + return -EIO; + } + + sysfs_notify(&asus->platform_device->dev.kobj, NULL, "dgpu_only"); + + return 0; +} + +static ssize_t dgpu_only_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct asus_wmi *asus =3D dev_get_drvdata(dev); + u8 mode =3D asus->dgpu_only; + + return sysfs_emit(buf, "%d\n", mode); +} + +static ssize_t dgpu_only_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + bool enable; + int result; + + struct asus_wmi *asus =3D dev_get_drvdata(dev); + + result =3D kstrtobool(buf, &enable); + if (result) + return result; + + asus->dgpu_only =3D enable; + + result =3D dgpu_only_write(asus); + if (result) + return result; + + return count; +} + +static DEVICE_ATTR_RW(dgpu_only); + /* TUF Laptop Keyboard RGB Modes *****************************************= *****/ static int keyboard_rgb_mode_check_present(struct asus_wmi *asus) { @@ -3473,6 +3557,7 @@ static struct attribute *platform_attributes[] =3D { &dev_attr_touchpad.attr, &dev_attr_egpu_enable.attr, &dev_attr_dgpu_disable.attr, + &dev_attr_dgpu_only.attr, &dev_attr_keyboard_rgb_mode.attr, &dev_attr_keyboard_rgb_mode_index.attr, &dev_attr_keyboard_rgb_state.attr, @@ -3507,6 +3592,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_only.attr) + ok =3D asus->dgpu_only_available; else if (attr =3D=3D &dev_attr_keyboard_rgb_mode.attr) ok =3D asus->keyboard_rgb_mode_available; else if (attr =3D=3D &dev_attr_keyboard_rgb_mode_index.attr) @@ -3784,6 +3871,10 @@ static int asus_wmi_add(struct platform_device *pdev) if (err) goto fail_dgpu_disable; =20 + err =3D dgpu_only_check_present(asus); + if (err) + goto fail_dgpu_only; + err =3D keyboard_rgb_mode_check_present(asus); if (err) goto fail_keyboard_rgb_mode; @@ -3906,6 +3997,7 @@ static int asus_wmi_add(struct platform_device *pdev) fail_fan_boost_mode: fail_egpu_enable: fail_dgpu_disable: +fail_dgpu_only: fail_keyboard_rgb_mode: fail_keyboard_rgb_state: fail_platform: diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index b5c966798ef8..76b0756a0666 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -98,6 +98,9 @@ /* dgpu on/off */ #define ASUS_WMI_DEVID_DGPU 0x00090020 =20 +/* Dedicated GPU only. When active the dGPU will be the only visible GPU */ +#define ASUS_WMI_DEVID_DEDICATED 0x00090016 + /* TUF laptop RGB control */ #define ASUS_WMI_DEVID_TUF_RGB_MODE 0x00100056 /* TUF laptop RGB state control */ --=20 2.37.1