All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support
@ 2026-07-16 16:25 Armin Wolf
  2026-07-16 16:25 ` [PATCH v3 1/2] platform/x86: uniwill-laptop: Split uniwill_kbd_led_init() Armin Wolf
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Armin Wolf @ 2026-07-16 16:25 UTC (permalink / raw)
  To: hansg, ilpo.jarvinen, wse; +Cc: platform-driver-x86, linux-kernel

This patch series contains a couple of changes suggested by
Werner Sembach from Tuxedo that are necessary for eventually
enabling keyboard backlight support for Tuxedo devices.

The first patch simply cleans up uniwill_kbd_led_init(), while
the remaining two patches make two key properties (single color
vs RGB, max intensity) configurable using the existing device
descriptor infrastructure.

Tested on a Tuxedo InfinityBook Pro 15 Gen 10 AMD.

Changes since v2:
- drop 3rd patch
- add Reviewed-by tag
- reword commit description of 2nd patch

Changes since v1:
- add Suggested-by tags

Armin Wolf (2):
  platform/x86: uniwill-laptop: Split uniwill_kbd_led_init()
  platform/x86: uniwill-laptop: Remove single color keyboard detection

 drivers/platform/x86/uniwill/uniwill-acpi.c | 119 +++++++++++---------
 1 file changed, 63 insertions(+), 56 deletions(-)

-- 
2.39.5


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

* [PATCH v3 1/2] platform/x86: uniwill-laptop: Split uniwill_kbd_led_init()
  2026-07-16 16:25 [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support Armin Wolf
@ 2026-07-16 16:25 ` Armin Wolf
  2026-07-16 16:25 ` [PATCH v3 2/2] platform/x86: uniwill-laptop: Remove single color keyboard detection Armin Wolf
  2026-07-16 17:40 ` [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support Werner Sembach
  2 siblings, 0 replies; 6+ messages in thread
From: Armin Wolf @ 2026-07-16 16:25 UTC (permalink / raw)
  To: hansg, ilpo.jarvinen, wse; +Cc: platform-driver-x86, linux-kernel

The function uniwill_kbd_led_init() is quite large and doing multiple
things at once:
- general hardware initialisation
- single color keyboard backlight registration
- RGB keyboard backlight registration

Move the last two things into separate functions to increase the
maintainability of uniwill_kbd_led_init().

Suggested-by: Werner Sembach <wse@tuxedocomputers.com>
Reviewed-by: Werner Sembach <wse@tuxedocomputers.com>
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
---
 drivers/platform/x86/uniwill/uniwill-acpi.c | 123 +++++++++++---------
 1 file changed, 70 insertions(+), 53 deletions(-)

diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
index 310445583832..d27f316800f6 100644
--- a/drivers/platform/x86/uniwill/uniwill-acpi.c
+++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
@@ -1733,7 +1733,24 @@ static enum led_brightness uniwill_kbd_led_mc_brightness_get(struct led_classdev
 	return uniwill_kbd_led_read_brightness(data);
 }
 
-static int uniwill_kbd_led_init(struct uniwill_data *data)
+static int uniwill_white_kbd_led_init(struct uniwill_data *data)
+{
+	struct led_init_data init_data = {
+		.default_label = "white:" LED_FUNCTION_KBD_BACKLIGHT,
+		.devicename = DRIVER_NAME,
+		.devname_mandatory = true,
+	};
+
+	data->kbd_led_cdev.max_brightness = data->kbd_led_max_brightness;
+	data->kbd_led_cdev.color = LED_COLOR_ID_WHITE;
+	data->kbd_led_cdev.flags = LED_BRIGHT_HW_CHANGED | LED_REJECT_NAME_CONFLICT;
+	data->kbd_led_cdev.brightness_set_blocking = uniwill_kbd_led_brightness_set;
+	data->kbd_led_cdev.brightness_get = uniwill_kbd_led_brightness_get;
+
+	return devm_led_classdev_register_ext(data->dev, &data->kbd_led_cdev, &init_data);
+}
+
+static int uniwill_rgb_kbd_led_init(struct uniwill_data *data)
 {
 	unsigned int color_indices[KBD_LED_CHANNELS] = {
 		LED_COLOR_ID_RED,
@@ -1741,6 +1758,7 @@ static int uniwill_kbd_led_init(struct uniwill_data *data)
 		LED_COLOR_ID_BLUE,
 	};
 	struct led_init_data init_data = {
+		.default_label = "multicolor:" LED_FUNCTION_KBD_BACKLIGHT,
 		.devicename = DRIVER_NAME,
 		.devname_mandatory = true,
 	};
@@ -1749,57 +1767,6 @@ static int uniwill_kbd_led_init(struct uniwill_data *data)
 	unsigned int regval;
 	int ret;
 
-	if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
-		return 0;
-
-	ret = regmap_read(data->regmap, EC_ADDR_SUPPORT_2, &regval);
-	if (ret < 0)
-		return ret;
-
-	if (!(regval & CHINA_MODE)) {
-		ret = regmap_set_bits(data->regmap, EC_ADDR_BIOS_OEM_2, ENABLE_CHINA_MODE);
-		if (ret < 0)
-			return ret;
-	}
-
-	ret = regmap_read(data->regmap, EC_ADDR_KBD_STATUS, &regval);
-	if (ret < 0)
-		return ret;
-
-	regval |= KBD_APPLY;
-	regval &= ~KBD_POWER_OFF;
-	ret = regmap_write(data->regmap, EC_ADDR_KBD_STATUS, regval);
-	if (ret < 0)
-		return ret;
-
-	switch (data->project_id) {
-	case PROJECT_ID_PF:
-	case PROJECT_ID_PF4MU_PF4MN_PF5MU:
-	case PROJECT_ID_PH4TRX1:
-	case PROJECT_ID_PH4TUX1:
-	case PROJECT_ID_PH4TQX1:
-	case PROJECT_ID_PH6TRX1:
-	case PROJECT_ID_PH6TQXX:
-	case PROJECT_ID_PHXAXXX:
-	case PROJECT_ID_PHXPXXX:
-		data->single_color_kbd = true;
-		break;
-	default:
-		data->single_color_kbd = regval & KBD_WHITE_ONLY;
-		break;
-	}
-
-	if (data->single_color_kbd) {
-		init_data.default_label = "white:" LED_FUNCTION_KBD_BACKLIGHT;
-		data->kbd_led_cdev.max_brightness = data->kbd_led_max_brightness;
-		data->kbd_led_cdev.color = LED_COLOR_ID_WHITE;
-		data->kbd_led_cdev.flags = LED_BRIGHT_HW_CHANGED | LED_REJECT_NAME_CONFLICT;
-		data->kbd_led_cdev.brightness_set_blocking = uniwill_kbd_led_brightness_set;
-		data->kbd_led_cdev.brightness_get = uniwill_kbd_led_brightness_get;
-
-		return devm_led_classdev_register_ext(data->dev, &data->kbd_led_cdev, &init_data);
-	}
-
 	for (int i = 0; i < KBD_LED_CHANNELS; i++) {
 		data->kbd_led_mc_subled_info[i].color_index = color_indices[i];
 
@@ -1851,7 +1818,6 @@ static int uniwill_kbd_led_init(struct uniwill_data *data)
 	if (ret < 0)
 		return ret;
 
-	init_data.default_label = "multicolor:" LED_FUNCTION_KBD_BACKLIGHT;
 	data->kbd_led_mc_cdev.led_cdev.max_brightness = data->kbd_led_max_brightness;
 	data->kbd_led_mc_cdev.led_cdev.color = LED_COLOR_ID_MULTI;
 	data->kbd_led_mc_cdev.led_cdev.flags = LED_BRIGHT_HW_CHANGED | LED_REJECT_NAME_CONFLICT;
@@ -1864,6 +1830,57 @@ static int uniwill_kbd_led_init(struct uniwill_data *data)
 							 &init_data);
 }
 
+static int uniwill_kbd_led_init(struct uniwill_data *data)
+{
+	unsigned int regval;
+	int ret;
+
+	if (!uniwill_device_supports(data, UNIWILL_FEATURE_KEYBOARD_BACKLIGHT))
+		return 0;
+
+	ret = regmap_read(data->regmap, EC_ADDR_SUPPORT_2, &regval);
+	if (ret < 0)
+		return ret;
+
+	if (!(regval & CHINA_MODE)) {
+		ret = regmap_set_bits(data->regmap, EC_ADDR_BIOS_OEM_2, ENABLE_CHINA_MODE);
+		if (ret < 0)
+			return ret;
+	}
+
+	ret = regmap_read(data->regmap, EC_ADDR_KBD_STATUS, &regval);
+	if (ret < 0)
+		return ret;
+
+	regval |= KBD_APPLY;
+	regval &= ~KBD_POWER_OFF;
+	ret = regmap_write(data->regmap, EC_ADDR_KBD_STATUS, regval);
+	if (ret < 0)
+		return ret;
+
+	switch (data->project_id) {
+	case PROJECT_ID_PF:
+	case PROJECT_ID_PF4MU_PF4MN_PF5MU:
+	case PROJECT_ID_PH4TRX1:
+	case PROJECT_ID_PH4TUX1:
+	case PROJECT_ID_PH4TQX1:
+	case PROJECT_ID_PH6TRX1:
+	case PROJECT_ID_PH6TQXX:
+	case PROJECT_ID_PHXAXXX:
+	case PROJECT_ID_PHXPXXX:
+		data->single_color_kbd = true;
+		break;
+	default:
+		data->single_color_kbd = regval & KBD_WHITE_ONLY;
+		break;
+	}
+
+	if (data->single_color_kbd)
+		return uniwill_white_kbd_led_init(data);
+
+	return uniwill_rgb_kbd_led_init(data);
+}
+
 static unsigned int uniwill_sanitize_battery_threshold(unsigned int value)
 {
 	/* 0 means "charging threshold not active" */
-- 
2.39.5


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

* [PATCH v3 2/2] platform/x86: uniwill-laptop: Remove single color keyboard detection
  2026-07-16 16:25 [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support Armin Wolf
  2026-07-16 16:25 ` [PATCH v3 1/2] platform/x86: uniwill-laptop: Split uniwill_kbd_led_init() Armin Wolf
@ 2026-07-16 16:25 ` Armin Wolf
  2026-07-16 16:28   ` Werner Sembach
  2026-07-20 10:28   ` Ilpo Järvinen
  2026-07-16 17:40 ` [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support Werner Sembach
  2 siblings, 2 replies; 6+ messages in thread
From: Armin Wolf @ 2026-07-16 16:25 UTC (permalink / raw)
  To: hansg, ilpo.jarvinen, wse; +Cc: platform-driver-x86, linux-kernel

Having a ad-hoc device whitelist inside uniwill_kbd_led_init()
to work around unreliable KBD_WHITE_ONLY values conflicts with
the idea of the device descriptor infrastructure.

Remove the ad-hoc device whitelist and use the device descriptor
infrastrcture instead.

Suggested-by: Werner Sembach <wse@tuxedocomputers.com>
Signed-off-by: Armin Wolf <W_Armin@gmx.de>
---
 drivers/platform/x86/uniwill/uniwill-acpi.c | 32 +++++++--------------
 1 file changed, 11 insertions(+), 21 deletions(-)

diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
index d27f316800f6..4591ee299a90 100644
--- a/drivers/platform/x86/uniwill/uniwill-acpi.c
+++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
@@ -255,6 +255,7 @@
 #define FAN_CURVE_LENGTH		5
 
 #define EC_ADDR_KBD_STATUS		0x078C
+/* Unreliable */
 #define KBD_WHITE_ONLY			BIT(0)
 #define KBD_POWER_OFF			BIT(1)
 #define KBD_TURBO_LEVEL_MASK		GENMASK(3, 2)
@@ -400,7 +401,7 @@ struct uniwill_data {
 	u8 lightbar_max_brightness;
 	struct led_classdev_mc led_mc_cdev;
 	struct mc_subled led_mc_subled_info[LED_CHANNELS];
-	bool single_color_kbd;
+	bool kbd_led_single_color;
 	u8 kbd_led_max_brightness;
 	unsigned int last_kbd_status;
 	union {
@@ -426,6 +427,7 @@ struct uniwill_battery_entry {
 
 struct uniwill_device_descriptor {
 	unsigned int features;
+	bool kbd_led_single_color;
 	u8 kbd_led_max_brightness;
 	u8 lightbar_max_brightness;
 	/* Executed during driver probing */
@@ -1629,7 +1631,7 @@ static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightness)
 	struct led_classdev *led_cdev;
 	int ret;
 
-	if (data->single_color_kbd)
+	if (data->kbd_led_single_color)
 		led_cdev = &data->kbd_led_cdev;
 	else
 		led_cdev = &data->kbd_led_mc_cdev.led_cdev;
@@ -1858,24 +1860,7 @@ static int uniwill_kbd_led_init(struct uniwill_data *data)
 	if (ret < 0)
 		return ret;
 
-	switch (data->project_id) {
-	case PROJECT_ID_PF:
-	case PROJECT_ID_PF4MU_PF4MN_PF5MU:
-	case PROJECT_ID_PH4TRX1:
-	case PROJECT_ID_PH4TUX1:
-	case PROJECT_ID_PH4TQX1:
-	case PROJECT_ID_PH6TRX1:
-	case PROJECT_ID_PH6TQXX:
-	case PROJECT_ID_PHXAXXX:
-	case PROJECT_ID_PHXPXXX:
-		data->single_color_kbd = true;
-		break;
-	default:
-		data->single_color_kbd = regval & KBD_WHITE_ONLY;
-		break;
-	}
-
-	if (data->single_color_kbd)
+	if (data->kbd_led_single_color)
 		return uniwill_white_kbd_led_init(data);
 
 	return uniwill_rgb_kbd_led_init(data);
@@ -2351,6 +2336,7 @@ static int uniwill_probe(struct platform_device *pdev)
 		return ret;
 
 	data->features = device_descriptor.features;
+	data->kbd_led_single_color = device_descriptor.kbd_led_single_color;
 	data->kbd_led_max_brightness = device_descriptor.kbd_led_max_brightness;
 	data->lightbar_max_brightness = device_descriptor.lightbar_max_brightness;
 
@@ -2580,7 +2566,7 @@ static int uniwill_resume_kbd_led(struct uniwill_data *data)
 	if (ret < 0)
 		return ret;
 
-	if (data->single_color_kbd)
+	if (data->kbd_led_single_color)
 		return 0;
 
 	return regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, RGB_APPLY_COLOR, RGB_APPLY_COLOR);
@@ -2687,6 +2673,7 @@ static struct uniwill_device_descriptor machenike_l16p_descriptor __initdata = {
 		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT |
 		    UNIWILL_FEATURE_AC_AUTO_BOOT |
 		    UNIWILL_FEATURE_USB_POWERSHARE,
+	.kbd_led_single_color = false,
 	.kbd_led_max_brightness = 4,
 };
 
@@ -2869,6 +2856,7 @@ static struct uniwill_device_descriptor x4sp4nal_descriptor __initdata = {
 		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT |
 		    UNIWILL_FEATURE_AC_AUTO_BOOT |
 		    UNIWILL_FEATURE_USB_POWERSHARE,
+	.kbd_led_single_color = true,
 	.kbd_led_max_brightness = 2,
 };
 
@@ -3363,6 +3351,8 @@ static int __init uniwill_init(void)
 	if (force) {
 		/* Assume that the device supports all features except the charge limit */
 		device_descriptor.features = UINT_MAX & ~UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT;
+		/* Some models only have a (white) single color keyboard backlight */
+		device_descriptor.kbd_led_single_color = false;
 		/* Some models only support 3 brightness levels */
 		device_descriptor.kbd_led_max_brightness = 4;
 		/* Some models only support 36 brightness levels per color component */
-- 
2.39.5


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

* Re: [PATCH v3 2/2] platform/x86: uniwill-laptop: Remove single color keyboard detection
  2026-07-16 16:25 ` [PATCH v3 2/2] platform/x86: uniwill-laptop: Remove single color keyboard detection Armin Wolf
@ 2026-07-16 16:28   ` Werner Sembach
  2026-07-20 10:28   ` Ilpo Järvinen
  1 sibling, 0 replies; 6+ messages in thread
From: Werner Sembach @ 2026-07-16 16:28 UTC (permalink / raw)
  To: Armin Wolf, hansg, ilpo.jarvinen; +Cc: platform-driver-x86, linux-kernel


Am 16.07.26 um 18:25 schrieb Armin Wolf:
> Having a ad-hoc device whitelist inside uniwill_kbd_led_init()
> to work around unreliable KBD_WHITE_ONLY values conflicts with
> the idea of the device descriptor infrastructure.
>
> Remove the ad-hoc device whitelist and use the device descriptor
> infrastrcture instead.
>
> Suggested-by: Werner Sembach <wse@tuxedocomputers.com>
> Signed-off-by: Armin Wolf <W_Armin@gmx.de>

lgtm

Reviewed-by: Werner Sembach <wse@tuxedocomputers.com>

> ---
>   drivers/platform/x86/uniwill/uniwill-acpi.c | 32 +++++++--------------
>   1 file changed, 11 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
> index d27f316800f6..4591ee299a90 100644
> --- a/drivers/platform/x86/uniwill/uniwill-acpi.c
> +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
> @@ -255,6 +255,7 @@
>   #define FAN_CURVE_LENGTH		5
>   
>   #define EC_ADDR_KBD_STATUS		0x078C
> +/* Unreliable */
>   #define KBD_WHITE_ONLY			BIT(0)
>   #define KBD_POWER_OFF			BIT(1)
>   #define KBD_TURBO_LEVEL_MASK		GENMASK(3, 2)
> @@ -400,7 +401,7 @@ struct uniwill_data {
>   	u8 lightbar_max_brightness;
>   	struct led_classdev_mc led_mc_cdev;
>   	struct mc_subled led_mc_subled_info[LED_CHANNELS];
> -	bool single_color_kbd;
> +	bool kbd_led_single_color;
>   	u8 kbd_led_max_brightness;
>   	unsigned int last_kbd_status;
>   	union {
> @@ -426,6 +427,7 @@ struct uniwill_battery_entry {
>   
>   struct uniwill_device_descriptor {
>   	unsigned int features;
> +	bool kbd_led_single_color;
>   	u8 kbd_led_max_brightness;
>   	u8 lightbar_max_brightness;
>   	/* Executed during driver probing */
> @@ -1629,7 +1631,7 @@ static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightness)
>   	struct led_classdev *led_cdev;
>   	int ret;
>   
> -	if (data->single_color_kbd)
> +	if (data->kbd_led_single_color)
>   		led_cdev = &data->kbd_led_cdev;
>   	else
>   		led_cdev = &data->kbd_led_mc_cdev.led_cdev;
> @@ -1858,24 +1860,7 @@ static int uniwill_kbd_led_init(struct uniwill_data *data)
>   	if (ret < 0)
>   		return ret;
>   
> -	switch (data->project_id) {
> -	case PROJECT_ID_PF:
> -	case PROJECT_ID_PF4MU_PF4MN_PF5MU:
> -	case PROJECT_ID_PH4TRX1:
> -	case PROJECT_ID_PH4TUX1:
> -	case PROJECT_ID_PH4TQX1:
> -	case PROJECT_ID_PH6TRX1:
> -	case PROJECT_ID_PH6TQXX:
> -	case PROJECT_ID_PHXAXXX:
> -	case PROJECT_ID_PHXPXXX:
> -		data->single_color_kbd = true;
> -		break;
> -	default:
> -		data->single_color_kbd = regval & KBD_WHITE_ONLY;
> -		break;
> -	}
> -
> -	if (data->single_color_kbd)
> +	if (data->kbd_led_single_color)
>   		return uniwill_white_kbd_led_init(data);
>   
>   	return uniwill_rgb_kbd_led_init(data);
> @@ -2351,6 +2336,7 @@ static int uniwill_probe(struct platform_device *pdev)
>   		return ret;
>   
>   	data->features = device_descriptor.features;
> +	data->kbd_led_single_color = device_descriptor.kbd_led_single_color;
>   	data->kbd_led_max_brightness = device_descriptor.kbd_led_max_brightness;
>   	data->lightbar_max_brightness = device_descriptor.lightbar_max_brightness;
>   
> @@ -2580,7 +2566,7 @@ static int uniwill_resume_kbd_led(struct uniwill_data *data)
>   	if (ret < 0)
>   		return ret;
>   
> -	if (data->single_color_kbd)
> +	if (data->kbd_led_single_color)
>   		return 0;
>   
>   	return regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, RGB_APPLY_COLOR, RGB_APPLY_COLOR);
> @@ -2687,6 +2673,7 @@ static struct uniwill_device_descriptor machenike_l16p_descriptor __initdata = {
>   		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT |
>   		    UNIWILL_FEATURE_AC_AUTO_BOOT |
>   		    UNIWILL_FEATURE_USB_POWERSHARE,
> +	.kbd_led_single_color = false,
>   	.kbd_led_max_brightness = 4,
>   };
>   
> @@ -2869,6 +2856,7 @@ static struct uniwill_device_descriptor x4sp4nal_descriptor __initdata = {
>   		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT |
>   		    UNIWILL_FEATURE_AC_AUTO_BOOT |
>   		    UNIWILL_FEATURE_USB_POWERSHARE,
> +	.kbd_led_single_color = true,
>   	.kbd_led_max_brightness = 2,
>   };
>   
> @@ -3363,6 +3351,8 @@ static int __init uniwill_init(void)
>   	if (force) {
>   		/* Assume that the device supports all features except the charge limit */
>   		device_descriptor.features = UINT_MAX & ~UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT;
> +		/* Some models only have a (white) single color keyboard backlight */
> +		device_descriptor.kbd_led_single_color = false;
>   		/* Some models only support 3 brightness levels */
>   		device_descriptor.kbd_led_max_brightness = 4;
>   		/* Some models only support 36 brightness levels per color component */

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

* Re: [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support
  2026-07-16 16:25 [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support Armin Wolf
  2026-07-16 16:25 ` [PATCH v3 1/2] platform/x86: uniwill-laptop: Split uniwill_kbd_led_init() Armin Wolf
  2026-07-16 16:25 ` [PATCH v3 2/2] platform/x86: uniwill-laptop: Remove single color keyboard detection Armin Wolf
@ 2026-07-16 17:40 ` Werner Sembach
  2 siblings, 0 replies; 6+ messages in thread
From: Werner Sembach @ 2026-07-16 17:40 UTC (permalink / raw)
  To: Armin Wolf, hansg, ilpo.jarvinen; +Cc: platform-driver-x86, linux-kernel

Am 16.07.26 um 18:25 schrieb Armin Wolf:
> This patch series contains a couple of changes suggested by
> Werner Sembach from Tuxedo that are necessary for eventually
> enabling keyboard backlight support for Tuxedo devices.
>
> The first patch simply cleans up uniwill_kbd_led_init(), while
> the remaining two patches make two key properties (single color
> vs RGB, max intensity) configurable using the existing device
> descriptor infrastructure.
>
> Tested on a Tuxedo InfinityBook Pro 15 Gen 10 AMD.
FYI: I have the patch for adding all the TUXEDO devices ready. Just waiting for 
this to be included to sent it. Until then it can be found here: 
https://gitlab.com/tuxedocomputers/development/packages/linux/-/commits/wip_nb02 
(still needs some testing).
>
> Changes since v2:
> - drop 3rd patch
> - add Reviewed-by tag
> - reword commit description of 2nd patch
>
> Changes since v1:
> - add Suggested-by tags
>
> Armin Wolf (2):
>    platform/x86: uniwill-laptop: Split uniwill_kbd_led_init()
>    platform/x86: uniwill-laptop: Remove single color keyboard detection
>
>   drivers/platform/x86/uniwill/uniwill-acpi.c | 119 +++++++++++---------
>   1 file changed, 63 insertions(+), 56 deletions(-)
>

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

* Re: [PATCH v3 2/2] platform/x86: uniwill-laptop: Remove single color keyboard detection
  2026-07-16 16:25 ` [PATCH v3 2/2] platform/x86: uniwill-laptop: Remove single color keyboard detection Armin Wolf
  2026-07-16 16:28   ` Werner Sembach
@ 2026-07-20 10:28   ` Ilpo Järvinen
  1 sibling, 0 replies; 6+ messages in thread
From: Ilpo Järvinen @ 2026-07-20 10:28 UTC (permalink / raw)
  To: Armin Wolf; +Cc: Hans de Goede, wse, platform-driver-x86, LKML

On Thu, 16 Jul 2026, Armin Wolf wrote:

> Having a ad-hoc device whitelist inside uniwill_kbd_led_init()
> to work around unreliable KBD_WHITE_ONLY values conflicts with
> the idea of the device descriptor infrastructure.
> 
> Remove the ad-hoc device whitelist and use the device descriptor
> infrastrcture instead.

infrastructure

> 
> Suggested-by: Werner Sembach <wse@tuxedocomputers.com>
> Signed-off-by: Armin Wolf <W_Armin@gmx.de>
> ---
>  drivers/platform/x86/uniwill/uniwill-acpi.c | 32 +++++++--------------
>  1 file changed, 11 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/platform/x86/uniwill/uniwill-acpi.c b/drivers/platform/x86/uniwill/uniwill-acpi.c
> index d27f316800f6..4591ee299a90 100644
> --- a/drivers/platform/x86/uniwill/uniwill-acpi.c
> +++ b/drivers/platform/x86/uniwill/uniwill-acpi.c
> @@ -255,6 +255,7 @@
>  #define FAN_CURVE_LENGTH		5
>  
>  #define EC_ADDR_KBD_STATUS		0x078C
> +/* Unreliable */

Please point out in the comment to the mechanism that was chosen 
to be used instead. A developer 5 years from now will be much happier if 
that information is readily given instead of a single word enigma like 
that. :-)

-- 
 i.

>  #define KBD_WHITE_ONLY			BIT(0)
>  #define KBD_POWER_OFF			BIT(1)
>  #define KBD_TURBO_LEVEL_MASK		GENMASK(3, 2)
> @@ -400,7 +401,7 @@ struct uniwill_data {
>  	u8 lightbar_max_brightness;
>  	struct led_classdev_mc led_mc_cdev;
>  	struct mc_subled led_mc_subled_info[LED_CHANNELS];
> -	bool single_color_kbd;
> +	bool kbd_led_single_color;
>  	u8 kbd_led_max_brightness;
>  	unsigned int last_kbd_status;
>  	union {
> @@ -426,6 +427,7 @@ struct uniwill_battery_entry {
>  
>  struct uniwill_device_descriptor {
>  	unsigned int features;
> +	bool kbd_led_single_color;
>  	u8 kbd_led_max_brightness;
>  	u8 lightbar_max_brightness;
>  	/* Executed during driver probing */
> @@ -1629,7 +1631,7 @@ static int uniwill_notify_kbd_led(struct uniwill_data *data, int brightness)
>  	struct led_classdev *led_cdev;
>  	int ret;
>  
> -	if (data->single_color_kbd)
> +	if (data->kbd_led_single_color)
>  		led_cdev = &data->kbd_led_cdev;
>  	else
>  		led_cdev = &data->kbd_led_mc_cdev.led_cdev;
> @@ -1858,24 +1860,7 @@ static int uniwill_kbd_led_init(struct uniwill_data *data)
>  	if (ret < 0)
>  		return ret;
>  
> -	switch (data->project_id) {
> -	case PROJECT_ID_PF:
> -	case PROJECT_ID_PF4MU_PF4MN_PF5MU:
> -	case PROJECT_ID_PH4TRX1:
> -	case PROJECT_ID_PH4TUX1:
> -	case PROJECT_ID_PH4TQX1:
> -	case PROJECT_ID_PH6TRX1:
> -	case PROJECT_ID_PH6TQXX:
> -	case PROJECT_ID_PHXAXXX:
> -	case PROJECT_ID_PHXPXXX:
> -		data->single_color_kbd = true;
> -		break;
> -	default:
> -		data->single_color_kbd = regval & KBD_WHITE_ONLY;
> -		break;
> -	}
> -
> -	if (data->single_color_kbd)
> +	if (data->kbd_led_single_color)
>  		return uniwill_white_kbd_led_init(data);
>  
>  	return uniwill_rgb_kbd_led_init(data);
> @@ -2351,6 +2336,7 @@ static int uniwill_probe(struct platform_device *pdev)
>  		return ret;
>  
>  	data->features = device_descriptor.features;
> +	data->kbd_led_single_color = device_descriptor.kbd_led_single_color;
>  	data->kbd_led_max_brightness = device_descriptor.kbd_led_max_brightness;
>  	data->lightbar_max_brightness = device_descriptor.lightbar_max_brightness;
>  
> @@ -2580,7 +2566,7 @@ static int uniwill_resume_kbd_led(struct uniwill_data *data)
>  	if (ret < 0)
>  		return ret;
>  
> -	if (data->single_color_kbd)
> +	if (data->kbd_led_single_color)
>  		return 0;
>  
>  	return regmap_write_bits(data->regmap, EC_ADDR_TRIGGER, RGB_APPLY_COLOR, RGB_APPLY_COLOR);
> @@ -2687,6 +2673,7 @@ static struct uniwill_device_descriptor machenike_l16p_descriptor __initdata = {
>  		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT |
>  		    UNIWILL_FEATURE_AC_AUTO_BOOT |
>  		    UNIWILL_FEATURE_USB_POWERSHARE,
> +	.kbd_led_single_color = false,
>  	.kbd_led_max_brightness = 4,
>  };
>  
> @@ -2869,6 +2856,7 @@ static struct uniwill_device_descriptor x4sp4nal_descriptor __initdata = {
>  		    UNIWILL_FEATURE_KEYBOARD_BACKLIGHT |
>  		    UNIWILL_FEATURE_AC_AUTO_BOOT |
>  		    UNIWILL_FEATURE_USB_POWERSHARE,
> +	.kbd_led_single_color = true,
>  	.kbd_led_max_brightness = 2,
>  };
>  
> @@ -3363,6 +3351,8 @@ static int __init uniwill_init(void)
>  	if (force) {
>  		/* Assume that the device supports all features except the charge limit */
>  		device_descriptor.features = UINT_MAX & ~UNIWILL_FEATURE_BATTERY_CHARGE_LIMIT;
> +		/* Some models only have a (white) single color keyboard backlight */
> +		device_descriptor.kbd_led_single_color = false;
>  		/* Some models only support 3 brightness levels */
>  		device_descriptor.kbd_led_max_brightness = 4;
>  		/* Some models only support 36 brightness levels per color component */
> 

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

end of thread, other threads:[~2026-07-20 10:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-16 16:25 [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support Armin Wolf
2026-07-16 16:25 ` [PATCH v3 1/2] platform/x86: uniwill-laptop: Split uniwill_kbd_led_init() Armin Wolf
2026-07-16 16:25 ` [PATCH v3 2/2] platform/x86: uniwill-laptop: Remove single color keyboard detection Armin Wolf
2026-07-16 16:28   ` Werner Sembach
2026-07-20 10:28   ` Ilpo Järvinen
2026-07-16 17:40 ` [PATCH v3 0/2] platform/x86: uniwill-laptop: Prepare for extending keyboard backlight support Werner Sembach

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.