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;