mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards
@ 2026-07-24 23:00 Werner Sembach
  2026-07-24 23:00 ` [PATCH 2/2] platform/x86: uniwill-laptop: Enable kb backlight and lightbar for TUXEDO Werner Sembach
  2026-07-25 14:44 ` [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards Armin Wolf
  0 siblings, 2 replies; 5+ messages in thread
From: Werner Sembach @ 2026-07-24 23:00 UTC (permalink / raw)
  To: Armin Wolf, Hans de Goede, Ilpo Järvinen
  Cc: Werner Sembach, platform-driver-x86, linux-kernel

The devices with 3 brightness level keyboards seem to send
UNIWILL_OSD_KB_LED_LEVEL0, UNIWILL_OSD_KB_LED_LEVEL2, and
UNIWILL_OSD_KB_LED_LEVEL4 and not UNIWILL_OSD_KB_LED_LEVEL0,
UNIWILL_OSD_KB_LED_LEVEL1, and UNIWILL_OSD_KB_LED_LEVEL2 so this patch does
not return the brightness based on one of these events, but the brightness
read from hardware.

Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
---
 drivers/platform/x86/uniwill/uniwill-acpi.c | 22 +++------------------
 1 file changed, 3 insertions(+), 19 deletions(-)

diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
index 7a2eeaec4c961..d9a33be4f4a37 100644
--- a/drivers/platform/x86/uniwill/uniwill-acpi.c
+++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
@@ -1626,7 +1626,7 @@ static int uniwill_led_init(struct uniwill_data *data)
 							 &init_data);
 }
 
-static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightness)
+static int uniwill_notify_kbd_led(struct uniwill_data *data)
 {
 	struct led_classdev *led_cdev;
 	int ret;
@@ -1643,7 +1643,7 @@ static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightness)
 	if (ret < 0)
 		return ret;
 
-	led_classdev_notify_brightness_hw_changed(led_cdev, brightness);
+	led_classdev_notify_brightness_hw_changed(led_cdev, led_cdev->brightness);
 
 	return 0;
 }
