From nobody Sun Jun 28 05:33:36 2026 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 126C3C4332F for ; Fri, 11 Feb 2022 20:01:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1350385AbiBKUBt (ORCPT ); Fri, 11 Feb 2022 15:01:49 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:44258 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1353069AbiBKUBd (ORCPT ); Fri, 11 Feb 2022 15:01:33 -0500 Received: from mail-pf1-x430.google.com (mail-pf1-x430.google.com [IPv6:2607:f8b0:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E9E55C4E; Fri, 11 Feb 2022 12:01:31 -0800 (PST) Received: by mail-pf1-x430.google.com with SMTP id i21so16637904pfd.13; Fri, 11 Feb 2022 12:01:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7yEhdzmKiBIVPQNgvEVDotMSHO96bEnJ0/2MaKTuINI=; b=dQQ5vc+CRKq9rB5cNxrmwN6Aol6eMj6O0wlxnSCI2g0wd3dWaMBq3xDNBUgQ8ZVxiO tXB1DC6uBS9vdN0uZt+4ox/7ekUVipyczJJTBWHPRZlyLSnPVclPUSeLk+vslctrMa+g hpzctKpuLOyAiRPeooFkcHoeRdeQ2lvs4IsPfgMQKABsFkrnlkfH/TTxavaUEIKQTobq 7Vyim5syU66Kd4VWQzZ6MH5L8tjRw6C056/6bcjY2Krkbovwa34Y0Vyayal8t2p0dn5W fC4pxXmrwYY/m0jqIzx1kTVkQdo0yvmvtrptSyBOmxVSHV1VjYwXDtjglUY/DVVgAo3V zOig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=7yEhdzmKiBIVPQNgvEVDotMSHO96bEnJ0/2MaKTuINI=; b=WN5G9ck50QfNVhGmXT+eOuKFxFcbqLsRX0H22fAQ+9iTr+QZavVyEqAfMdTE3f3Ot9 t39haV7/VPH14TGG2qwtLqImuC0wn7hBOwn0UbomIPKOp5o4B6vKlAU1wAjxiNZCywoN 0hwz+k9JgzFF0H+8IYx2TxJbmG7eGXBmUbwGM4evuZujY/PGeokBZqY9nFir59jHx3V4 46rFV6cDUvP/9Q+ZvDyk7FRf5CyanayXtdR3mnJSmkj7F9VcJxeFIR8w/LvOBiceeGSp RR7IUn4bDp3BFvvoHRnWrWqZxKEm83RzMp5Kfxar3YH9qvncbmloMvhKYn34v62J/FSt NpcQ== X-Gm-Message-State: AOAM530/IVwi6UkDZHIXCdn1PtNQTrxFU+HxUUSBEE0GcTIpuSFLAFxl GQ1SWrhsKc6uXLZOeq+sCCI= X-Google-Smtp-Source: ABdhPJwVXOnbqurcePIcKhG+jxXjd9ekN4pr6QlNeHNOAlZHr1MGi1hkp4aqBv1srPHLYvORpkMyYQ== X-Received: by 2002:aa7:900d:: with SMTP id m13mr3329110pfo.14.1644609691410; Fri, 11 Feb 2022 12:01:31 -0800 (PST) Received: from localhost.localdomain ([117.194.161.23]) by smtp.gmail.com with ESMTPSA id f15sm28915080pfv.189.2022.02.11.12.01.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Feb 2022 12:01:31 -0800 (PST) From: Abhijeet V To: Corentin Chary , Hans de Goede , Mark Gross Cc: acpi4asus-user@lists.sourceforge.net, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Abhijeet V Subject: [PATCH 1/2] asus-wmi: Use led multicolor class for keyboard backlight Date: Sat, 12 Feb 2022 01:31:21 +0530 Message-Id: <20220211200122.9821-2-abhijeetviswa@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220211200122.9821-1-abhijeetviswa@gmail.com> References: <20220211200122.9821-1-abhijeetviswa@gmail.com> 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" Use the led multicolor class for keyboard backlight so that support for rgb keyboard leds can be added for supported Asus laptops. Also refactored the keyboard led functions. The function names are now indicative of what the function does. Signed-off-by: Abhijeet V Reported-by: kernel test robot --- drivers/platform/x86/asus-wmi.c | 109 ++++++++++++++++++-------------- 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 2104a2621e50..117fbcb303d3 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 @@ -88,6 +89,8 @@ module_param(fnlock_default, bool, 0444); #define ASUS_FAN_BOOST_MODE_SILENT_MASK 0x02 #define ASUS_FAN_BOOST_MODES_MASK 0x03 =20 +#define ASUS_KBD_SUBLED_COUNT 3 + #define ASUS_THROTTLE_THERMAL_POLICY_DEFAULT 0 #define ASUS_THROTTLE_THERMAL_POLICY_OVERBOOST 1 #define ASUS_THROTTLE_THERMAL_POLICY_SILENT 2 @@ -204,8 +207,6 @@ struct asus_wmi { int wlan_led_wk; struct led_classdev tpd_led; int tpd_led_wk; - struct led_classdev kbd_led; - int kbd_led_wk; struct led_classdev lightbar_led; int lightbar_led_wk; struct workqueue_struct *led_workqueue; @@ -213,6 +214,10 @@ struct asus_wmi { struct work_struct wlan_led_work; struct work_struct lightbar_led_work; =20 + struct led_classdev_mc kbd_led_mc; + int kbd_led_wk; + struct mc_subled subled_info[ASUS_KBD_SUBLED_COUNT]; + struct asus_rfkill wlan; struct asus_rfkill bluetooth; struct asus_rfkill wimax; @@ -870,15 +875,7 @@ static enum led_brightness tpd_led_get(struct led_clas= sdev *led_cdev) return read_tpd_led_state(asus); } =20 -static void kbd_led_update(struct asus_wmi *asus) -{ - int ctrl_param =3D 0; - - ctrl_param =3D 0x80 | (asus->kbd_led_wk & 0x7F); - asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL); -} - -static int kbd_led_read(struct asus_wmi *asus, int *level, int *env) +static int kbd_led_brightness_wmi_read(struct asus_wmi *asus, int *level, = int *env) { int retval; =20 @@ -905,50 +902,77 @@ static int kbd_led_read(struct asus_wmi *asus, int *l= evel, int *env) return 0; } =20 -static void do_kbd_led_set(struct led_classdev *led_cdev, int value) +static void kbd_led_brightness_wmi_write(struct asus_wmi *asus, int value) { - struct asus_wmi *asus; int max_level; + int ctrl_param =3D 0; =20 - asus =3D container_of(led_cdev, struct asus_wmi, kbd_led); - max_level =3D asus->kbd_led.max_brightness; - + max_level =3D asus->kbd_led_mc.led_cdev.max_brightness; asus->kbd_led_wk =3D clamp_val(value, 0, max_level); - kbd_led_update(asus); + + ctrl_param =3D 0x80 | (asus->kbd_led_wk & 0x7F); + asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL); } =20 -static void kbd_led_set(struct led_classdev *led_cdev, - enum led_brightness value) +static void kbd_led_brightness_set(struct led_classdev *led_cdev, + enum led_brightness value) { + struct asus_wmi *asus; + struct led_classdev_mc *led_cdev_mc; + /* Prevent disabling keyboard backlight on module unregister */ if (led_cdev->flags & LED_UNREGISTERING) return; =20 - do_kbd_led_set(led_cdev, value); + led_cdev_mc =3D container_of(led_cdev, struct led_classdev_mc, led_cdev); + asus =3D container_of(led_cdev_mc, struct asus_wmi, kbd_led_mc); + + kbd_led_brightness_wmi_write(asus, value); } =20 -static void kbd_led_set_by_kbd(struct asus_wmi *asus, enum led_brightness = value) +static void kbd_led_set_brightness_by_hw(struct asus_wmi *asus, + enum led_brightness value) { - struct led_classdev *led_cdev =3D &asus->kbd_led; + struct led_classdev *led_cdev =3D &asus->kbd_led_mc.led_cdev; =20 - do_kbd_led_set(led_cdev, value); + kbd_led_brightness_wmi_write(asus, value); led_classdev_notify_brightness_hw_changed(led_cdev, asus->kbd_led_wk); } =20 -static enum led_brightness kbd_led_get(struct led_classdev *led_cdev) +static enum led_brightness kbd_led_brightness_get(struct led_classdev *led= _cdev) { struct asus_wmi *asus; + struct led_classdev_mc *led_cdev_mc; int retval, value; =20 - asus =3D container_of(led_cdev, struct asus_wmi, kbd_led); + led_cdev_mc =3D container_of(led_cdev, struct led_classdev_mc, led_cdev); + asus =3D container_of(led_cdev_mc, struct asus_wmi, kbd_led_mc); =20 - retval =3D kbd_led_read(asus, &value, NULL); + retval =3D kbd_led_brightness_wmi_read(asus, &value, NULL); if (retval < 0) return retval; =20 return value; } =20 +int kbd_led_classdev_init(struct asus_wmi *asus, int brightness) +{ + int rv; + + asus->kbd_led_wk =3D brightness; + asus->kbd_led_mc.led_cdev.name =3D "asus::kbd_backlight"; + asus->kbd_led_mc.led_cdev.flags =3D LED_BRIGHT_HW_CHANGED; + asus->kbd_led_mc.led_cdev.brightness_set =3D kbd_led_brightness_set; + asus->kbd_led_mc.led_cdev.brightness_get =3D kbd_led_brightness_get; + asus->kbd_led_mc.led_cdev.max_brightness =3D 3; + + asus->kbd_led_mc.num_colors =3D ASUS_KBD_SUBLED_COUNT; + + rv =3D led_classdev_multicolor_register(&asus->platform_device->dev, + &asus->kbd_led_mc); + return rv; +} + static int wlan_led_unknown_state(struct asus_wmi *asus) { u32 result; @@ -1026,7 +1050,7 @@ static enum led_brightness lightbar_led_get(struct le= d_classdev *led_cdev) =20 static void asus_wmi_led_exit(struct asus_wmi *asus) { - led_classdev_unregister(&asus->kbd_led); + led_classdev_multicolor_unregister(&asus->kbd_led_mc); led_classdev_unregister(&asus->tpd_led); led_classdev_unregister(&asus->wlan_led); led_classdev_unregister(&asus->lightbar_led); @@ -1057,16 +1081,8 @@ static int asus_wmi_led_init(struct asus_wmi *asus) goto error; } =20 - if (!kbd_led_read(asus, &led_val, NULL)) { - asus->kbd_led_wk =3D led_val; - asus->kbd_led.name =3D "asus::kbd_backlight"; - asus->kbd_led.flags =3D LED_BRIGHT_HW_CHANGED; - asus->kbd_led.brightness_set =3D kbd_led_set; - asus->kbd_led.brightness_get =3D kbd_led_get; - asus->kbd_led.max_brightness =3D 3; - - rv =3D led_classdev_register(&asus->platform_device->dev, - &asus->kbd_led); + if (!kbd_led_brightness_wmi_read(asus, &led_val, NULL)) { + rv =3D kbd_led_classdev_init(asus, led_val); if (rv) goto error; } @@ -3057,18 +3073,19 @@ static void asus_wmi_handle_event_code(int code, st= ruct asus_wmi *asus) } =20 if (code =3D=3D NOTIFY_KBD_BRTUP) { - kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1); + kbd_led_set_brightness_by_hw(asus, asus->kbd_led_wk + 1); return; } if (code =3D=3D NOTIFY_KBD_BRTDWN) { - kbd_led_set_by_kbd(asus, asus->kbd_led_wk - 1); + kbd_led_set_brightness_by_hw(asus, asus->kbd_led_wk - 1); return; } if (code =3D=3D NOTIFY_KBD_BRTTOGGLE) { - if (asus->kbd_led_wk =3D=3D asus->kbd_led.max_brightness) - kbd_led_set_by_kbd(asus, 0); + if (asus->kbd_led_wk =3D=3D asus->kbd_led_mc.led_cdev.max_brightness) + kbd_led_set_brightness_by_hw(asus, 0); else - kbd_led_set_by_kbd(asus, asus->kbd_led_wk + 1); + kbd_led_set_brightness_by_hw(asus, + asus->kbd_led_wk + 1); return; } =20 @@ -3720,8 +3737,8 @@ static int asus_hotk_resume(struct device *device) { struct asus_wmi *asus =3D dev_get_drvdata(device); =20 - if (!IS_ERR_OR_NULL(asus->kbd_led.dev)) - kbd_led_update(asus); + if (!IS_ERR_OR_NULL(asus->kbd_led_mc.led_cdev.dev)) + kbd_led_brightness_wmi_write(asus, asus->kbd_led_wk); =20 if (asus_wmi_has_fnlock_key(asus)) asus_wmi_fnlock_update(asus); @@ -3762,8 +3779,8 @@ static int asus_hotk_restore(struct device *device) bl =3D !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB); rfkill_set_sw_state(asus->uwb.rfkill, bl); } - if (!IS_ERR_OR_NULL(asus->kbd_led.dev)) - kbd_led_update(asus); + if (!IS_ERR_OR_NULL(asus->kbd_led_mc.led_cdev.dev)) + kbd_led_brightness_wmi_write(asus, asus->kbd_led_wk); =20 if (asus_wmi_has_fnlock_key(asus)) asus_wmi_fnlock_update(asus); --=20 2.35.1 From nobody Sun Jun 28 05:33:36 2026 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 7063AC433F5 for ; Fri, 11 Feb 2022 20:01:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1353090AbiBKUBv (ORCPT ); Fri, 11 Feb 2022 15:01:51 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:44420 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240414AbiBKUBr (ORCPT ); Fri, 11 Feb 2022 15:01:47 -0500 Received: from mail-pf1-x42b.google.com (mail-pf1-x42b.google.com [IPv6:2607:f8b0:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 38B27C54; Fri, 11 Feb 2022 12:01:34 -0800 (PST) Received: by mail-pf1-x42b.google.com with SMTP id i6so16215745pfc.9; Fri, 11 Feb 2022 12:01:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NGMuc3QWa/tz9bO3RZ/u3cDSmW3qy4DcRBs8PaptKno=; b=Gnr7YIwgQZGHqHYRT63/meO9IIR0rw426TxbiV/E5CPgOLJTfqiRZR2tfvctMcxRrD wdFz5MoC6RFzbcWr4Xkl2PHUCbwvjSIq2UhkoQWxNCsPpQUjtuz/CLfUW4nAD5Zwb7z4 UlWXnFsJ6WJSG7TZHoFnnsEnZOJP0H16IiXfjcZNBv12gXzP/UxLPkPh5V3nPalhYI+s 8l80rGSZYlBq1Wa1c8mw3TdVPwU9mYiJLnLheknE9E71MzTN7VWHxxMVeKwAkGsc1ocy nUYmSXtlb/zJAt+GyXjqE555S95y6QVtCxutybdhYi1K6i0q67qfr6MNVJP1Yh+Oxztx pcfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NGMuc3QWa/tz9bO3RZ/u3cDSmW3qy4DcRBs8PaptKno=; b=59gH9ptxBQV+BnOwVUeltFeW9MW2nYdJlojxlbZLpKhiavz9zqvXh99PqtUh423CTm 2E9FroIxwZVyvaOdEDV3i5wGHwhbuG43xoDhcJjigaNaJqvtoqAxDQfsuQhCPeLB0U97 TzEbzgFQv9InLCz6DA5UYhrCU71xXMVxhBVR4C71ZlG8uZSNM09vaUBMulZv9zbipmM7 uObG/7bwCZ+ytzTjHJ6QDdMmHoJShu1Ur70LHAWs8ZSqWTK7zZ0rHhPxVtWBE2YVFbuc StKfrXAjbkSg2Wu57rleRKd5q7usU3uXS1YWX+Znwoku/Q6mJUNFoY9Ysepfu5/mBxJv AeJQ== X-Gm-Message-State: AOAM530r9M+gAV5FbQ7NYR/BwlfngqnLSBrDYUcIL64xIG2xvVr2stSr zd2n5OmjYcsM77hPzlhDg4g= X-Google-Smtp-Source: ABdhPJw0i5w2ryRDqs3JEpmMmeTR7/3UmsM41KWaHLyAXpgFJvMp8zDpqaABSyeFsfIv/wgns2nUvQ== X-Received: by 2002:a63:181:: with SMTP id 123mr2653820pgb.546.1644609693981; Fri, 11 Feb 2022 12:01:33 -0800 (PST) Received: from localhost.localdomain ([117.194.161.23]) by smtp.gmail.com with ESMTPSA id f15sm28915080pfv.189.2022.02.11.12.01.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Feb 2022 12:01:33 -0800 (PST) From: Abhijeet V To: Corentin Chary , Hans de Goede , Mark Gross Cc: acpi4asus-user@lists.sourceforge.net, platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Abhijeet V Subject: [PATCH 2/2] asus-wmi: Add support for keyboard rgb backlights Date: Sat, 12 Feb 2022 01:31:22 +0530 Message-Id: <20220211200122.9821-3-abhijeetviswa@gmail.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220211200122.9821-1-abhijeetviswa@gmail.com> References: <20220211200122.9821-1-abhijeetviswa@gmail.com> 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" Uses the led multicolor classdev to change the rgb values. The WMI function expects other settings in addition to the rgb values. This patch assumes some defaults to get the base rgb functionality working. Signed-off-by: Abhijeet V --- drivers/platform/x86/asus-wmi.c | 137 +++++++++++++++++++++ include/linux/platform_data/x86/asus-wmi.h | 2 + 2 files changed, 139 insertions(+) diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wm= i.c index 117fbcb303d3..f8e92021399c 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c @@ -193,6 +193,12 @@ struct fan_curve_data { u8 percents[FAN_CURVE_POINTS]; }; =20 +struct asus_kbd_rgb { + u8 red; + u8 green; + u8 blue; +}; + struct asus_wmi { int dsts_id; int spec; @@ -217,6 +223,8 @@ struct asus_wmi { struct led_classdev_mc kbd_led_mc; int kbd_led_wk; struct mc_subled subled_info[ASUS_KBD_SUBLED_COUNT]; + struct asus_kbd_rgb kbd_rgb; + bool kbd_rgb_available; =20 struct asus_rfkill wlan; struct asus_rfkill bluetooth; @@ -914,6 +922,114 @@ static void kbd_led_brightness_wmi_write(struct asus_= wmi *asus, int value) asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL); } =20 +static int kbd_led_rgb_wmi_write(struct asus_wmi *asus) +{ + int err; + u32 retval; + u8 red; + u8 green; + u8 blue; + u8 speed_byte; + u8 mode_byte; + u8 speed; + u8 mode; + u8 flags; + u8 persistent; + + speed =3D 0; // Sane default + switch (speed) { + case 0: + default: + speed_byte =3D 0xe1; // slow + speed =3D 0; + break; + case 1: + speed_byte =3D 0xeb; // medium + break; + case 2: + speed_byte =3D 0xf5; // fast + break; + } + + mode =3D 0; // Sane default + switch (mode) { + case 0: + default: + mode_byte =3D 0x00; // static color + mode =3D 0; + break; + case 1: + mode_byte =3D 0x01; // breathing + break; + case 2: + mode_byte =3D 0x02; // color cycle + break; + case 3: + mode_byte =3D 0x0a; // strobing + break; + } + + red =3D clamp_val(asus->kbd_led_mc.subled_info[0].intensity, 0, 255); + green =3D clamp_val(asus->kbd_led_mc.subled_info[1].intensity, 0, 255); + blue =3D clamp_val(asus->kbd_led_mc.subled_info[2].intensity, 0, 255); + + /* + * 00 - Reset on boot + * 01 - Persist across boot + */ + persistent =3D 1; // Sane defaults + + err =3D asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, + ASUS_WMI_DEVID_KBD_RGB, + (persistent ? 0xb4 : 0xb3) | + (mode_byte << 8) | + (red << 16) | + (green << 24), + (blue) | + (speed_byte << 8), &retval); + if (err) { + pr_warn("RGB keyboard device 1, write error: %d\n", err); + return err; + } + + if (retval !=3D 1) { + pr_warn("RGB keyboard device 1, write error (retval): %x\n", + retval); + return -EIO; + } + + /* + * Enable: 02 - on boot (until module load) | 08 - awake | 20 - sleep + * (2a or ff to enable everything) + * + * Logically 80 would be shutdown, but no visible effects of this option + * were observed so far + */ + flags =3D 0xff; + + err =3D asus_wmi_evaluate_method3(ASUS_WMI_METHODID_DEVS, + ASUS_WMI_DEVID_KBD_RGB2, + (0xbd) | + (flags << 16) | + (persistent ? 0x0100 : 0x0000), 0, &retval); + if (err) { + pr_warn("RGB keyboard device 2, write error: %d\n", err); + return err; + } + + if (retval !=3D 1) { + pr_warn("RGB keyboard device 2, write error (retval): %x\n", + retval); + return -EIO; + } + + asus->kbd_rgb.red =3D red; + asus->kbd_rgb.green =3D green; + asus->kbd_rgb.blue =3D blue; + + return 0; +} + static void kbd_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness value) { @@ -928,6 +1044,18 @@ static void kbd_led_brightness_set(struct led_classde= v *led_cdev, asus =3D container_of(led_cdev_mc, struct asus_wmi, kbd_led_mc); =20 kbd_led_brightness_wmi_write(asus, value); + + /* Check and set if rgb available */ + if (!asus->kbd_rgb_available) + return; + + if (asus->kbd_rgb.red =3D=3D asus->subled_info[LED_COLOR_ID_RED].intensit= y && + asus->kbd_rgb.green =3D=3D asus->subled_info[LED_COLOR_ID_GREEN].intens= ity && + asus->kbd_rgb.blue =3D=3D asus->subled_info[LED_COLOR_ID_BLUE].intensit= y) { + return; + } + + kbd_led_rgb_wmi_write(asus); } =20 static void kbd_led_set_brightness_by_hw(struct asus_wmi *asus, @@ -959,6 +1087,7 @@ int kbd_led_classdev_init(struct asus_wmi *asus, int b= rightness) { int rv; =20 + asus->kbd_rgb_available =3D true; asus->kbd_led_wk =3D brightness; asus->kbd_led_mc.led_cdev.name =3D "asus::kbd_backlight"; asus->kbd_led_mc.led_cdev.flags =3D LED_BRIGHT_HW_CHANGED; @@ -966,6 +1095,14 @@ int kbd_led_classdev_init(struct asus_wmi *asus, int = brightness) asus->kbd_led_mc.led_cdev.brightness_get =3D kbd_led_brightness_get; asus->kbd_led_mc.led_cdev.max_brightness =3D 3; =20 + asus->subled_info[0].color_index =3D LED_COLOR_ID_RED; + asus->subled_info[0].channel =3D 0; + asus->subled_info[1].color_index =3D LED_COLOR_ID_GREEN; + asus->subled_info[1].channel =3D 1; + asus->subled_info[2].color_index =3D LED_COLOR_ID_BLUE; + asus->subled_info[2].channel =3D 2; + asus->kbd_led_mc.subled_info =3D asus->subled_info; + asus->kbd_led_mc.num_colors =3D ASUS_KBD_SUBLED_COUNT; =20 rv =3D led_classdev_multicolor_register(&asus->platform_device->dev, diff --git a/include/linux/platform_data/x86/asus-wmi.h b/include/linux/pla= tform_data/x86/asus-wmi.h index a571b47ff362..a20ca3787e9f 100644 --- a/include/linux/platform_data/x86/asus-wmi.h +++ b/include/linux/platform_data/x86/asus-wmi.h @@ -59,6 +59,8 @@ #define ASUS_WMI_DEVID_LIGHTBAR 0x00050025 #define ASUS_WMI_DEVID_FAN_BOOST_MODE 0x00110018 #define ASUS_WMI_DEVID_THROTTLE_THERMAL_POLICY 0x00120075 +#define ASUS_WMI_DEVID_KBD_RGB 0x00100056 +#define ASUS_WMI_DEVID_KBD_RGB2 0x00100057 =20 /* Misc */ #define ASUS_WMI_DEVID_PANEL_OD 0x00050019 --=20 2.35.1