Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Jacek Anaszewski <j.anaszewski@samsung.com>
Signed-off-by: Stas Sergeev <stsp@users.sourceforge.net>
Signed-off-by: Bryan Wu <cooloney@gmail.com>

authored by

Stas Sergeev and committed by
Bryan Wu
76931edd 7ff6b232

+8 -2
+5
drivers/leds/led-class.c
··· 121 121 brightness = led_get_brightness(led_cdev); 122 122 if (!brightness) { 123 123 /* Time to switch the LED on. */ 124 + if (led_cdev->delayed_set_value) { 125 + led_cdev->blink_brightness = 126 + led_cdev->delayed_set_value; 127 + led_cdev->delayed_set_value = 0; 128 + } 124 129 brightness = led_cdev->blink_brightness; 125 130 delay = led_cdev->blink_delay_on; 126 131 } else {
+3 -2
drivers/leds/led-core.c
··· 119 119 { 120 120 int ret = 0; 121 121 122 - /* delay brightness setting if need to stop soft-blink timer */ 122 + /* delay brightness if soft-blink is active */ 123 123 if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) { 124 124 led_cdev->delayed_set_value = brightness; 125 - schedule_work(&led_cdev->set_brightness_work); 125 + if (brightness == LED_OFF) 126 + schedule_work(&led_cdev->set_brightness_work); 126 127 return; 127 128 } 128 129