diff options
author | Jacek Anaszewski <j.anaszewski@samsung.com> | 2014-11-14 05:50:18 -0500 |
---|---|---|
committer | Bryan Wu <cooloney@gmail.com> | 2014-11-14 17:29:35 -0500 |
commit | 4d71a4a12b130ad033219e6f58c74a64059415eb (patch) | |
tree | 5b9560719835c5a204b92f4bb7e44aae6793281c /drivers/leds/led-class.c | |
parent | acd899e4f3066b6662f6047da5b795cc762093cb (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.c | 10 |
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; |
61 | unlock: | 61 | unlock: |
@@ -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); |