From nobody Wed Jun 17 02:58:38 2026 Received: from mail.tuxedocomputers.com (mail.tuxedocomputers.com [157.90.84.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B0AD535DA48; Tue, 21 Apr 2026 20:11:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=157.90.84.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776802277; cv=none; b=q0sqgYV7srLDiAYK5WQogybFQUeS7DRcoOn/8/g6khcjiUz1PFqhGhgotKVwzF0XQHC0cdO500D5L38TFPpycrpzNoyJtBZZIklOMMprHkhP0QatIXWfgS61Ths3Mb42pqW4BpoDO1ZdV/5QrGs03thE8G5ouqRf+GEVocVAUdc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776802277; c=relaxed/simple; bh=t0v2qD+8FqrUczTY/vnoCRFN0soJX8hWC64yg673bMY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ND4Eae4RUXcG2wJEobeyX/wXIpW+m8xi05233Ye/i4bnKXMIqC8F4KWeeiwbnYPQZuB0FLoiTvas3sAp270lNK2Mw7O+FvvaMPaMnsMA7KRIDOyHPNVoW9G+m/vKklRFduysvohw6VAGjJJceciw0uyBQYDoNaeCL4BQDY2mL88= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=tuxedocomputers.com; spf=pass smtp.mailfrom=tuxedocomputers.com; dkim=pass (1024-bit key) header.d=tuxedocomputers.com header.i=@tuxedocomputers.com header.b=joYH+qbj; arc=none smtp.client-ip=157.90.84.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=tuxedocomputers.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxedocomputers.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=tuxedocomputers.com header.i=@tuxedocomputers.com header.b="joYH+qbj" Received: from wse-pc.fritz.box (i5C75F683.versanet.de [92.117.246.131]) (Authenticated sender: wse@tuxedocomputers.com) by mail.tuxedocomputers.com (Postfix) with ESMTPA id 076172FC0224; Tue, 21 Apr 2026 22:11:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxedocomputers.com; s=default; t=1776802267; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Lm+kkK6XtCYqdsLrVUlCFaw3rSJFL1LgYVEXMkex8Nk=; b=joYH+qbjEg0MvhuXE5ytVKoaYdy/yyHM9BBdUvlgXfZ6uOOQBDTvMaiNojPp5hOm9mZz3N vDG5GrRWL3+vn5NKT34AmCFCKEp8DtBneYdYzAVsUujd7maGiufih35psYBBk09wQjCSyA LkM+sly6uzJHYaHMADfSvWxiQ9SRGYw= Authentication-Results: mail.tuxedocomputers.com; auth=pass smtp.auth=wse@tuxedocomputers.com smtp.mailfrom=wse@tuxedocomputers.com From: Werner Sembach To: W_Armin@gmx.de, hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Werner Sembach Subject: [RFC PATCH 1/3] platform/x86: uniwill-laptop: Make super key init lineup with other inits Date: Tue, 21 Apr 2026 22:01:25 +0200 Message-ID: <20260421201103.142403-2-wse@tuxedocomputers.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260421201103.142403-1-wse@tuxedocomputers.com> References: <20260421201103.142403-1-wse@tuxedocomputers.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The super key init, while being trivial, was the only one not in its own method and before the EC init. Make an own method and move it after EC init and probe call to make it consistent with other initialization steps. Signed-off-by: Werner Sembach Reviewed-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen --- drivers/platform/x86/uniwill/uniwill-acpi.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 766bc1ee192d2..7d1fdbacc6871 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -768,6 +768,14 @@ static ssize_t super_key_enable_show(struct device *de= v, struct device_attribute =20 static DEVICE_ATTR_RW(super_key_enable); =20 +static int super_key_enable_init(struct uniwill_data *data) +{ + if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY)) + return 0; + + return devm_mutex_init(&data->dev, &data->super_key_lock); +} + static int uniwill_write_touchpad_toggle_enable(struct uniwill_data *data,= bool status) { unsigned int value; @@ -1869,10 +1877,6 @@ static int uniwill_probe(struct platform_device *pde= v) =20 data->regmap =3D regmap; =20 - ret =3D devm_mutex_init(&pdev->dev, &data->super_key_lock); - if (ret < 0) - return ret; - ret =3D uniwill_ec_init(data); if (ret < 0) return ret; @@ -1890,6 +1894,10 @@ static int uniwill_probe(struct platform_device *pde= v) return ret; } =20 + ret =3D super_key_enable_init(data); + if (ret < 0) + return ret; + ret =3D uniwill_battery_init(data); if (ret < 0) return ret; --=20 2.43.0 From nobody Wed Jun 17 02:58:38 2026 Received: from mail.tuxedocomputers.com (mail.tuxedocomputers.com [157.90.84.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF5B2388E77; Tue, 21 Apr 2026 20:11:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=157.90.84.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776802278; cv=none; b=BC0uGRL5HteVyigeVt/ISE52sG1GRRIOjy6dzfX1B878KE3/J+Y5G2hR/2bF8vs4FNPhKngjXeZNNhYrVyExYl7MWWaBmHfQdRukUmV6rm6mnnx8N7tuY/BX6uIEFUpEByXzZ4F3KB/zAVZoU4vjBWDRqXqtH1TrA6a8N/Oaqcs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776802278; c=relaxed/simple; bh=Peoyy0GHOwICCN/tNJTu1Xh+JZnNkeAXca84kSo0X9M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RP8bxbWH8fvOP+7zqESW/SNoPriU02OluC5HTcmu116i7Vyn4f308sCHvRwlTogp++G31uXtzRcKwbSsBURFHb+Ca2WCjmkZrxjukKHeAmjviwBhvt8dXeW7MWqrOVUe2tGjLtRNKI6Ba++7gXFHLiwXHppAPfA9Rg9T4m4TmN0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=tuxedocomputers.com; spf=pass smtp.mailfrom=tuxedocomputers.com; dkim=pass (1024-bit key) header.d=tuxedocomputers.com header.i=@tuxedocomputers.com header.b=hMIygCYr; arc=none smtp.client-ip=157.90.84.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=tuxedocomputers.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxedocomputers.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=tuxedocomputers.com header.i=@tuxedocomputers.com header.b="hMIygCYr" Received: from wse-pc.fritz.box (i5C75F683.versanet.de [92.117.246.131]) (Authenticated sender: wse@tuxedocomputers.com) by mail.tuxedocomputers.com (Postfix) with ESMTPA id 51AA92FC0225; Tue, 21 Apr 2026 22:11:08 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxedocomputers.com; s=default; t=1776802268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KYb3zC4GdkzpYcydAJaXs+9nZIdkMHPvFcSdCM4+56o=; b=hMIygCYrAyKP2Jckx0XheWiquOTD/6zaYFfNRm5mbB09YX9rRHuF983ClfVMdenIX/xrv/ LdADw8vFHykCzMsvdAWukBkud9A2G4kaFex57cv322bLuT3u1Z3yHBsGwoGbp9xofijHHr 6ZPvWcEU6rs2AtODITe4jML4GPlh/VM= Authentication-Results: mail.tuxedocomputers.com; auth=pass smtp.auth=wse@tuxedocomputers.com smtp.mailfrom=wse@tuxedocomputers.com From: Werner Sembach To: W_Armin@gmx.de, hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Werner Sembach Subject: [RFC PATCH 2/3] platform/x86: uniwill-laptop: Implement lightbar for XMG Fusion (L19) Date: Tue, 21 Apr 2026 22:01:26 +0200 Message-ID: <20260421201103.142403-3-wse@tuxedocomputers.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260421201103.142403-1-wse@tuxedocomputers.com> References: <20260421201103.142403-1-wse@tuxedocomputers.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The XMG Fusion (L19) also has a lightbar but with a different max brightness value of 36 instead of 200. This patch adds a new feature flag for the driver to correctly handle this case and applies it to the mentioned device. Signed-off-by: Werner Sembach Reviewed-by: Ilpo J=C3=A4rvinen --- drivers/platform/x86/uniwill/uniwill-acpi.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 7d1fdbacc6871..62d56cc67e2e8 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -318,7 +318,6 @@ #define FAN_TABLE_LENGTH 16 =20 #define LED_CHANNELS 3 -#define LED_MAX_BRIGHTNESS 200 =20 #define UNIWILL_FEATURE_FN_LOCK BIT(0) #define UNIWILL_FEATURE_SUPER_KEY BIT(1) @@ -344,6 +343,7 @@ struct uniwill_data { acpi_handle handle; struct regmap *regmap; unsigned int features; + u8 lightbar_max_brightness; struct acpi_battery_hook hook; struct mutex battery_lock; /* Protects the list of currently registered b= atteries */ union { @@ -376,6 +376,7 @@ struct uniwill_battery_entry { =20 struct uniwill_device_descriptor { unsigned int features; + u8 lightbar_max_brightness; /* Executed during driver probing */ int (*probe)(struct uniwill_data *data); }; @@ -1340,7 +1341,7 @@ static int uniwill_led_brightness_set(struct led_clas= sdev *led_cdev, enum led_br =20 for (int i =3D 0; i < LED_CHANNELS; i++) { /* Prevent the brightness values from overflowing */ - value =3D min(LED_MAX_BRIGHTNESS, data->led_mc_subled_info[i].brightness= ); + value =3D min(data->lightbar_max_brightness, data->led_mc_subled_info[i]= .brightness); ret =3D regmap_write(data->regmap, uniwill_led_channel_to_ac_reg[i], val= ue); if (ret < 0) return ret; @@ -1376,12 +1377,14 @@ static int uniwill_led_init(struct uniwill_data *da= ta) LED_COLOR_ID_GREEN, LED_COLOR_ID_BLUE, }; - unsigned int value; + unsigned int value, max_brightness; int ret; =20 if (!uniwill_device_supports(data, UNIWILL_FEATURE_LIGHTBAR)) return 0; =20 + max_brightness =3D data->lightbar_max_brightness; + ret =3D devm_mutex_init(data->dev, &data->led_lock); if (ret < 0) return ret; @@ -1409,14 +1412,14 @@ static int uniwill_led_init(struct uniwill_data *da= ta) return ret; =20 data->led_mc_cdev.led_cdev.color =3D LED_COLOR_ID_MULTI; - data->led_mc_cdev.led_cdev.max_brightness =3D LED_MAX_BRIGHTNESS; + data->led_mc_cdev.led_cdev.max_brightness =3D max_brightness; data->led_mc_cdev.led_cdev.flags =3D LED_REJECT_NAME_CONFLICT; data->led_mc_cdev.led_cdev.brightness_set_blocking =3D uniwill_led_bright= ness_set; =20 if (value & LIGHTBAR_S0_OFF) data->led_mc_cdev.led_cdev.brightness =3D 0; else - data->led_mc_cdev.led_cdev.brightness =3D LED_MAX_BRIGHTNESS; + data->led_mc_cdev.led_cdev.brightness =3D max_brightness; =20 for (int i =3D 0; i < LED_CHANNELS; i++) { data->led_mc_subled_info[i].color_index =3D color_indices[i]; @@ -1429,7 +1432,7 @@ static int uniwill_led_init(struct uniwill_data *data) * Make sure that the initial intensity value is not greater than * the maximum brightness. */ - value =3D min(LED_MAX_BRIGHTNESS, value); + value =3D min(max_brightness, value); ret =3D regmap_write(data->regmap, uniwill_led_channel_to_ac_reg[i], val= ue); if (ret < 0) return ret; @@ -1882,6 +1885,7 @@ static int uniwill_probe(struct platform_device *pdev) return ret; =20 data->features =3D device_descriptor.features; + data->lightbar_max_brightness =3D device_descriptor.lightbar_max_brightne= ss; =20 /* * Some devices might need to perform some device-specific initialization= steps @@ -2130,11 +2134,13 @@ static struct platform_driver uniwill_driver =3D { =20 static struct uniwill_device_descriptor lapqc71a_lapqc71b_descriptor __ini= tdata =3D { .features =3D UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_LIGHTBAR | UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT | UNIWILL_FEATURE_CPU_TEMP | UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | UNIWILL_FEATURE_SECONDARY_FAN, + .lightbar_max_brightness =3D 36, }; =20 static struct uniwill_device_descriptor lapac71h_descriptor __initdata =3D= { @@ -2158,6 +2164,7 @@ static struct uniwill_device_descriptor lapkc71f_desc= riptor __initdata =3D { UNIWILL_FEATURE_GPU_TEMP | UNIWILL_FEATURE_PRIMARY_FAN | UNIWILL_FEATURE_SECONDARY_FAN, + .lightbar_max_brightness =3D 200, }; =20 /* --=20 2.43.0 From nobody Wed Jun 17 02:58:38 2026 Received: from mail.tuxedocomputers.com (mail.tuxedocomputers.com [157.90.84.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E3063DD53A; Tue, 21 Apr 2026 20:11:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=157.90.84.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776802279; cv=none; b=hXxktQUxvpsQ46C4eobOKuN/PL+50UJ1BAyd5OMgScwmANiUJByBm5i4rrycTP6K0k5nDY4V7Qmi8QWdqpb8LXCqpYVy9w/71HOMf2oGc52GaevQL5yQC55hfmW9TktQ+imllS1nJQ1NGMvFBTcE3IKRAs6yMtjkRQOiBou1W8k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776802279; c=relaxed/simple; bh=qCbCb0yTbJlaKSVsdtR+FMXXyNsYZ3o4vXKnK/NHzl0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QHfCV09bgmG4SUneHDhS31JIjQNewvbZEkCQC/5vdC4nBJfpEU/S0MeVaQJVDTUJTxZ96sktMTAeCciyIdtDI2fjJImoUeDca6v2GCBn20Vh1MA8x8MUHRauDR3q+XQ6xAdaDMEVYKG2UP2j4kOO8TyF2AB74EK8ay0OAdp0fgQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=tuxedocomputers.com; spf=pass smtp.mailfrom=tuxedocomputers.com; dkim=pass (1024-bit key) header.d=tuxedocomputers.com header.i=@tuxedocomputers.com header.b=e7lE/icL; arc=none smtp.client-ip=157.90.84.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=tuxedocomputers.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxedocomputers.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=tuxedocomputers.com header.i=@tuxedocomputers.com header.b="e7lE/icL" Received: from wse-pc.fritz.box (i5C75F683.versanet.de [92.117.246.131]) (Authenticated sender: wse@tuxedocomputers.com) by mail.tuxedocomputers.com (Postfix) with ESMTPA id 65DEE2FC0226; Tue, 21 Apr 2026 22:11:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxedocomputers.com; s=default; t=1776802269; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dpakQoIyJoSYNr0v6zw1c6XEmfX8aaFSo0XKYFTgz1U=; b=e7lE/icLJjwZbtQkNpE9VYjYoD1uDslbpy1iUDhvFSmnhT1vFEP0fziVwgYPOchGjfkdo4 V1SZfGuehVLvx0vhhAV/1xkZ2e9Zo+q4fmqdQHm74sSV/2vOmTCUPjx9VTUwcjK53LqkKh UrnW5+QP1w3CgBbGDiOYAUbknMAExPw= Authentication-Results: mail.tuxedocomputers.com; auth=pass smtp.auth=wse@tuxedocomputers.com smtp.mailfrom=wse@tuxedocomputers.com From: Werner Sembach To: W_Armin@gmx.de, hansg@kernel.org, ilpo.jarvinen@linux.intel.com Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, Werner Sembach Subject: [RFC PATCH 3/3] platform/x86: uniwill-laptop: Offer support to activate local dimming Date: Tue, 21 Apr 2026 22:01:27 +0200 Message-ID: <20260421201103.142403-4-wse@tuxedocomputers.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260421201103.142403-1-wse@tuxedocomputers.com> References: <20260421201103.142403-1-wse@tuxedocomputers.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This patch adds a sysfs variable local_dimming to supported devices. Setting it to true enables local dimming for the internal notebook display. Currently only TUXEDO Stellaris 16 Gen7 Intel/AMD with mLED displays are supported. Signed-off-by: Werner Sembach --- drivers/platform/x86/uniwill/uniwill-acpi.c | 162 +++++++++++++++++++- 1 file changed, 158 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform= /x86/uniwill/uniwill-acpi.c index 62d56cc67e2e8..909d8608a2f80 100644 --- a/drivers/platform/x86/uniwill/uniwill-acpi.c +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c @@ -275,6 +275,9 @@ #define EC_ADDR_USB_C_POWER_PRIORITY 0x07CC #define USB_C_POWER_PRIORITY BIT(7) =20 +#define EC_ADDR_LOCAL_DIMMING_SUPPORT 0x0D4F +#define LOCAL_DIMMING_SUPPORT BIT(0) + /* Same bits as EC_ADDR_LIGHTBAR_AC_CTRL except LIGHTBAR_S3_OFF */ #define EC_ADDR_LIGHTBAR_BAT_CTRL 0x07E2 =20 @@ -296,6 +299,14 @@ =20 #define EC_ADDR_GPU_FAN_SPEED_TABLE 0x0F50 =20 +#define WMI_GUID_BC "ABBC0F6F-8EA1-11D1-00A0-C90629100000" +#define WMI_DEFAULT_INSTANCE 0x00 +#define WMI_DEFAULT_METHOD 0x04 + +#define WMI_FUNC_SET_FEATURE 0x00000500 +#define WMI_FEATURE_LOCAL_DIMMING_OFF 0x0d +#define WMI_FEATURE_LOCAL_DIMMING_ON 0x0e + /* * Those two registers technically allow for manual fan control, * but are unstable on some models and are likely not meant to @@ -332,6 +343,7 @@ #define UNIWILL_FEATURE_SECONDARY_FAN BIT(9) #define UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL BIT(10) #define UNIWILL_FEATURE_USB_C_POWER_PRIORITY BIT(11) +#define UNIWILL_FEATURE_LOCAL_DIMMING BIT(12) =20 enum usb_c_power_priority_options { USB_C_POWER_PRIORITY_CHARGING =3D 0, @@ -367,6 +379,8 @@ struct uniwill_data { struct notifier_block nb; struct mutex usb_c_power_priority_lock; /* Protects dependent bit write a= nd state safe */ enum usb_c_power_priority_options last_usb_c_power_priority_option; + struct mutex local_dimming_lock; /* Protects call to local dimming wmi me= thod */ + bool last_local_dimming_option; }; =20 struct uniwill_battery_entry { @@ -774,7 +788,7 @@ static int super_key_enable_init(struct uniwill_data *d= ata) if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY)) return 0; =20 - return devm_mutex_init(&data->dev, &data->super_key_lock); + return devm_mutex_init(data->dev, &data->super_key_lock); } =20 static int uniwill_write_touchpad_toggle_enable(struct uniwill_data *data,= bool status) @@ -1086,6 +1100,87 @@ static int usb_c_power_priority_init(struct uniwill_= data *data) return 0; } =20 +struct __packed uniwill_wmi_input { + u8 args[4]; + u32 function; + /* Prevent accidential out of bounds access by the ACPI code */ + u32 reserved[8]; +}; + +static int set_local_dimming(bool enable) +{ + struct __packed uniwill_wmi_input wmi_input; + struct acpi_buffer wmi_buf =3D { (acpi_size) sizeof(wmi_input), &wmi_inpu= t }; + acpi_status status; + + wmi_input.function =3D WMI_FUNC_SET_FEATURE; + wmi_input.args[0] =3D enable ? WMI_FEATURE_LOCAL_DIMMING_ON : WMI_FEATURE= _LOCAL_DIMMING_OFF; + + status =3D wmi_evaluate_method(WMI_GUID_BC, WMI_DEFAULT_INSTANCE, WMI_DEF= AULT_METHOD, + &wmi_buf, &wmi_buf); + if (ACPI_FAILURE(status)) + return -EIO; + + return 0; +} + +static ssize_t local_dimming_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct uniwill_data *data =3D dev_get_drvdata(dev); + bool enable; + int ret; + + ret =3D kstrtobool(buf, &enable); + if (ret < 0) + return ret; + + guard(mutex)(&data->local_dimming_lock); + + ret =3D set_local_dimming(enable); + if (ret) + return ret; + + data->last_local_dimming_option =3D enable; + + return count; +} + +static ssize_t local_dimming_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct uniwill_data *data =3D dev_get_drvdata(dev); + + return sysfs_emit(buf, "%d\n", data->last_local_dimming_option); +} + +static DEVICE_ATTR_RW(local_dimming); + +static int local_dimming_restore(struct uniwill_data *data) +{ + guard(mutex)(&data->local_dimming_lock); + + return set_local_dimming(data->last_local_dimming_option); +} + +static int local_dimming_init(struct uniwill_data *data) +{ + int ret; + + if (!uniwill_device_supports(data, UNIWILL_FEATURE_LOCAL_DIMMING)) + return 0; + + ret =3D devm_mutex_init(data->dev, &data->local_dimming_lock); + if (ret < 0) + return ret; + + data->last_local_dimming_option =3D 0; + + return local_dimming_restore(data); +} + static struct attribute *uniwill_attrs[] =3D { /* Keyboard-related */ &dev_attr_fn_lock.attr, @@ -1097,6 +1192,7 @@ static struct attribute *uniwill_attrs[] =3D { /* Power-management-related */ &dev_attr_ctgp_offset.attr, &dev_attr_usb_c_power_priority.attr, + &dev_attr_local_dimming.attr, NULL }; =20 @@ -1136,6 +1232,11 @@ static umode_t uniwill_attr_is_visible(struct kobjec= t *kobj, struct attribute *a return attr->mode; } =20 + if (attr =3D=3D &dev_attr_local_dimming.attr) { + if (uniwill_device_supports(data, UNIWILL_FEATURE_LOCAL_DIMMING)) + return attr->mode; + } + return 0; } =20 @@ -1922,6 +2023,10 @@ static int uniwill_probe(struct platform_device *pde= v) if (ret < 0) return ret; =20 + ret =3D local_dimming_init(data); + if (ret < 0) + return ret; + return uniwill_input_init(data); } =20 @@ -2075,6 +2180,14 @@ static int uniwill_resume_usb_c_power_priority(struc= t uniwill_data *data) return usb_c_power_priority_restore(data); } =20 +static int uniwill_resume_local_dimming(struct uniwill_data *data) +{ + if (!uniwill_device_supports(data, UNIWILL_FEATURE_LOCAL_DIMMING)) + return 0; + + return local_dimming_restore(data); +} + static int uniwill_resume(struct device *dev) { struct uniwill_data *data =3D dev_get_drvdata(dev); @@ -2106,7 +2219,11 @@ static int uniwill_resume(struct device *dev) if (ret < 0) return ret; =20 - return uniwill_resume_usb_c_power_priority(data); + ret =3D uniwill_resume_usb_c_power_priority(data); + if (ret < 0) + return ret; + + return uniwill_resume_local_dimming(data); } =20 static DEFINE_SIMPLE_DEV_PM_OPS(uniwill_pm_ops, uniwill_suspend, uniwill_r= esume); @@ -2222,6 +2339,17 @@ static struct uniwill_device_descriptor tux_features= et_3_nvidia_descriptor __ini UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL, }; =20 +static struct uniwill_device_descriptor tux_featureset_3_nvidia_mled_descr= iptor __initdata =3D { + .features =3D UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_GPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN | + UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL | + UNIWILL_FEATURE_LOCAL_DIMMING, +}; + static int phxtxx1_probe(struct uniwill_data *data) { unsigned int value; @@ -2272,6 +2400,32 @@ static struct uniwill_device_descriptor phxarx1_phxa= qf1_descriptor __initdata =3D .probe =3D phxarx1_phxaqf1_probe, }; =20 +static int x6fr5xxy_probe(struct uniwill_data *data) +{ + unsigned int value; + int ret; + + ret =3D regmap_read(data->regmap, EC_ADDR_LOCAL_DIMMING_SUPPORT, &value); + if (ret < 0) + return ret; + + if (value !=3D 0xff && value & LOCAL_DIMMING_SUPPORT) + data->features |=3D UNIWILL_FEATURE_LOCAL_DIMMING; + + return 0; +}; + +static struct uniwill_device_descriptor x6fr5xxy_descriptor __initdata =3D= { + .features =3D UNIWILL_FEATURE_FN_LOCK | + UNIWILL_FEATURE_SUPER_KEY | + UNIWILL_FEATURE_CPU_TEMP | + UNIWILL_FEATURE_GPU_TEMP | + UNIWILL_FEATURE_PRIMARY_FAN | + UNIWILL_FEATURE_SECONDARY_FAN | + UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL, + .probe =3D x6fr5xxy_probe, +}; + static struct uniwill_device_descriptor pf5pu1g_descriptor __initdata =3D { .features =3D UNIWILL_FEATURE_FN_LOCK | UNIWILL_FEATURE_SUPER_KEY | @@ -2662,7 +2816,7 @@ static const struct dmi_system_id uniwill_dmi_table[]= __initconst =3D { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6FR5xxY"), }, - .driver_data =3D &tux_featureset_3_nvidia_descriptor, + .driver_data =3D &x6fr5xxy_descriptor, }, { .ident =3D "TUXEDO Stellaris 16 Gen7 Intel", @@ -2678,7 +2832,7 @@ static const struct dmi_system_id uniwill_dmi_table[]= __initconst =3D { DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"), DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY_mLED"), }, - .driver_data =3D &tux_featureset_3_nvidia_descriptor, + .driver_data =3D &tux_featureset_3_nvidia_mled_descriptor, }, { .ident =3D "TUXEDO Book BA15 Gen10 AMD", --=20 2.43.0