Re: [PATCH] platform/x86: system76: Handle new KBLED ACPI methods

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Thank you for the patch, I have several review remarks below.

On 7/1/23 02:43, Tim Crawford wrote:
> System76 EC since system76/ec@9ac513128ad9 detects if the keyboard is
> white or RGB backlit via `RGBKB-DET#` at run-time instead of being set
> at compile-time. As part of this, the brightness of white-only backlit
> keyboards was also changed to behave more like the RGB-backlit
> keyboards: a value between 0 and 255 instead of a firmware-defined
> level.
> 
> The EC ACPI methods in coreboot have been updated for this new
> functionality only, removing the old behavior.
> 
> This should preserve behavior as we roll out new firmware with these
> changes included and users update to it.
> 
> Ref: https://github.com/system76/ec/pull/357
> Ref: https://review.coreboot.org/c/coreboot/+/76152
> Signed-off-by: Tim Crawford <tcrawford@xxxxxxxxxxxx>
> ---
>  drivers/platform/x86/system76_acpi.c | 84 ++++++++++++++++++++++------
>  1 file changed, 67 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/platform/x86/system76_acpi.c b/drivers/platform/x86/system76_acpi.c
> index fc4708fa6ebe..a172769f5172 100644
> --- a/drivers/platform/x86/system76_acpi.c
> +++ b/drivers/platform/x86/system76_acpi.c
> @@ -2,7 +2,7 @@
>  /*
>   * System76 ACPI Driver
>   *
> - * Copyright (C) 2019 System76
> + * Copyright (C) 2023 System76
>   *
>   * This program is free software; you can redistribute it and/or modify
>   * it under the terms of the GNU General Public License version 2 as
> @@ -24,6 +24,12 @@
>  
>  #include <acpi/battery.h>
>  
> +enum kbled_type {
> +	KBLED_NONE,
> +	KBLED_WHITE,
> +	KBLED_RGB,
> +};
> +
>  struct system76_data {
>  	struct acpi_device *acpi_dev;
>  	struct led_classdev ap_led;
> @@ -36,6 +42,7 @@ struct system76_data {
>  	union acpi_object *ntmp;
>  	struct input_dev *input;
>  	bool has_open_ec;
> +	enum kbled_type kbled_type;
>  };
>  
>  static const struct acpi_device_id device_ids[] = {
> @@ -51,7 +58,7 @@ static const enum led_brightness kb_levels[] = {
>  	96,
>  	144,
>  	192,
> -	255
> +	255,
>  };
>  
>  // Array of keyboard LED colors in 24-bit RGB format

Please drop this unnecessary addition of the ',' .

> @@ -62,7 +69,7 @@ static const int kb_colors[] = {
>  	0xFF00FF,
>  	0x00FF00,
>  	0x00FFFF,
> -	0xFFFF00
> +	0xFFFF00,
>  };
>  
>  // Get a System76 ACPI device value by name

Please drop this unnecessary addition of the ',' .

> @@ -327,7 +334,11 @@ static int kb_led_set(struct led_classdev *led, enum led_brightness value)
>  
>  	data = container_of(led, struct system76_data, kb_led);
>  	data->kb_brightness = value;
> -	return system76_set(data, "SKBL", (int)data->kb_brightness);
> +	if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) {
> +		return system76_set(data, "SKBB", (int)data->kb_brightness);
> +	} else {
> +		return system76_set(data, "SKBL", (int)data->kb_brightness);
> +	}
>  }
>  
>  // Get the last set keyboard LED color
> @@ -399,7 +410,12 @@ static void kb_led_hotkey_hardware(struct system76_data *data)
>  {
>  	int value;
>  
> -	value = system76_get(data, "GKBL");
> +	if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) {
> +		value = system76_get(data, "GKBB");
> +	} else {
> +		value = system76_get(data, "GKBL");
> +	}
> +
>  	if (value < 0)
>  		return;
>  	data->kb_brightness = value;
> @@ -683,20 +699,54 @@ static int system76_add(struct acpi_device *acpi_dev)
>  	if (err)
>  		return err;
>  
> -	data->kb_led.name = "system76_acpi::kbd_backlight";
> -	data->kb_led.flags = LED_BRIGHT_HW_CHANGED | LED_CORE_SUSPENDRESUME;
> -	data->kb_led.brightness_get = kb_led_get;
> -	data->kb_led.brightness_set_blocking = kb_led_set;

These 4 lines are repeated in all 3 scenarios below, please just
keep them here above the if () ... ... ... blocks.

> -	if (acpi_has_method(acpi_device_handle(data->acpi_dev), "SKBC")) {
> -		data->kb_led.max_brightness = 255;
> -		data->kb_led.groups = system76_kb_led_color_groups;
> -		data->kb_toggle_brightness = 72;
> -		data->kb_color = 0xffffff;
> -		system76_set(data, "SKBC", data->kb_color);
> +	if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) {
> +		// Use the new ACPI methods
> +		data->kbled_type = system76_get(data, "GKBK");
> +
> +		switch (data->kbled_type) {
> +		case KBLED_NONE:
> +			data->kb_led.max_brightness = 0;
> +			data->kb_color = -1;
> +			break;

In this case you don't want to call the devm_led_classdev_register()
below, so perhaps do an early return from the function here ?

> +		case KBLED_WHITE:
> +			data->kb_led.name = "system76_acpi::kbd_backlight";
> +			data->kb_led.flags = LED_BRIGHT_HW_CHANGED | LED_CORE_SUSPENDRESUME;
> +			data->kb_led.brightness_get = kb_led_get;
> +			data->kb_led.brightness_set_blocking = kb_led_set;
> +			data->kb_led.max_brightness = 255;
> +			data->kb_toggle_brightness = 72;
> +			data->kb_color = 0xffffff;

I don't think that setting kb_color for the non color keyboard
makes sense ? Note the old code uses -1 as color for the non RGB
backlight case.

> +			break;
> +		case KBLED_RGB:
> +			data->kb_led.name = "system76_acpi::kbd_backlight";
> +			data->kb_led.flags = LED_BRIGHT_HW_CHANGED | LED_CORE_SUSPENDRESUME;
> +			data->kb_led.brightness_get = kb_led_get;
> +			data->kb_led.brightness_set_blocking = kb_led_set;
> +			data->kb_led.max_brightness = 255;
> +			data->kb_led.groups = system76_kb_led_color_groups;
> +			data->kb_toggle_brightness = 72;
> +			data->kb_color = 0xffffff;
> +			system76_set(data, "SKBC", data->kb_color);
> +			break;
> +		}
>  	} else {
> -		data->kb_led.max_brightness = 5;
> -		data->kb_color = -1;
> +		// Use the old ACPI methods
> +		data->kb_led.name = "system76_acpi::kbd_backlight";
> +		data->kb_led.flags = LED_BRIGHT_HW_CHANGED | LED_CORE_SUSPENDRESUME;
> +		data->kb_led.brightness_get = kb_led_get;
> +		data->kb_led.brightness_set_blocking = kb_led_set;
> +		if (acpi_has_method(acpi_device_handle(data->acpi_dev), "SKBC")) {
> +			data->kb_led.max_brightness = 255;
> +			data->kb_led.groups = system76_kb_led_color_groups;
> +			data->kb_toggle_brightness = 72;
> +			data->kb_color = 0xffffff;
> +			system76_set(data, "SKBC", data->kb_color);
> +		} else {
> +			data->kb_led.max_brightness = 5;
> +			data->kb_color = -1;

Same remark, is it necesssary to set kb_color here at all ?

Regards,

Hans



> +		}
>  	}
> +
>  	err = devm_led_classdev_register(&acpi_dev->dev, &data->kb_led);
>  	if (err)
>  		return err;




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux