Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

platform/x86: system76: Handle new KBLED ACPI methods

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.

Link: https://github.com/system76/ec/pull/357
Link: https://review.coreboot.org/c/coreboot/+/76152
Signed-off-by: Tim Crawford <tcrawford@system76.com>
Link: https://lore.kernel.org/r/20230719181324.47035-1-tcrawford@system76.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>

authored by

Tim Crawford and committed by
Hans de Goede
5d36931f b9fe9c9e

+59 -15
+59 -15
drivers/platform/x86/system76_acpi.c
··· 2 2 /* 3 3 * System76 ACPI Driver 4 4 * 5 - * Copyright (C) 2019 System76 5 + * Copyright (C) 2023 System76 6 6 * 7 7 * This program is free software; you can redistribute it and/or modify 8 8 * it under the terms of the GNU General Public License version 2 as ··· 24 24 25 25 #include <acpi/battery.h> 26 26 27 + enum kbled_type { 28 + KBLED_NONE, 29 + KBLED_WHITE, 30 + KBLED_RGB, 31 + }; 32 + 27 33 struct system76_data { 28 34 struct acpi_device *acpi_dev; 29 35 struct led_classdev ap_led; ··· 42 36 union acpi_object *ntmp; 43 37 struct input_dev *input; 44 38 bool has_open_ec; 39 + enum kbled_type kbled_type; 45 40 }; 46 41 47 42 static const struct acpi_device_id device_ids[] = { ··· 334 327 335 328 data = container_of(led, struct system76_data, kb_led); 336 329 data->kb_brightness = value; 337 - return system76_set(data, "SKBL", (int)data->kb_brightness); 330 + if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) { 331 + return system76_set(data, "SKBB", (int)data->kb_brightness); 332 + } else { 333 + return system76_set(data, "SKBL", (int)data->kb_brightness); 334 + } 338 335 } 339 336 340 337 // Get the last set keyboard LED color ··· 410 399 { 411 400 int value; 412 401 413 - value = system76_get(data, "GKBL"); 402 + if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) { 403 + value = system76_get(data, "GKBB"); 404 + } else { 405 + value = system76_get(data, "GKBL"); 406 + } 407 + 414 408 if (value < 0) 415 409 return; 416 410 data->kb_brightness = value; ··· 475 459 { 476 460 int i; 477 461 478 - if (data->kb_color < 0) 462 + if (data->kbled_type != KBLED_RGB) 479 463 return; 464 + 480 465 if (data->kb_brightness > 0) { 481 466 for (i = 0; i < ARRAY_SIZE(kb_colors); i++) { 482 467 if (kb_colors[i] == data->kb_color) ··· 704 687 data->kb_led.flags = LED_BRIGHT_HW_CHANGED | LED_CORE_SUSPENDRESUME; 705 688 data->kb_led.brightness_get = kb_led_get; 706 689 data->kb_led.brightness_set_blocking = kb_led_set; 707 - if (acpi_has_method(acpi_device_handle(data->acpi_dev), "SKBC")) { 708 - data->kb_led.max_brightness = 255; 709 - data->kb_led.groups = system76_kb_led_color_groups; 710 - data->kb_toggle_brightness = 72; 711 - data->kb_color = 0xffffff; 712 - system76_set(data, "SKBC", data->kb_color); 690 + if (acpi_has_method(acpi_device_handle(data->acpi_dev), "GKBK")) { 691 + // Use the new ACPI methods 692 + data->kbled_type = system76_get(data, "GKBK"); 693 + 694 + switch (data->kbled_type) { 695 + case KBLED_NONE: 696 + // Nothing to do: Device will not be registered. 697 + break; 698 + case KBLED_WHITE: 699 + data->kb_led.max_brightness = 255; 700 + data->kb_toggle_brightness = 72; 701 + break; 702 + case KBLED_RGB: 703 + data->kb_led.max_brightness = 255; 704 + data->kb_led.groups = system76_kb_led_color_groups; 705 + data->kb_toggle_brightness = 72; 706 + data->kb_color = 0xffffff; 707 + system76_set(data, "SKBC", data->kb_color); 708 + break; 709 + } 713 710 } else { 714 - data->kb_led.max_brightness = 5; 715 - data->kb_color = -1; 711 + // Use the old ACPI methods 712 + if (acpi_has_method(acpi_device_handle(data->acpi_dev), "SKBC")) { 713 + data->kbled_type = KBLED_RGB; 714 + data->kb_led.max_brightness = 255; 715 + data->kb_led.groups = system76_kb_led_color_groups; 716 + data->kb_toggle_brightness = 72; 717 + data->kb_color = 0xffffff; 718 + system76_set(data, "SKBC", data->kb_color); 719 + } else { 720 + data->kbled_type = KBLED_WHITE; 721 + data->kb_led.max_brightness = 5; 722 + } 716 723 } 717 - err = devm_led_classdev_register(&acpi_dev->dev, &data->kb_led); 718 - if (err) 719 - return err; 724 + 725 + if (data->kbled_type != KBLED_NONE) { 726 + err = devm_led_classdev_register(&acpi_dev->dev, &data->kb_led); 727 + if (err) 728 + return err; 729 + } 720 730 721 731 data->input = devm_input_allocate_device(&acpi_dev->dev); 722 732 if (!data->input)