@@ -2215,30 +2215,14 @@ static int uniwill_notifier_call(struct notifier_block *nb, unsigned long action
 
 		return NOTIFY_OK;
 	case UNIWILL_OSD_KB_LED_LEVEL0:
-		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
-			return NOTIFY_DONE;
-
-		return notifier_from_errno(uniwill_notify_kbd_led(data, 0));
 	case UNIWILL_OSD_KB_LED_LEVEL1:
-		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
-			return NOTIFY_DONE;
-
-		return notifier_from_errno(uniwill_notify_kbd_led(data, 1));
 	case UNIWILL_OSD_KB_LED_LEVEL2:
-		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
-			return NOTIFY_DONE;
-
-		return notifier_from_errno(uniwill_notify_kbd_led(data, 2));
 	case UNIWILL_OSD_KB_LED_LEVEL3:
-		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
-			return NOTIFY_DONE;
-
-		return notifier_from_errno(uniwill_notify_kbd_led(data, 3));
 	case UNIWILL_OSD_KB_LED_LEVEL4:
 		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
 			return NOTIFY_DONE;
 
-		return notifier_from_errno(uniwill_notify_kbd_led(data, 4));
+		return notifier_from_errno(uniwill_notify_kbd_led(data));
 	default:
 		mutex_lock(&data->input_lock);
 		sparse_keymap_report_event(data->input_device, action, 1, true);

base-commit: caf8342512c3056005f475d350eeca089c3c6623
-- 
2.43.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/2] platform/x86: uniwill-laptop: Enable kb backlight and lightbar for TUXEDO
  2026-07-24 23:00 [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards Werner Sembach
@ 2026-07-24 23:00 ` Werner Sembach
  2026-07-25 14:47   ` Armin Wolf
  2026-07-25 14:44 ` [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards Armin Wolf
  1 sibling, 1 reply; 5+ messages in thread
From: Werner Sembach @ 2026-07-24 23:00 UTC (permalink / raw)
  To: Armin Wolf, Hans de Goede, Ilpo Järvinen
  Cc: Werner Sembach, platform-driver-x86, linux-kernel

Enable EC controlled keyboard backlight across the board for TUXEDO
devices.

This has split up the device descriptors even more, so the "featureset"
naming scheme was dropped in favor of a "generalized board_name" naming
scheme.

Also Stellaris and Polaris Gen3 are now identified by product_sku to split
them up.

Also some TUXEDO devices with lightbar still had the support missing. This
patch completes the list in this point.

Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
---
 drivers/platform/x86/uniwill/uniwill-acpi.c | 309 +++++++++++++++-----
 1 file changed, 233 insertions(+), 76 deletions(-)

diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
index d9a33be4f4a37..e81ccfa39039e 100644
--- a/drivers/platform/x86/uniwill/uniwill-acpi.c
+++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
@@ -645,6 +645,7 @@ static bool uniwill_readable_reg(struct device *dev, unsigned int reg)
 	case EC_ADDR_BIOS_OEM:
 	case EC_ADDR_PWM_1:
 	case EC_ADDR_PWM_2:
+	case EC_ADDR_SUPPORT_1:
 	case EC_ADDR_SUPPORT_2:
 	case EC_ADDR_TRIGGER:
 	case EC_ADDR_SWITCH_STATUS:
@@ -684,6 +685,7 @@ static bool uniwill_volatile_reg(struct device *dev, unsigned int reg)
 	case EC_ADDR_BIOS_OEM:
 	case EC_ADDR_PWM_1:
 	case EC_ADDR_PWM_2:
+	case EC_ADDR_SUPPORT_1:
 	case EC_ADDR_SUPPORT_2:
 	case EC_ADDR_TRIGGER:
 	case EC_ADDR_SWITCH_STATUS:
@@ -2696,35 +2698,47 @@ static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = {
 	.lightbar_max_brightness = 200,
 };
 
-/*
- * The featuresets below reflect somewhat chronological changes:
- * 1 -> 2: UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL is added to the EC firmware.
- * 2 -> 3: UNIWILL_FEATURE_USB_C_POWER_PRIORITY is removed from the EC firmware.
- * Some devices might divert from this timeline.
- */
+static struct uniwill_device_descriptor pfxnuxx_pfxluxx_phxprxx_descriptor __initdata = {
+	.features = UNIWILL_FEATURE_FN_LOCK |
+		    UNIWILL_FEATURE_SUPER_KEY |
+		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
+		    UNIWILL_FEATURE_CPU_TEMP |
+		    UNIWILL_FEATURE_PRIMARY_FAN |
+		    UNIWILL_FEATURE_SECONDARY_FAN |
+		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = true,
+	.kbd_led_max_brightness = 2,
+};
 
-static struct uniwill_device_descriptor tux_featureset_1_descriptor __initdata = {
+static struct uniwill_device_descriptor gkxmrxx_gkxnpxx_gkxnrxx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
 		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
 		    UNIWILL_FEATURE_CPU_TEMP |
+		    UNIWILL_FEATURE_GPU_TEMP |
 		    UNIWILL_FEATURE_PRIMARY_FAN |
 		    UNIWILL_FEATURE_SECONDARY_FAN |
-		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
+		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = false,
+	.kbd_led_max_brightness = 4,
 };
 
-static struct uniwill_device_descriptor tux_featureset_1_nvidia_descriptor __initdata = {
+static struct uniwill_device_descriptor gmxmpxx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
+		    UNIWILL_FEATURE_LIGHTBAR |
 		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
 		    UNIWILL_FEATURE_CPU_TEMP |
 		    UNIWILL_FEATURE_GPU_TEMP |
 		    UNIWILL_FEATURE_PRIMARY_FAN |
 		    UNIWILL_FEATURE_SECONDARY_FAN |
 		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
+	.lightbar_max_brightness = 36,
 };
 
-static struct uniwill_device_descriptor tux_featureset_2_nvidia_descriptor __initdata = {
+static struct uniwill_device_descriptor phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
 		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
@@ -2733,10 +2747,109 @@ static struct uniwill_device_descriptor tux_featureset_2_nvidia_descriptor __ini
 		    UNIWILL_FEATURE_PRIMARY_FAN |
 		    UNIWILL_FEATURE_SECONDARY_FAN |
 		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
+		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = true,
+	.kbd_led_max_brightness = 2,
+};
+
+static struct uniwill_device_descriptor gmxmgxx_gmxngxx_gmxxgxx_descriptor __initdata = {
+	.features = UNIWILL_FEATURE_FN_LOCK |
+		    UNIWILL_FEATURE_SUPER_KEY |
+		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
+		    UNIWILL_FEATURE_CPU_TEMP |
+		    UNIWILL_FEATURE_GPU_TEMP |
+		    UNIWILL_FEATURE_PRIMARY_FAN |
+		    UNIWILL_FEATURE_SECONDARY_FAN |
+		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
+		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = false,
+	.kbd_led_max_brightness = 4,
+};
+
+static struct uniwill_device_descriptor gmxzgxx_gmxtgxx_pol_descriptor __initdata = {
+	.features = UNIWILL_FEATURE_FN_LOCK |
+		    UNIWILL_FEATURE_SUPER_KEY |
+		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
+		    UNIWILL_FEATURE_CPU_TEMP |
+		    UNIWILL_FEATURE_GPU_TEMP |
+		    UNIWILL_FEATURE_PRIMARY_FAN |
+		    UNIWILL_FEATURE_SECONDARY_FAN |
+		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
+		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = false,
+	.kbd_led_max_brightness = 4,
+};
+
+static struct uniwill_device_descriptor gmxzgxx_gmxtgxx_ste_descriptor __initdata = {
+	.features = UNIWILL_FEATURE_FN_LOCK |
+		    UNIWILL_FEATURE_SUPER_KEY |
+		    UNIWILL_FEATURE_LIGHTBAR |
+		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
+		    UNIWILL_FEATURE_CPU_TEMP |
+		    UNIWILL_FEATURE_GPU_TEMP |
+		    UNIWILL_FEATURE_PRIMARY_FAN |
+		    UNIWILL_FEATURE_SECONDARY_FAN |
+		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
 		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
+	.lightbar_max_brightness = 36,
 };
 
-static struct uniwill_device_descriptor tux_featureset_3_nvidia_descriptor __initdata = {
+static int gmxrgxx_probe(struct uniwill_data *data)
+{
+	unsigned int value;
+	int ret;
+
+	ret = regmap_read(data->regmap, EC_ADDR_SUPPORT_1, &value);
+	if (ret < 0)
+		return ret;
+
+	if (value & LIGHTBAR) {
+		data->features |= UNIWILL_FEATURE_LIGHTBAR;
+		data->lightbar_max_brightness = 36;
+	}
+
+	ret = regmap_read(data->regmap, EC_ADDR_SUPPORT_2, &value);
+	if (ret < 0)
+		return ret;
+
+	if (value & RGB_KEYBOARD) {
+		data->features |= UNIWILL_FEATURE_KEYBOARD_BACKLIGHT;
+		data->kbd_led_single_color = false;
+		data->kbd_led_max_brightness = 4;
+	}
+
+	return 0;
+};
+
+static struct uniwill_device_descriptor gmxrgxx_descriptor __initdata = {
+	.features = UNIWILL_FEATURE_FN_LOCK |
+		    UNIWILL_FEATURE_SUPER_KEY |
+		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
+		    UNIWILL_FEATURE_CPU_TEMP |
+		    UNIWILL_FEATURE_GPU_TEMP |
+		    UNIWILL_FEATURE_PRIMARY_FAN |
+		    UNIWILL_FEATURE_SECONDARY_FAN |
+		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL,
+	.probe = gmxrgxx_probe,
+};
+
+static struct uniwill_device_descriptor gmxagxx_descriptor __initdata = {
+	.features = UNIWILL_FEATURE_FN_LOCK |
+		    UNIWILL_FEATURE_SUPER_KEY |
+		    UNIWILL_FEATURE_LIGHTBAR |
+		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
+		    UNIWILL_FEATURE_CPU_TEMP |
+		    UNIWILL_FEATURE_GPU_TEMP |
+		    UNIWILL_FEATURE_PRIMARY_FAN |
+		    UNIWILL_FEATURE_SECONDARY_FAN |
+		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL,
+	.lightbar_max_brightness = 36,
+};
+
+static struct uniwill_device_descriptor gmxxgxx_gmxpxxx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
 		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
@@ -2747,7 +2860,7 @@ static struct uniwill_device_descriptor tux_featureset_3_nvidia_descriptor __ini
 		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL,
 };
 
-static struct uniwill_device_descriptor tux_featureset_4_descriptor __initdata = {
+static struct uniwill_device_descriptor gxxhrxx_gxxmrxx_xxxx4nxx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
 		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
@@ -2755,10 +2868,29 @@ static struct uniwill_device_descriptor tux_featureset_4_descriptor __initdata =
 		    UNIWILL_FEATURE_PRIMARY_FAN |
 		    UNIWILL_FEATURE_SECONDARY_FAN |
 		    UNIWILL_FEATURE_AC_AUTO_BOOT |
-		    UNIWILL_FEATURE_USB_POWERSHARE,
+		    UNIWILL_FEATURE_USB_POWERSHARE |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = true,
+	.kbd_led_max_brightness = 4,
 };
 
-static struct uniwill_device_descriptor tux_featureset_4_nvidia_descriptor __initdata = {
+static struct uniwill_device_descriptor gmxhgxx_descriptor __initdata = {
+	.features = UNIWILL_FEATURE_FN_LOCK |
+		    UNIWILL_FEATURE_SUPER_KEY |
+		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
+		    UNIWILL_FEATURE_CPU_TEMP |
+		    UNIWILL_FEATURE_GPU_TEMP |
+		    UNIWILL_FEATURE_PRIMARY_FAN |
+		    UNIWILL_FEATURE_SECONDARY_FAN |
+		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
+		    UNIWILL_FEATURE_AC_AUTO_BOOT |
+		    UNIWILL_FEATURE_USB_POWERSHARE |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = false,
+	.kbd_led_max_brightness = 4,
+};
+
+static struct uniwill_device_descriptor gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
 		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
@@ -2771,7 +2903,7 @@ static struct uniwill_device_descriptor tux_featureset_4_nvidia_descriptor __ini
 		    UNIWILL_FEATURE_USB_POWERSHARE,
 };
 
-static int phxtxx1_probe(struct uniwill_data *data)
+static int phxtuxx_phxtrxx_probe(struct uniwill_data *data)
 {
 	unsigned int value;
 	int ret;
@@ -2786,17 +2918,20 @@ static int phxtxx1_probe(struct uniwill_data *data)
 	return 0;
 };
 
-static struct uniwill_device_descriptor phxtxx1_descriptor __initdata = {
+static struct uniwill_device_descriptor phxtuxx_phxtrxx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
 		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
 		    UNIWILL_FEATURE_CPU_TEMP |
 		    UNIWILL_FEATURE_PRIMARY_FAN |
-		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
-	.probe = phxtxx1_probe,
+		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = true,
+	.kbd_led_max_brightness = 2,
+	.probe = phxtuxx_phxtrxx_probe,
 };
 
-static int phxarx1_phxaqf1_probe(struct uniwill_data *data)
+static int phxarxx_phxaqxx_probe(struct uniwill_data *data)
 {
 	unsigned int value;
 	int ret;
@@ -2812,22 +2947,28 @@ static int phxarx1_phxaqf1_probe(struct uniwill_data *data)
 	return 0;
 };
 
-static struct uniwill_device_descriptor phxarx1_phxaqf1_descriptor __initdata = {
+static struct uniwill_device_descriptor phxarxx_phxaqxx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
 		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
 		    UNIWILL_FEATURE_CPU_TEMP |
 		    UNIWILL_FEATURE_PRIMARY_FAN |
 		    UNIWILL_FEATURE_SECONDARY_FAN |
-		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
-	.probe = phxarx1_phxaqf1_probe,
+		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = true,
+	.kbd_led_max_brightness = 2,
+	.probe = phxarxx_phxaqxx_probe,
 };
 
-static struct uniwill_device_descriptor pf5pu1g_descriptor __initdata = {
+static struct uniwill_device_descriptor pfxpuxx_descriptor __initdata = {
 	.features = UNIWILL_FEATURE_FN_LOCK |
 		    UNIWILL_FEATURE_SUPER_KEY |
 		    UNIWILL_FEATURE_CPU_TEMP |
-		    UNIWILL_FEATURE_PRIMARY_FAN,
+		    UNIWILL_FEATURE_PRIMARY_FAN |
+		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
+	.kbd_led_single_color = true,
+	.kbd_led_max_brightness = 2,
 };
 
 static struct uniwill_device_descriptor x4sp4nal_descriptor __initdata = {
@@ -2922,7 +3063,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTxX1"),
 		},
-		.driver_data = &phxtxx1_descriptor,
+		.driver_data = &phxtuxx_phxtrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 14 Gen6 Intel",
@@ -2930,7 +3071,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTQx1"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 14/16 Gen7 Intel",
@@ -2938,7 +3079,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxARX1_PHxAQF1"),
 		},
-		.driver_data = &phxarx1_phxaqf1_descriptor,
+		.driver_data = &phxarxx_phxaqxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 16 Gen7 Intel/Commodore Omnia-Book Pro Gen 7",
@@ -2946,7 +3087,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6AG01_PH6AQ71_PH6AQI1"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 14/16 Gen8 Intel/Commodore Omnia-Book Pro Gen 8",
@@ -2954,7 +3095,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PRX1_PH6PRX1"),
 		},
-		.driver_data = &tux_featureset_1_descriptor,
+		.driver_data = &pfxnuxx_pfxluxx_phxprxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 14 Gen8 Intel/Commodore Omnia-Book Pro Gen 8",
@@ -2962,7 +3103,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PG31"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 16 Gen8 Intel",
@@ -2970,7 +3111,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6PG01_PH6PG71"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 14/15 Gen9 AMD",
@@ -2978,7 +3119,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GXxHRXx"),
 		},
-		.driver_data = &tux_featureset_4_descriptor,
+		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 14/15 Gen9 Intel/Commodore Omnia-Book 15 Gen9",
@@ -2986,7 +3127,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GXxMRXx"),
 		},
-		.driver_data = &tux_featureset_4_descriptor,
+		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 14/15 Gen10 AMD",
@@ -2994,7 +3135,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxHP4NAx"),
 		},
-		.driver_data = &tux_featureset_4_descriptor,
+		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 14/15 Gen10 AMD",
@@ -3002,7 +3143,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxKK4NAx_XxSP4NAx"),
 		},
-		.driver_data = &tux_featureset_4_descriptor,
+		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Pro 15 Gen10 Intel",
@@ -3010,7 +3151,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxAR4NAx"),
 		},
-		.driver_data = &tux_featureset_4_descriptor,
+		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Max 15 Gen10 AMD",
@@ -3018,7 +3159,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X5KK45xS_X5SP45xS"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Max 16 Gen10 AMD",
@@ -3026,7 +3167,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6HP45xU"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Max 16 Gen10 AMD",
@@ -3034,7 +3175,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6KK45xU_X6SP45xU"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Max 15 Gen10 Intel",
@@ -3042,7 +3183,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X5AR45xS"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO InfinityBook Max 16 Gen10 Intel",
@@ -3050,7 +3191,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR55xU"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 15 Gen1 AMD",
@@ -3058,7 +3199,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501A1650TI"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 15 Gen1 AMD",
@@ -3066,7 +3207,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501A2060"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 17 Gen1 AMD",
@@ -3074,7 +3215,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701A1650TI"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 17 Gen1 AMD",
@@ -3082,7 +3223,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701A2060"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 15 Gen1 Intel",
@@ -3090,7 +3231,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501I1650TI"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 15 Gen1 Intel",
@@ -3098,7 +3239,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501I2060"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 17 Gen1 Intel",
@@ -3106,7 +3247,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701I1650TI"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 17 Gen1 Intel",
@@ -3114,7 +3255,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701I2060"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Trinity 15 Intel Gen1",
@@ -3122,7 +3263,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "TRINITY1501I"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gmxmpxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Trinity 17 Intel Gen1",
@@ -3130,7 +3271,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "TRINITY1701I"),
 		},
-		.driver_data = &tux_featureset_1_nvidia_descriptor,
+		.driver_data = &gmxmpxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 15/17 Gen2 AMD",
@@ -3138,7 +3279,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxMGxx"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &gmxmgxx_gmxngxx_gmxxgxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 15/17 Gen2 Intel",
@@ -3146,23 +3287,39 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxNGxx"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &gmxmgxx_gmxngxx_gmxxgxx_descriptor,
+	},
+	{
+		.ident = "TUXEDO Polaris 15/17 Gen3 AMD",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "POLARIS1XA03"),
+		},
+		.driver_data = &gmxzgxx_gmxtgxx_pol_descriptor,
+	},
+	{
+		.ident = "TUXEDO Polaris 15/17 Gen3 Intel",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "POLARIS1XI03"),
+		},
+		.driver_data = &gmxzgxx_gmxtgxx_pol_descriptor,
 	},
 	{
-		.ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 AMD",
+		.ident = "TUXEDO Stellaris 15/17 Gen3 AMD",
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
-			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxZGxx"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "STELLARIS1XA03"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &gmxzgxx_gmxtgxx_ste_descriptor,
 	},
 	{
-		.ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 Intel",
+		.ident = "TUXEDO Stellaris 15/17 Gen3 Intel",
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
-			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxTGxx"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "STELLARIS1XI03"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &gmxzgxx_gmxtgxx_ste_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris/Polaris 15/17 Gen4 AMD",
@@ -3170,7 +3327,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxRGxx"),
 		},
-		.driver_data = &tux_featureset_3_nvidia_descriptor,
+		.driver_data = &gmxrgxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 15 Gen4 Intel",
@@ -3178,7 +3335,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxAGxx"),
 		},
-		.driver_data = &tux_featureset_3_nvidia_descriptor,
+		.driver_data = &gmxagxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Polaris 15/17 Gen5 AMD",
@@ -3186,7 +3343,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxXGxx"),
 		},
-		.driver_data = &tux_featureset_2_nvidia_descriptor,
+		.driver_data = &gmxmgxx_gmxngxx_gmxxgxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 16 Gen5 AMD",
@@ -3194,7 +3351,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6XGxX"),
 		},
-		.driver_data = &tux_featureset_3_nvidia_descriptor,
+		.driver_data = &gmxxgxx_gmxpxxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 16/17 Gen5 Intel/Commodore ORION Gen 5",
@@ -3202,7 +3359,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxPXxx"),
 		},
-		.driver_data = &tux_featureset_3_nvidia_descriptor,
+		.driver_data = &gmxxgxx_gmxpxxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris Slim 15 Gen6 AMD",
@@ -3210,7 +3367,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxHGxx"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxhgxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris Slim 15 Gen6 Intel/Commodore ORION Slim 15 Gen6",
@@ -3218,7 +3375,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM5IXxA"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6",
@@ -3226,7 +3383,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB1"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6",
@@ -3234,7 +3391,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB2"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 17 Gen6 Intel/Commodore ORION 17 Gen6",
@@ -3242,7 +3399,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM7IXxN"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 16 Gen7 AMD",
@@ -3250,7 +3407,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6FR5xxY"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 16 Gen7 Intel",
@@ -3258,7 +3415,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Stellaris 16 Gen7 Intel",
@@ -3266,7 +3423,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY_mLED"),
 		},
-		.driver_data = &tux_featureset_4_nvidia_descriptor,
+		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Book BA15 Gen10 AMD",
@@ -3274,7 +3431,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PF5PU1G"),
 		},
-		.driver_data = &pf5pu1g_descriptor,
+		.driver_data = &pfxpuxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Pulse 14 Gen1 AMD",
@@ -3282,7 +3439,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PULSE1401"),
 		},
-		.driver_data = &tux_featureset_1_descriptor,
+		.driver_data = &pfxnuxx_pfxluxx_phxprxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Pulse 15 Gen1 AMD",
@@ -3290,7 +3447,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PULSE1501"),
 		},
-		.driver_data = &tux_featureset_1_descriptor,
+		.driver_data = &pfxnuxx_pfxluxx_phxprxx_descriptor,
 	},
 	{
 		.ident = "TUXEDO Pulse 15 Gen2 AMD",
@@ -3298,7 +3455,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
 			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
 			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PF5LUXG"),
 		},
-		.driver_data = &tux_featureset_1_descriptor,
+		.driver_data = &pfxnuxx_pfxluxx_phxprxx_descriptor,
 	},
 	{ }
 };
-- 
2.43.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards
  2026-07-24 23:00 [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards Werner Sembach
  2026-07-24 23:00 ` [PATCH 2/2] platform/x86: uniwill-laptop: Enable kb backlight and lightbar for TUXEDO Werner Sembach
@ 2026-07-25 14:44 ` Armin Wolf
  2026-08-05 21:47   ` Werner Sembach
  1 sibling, 1 reply; 5+ messages in thread
From: Armin Wolf @ 2026-07-25 14:44 UTC (permalink / raw)
  To: Werner Sembach, Hans de Goede, Ilpo Järvinen
  Cc: platform-driver-x86, linux-kernel

Am 25.07.26 um 01:00 schrieb Werner Sembach:

> The devices with 3 brightness level keyboards seem to send
> UNIWILL_OSD_KB_LED_LEVEL0, UNIWILL_OSD_KB_LED_LEVEL2, and
> UNIWILL_OSD_KB_LED_LEVEL4 and not UNIWILL_OSD_KB_LED_LEVEL0,
> UNIWILL_OSD_KB_LED_LEVEL1, and UNIWILL_OSD_KB_LED_LEVEL2 so this patch does
> not return the brightness based on one of these events, but the brightness
> read from hardware.
>
> Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
> ---
>   drivers/platform/x86/uniwill/uniwill-acpi.c | 22 +++------------------
>   1 file changed, 3 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
> index 7a2eeaec4c961..d9a33be4f4a37 100644
> --- a/drivers/platform/x86/uniwill/uniwill-acpi.c
> +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
> @@ -1626,7 +1626,7 @@ static int uniwill_led_init(struct uniwill_data *data)
>   							 &init_data);
>   }
>   
> -static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightness)
> +static int uniwill_notify_kbd_led(struct uniwill_data *data)
>   {
>   	struct led_classdev *led_cdev;
>   	int ret;
> @@ -1643,7 +1643,7 @@ static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightness)
>   	if (ret < 0)
>   		return ret;
>   
> -	led_classdev_notify_brightness_hw_changed(led_cdev, brightness);
> +	led_classdev_notify_brightness_hw_changed(led_cdev, led_cdev->brightness);

