Commit 76931edd authored by Stas Sergeev's avatar Stas Sergeev Committed by Bryan Wu

leds: fix brightness changing when software blinking is active

The following sequence:
echo timer >/sys/class/leds/<name>/trigger
echo 1 >/sys/class/leds/<name>/brightness
should change the ON brightness for blinking.
The function led_set_brightness() was mistakenly initiating the
delayed blink stop procedure, which resulted in no blinking with
the timer trigger still active.

This patch fixes the problem by changing led_set_brightness()
to not initiate the delayed blink stop when brightness is not 0.

CC: Richard Purdie <rpurdie@rpsys.net>
CC: Kyungmin Park <kyungmin.park@samsung.com>
CC: linux-leds@vger.kernel.org
CC: linux-kernel@vger.kernel.org
Acked-by: default avatarJacek Anaszewski <j.anaszewski@samsung.com>
Signed-off-by: default avatarStas Sergeev <stsp@users.sourceforge.net>
Signed-off-by: default avatarBryan Wu <cooloney@gmail.com>
parent 7ff6b232
...@@ -121,6 +121,11 @@ static void led_timer_function(unsigned long data) ...@@ -121,6 +121,11 @@ static void led_timer_function(unsigned long data)
brightness = led_get_brightness(led_cdev); brightness = led_get_brightness(led_cdev);
if (!brightness) { if (!brightness) {
/* Time to switch the LED on. */ /* Time to switch the LED on. */
if (led_cdev->delayed_set_value) {
led_cdev->blink_brightness =
led_cdev->delayed_set_value;
led_cdev->delayed_set_value = 0;
}
brightness = led_cdev->blink_brightness; brightness = led_cdev->blink_brightness;
delay = led_cdev->blink_delay_on; delay = led_cdev->blink_delay_on;
} else { } else {
......
...@@ -119,9 +119,10 @@ void led_set_brightness(struct led_classdev *led_cdev, ...@@ -119,9 +119,10 @@ void led_set_brightness(struct led_classdev *led_cdev,
{ {
int ret = 0; int ret = 0;
/* delay brightness setting if need to stop soft-blink timer */ /* delay brightness if soft-blink is active */
if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) { if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) {
led_cdev->delayed_set_value = brightness; led_cdev->delayed_set_value = brightness;
if (brightness == LED_OFF)
schedule_work(&led_cdev->set_brightness_work); schedule_work(&led_cdev->set_brightness_work);
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment