aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/leds/led-class.c
diff options
context:
space:
mode:
authorJacek Anaszewski <j.anaszewski@samsung.com>2014-11-14 05:50:18 -0500
committerBryan Wu <cooloney@gmail.com>2014-11-14 17:29:35 -0500
commit4d71a4a12b130ad033219e6f58c74a64059415eb (patch)
tree5b9560719835c5a204b92f4bb7e44aae6793281c /drivers/leds/led-class.c
parentacd899e4f3066b6662f6047da5b795cc762093cb (diff)
leds: Add support for setting brightness in a synchronous way
There are use cases when setting a LED brightness has to have immediate effect (e.g. setting a torch LED brightness). This patch extends LED subsystem to support such operations. The LED subsystem internal API __led_set_brightness is changed to led_set_brightness_async and new led_set_brightness_sync API is added. Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com> Acked-by: Kyungmin Park <kyungmin.park@samsung.com> Cc: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Bryan Wu <cooloney@gmail.com>
Diffstat (limited to 'drivers/leds/led-class.c')
-rw-r--r--drivers/leds/led-class.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index 65722deb8d28..dbeebac38d31 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -55,7 +55,7 @@ static ssize_t brightness_store(struct device *dev,
55 55
56 if (state == LED_OFF) 56 if (state == LED_OFF)
57 led_trigger_remove(led_cdev); 57 led_trigger_remove(led_cdev);
58 __led_set_brightness(led_cdev, state); 58 led_set_brightness(led_cdev, state);
59 59
60 ret = size; 60 ret = size;
61unlock: 61unlock:
@@ -109,7 +109,7 @@ static void led_timer_function(unsigned long data)
109 unsigned long delay; 109 unsigned long delay;
110 110
111 if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) { 111 if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) {
112 __led_set_brightness(led_cdev, LED_OFF); 112 led_set_brightness_async(led_cdev, LED_OFF);
113 return; 113 return;
114 } 114 }
115 115
@@ -132,7 +132,7 @@ static void led_timer_function(unsigned long data)
132 delay = led_cdev->blink_delay_off; 132 delay = led_cdev->blink_delay_off;
133 } 133 }
134 134
135 __led_set_brightness(led_cdev, brightness); 135 led_set_brightness_async(led_cdev, brightness);
136 136
137 /* Return in next iteration if led is in one-shot mode and we are in 137 /* Return in next iteration if led is in one-shot mode and we are in
138 * the final blink state so that the led is toggled each delay_on + 138 * the final blink state so that the led is toggled each delay_on +
@@ -158,7 +158,7 @@ static void set_brightness_delayed(struct work_struct *ws)
158 158
159 led_stop_software_blink(led_cdev); 159 led_stop_software_blink(led_cdev);
160 160
161 __led_set_brightness(led_cdev, led_cdev->delayed_set_value); 161 led_set_brightness_async(led_cdev, led_cdev->delayed_set_value);
162} 162}
163 163
164/** 164/**
@@ -233,6 +233,8 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
233 if (!led_cdev->max_brightness) 233 if (!led_cdev->max_brightness)
234 led_cdev->max_brightness = LED_FULL; 234 led_cdev->max_brightness = LED_FULL;
235 235
236 led_cdev->flags |= SET_BRIGHTNESS_ASYNC;
237
236 led_update_brightness(led_cdev); 238 led_update_brightness(led_cdev);
237 239
238 INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed); 240 INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);