WMI events are usually delivered with a large latency, a userspace application could
have changed the LED brightness value in the meantime.

Please check the maximum keyboard backlight brightness inside uniwill_notify_kbd_led()
and translate the brightness values instead:

/* Comment here */
switch (data->kbd_led_max_brightness) {
case 4:
	break;
case 2:
	switch (brightness) {
	case 0:
		break;
	case 2:
		brightness = 1;
		break;
	case 4:
		brightness = 2;
		break;
	default:
		return -EINVAL;
	}
	break;
default:
	return -EINVAL;
}

Thanks,
Armin Wolf

>   
>   	return 0;
>   }
> @@ -2215,30 +2215,14 @@ static int uniwill_notifier_call(struct notifier_block *nb, unsigned long action
>   
>   		return NOTIFY_OK;
>   	case UNIWILL_OSD_KB_LED_LEVEL0:
> -		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
> -			return NOTIFY_DONE;
> -
> -		return notifier_from_errno(uniwill_notify_kbd_led(data, 0));
>   	case UNIWILL_OSD_KB_LED_LEVEL1:
> -		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
> -			return NOTIFY_DONE;
> -
> -		return notifier_from_errno(uniwill_notify_kbd_led(data, 1));
>   	case UNIWILL_OSD_KB_LED_LEVEL2:
> -		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
> -			return NOTIFY_DONE;
> -
> -		return notifier_from_errno(uniwill_notify_kbd_led(data, 2));
>   	case UNIWILL_OSD_KB_LED_LEVEL3:
> -		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
> -			return NOTIFY_DONE;
> -
> -		return notifier_from_errno(uniwill_notify_kbd_led(data, 3));
>   	case UNIWILL_OSD_KB_LED_LEVEL4:
>   		if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
>   			return NOTIFY_DONE;
>   
> -		return notifier_from_errno(uniwill_notify_kbd_led(data, 4));
> +		return notifier_from_errno(uniwill_notify_kbd_led(data));
>   	default:
>   		mutex_lock(&data->input_lock);
>   		sparse_keymap_report_event(data->input_device, action, 1, true);
>
> base-commit: caf8342512c3056005f475d350eeca089c3c6623

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] platform/x86: uniwill-laptop: Enable kb backlight and lightbar for TUXEDO
  2026-07-24 23:00 ` [PATCH 2/2] platform/x86: uniwill-laptop: Enable kb backlight and lightbar for TUXEDO Werner Sembach
@ 2026-07-25 14:47   ` Armin Wolf
  0 siblings, 0 replies; 5+ messages in thread
