Lines Matching +full:multi +full:- +full:led

2  * LED Kernel Multi-Control Trigger
4 * Control multi leds at one time using ioctl from userspace.
6 * Copyright 2017 Allen Zhang <zwp@rock-chips.com>
8 * Based on Richard Purdie's ledtrig-timer.c.
25 #include "../leds-multi.h"
65 "default-on",
78 u64 ret_bitmap = bitmap & (bits(led_num) - 1); in multi_ctrl_calc_next_scroll_bitmap()
80 if (bitmap > (bits(led_num) - 1)) in multi_ctrl_calc_next_scroll_bitmap()
95 if (!multi_ctrl_scroll_info->data_valid) { in multi_ctrl_scroll_work_fn()
96 update_bits = bits(led_num) - 1; in multi_ctrl_scroll_work_fn()
97 multi_ctrl_scroll_info->data_valid = true; in multi_ctrl_scroll_work_fn()
100 if (unlikely(update_bits > (bits(led_num) - 1))) { in multi_ctrl_scroll_work_fn()
101 pr_warn("%s,update_bits is exceed the max led numbers!\n", in multi_ctrl_scroll_work_fn()
103 update_bits = bits(led_num) - 1; in multi_ctrl_scroll_work_fn()
107 update_bits = bits(led_num) - 1; in multi_ctrl_scroll_work_fn()
112 struct led_classdev *led_cdev = ctrl_data->led_cdev; in multi_ctrl_scroll_work_fn()
115 dev_err(led_cdev->dev, "exceed the max number of muti_leds_list\n"); in multi_ctrl_scroll_work_fn()
119 cancel_delayed_work_sync(&ctrl_data->delay_trig_work); in multi_ctrl_scroll_work_fn()
121 /* only change the led status when bits updated */ in multi_ctrl_scroll_work_fn()
138 schedule_delayed_work(&multi_ctrl_scroll_info->scroll_work, in multi_ctrl_scroll_work_fn()
153 if (!multi_ctrl_breath_info->data_valid) { in multi_ctrl_breath_work_fn()
157 multi_ctrl_breath_info->data_valid = true; in multi_ctrl_breath_work_fn()
163 struct led_classdev *led_cdev = ctrl_data->led_cdev; in multi_ctrl_breath_work_fn()
166 dev_err(led_cdev->dev, "exceed the max number of muti_leds_list\n"); in multi_ctrl_breath_work_fn()
170 cancel_delayed_work_sync(&ctrl_data->delay_trig_work); in multi_ctrl_breath_work_fn()
181 led_cdev->brightness = in multi_ctrl_breath_work_fn()
188 led_cdev->brightness); in multi_ctrl_breath_work_fn()
206 schedule_delayed_work(&multi_ctrl_breath_info->breath_work, in multi_ctrl_breath_work_fn()
214 struct led_classdev *led_cdev = ctrl_data->led_cdev; in multi_ctrl_delay_trig_func()
215 struct led_ctrl_data *led_data = ctrl_data->data; in multi_ctrl_delay_trig_func()
218 if (led_data->brightness == LED_OFF) { in multi_ctrl_delay_trig_func()
223 led_cdev->blink_delay_off = led_data->delay_off; in multi_ctrl_delay_trig_func()
224 led_cdev->blink_delay_on = led_data->delay_on; in multi_ctrl_delay_trig_func()
225 led_cdev->brightness = led_data->brightness; in multi_ctrl_delay_trig_func()
227 led_trigger_set_by_name(led_cdev, mult_ctrl_trigger[led_data->trigger]); in multi_ctrl_delay_trig_func()
229 if (led_data->trigger == TRIG_ONESHOT) in multi_ctrl_delay_trig_func()
231 &led_cdev->blink_delay_on, in multi_ctrl_delay_trig_func()
232 &led_cdev->blink_delay_off, 0); in multi_ctrl_delay_trig_func()
237 struct led_ctrl_data *led_data = ctrl_data->data; in multi_ctrl_set_led()
238 struct led_classdev *led_cdev = ctrl_data->led_cdev; in multi_ctrl_set_led()
240 if (!led_data || led_data->trigger >= TRIG_MAX) in multi_ctrl_set_led()
241 return -EINVAL; in multi_ctrl_set_led()
243 if (led_data->delayed_trigger_ms && in multi_ctrl_set_led()
244 (led_data->trigger == TRIG_TIMER || in multi_ctrl_set_led()
245 led_data->trigger == TRIG_ONESHOT)) { in multi_ctrl_set_led()
246 schedule_delayed_work(&ctrl_data->delay_trig_work, in multi_ctrl_set_led()
247 msecs_to_jiffies(led_data->delayed_trigger_ms)); in multi_ctrl_set_led()
250 if (led_data->brightness == LED_OFF || in multi_ctrl_set_led()
251 led_data->trigger == TRIG_NONE) { in multi_ctrl_set_led()
256 led_cdev->blink_delay_off = led_data->delay_off; in multi_ctrl_set_led()
257 led_cdev->blink_delay_on = led_data->delay_on; in multi_ctrl_set_led()
258 led_cdev->brightness = led_data->brightness; in multi_ctrl_set_led()
261 mult_ctrl_trigger[led_data->trigger]); in multi_ctrl_set_led()
263 if (led_data->trigger == TRIG_ONESHOT) in multi_ctrl_set_led()
265 &led_cdev->blink_delay_on, in multi_ctrl_set_led()
266 &led_cdev->blink_delay_off, 0); in multi_ctrl_set_led()
274 multi_ctrl_scroll_info->data_valid = false; in cancel_all_work_sync()
275 multi_ctrl_breath_info->data_valid = false; in cancel_all_work_sync()
276 cancel_delayed_work_sync(&multi_ctrl_scroll_info->scroll_work); in cancel_all_work_sync()
277 cancel_delayed_work_sync(&multi_ctrl_breath_info->breath_work); in cancel_all_work_sync()
316 ret = -EFAULT; in multi_ctrl_ioctl()
320 struct led_classdev *led_cdev = ctrl_data->led_cdev; in multi_ctrl_ioctl()
322 cancel_delayed_work_sync(&ctrl_data->delay_trig_work); in multi_ctrl_ioctl()
325 dev_err(led_cdev->dev, "exceed the max number of muti_leds_list\n"); in multi_ctrl_ioctl()
328 ctrl_data->data = &leds_data[i++]; in multi_ctrl_ioctl()
329 if (!memcmp(&ctrl_data->old_data, ctrl_data->data, in multi_ctrl_ioctl()
335 memcpy(&ctrl_data->old_data, ctrl_data->data, in multi_ctrl_ioctl()
352 ret = -EINVAL; in multi_ctrl_ioctl()
361 ret = -EFAULT; in multi_ctrl_ioctl()
364 schedule_delayed_work(&multi_ctrl_scroll_info->scroll_work, 0); in multi_ctrl_ioctl()
371 ret = -EINVAL; in multi_ctrl_ioctl()
376 * background color bitmap will be set to default-on mode, in multi_ctrl_ioctl()
387 ret = -EFAULT; in multi_ctrl_ioctl()
390 schedule_delayed_work(&multi_ctrl_breath_info->breath_work, 0); in multi_ctrl_ioctl()
415 return -EINVAL; in led_multi_control_register()
419 dev_err(led_cdev->dev, "malloc multi_ctrl_data failed\n"); in led_multi_control_register()
420 return -ENOMEM; in led_multi_control_register()
423 data->led_cdev = led_cdev; in led_multi_control_register()
424 data->old_data.brightness = led_cdev->brightness; in led_multi_control_register()
425 data->old_data.delay_off = led_cdev->blink_delay_off; in led_multi_control_register()
426 data->old_data.delay_on = led_cdev->blink_delay_on; in led_multi_control_register()
429 list_add_tail(&data->node, &multi_leds_list); in led_multi_control_register()
432 INIT_DELAYED_WORK(&data->delay_trig_work, in led_multi_control_register()
442 if (led_num-- < 0) in led_multi_control_unregister()
443 return -EINVAL; in led_multi_control_unregister()
447 if (ctrl_data->led_cdev == cdev) { in led_multi_control_unregister()
448 cancel_delayed_work_sync(&ctrl_data->delay_trig_work); in led_multi_control_unregister()
449 list_del(&ctrl_data->node); in led_multi_control_unregister()
467 return -ENOMEM; in led_multi_control_init()
473 ret = -ENOMEM; in led_multi_control_init()
482 pr_err("Can't register misc dev for led multi-control.\n"); in led_multi_control_init()
487 multi_ctrl_scroll_info->data = &leds_scroll_data; in led_multi_control_init()
488 INIT_DELAYED_WORK(&multi_ctrl_scroll_info->scroll_work, in led_multi_control_init()
490 multi_ctrl_breath_info->data = &leds_breath_data; in led_multi_control_init()
491 INIT_DELAYED_WORK(&multi_ctrl_breath_info->breath_work, in led_multi_control_init()
510 cancel_delayed_work_sync(&multi_ctrl_scroll_info->scroll_work); in led_multi_control_exit()
511 cancel_delayed_work_sync(&multi_ctrl_breath_info->breath_work); in led_multi_control_exit()
524 MODULE_AUTHOR("Allen.zhang <zwp@rock-chips.com>");
525 MODULE_DESCRIPTION("Multi-Contorl LED trigger");