diff --git a/patches-19.x/0107-kernel-leds-support-gradient-in-led-trigger-timer.patch b/patches-19.x/0107-kernel-leds-support-gradient-in-led-trigger-timer.patch new file mode 100644 index 0000000..1d02e8d --- /dev/null +++ b/patches-19.x/0107-kernel-leds-support-gradient-in-led-trigger-timer.patch @@ -0,0 +1,131 @@ +From 6d92cdee2c8ff1e98ccb748a3f3ae9613b210a57 Mon Sep 17 00:00:00 2001 +From: Jianhui Zhao +Date: Fri, 24 Sep 2021 20:06:49 +0800 +Subject: [PATCH] kernel: leds: support gradient in led-trigger-timer + +Signed-off-by: Jianhui Zhao +--- + .../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 +