From: Armin Wolf @ 2026-07-25 14:47 UTC (permalink / raw)
  To: Werner Sembach, Hans de Goede, Ilpo Järvinen
  Cc: platform-driver-x86, linux-kernel

Am 25.07.26 um 01:00 schrieb Werner Sembach:

> Enable EC controlled keyboard backlight across the board for TUXEDO
> devices.
>
> This has split up the device descriptors even more, so the "featureset"
> naming scheme was dropped in favor of a "generalized board_name" naming
> scheme.
>
> Also Stellaris and Polaris Gen3 are now identified by product_sku to split
> them up.
>
> Also some TUXEDO devices with lightbar still had the support missing. This
> patch completes the list in this point.

Reviewed-by: Armin Wolf <W_Armin@gmx.de>

>
> Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
> ---
>   drivers/platform/x86/uniwill/uniwill-acpi.c | 309 +++++++++++++++-----
>   1 file changed, 233 insertions(+), 76 deletions(-)
>
> diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
> index d9a33be4f4a37..e81ccfa39039e 100644
> --- a/drivers/platform/x86/uniwill/uniwill-acpi.c
> +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
> @@ -645,6 +645,7 @@ static bool uniwill_readable_reg(struct device *dev, unsigned int reg)
>   	case EC_ADDR_BIOS_OEM:
>   	case EC_ADDR_PWM_1:
>   	case EC_ADDR_PWM_2:
> +	case EC_ADDR_SUPPORT_1:
>   	case EC_ADDR_SUPPORT_2:
>   	case EC_ADDR_TRIGGER:
>   	case EC_ADDR_SWITCH_STATUS:
> @@ -684,6 +685,7 @@ static bool uniwill_volatile_reg(struct device *dev, unsigned int reg)
>   	case EC_ADDR_BIOS_OEM:
>   	case EC_ADDR_PWM_1:
>   	case EC_ADDR_PWM_2:
> +	case EC_ADDR_SUPPORT_1:
>   	case EC_ADDR_SUPPORT_2:
>   	case EC_ADDR_TRIGGER:
>   	case EC_ADDR_SWITCH_STATUS:
> @@ -2696,35 +2698,47 @@ static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = {
>   	.lightbar_max_brightness = 200,
>   };
>   
> -/*
> - * The featuresets below reflect somewhat chronological changes:
> - * 1 -> 2: UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL is added to the EC firmware.
> - * 2 -> 3: UNIWILL_FEATURE_USB_C_POWER_PRIORITY is removed from the EC firmware.
> - * Some devices might divert from this timeline.
> - */
> +static struct uniwill_device_descriptor pfxnuxx_pfxluxx_phxprxx_descriptor __initdata = {
> +	.features = UNIWILL_FEATURE_FN_LOCK |
> +		    UNIWILL_FEATURE_SUPER_KEY |
> +		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> +		    UNIWILL_FEATURE_CPU_TEMP |
> +		    UNIWILL_FEATURE_PRIMARY_FAN |
> +		    UNIWILL_FEATURE_SECONDARY_FAN |
> +		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = true,
> +	.kbd_led_max_brightness = 2,
> +};
>   
> -static struct uniwill_device_descriptor tux_featureset_1_descriptor __initdata = {
> +static struct uniwill_device_descriptor gkxmrxx_gkxnpxx_gkxnrxx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
>   		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
>   		    UNIWILL_FEATURE_CPU_TEMP |
> +		    UNIWILL_FEATURE_GPU_TEMP |
>   		    UNIWILL_FEATURE_PRIMARY_FAN |
>   		    UNIWILL_FEATURE_SECONDARY_FAN |
> -		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
> +		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = false,
> +	.kbd_led_max_brightness = 4,
>   };
>   
> -static struct uniwill_device_descriptor tux_featureset_1_nvidia_descriptor __initdata = {
> +static struct uniwill_device_descriptor gmxmpxx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
> +		    UNIWILL_FEATURE_LIGHTBAR |
>   		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
>   		    UNIWILL_FEATURE_CPU_TEMP |
>   		    UNIWILL_FEATURE_GPU_TEMP |
>   		    UNIWILL_FEATURE_PRIMARY_FAN |
>   		    UNIWILL_FEATURE_SECONDARY_FAN |
>   		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
> +	.lightbar_max_brightness = 36,
>   };
>   
> -static struct uniwill_device_descriptor tux_featureset_2_nvidia_descriptor __initdata = {
> +static struct uniwill_device_descriptor phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
>   		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> @@ -2733,10 +2747,109 @@ static struct uniwill_device_descriptor tux_featureset_2_nvidia_descriptor __ini
>   		    UNIWILL_FEATURE_PRIMARY_FAN |
>   		    UNIWILL_FEATURE_SECONDARY_FAN |
>   		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
> +		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = true,
> +	.kbd_led_max_brightness = 2,
> +};
> +
> +static struct uniwill_device_descriptor gmxmgxx_gmxngxx_gmxxgxx_descriptor __initdata = {
> +	.features = UNIWILL_FEATURE_FN_LOCK |
> +		    UNIWILL_FEATURE_SUPER_KEY |
> +		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> +		    UNIWILL_FEATURE_CPU_TEMP |
> +		    UNIWILL_FEATURE_GPU_TEMP |
> +		    UNIWILL_FEATURE_PRIMARY_FAN |
> +		    UNIWILL_FEATURE_SECONDARY_FAN |
> +		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
> +		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = false,
> +	.kbd_led_max_brightness = 4,
> +};
> +
> +static struct uniwill_device_descriptor gmxzgxx_gmxtgxx_pol_descriptor __initdata = {
> +	.features = UNIWILL_FEATURE_FN_LOCK |
> +		    UNIWILL_FEATURE_SUPER_KEY |
> +		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> +		    UNIWILL_FEATURE_CPU_TEMP |
> +		    UNIWILL_FEATURE_GPU_TEMP |
> +		    UNIWILL_FEATURE_PRIMARY_FAN |
> +		    UNIWILL_FEATURE_SECONDARY_FAN |
> +		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
> +		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = false,
> +	.kbd_led_max_brightness = 4,
> +};
> +
> +static struct uniwill_device_descriptor gmxzgxx_gmxtgxx_ste_descriptor __initdata = {
> +	.features = UNIWILL_FEATURE_FN_LOCK |
> +		    UNIWILL_FEATURE_SUPER_KEY |
> +		    UNIWILL_FEATURE_LIGHTBAR |
> +		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> +		    UNIWILL_FEATURE_CPU_TEMP |
> +		    UNIWILL_FEATURE_GPU_TEMP |
> +		    UNIWILL_FEATURE_PRIMARY_FAN |
> +		    UNIWILL_FEATURE_SECONDARY_FAN |
> +		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
>   		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
> +	.lightbar_max_brightness = 36,
>   };
>   
> -static struct uniwill_device_descriptor tux_featureset_3_nvidia_descriptor __initdata = {
> +static int gmxrgxx_probe(struct uniwill_data *data)
> +{
> +	unsigned int value;
> +	int ret;
> +
> +	ret = regmap_read(data->regmap, EC_ADDR_SUPPORT_1, &value);
> +	if (ret < 0)
> +		return ret;
> +
> +	if (value & LIGHTBAR) {
> +		data->features |= UNIWILL_FEATURE_LIGHTBAR;
> +		data->lightbar_max_brightness = 36;
> +	}
> +
> +	ret = regmap_read(data->regmap, EC_ADDR_SUPPORT_2, &value);
> +	if (ret < 0)
> +		return ret;
> +
> +	if (value & RGB_KEYBOARD) {
> +		data->features |= UNIWILL_FEATURE_KEYBOARD_BACKLIGHT;
> +		data->kbd_led_single_color = false;
> +		data->kbd_led_max_brightness = 4;
> +	}
> +
> +	return 0;
> +};
> +
> +static struct uniwill_device_descriptor gmxrgxx_descriptor __initdata = {
> +	.features = UNIWILL_FEATURE_FN_LOCK |
> +		    UNIWILL_FEATURE_SUPER_KEY |
> +		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> +		    UNIWILL_FEATURE_CPU_TEMP |
> +		    UNIWILL_FEATURE_GPU_TEMP |
> +		    UNIWILL_FEATURE_PRIMARY_FAN |
> +		    UNIWILL_FEATURE_SECONDARY_FAN |
> +		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL,
> +	.probe = gmxrgxx_probe,
> +};
> +
> +static struct uniwill_device_descriptor gmxagxx_descriptor __initdata = {
> +	.features = UNIWILL_FEATURE_FN_LOCK |
> +		    UNIWILL_FEATURE_SUPER_KEY |
> +		    UNIWILL_FEATURE_LIGHTBAR |
> +		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> +		    UNIWILL_FEATURE_CPU_TEMP |
> +		    UNIWILL_FEATURE_GPU_TEMP |
> +		    UNIWILL_FEATURE_PRIMARY_FAN |
> +		    UNIWILL_FEATURE_SECONDARY_FAN |
> +		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL,
> +	.lightbar_max_brightness = 36,
> +};
> +
> +static struct uniwill_device_descriptor gmxxgxx_gmxpxxx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
>   		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> @@ -2747,7 +2860,7 @@ static struct uniwill_device_descriptor tux_featureset_3_nvidia_descriptor __ini
>   		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL,
>   };
>   
> -static struct uniwill_device_descriptor tux_featureset_4_descriptor __initdata = {
> +static struct uniwill_device_descriptor gxxhrxx_gxxmrxx_xxxx4nxx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
>   		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> @@ -2755,10 +2868,29 @@ static struct uniwill_device_descriptor tux_featureset_4_descriptor __initdata =
>   		    UNIWILL_FEATURE_PRIMARY_FAN |
>   		    UNIWILL_FEATURE_SECONDARY_FAN |
>   		    UNIWILL_FEATURE_AC_AUTO_BOOT |
> -		    UNIWILL_FEATURE_USB_POWERSHARE,
> +		    UNIWILL_FEATURE_USB_POWERSHARE |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = true,
> +	.kbd_led_max_brightness = 4,
>   };
>   
> -static struct uniwill_device_descriptor tux_featureset_4_nvidia_descriptor __initdata = {
> +static struct uniwill_device_descriptor gmxhgxx_descriptor __initdata = {
> +	.features = UNIWILL_FEATURE_FN_LOCK |
> +		    UNIWILL_FEATURE_SUPER_KEY |
> +		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> +		    UNIWILL_FEATURE_CPU_TEMP |
> +		    UNIWILL_FEATURE_GPU_TEMP |
> +		    UNIWILL_FEATURE_PRIMARY_FAN |
> +		    UNIWILL_FEATURE_SECONDARY_FAN |
> +		    UNIWILL_FEATURE_NVIDIA_CTGP_CONTROL |
> +		    UNIWILL_FEATURE_AC_AUTO_BOOT |
> +		    UNIWILL_FEATURE_USB_POWERSHARE |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = false,
> +	.kbd_led_max_brightness = 4,
> +};
> +
> +static struct uniwill_device_descriptor gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
>   		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
> @@ -2771,7 +2903,7 @@ static struct uniwill_device_descriptor tux_featureset_4_nvidia_descriptor __ini
>   		    UNIWILL_FEATURE_USB_POWERSHARE,
>   };
>   
> -static int phxtxx1_probe(struct uniwill_data *data)
> +static int phxtuxx_phxtrxx_probe(struct uniwill_data *data)
>   {
>   	unsigned int value;
>   	int ret;
> @@ -2786,17 +2918,20 @@ static int phxtxx1_probe(struct uniwill_data *data)
>   	return 0;
>   };
>   
> -static struct uniwill_device_descriptor phxtxx1_descriptor __initdata = {
> +static struct uniwill_device_descriptor phxtuxx_phxtrxx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
>   		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
>   		    UNIWILL_FEATURE_CPU_TEMP |
>   		    UNIWILL_FEATURE_PRIMARY_FAN |
> -		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
> -	.probe = phxtxx1_probe,
> +		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = true,
> +	.kbd_led_max_brightness = 2,
> +	.probe = phxtuxx_phxtrxx_probe,
>   };
>   
> -static int phxarx1_phxaqf1_probe(struct uniwill_data *data)
> +static int phxarxx_phxaqxx_probe(struct uniwill_data *data)
>   {
>   	unsigned int value;
>   	int ret;
> @@ -2812,22 +2947,28 @@ static int phxarx1_phxaqf1_probe(struct uniwill_data *data)
>   	return 0;
>   };
>   
> -static struct uniwill_device_descriptor phxarx1_phxaqf1_descriptor __initdata = {
> +static struct uniwill_device_descriptor phxarxx_phxaqxx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
>   		    UNIWILL_FEATURE_BATTERY_CHARGE_MODES |
>   		    UNIWILL_FEATURE_CPU_TEMP |
>   		    UNIWILL_FEATURE_PRIMARY_FAN |
>   		    UNIWILL_FEATURE_SECONDARY_FAN |
> -		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY,
> -	.probe = phxarx1_phxaqf1_probe,
> +		    UNIWILL_FEATURE_USB_C_POWER_PRIORITY |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = true,
> +	.kbd_led_max_brightness = 2,
> +	.probe = phxarxx_phxaqxx_probe,
>   };
>   
> -static struct uniwill_device_descriptor pf5pu1g_descriptor __initdata = {
> +static struct uniwill_device_descriptor pfxpuxx_descriptor __initdata = {
>   	.features = UNIWILL_FEATURE_FN_LOCK |
>   		    UNIWILL_FEATURE_SUPER_KEY |
>   		    UNIWILL_FEATURE_CPU_TEMP |
> -		    UNIWILL_FEATURE_PRIMARY_FAN,
> +		    UNIWILL_FEATURE_PRIMARY_FAN |
> +		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT,
> +	.kbd_led_single_color = true,
> +	.kbd_led_max_brightness = 2,
>   };
>   
>   static struct uniwill_device_descriptor x4sp4nal_descriptor __initdata = {
> @@ -2922,7 +3063,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTxX1"),
>   		},
> -		.driver_data = &phxtxx1_descriptor,
> +		.driver_data = &phxtuxx_phxtrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 14 Gen6 Intel",
> @@ -2930,7 +3071,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxTQx1"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 14/16 Gen7 Intel",
> @@ -2938,7 +3079,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PHxARX1_PHxAQF1"),
>   		},
> -		.driver_data = &phxarx1_phxaqf1_descriptor,
> +		.driver_data = &phxarxx_phxaqxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 16 Gen7 Intel/Commodore Omnia-Book Pro Gen 7",
> @@ -2946,7 +3087,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6AG01_PH6AQ71_PH6AQI1"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 14/16 Gen8 Intel/Commodore Omnia-Book Pro Gen 8",
> @@ -2954,7 +3095,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PRX1_PH6PRX1"),
>   		},
> -		.driver_data = &tux_featureset_1_descriptor,
> +		.driver_data = &pfxnuxx_pfxluxx_phxprxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 14 Gen8 Intel/Commodore Omnia-Book Pro Gen 8",
> @@ -2962,7 +3103,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH4PG31"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 16 Gen8 Intel",
> @@ -2970,7 +3111,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PH6PG01_PH6PG71"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &phxtqxx_phxagxx_phxaqxx_phxpgxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 14/15 Gen9 AMD",
> @@ -2978,7 +3119,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GXxHRXx"),
>   		},
> -		.driver_data = &tux_featureset_4_descriptor,
> +		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 14/15 Gen9 Intel/Commodore Omnia-Book 15 Gen9",
> @@ -2986,7 +3127,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GXxMRXx"),
>   		},
> -		.driver_data = &tux_featureset_4_descriptor,
> +		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 14/15 Gen10 AMD",
> @@ -2994,7 +3135,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxHP4NAx"),
>   		},
> -		.driver_data = &tux_featureset_4_descriptor,
> +		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 14/15 Gen10 AMD",
> @@ -3002,7 +3143,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxKK4NAx_XxSP4NAx"),
>   		},
> -		.driver_data = &tux_featureset_4_descriptor,
> +		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Pro 15 Gen10 Intel",
> @@ -3010,7 +3151,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "XxAR4NAx"),
>   		},
> -		.driver_data = &tux_featureset_4_descriptor,
> +		.driver_data = &gxxhrxx_gxxmrxx_xxxx4nxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Max 15 Gen10 AMD",
> @@ -3018,7 +3159,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X5KK45xS_X5SP45xS"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Max 16 Gen10 AMD",
> @@ -3026,7 +3167,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6HP45xU"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Max 16 Gen10 AMD",
> @@ -3034,7 +3175,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6KK45xU_X6SP45xU"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Max 15 Gen10 Intel",
> @@ -3042,7 +3183,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X5AR45xS"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO InfinityBook Max 16 Gen10 Intel",
> @@ -3050,7 +3191,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR55xU"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 15 Gen1 AMD",
> @@ -3058,7 +3199,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501A1650TI"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 15 Gen1 AMD",
> @@ -3066,7 +3207,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501A2060"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 17 Gen1 AMD",
> @@ -3074,7 +3215,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701A1650TI"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 17 Gen1 AMD",
> @@ -3082,7 +3223,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701A2060"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 15 Gen1 Intel",
> @@ -3090,7 +3231,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501I1650TI"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 15 Gen1 Intel",
> @@ -3098,7 +3239,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1501I2060"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 17 Gen1 Intel",
> @@ -3106,7 +3247,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701I1650TI"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 17 Gen1 Intel",
> @@ -3114,7 +3255,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "POLARIS1701I2060"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gkxmrxx_gkxnpxx_gkxnrxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Trinity 15 Intel Gen1",
> @@ -3122,7 +3263,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "TRINITY1501I"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gmxmpxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Trinity 17 Intel Gen1",
> @@ -3130,7 +3271,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "TRINITY1701I"),
>   		},
> -		.driver_data = &tux_featureset_1_nvidia_descriptor,
> +		.driver_data = &gmxmpxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 15/17 Gen2 AMD",
> @@ -3138,7 +3279,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxMGxx"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &gmxmgxx_gmxngxx_gmxxgxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 15/17 Gen2 Intel",
> @@ -3146,23 +3287,39 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxNGxx"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &gmxmgxx_gmxngxx_gmxxgxx_descriptor,
> +	},
> +	{
> +		.ident = "TUXEDO Polaris 15/17 Gen3 AMD",
> +		.matches = {
> +			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
> +			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "POLARIS1XA03"),
> +		},
> +		.driver_data = &gmxzgxx_gmxtgxx_pol_descriptor,
> +	},
> +	{
> +		.ident = "TUXEDO Polaris 15/17 Gen3 Intel",
> +		.matches = {
> +			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
> +			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "POLARIS1XI03"),
> +		},
> +		.driver_data = &gmxzgxx_gmxtgxx_pol_descriptor,
>   	},
>   	{
> -		.ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 AMD",
> +		.ident = "TUXEDO Stellaris 15/17 Gen3 AMD",
>   		.matches = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
> -			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxZGxx"),
> +			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "STELLARIS1XA03"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &gmxzgxx_gmxtgxx_ste_descriptor,
>   	},
>   	{
> -		.ident = "TUXEDO Stellaris/Polaris 15/17 Gen3 Intel",
> +		.ident = "TUXEDO Stellaris 15/17 Gen3 Intel",
>   		.matches = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
> -			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxTGxx"),
> +			DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "STELLARIS1XI03"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &gmxzgxx_gmxtgxx_ste_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris/Polaris 15/17 Gen4 AMD",
> @@ -3170,7 +3327,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxRGxx"),
>   		},
> -		.driver_data = &tux_featureset_3_nvidia_descriptor,
> +		.driver_data = &gmxrgxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 15 Gen4 Intel",
> @@ -3178,7 +3335,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxAGxx"),
>   		},
> -		.driver_data = &tux_featureset_3_nvidia_descriptor,
> +		.driver_data = &gmxagxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Polaris 15/17 Gen5 AMD",
> @@ -3186,7 +3343,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxXGxx"),
>   		},
> -		.driver_data = &tux_featureset_2_nvidia_descriptor,
> +		.driver_data = &gmxmgxx_gmxngxx_gmxxgxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 16 Gen5 AMD",
> @@ -3194,7 +3351,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6XGxX"),
>   		},
> -		.driver_data = &tux_featureset_3_nvidia_descriptor,
> +		.driver_data = &gmxxgxx_gmxpxxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 16/17 Gen5 Intel/Commodore ORION Gen 5",
> @@ -3202,7 +3359,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxPXxx"),
>   		},
> -		.driver_data = &tux_featureset_3_nvidia_descriptor,
> +		.driver_data = &gmxxgxx_gmxpxxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris Slim 15 Gen6 AMD",
> @@ -3210,7 +3367,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GMxHGxx"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxhgxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris Slim 15 Gen6 Intel/Commodore ORION Slim 15 Gen6",
> @@ -3218,7 +3375,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM5IXxA"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6",
> @@ -3226,7 +3383,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB1"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 16 Gen6 Intel/Commodore ORION 16 Gen6",
> @@ -3234,7 +3391,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM6IXxB_MB2"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 17 Gen6 Intel/Commodore ORION 17 Gen6",
> @@ -3242,7 +3399,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "GM7IXxN"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 16 Gen7 AMD",
> @@ -3250,7 +3407,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6FR5xxY"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 16 Gen7 Intel",
> @@ -3258,7 +3415,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Stellaris 16 Gen7 Intel",
> @@ -3266,7 +3423,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "X6AR5xxY_mLED"),
>   		},
> -		.driver_data = &tux_featureset_4_nvidia_descriptor,
> +		.driver_data = &gmxixxx_xxxx45xx_xxxx55xx_xxxx57xx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Book BA15 Gen10 AMD",
> @@ -3274,7 +3431,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PF5PU1G"),
>   		},
> -		.driver_data = &pf5pu1g_descriptor,
> +		.driver_data = &pfxpuxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Pulse 14 Gen1 AMD",
> @@ -3282,7 +3439,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PULSE1401"),
>   		},
> -		.driver_data = &tux_featureset_1_descriptor,
> +		.driver_data = &pfxnuxx_pfxluxx_phxprxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Pulse 15 Gen1 AMD",
> @@ -3290,7 +3447,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PULSE1501"),
>   		},
> -		.driver_data = &tux_featureset_1_descriptor,
> +		.driver_data = &pfxnuxx_pfxluxx_phxprxx_descriptor,
>   	},
>   	{
>   		.ident = "TUXEDO Pulse 15 Gen2 AMD",
> @@ -3298,7 +3455,7 @@ static const struct dmi_system_id uniwill_dmi_table[] __initconst = {
>   			DMI_MATCH(DMI_SYS_VENDOR, "TUXEDO"),
>   			DMI_EXACT_MATCH(DMI_BOARD_NAME, "PF5LUXG"),
>   		},
> -		.driver_data = &tux_featureset_1_descriptor,
> +		.driver_data = &pfxnuxx_pfxluxx_phxprxx_descriptor,
>   	},
>   	{ }
>   };

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards
  2026-07-25 14:44 ` [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards Armin Wolf
@ 2026-08-05 21:47   ` Werner Sembach
  0 siblings, 0 replies; 5+ messages in thread
