gl-infra-builder-FUjr/patches-19.x/0107-kernel-leds-support-gradient-in-led-trigger-timer.patch
Jianhui Zhao 3b5491228f patches-19.x: kernel: leds: support gradient in led-trigger-timer
Signed-off-by: Jianhui Zhao <jianhui.zhao@gl-inet.com>
2021-09-24 20:08:18 +08:00

132 lines
4.2 KiB
Diff

From 6d92cdee2c8ff1e98ccb748a3f3ae9613b210a57 Mon Sep 17 00:00:00 2001
From: Jianhui Zhao <jianhui.zhao@gl-inet.com>
Date: Fri, 24 Sep 2021 20:06:49 +0800
Subject: [PATCH] kernel: leds: support gradient in led-trigger-timer
Signed-off-by: Jianhui Zhao <jianhui.zhao@gl-inet.com>
---
.../955-leds-support-gradient.patch | 111 ++++++++++++++++++
1 file changed, 111 insertions(+)
create mode 100644 target/linux/generic/pending-4.14/955-leds-support-gradient.patch
diff --git a/target/linux/generic/pending-4.14/955-leds-support-gradient.patch b/target/linux/generic/pending-4.14/955-leds-support-gradient.patch
new file mode 100644
index 0000000000..0712c942e7
--- /dev/null
+++ b/target/linux/generic/pending-4.14/955-leds-support-gradient.patch
@@ -0,0 +1,111 @@
+--- a/drivers/leds/led-core.c
++++ b/drivers/leds/led-core.c
+@@ -227,6 +227,15 @@ void led_stop_software_blink(struct led_
+ }
+ EXPORT_SYMBOL_GPL(led_stop_software_blink);
+
++void led_gradient_set(struct led_classdev *led_cdev, bool on)
++{
++ if (led_cdev->gradient_set) {
++ led_cdev->gradient_set(led_cdev, on);
++ return;
++ }
++}
++EXPORT_SYMBOL_GPL(led_gradient_set);
++
+ void led_set_brightness(struct led_classdev *led_cdev,
+ enum led_brightness brightness)
+ {
+--- a/drivers/leds/trigger/ledtrig-timer.c
++++ b/drivers/leds/trigger/ledtrig-timer.c
+@@ -68,8 +68,34 @@ static ssize_t led_delay_off_store(struc
+ return size;
+ }
+
++static ssize_t led_gradient_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct led_classdev *led_cdev = dev_get_drvdata(dev);
++
++ return sprintf(buf, "%d\n", led_cdev->gradiented);
++}
++
++static ssize_t led_gradient_store(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t size)
++{
++ struct led_classdev *led_cdev = dev_get_drvdata(dev);
++ unsigned long state;
++ ssize_t ret = -EINVAL;
++
++ ret = kstrtoul(buf, 10, &state);
++ if (ret)
++ return ret;
++
++ led_gradient_set(led_cdev, state);
++ led_cdev->gradiented = state ? true : false;
++
++ return size;
++}
++
+ static DEVICE_ATTR(delay_on, 0644, led_delay_on_show, led_delay_on_store);
+ static DEVICE_ATTR(delay_off, 0644, led_delay_off_show, led_delay_off_store);
++static DEVICE_ATTR(gradient, 0644, led_gradient_show, led_gradient_store);
+
+ static void timer_trig_activate(struct led_classdev *led_cdev)
+ {
+@@ -83,6 +109,9 @@ static void timer_trig_activate(struct l
+ rc = device_create_file(led_cdev->dev, &dev_attr_delay_off);
+ if (rc)
+ goto err_out_delayon;
++ rc = device_create_file(led_cdev->dev, &dev_attr_gradient);
++ if (rc)
++ goto err_out_delayoff;
+
+ led_blink_set(led_cdev, &led_cdev->blink_delay_on,
+ &led_cdev->blink_delay_off);
+@@ -90,6 +119,8 @@ static void timer_trig_activate(struct l
+
+ return;
+
++err_out_delayoff:
++ device_remove_file(led_cdev->dev, &dev_attr_delay_off);
+ err_out_delayon:
+ device_remove_file(led_cdev->dev, &dev_attr_delay_on);
+ }
+@@ -99,6 +130,7 @@ static void timer_trig_deactivate(struct
+ if (led_cdev->activated) {
+ device_remove_file(led_cdev->dev, &dev_attr_delay_on);
+ device_remove_file(led_cdev->dev, &dev_attr_delay_off);
++ device_remove_file(led_cdev->dev, &dev_attr_gradient);
+ led_cdev->activated = false;
+ }
+
+--- a/include/linux/leds.h
++++ b/include/linux/leds.h
+@@ -88,12 +88,16 @@ struct led_classdev {
+ unsigned long *delay_on,
+ unsigned long *delay_off);
+
++ /* Activate hardware accelerated gradient */
++ void (*gradient_set)(struct led_classdev *led_cdev, bool on);
++
+ struct device *dev;
+ const struct attribute_group **groups;
+
+ struct list_head node; /* LED Device list */
+ const char *default_trigger; /* Trigger to use */
+
++ bool gradiented;
+ unsigned long blink_delay_on, blink_delay_off;
+ struct timer_list blink_timer;
+ int blink_brightness;
+@@ -157,6 +161,9 @@ extern void led_classdev_resume(struct l
+ extern void led_blink_set(struct led_classdev *led_cdev,
+ unsigned long *delay_on,
+ unsigned long *delay_off);
++
++extern void led_gradient_set(struct led_classdev *led_cdev, bool on);
++
+ /**
+ * led_blink_set_oneshot - do a oneshot software blink
+ * @led_cdev: the LED to start blinking
--
2.17.1