aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/leds/led-class.c
diff options
context:
space:
mode:
authorJacek Anaszewski <j.anaszewski@samsung.com>2015-09-28 08:38:04 -0400
committerJacek Anaszewski <j.anaszewski@samsung.com>2015-11-03 02:59:22 -0500
commit757b06ae04b3b6c8958ab067e879a8865d076d2a (patch)
treec210be20cf1c644e2c156acf216f2734526c8cfa /drivers/leds/led-class.c
parent22a16873d38829570677871a22cf77f00445206f (diff)
leds: core: Move LED core callbacks out of led-class.c
Since the API for controlling LED brightness and blinking is defined in the LED core, move the related timer and work callbacks to the led-core.c, and initialize them through a new led_core_init API. Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com> Acked-by: Andrew Lunn <andrew@lunn.ch> Acked-by: Pavel Machek <pavel@ucw.cz>
Diffstat (limited to 'drivers/leds/led-class.c')
-rw-r--r--drivers/leds/led-class.c69
1 files changed, 1 insertions, 68 deletions
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index ca51d58bed24..7385f98dd54b 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -102,70 +102,6 @@ static const struct attribute_group *led_groups[] = {
102 NULL, 102 NULL,
103}; 103};
104 104
105static void led_timer_function(unsigned long data)
106{
107 struct led_classdev *led_cdev = (void *)data;
108 unsigned long brightness;
109 unsigned long delay;
110
111 if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) {
112 led_set_brightness_async(led_cdev, LED_OFF);
113 return;
114 }
115
116 if (led_cdev->flags & LED_BLINK_ONESHOT_STOP) {
117 led_cdev->flags &= ~LED_BLINK_ONESHOT_STOP;
118 return;
119 }
120
121 brightness = led_get_brightness(led_cdev);
122 if (!brightness) {
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 }
129 brightness = led_cdev->blink_brightness;
130 delay = led_cdev->blink_delay_on;
131 } else {
132 /* Store the current brightness value to be able
133 * to restore it when the delay_off period is over.
134 */
135 led_cdev->blink_brightness = brightness;
136 brightness = LED_OFF;
137 delay = led_cdev->blink_delay_off;
138 }
139
140 led_set_brightness_async(led_cdev, brightness);
141
142 /* Return in next iteration if led is in one-shot mode and we are in
143 * the final blink state so that the led is toggled each delay_on +
144 * delay_off milliseconds in worst case.
145 */
146 if (led_cdev->flags & LED_BLINK_ONESHOT) {
147 if (led_cdev->flags & LED_BLINK_INVERT) {
148 if (brightness)
149 led_cdev->flags |= LED_BLINK_ONESHOT_STOP;
150 } else {
151 if (!brightness)
152 led_cdev->flags |= LED_BLINK_ONESHOT_STOP;
153 }
154 }
155
156 mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay));
157}
158
159static void set_brightness_delayed(struct work_struct *ws)
160{
161 struct led_classdev *led_cdev =
162 container_of(ws, struct led_classdev, set_brightness_work);
163
164 led_stop_software_blink(led_cdev);
165
166 led_set_brightness_async(led_cdev, led_cdev->delayed_set_value);
167}
168
169/** 105/**
170 * led_classdev_suspend - suspend an led_classdev. 106 * led_classdev_suspend - suspend an led_classdev.
171 * @led_cdev: the led_classdev to suspend. 107 * @led_cdev: the led_classdev to suspend.
@@ -283,10 +219,7 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
283 219
284 led_update_brightness(led_cdev); 220 led_update_brightness(led_cdev);
285 221
286 INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed); 222 led_init_core(led_cdev);
287
288 setup_timer(&led_cdev->blink_timer, led_timer_function,
289 (unsigned long)led_cdev);
290 223
291#ifdef CONFIG_LEDS_TRIGGERS 224#ifdef CONFIG_LEDS_TRIGGERS
292 led_trigger_set_default(led_cdev); 225 led_trigger_set_default(led_cdev);