diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2023-11-20 05:42:03 -0800 |
---|---|---|
committer | Pierre-Loup A. Griffais <pgriffais@valvesoftware.com> | 2023-11-22 15:55:54 -0800 |
commit | e90fb9bec45c15c0c541ce60b994bab3922ddadf (patch) | |
tree | 3b565f50e0f4d25a6205615f5b9f9d49ebafa6fc /drivers | |
parent | 3b2e75ef7615d5a40c8d3fe5b5116614ec72ff38 (diff) | |
download | linux-e90fb9bec45c15c0c541ce60b994bab3922ddadf.tar.gz |
leds-steamdeck: Add support for LED birghtness multiplier
Add support for LED birghtness multiplier exposed via custom sysfs attribute (led_brightness_multiplier). Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> (cherry picked from commit c4ea057992e189ec8821cde3a65e2cc0529a5088)
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/leds/leds-steamdeck.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/leds/leds-steamdeck.c b/drivers/leds/leds-steamdeck.c index 686500b8de73..ada9fffc0a42 100644 --- a/drivers/leds/leds-steamdeck.c +++ b/drivers/leds/leds-steamdeck.c @@ -16,6 +16,54 @@ struct steamdeck_led { struct led_classdev cdev; }; +static ssize_t led_brightness_multiplier_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct led_classdev *cdev = dev_get_drvdata(dev); + struct steamdeck_led *sd = container_of(cdev, struct steamdeck_led, + cdev); + unsigned long long led_brightness_multiplier; + + if (ACPI_FAILURE(acpi_evaluate_integer(sd->adev->handle, + "GLDM", + NULL, + &led_brightness_multiplier))) + return -EIO; + + + return sprintf(buf, "%llu", led_brightness_multiplier); +} + +static ssize_t led_brightness_multiplier_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct led_classdev *cdev = dev_get_drvdata(dev); + struct steamdeck_led *sd = container_of(cdev, struct steamdeck_led, + cdev); + unsigned long value; + + if (kstrtoul(buf, 10, &value) || value > 100) + return -EINVAL; + + + if (ACPI_FAILURE(acpi_execute_simple_method(sd->adev->handle, + "SLDM", value))) + return -EIO; + + + return count; +} + +static DEVICE_ATTR_RW(led_brightness_multiplier); + +static struct attribute *steamdeck_led_attrs[] = { + &dev_attr_led_brightness_multiplier.attr, + NULL +}; +ATTRIBUTE_GROUPS(steamdeck_led); + static int steamdeck_leds_brightness_set(struct led_classdev *cdev, enum led_brightness value) { @@ -44,6 +92,7 @@ static int steamdeck_leds_probe(struct platform_device *pdev) sd->cdev.name = "status:white"; sd->cdev.brightness_set_blocking = steamdeck_leds_brightness_set; sd->cdev.max_brightness = 100; + sd->cdev.groups = steamdeck_led_groups; ret = devm_led_classdev_register(dev, &sd->cdev); if (ret) { |