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