From: Werner Sembach @ 2026-08-05 21:47 UTC (permalink / raw)
  To: Armin Wolf, Hans de Goede, Ilpo Järvinen
  Cc: platform-driver-x86, linux-kernel


Am 25.07.26 um 16:44 schrieb Armin Wolf:
> Am 25.07.26 um 01:00 schrieb Werner Sembach:
>
>> The devices with 3 brightness level keyboards seem to send
>> UNIWILL_OSD_KB_LED_LEVEL0, UNIWILL_OSD_KB_LED_LEVEL2, and
>> UNIWILL_OSD_KB_LED_LEVEL4 and not UNIWILL_OSD_KB_LED_LEVEL0,
>> UNIWILL_OSD_KB_LED_LEVEL1, and UNIWILL_OSD_KB_LED_LEVEL2 so this patch does
>> not return the brightness based on one of these events, but the brightness
>> read from hardware.
>>
>> Signed-off-by: Werner Sembach <wse@tuxedocomputers.com>
>> ---
>>   drivers/platform/x86/uniwill/uniwill-acpi.c | 22 +++------------------
>>   1 file changed, 3 insertions(+), 19 deletions(-)
>>
>> diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c 
>> b/drivers/platform/x86/uniwill/uniwill-acpi.c
>> index 7a2eeaec4c961..d9a33be4f4a37 100644
>> --- a/drivers/platform/x86/uniwill/uniwill-acpi.c
>> +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
>> @@ -1626,7 +1626,7 @@ static int uniwill_led_init(struct uniwill_data *data)
>>                                &init_data);
>>   }
>>   -static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightness)
>> +static int uniwill_notify_kbd_led(struct uniwill_data *data)
>>   {
>>       struct led_classdev *led_cdev;
>>       int ret;
>> @@ -1643,7 +1643,7 @@ static int uniwill_notify_kbd_led(struct uniwill_data 
>> *data, int brightness)
>>       if (ret < 0)
>>           return ret;
>>   -    led_classdev_notify_brightness_hw_changed(led_cdev, brightness);
>> +    led_classdev_notify_brightness_hw_changed(led_cdev, led_cdev->brightness);
>
> WMI events are usually delivered with a large latency, a userspace application 
> could
> have changed the LED brightness value in the meantime.
>
> Please check the maximum keyboard backlight brightness inside 
> uniwill_notify_kbd_led()
> and translate the brightness values instead:
>
> /* Comment here */
> switch (data->kbd_led_max_brightness) {
> case 4:
>     break;
> case 2:
>     switch (brightness) {
>     case 0:
>         break;
>     case 2:
>         brightness = 1;
>         break;
>     case 4:
>         brightness = 2;
>         break;
>     default:
>         return -EINVAL;
>     }
>     break;
> default:
>     return -EINVAL;
> }
>
> Thanks,
> Armin Wolf
ack, but I did it with some ifs to make the footprint smaller
>
>>         return 0;
>>   }
>> @@ -2215,30 +2215,14 @@ static int uniwill_notifier_call(struct 
>> notifier_block *nb, unsigned long action
>>             return NOTIFY_OK;
>>       case UNIWILL_OSD_KB_LED_LEVEL0:
>> -        if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
>> -            return NOTIFY_DONE;
>> -
>> -        return notifier_from_errno(uniwill_notify_kbd_led(data, 0));
>>       case UNIWILL_OSD_KB_LED_LEVEL1:
>> -        if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
>> -            return NOTIFY_DONE;
>> -
>> -        return notifier_from_errno(uniwill_notify_kbd_led(data, 1));
>>       case UNIWILL_OSD_KB_LED_LEVEL2:
>> -        if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
>> -            return NOTIFY_DONE;
>> -
>> -        return notifier_from_errno(uniwill_notify_kbd_led(data, 2));
>>       case UNIWILL_OSD_KB_LED_LEVEL3:
>> -        if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
>> -            return NOTIFY_DONE;
>> -
>> -        return notifier_from_errno(uniwill_notify_kbd_led(data, 3));
>>       case UNIWILL_OSD_KB_LED_LEVEL4:
>>           if (!uniwill_device_supports(data, 
>> UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
>>               return NOTIFY_DONE;
>>   -        return notifier_from_errno(uniwill_notify_kbd_led(data, 4));
>> +        return notifier_from_errno(uniwill_notify_kbd_led(data));
>>       default:
>>           mutex_lock(&data->input_lock);
>>           sparse_keymap_report_event(data->input_device, action, 1, true);
>>
>> base-commit: caf8342512c3056005f475d350eeca089c3c6623

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-08-05 21:47 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-24 23:00 [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards Werner Sembach
2026-07-24 23:00 ` [PATCH 2/2] platform/x86: uniwill-laptop: Enable kb backlight and lightbar for TUXEDO Werner Sembach
2026-07-25 14:47   ` Armin Wolf
2026-07-25 14:44 ` [PATCH 1/2] platform/x86: uniwill-laptop: Fix brightness notify for 3 level keyboards Armin Wolf
2026-08-05 21:47   ` Werner Sembach

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®