mirror of
https://github.com/FUjr/gl-infra-builder.git
synced 2025-12-16 09:10:02 +00:00
132 lines
4.2 KiB
Diff
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
|
|
|