Lines Matching +full:led +full:- +full:pattern
1 // SPDX-License-Identifier: GPL-2.0-only
3 * LED Class Core
5 * Copyright 2005-2006 Openedhand Ltd.
11 #include <linux/led-class-multicolor.h>
49 if (!led_cdev->brightness_set) in __led_set_brightness()
50 return -ENOTSUPP; in __led_set_brightness()
52 led_cdev->brightness_set(led_cdev, value); in __led_set_brightness()
59 if (!led_cdev->brightness_set_blocking) in __led_set_brightness_blocking()
60 return -ENOTSUPP; in __led_set_brightness_blocking()
62 return led_cdev->brightness_set_blocking(led_cdev, value); in __led_set_brightness_blocking()
71 if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) { in led_timer_function()
73 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_timer_function()
78 &led_cdev->work_flags)) { in led_timer_function()
79 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_timer_function()
85 /* Time to switch the LED on. */ in led_timer_function()
87 &led_cdev->work_flags)) in led_timer_function()
88 brightness = led_cdev->new_blink_brightness; in led_timer_function()
90 brightness = led_cdev->blink_brightness; in led_timer_function()
91 delay = led_cdev->blink_delay_on; in led_timer_function()
96 led_cdev->blink_brightness = brightness; in led_timer_function()
98 delay = led_cdev->blink_delay_off; in led_timer_function()
103 /* Return in next iteration if led is in one-shot mode and we are in in led_timer_function()
104 * the final blink state so that the led is toggled each delay_on + in led_timer_function()
107 if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags)) { in led_timer_function()
108 if (test_bit(LED_BLINK_INVERT, &led_cdev->work_flags)) { in led_timer_function()
111 &led_cdev->work_flags); in led_timer_function()
115 &led_cdev->work_flags); in led_timer_function()
119 mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay)); in led_timer_function()
128 if (ret == -ENOTSUPP) { in set_brightness_delayed_set_brightness()
130 if (ret == -ENOTSUPP) in set_brightness_delayed_set_brightness()
131 /* No back-end support to set a fixed brightness value */ in set_brightness_delayed_set_brightness()
135 /* LED HW might have been unplugged, therefore don't warn */ in set_brightness_delayed_set_brightness()
136 if (ret == -ENODEV && led_cdev->flags & LED_UNREGISTERING && in set_brightness_delayed_set_brightness()
137 led_cdev->flags & LED_HW_PLUGGABLE) in set_brightness_delayed_set_brightness()
141 dev_err(led_cdev->dev, in set_brightness_delayed_set_brightness()
142 "Setting an LED's brightness failed (%d)\n", ret); in set_brightness_delayed_set_brightness()
150 if (test_and_clear_bit(LED_BLINK_DISABLE, &led_cdev->work_flags)) { in set_brightness_delayed()
152 set_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags); in set_brightness_delayed()
158 * and turn the LED on. Both actions may have been scheduled to run in set_brightness_delayed()
162 if (test_and_clear_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags)) { in set_brightness_delayed()
169 * work. To avoid ending with the LED turned off, turn the LED in set_brightness_delayed()
172 if (led_cdev->delayed_set_value != LED_OFF) in set_brightness_delayed()
173 set_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags); in set_brightness_delayed()
176 if (test_and_clear_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags)) in set_brightness_delayed()
177 set_brightness_delayed_set_brightness(led_cdev, led_cdev->delayed_set_value); in set_brightness_delayed()
179 if (test_and_clear_bit(LED_SET_BLINK, &led_cdev->work_flags)) { in set_brightness_delayed()
180 unsigned long delay_on = led_cdev->delayed_delay_on; in set_brightness_delayed()
181 unsigned long delay_off = led_cdev->delayed_delay_off; in set_brightness_delayed()
195 led_cdev->blink_brightness = current_brightness; in led_set_software_blink()
196 if (!led_cdev->blink_brightness) in led_set_software_blink()
197 led_cdev->blink_brightness = led_cdev->max_brightness; in led_set_software_blink()
199 led_cdev->blink_delay_on = delay_on; in led_set_software_blink()
200 led_cdev->blink_delay_off = delay_off; in led_set_software_blink()
202 /* never on - just set to off */ in led_set_software_blink()
208 /* never off - just set to brightness */ in led_set_software_blink()
211 led_cdev->blink_brightness); in led_set_software_blink()
215 set_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_set_software_blink()
216 mod_timer(&led_cdev->blink_timer, jiffies + 1); in led_set_software_blink()
224 if (!test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) && in led_blink_setup()
225 led_cdev->blink_set && in led_blink_setup()
226 !led_cdev->blink_set(led_cdev, delay_on, delay_off)) in led_blink_setup()
238 INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed); in led_init_core()
240 timer_setup(&led_cdev->blink_timer, led_timer_function, 0); in led_init_core()
248 del_timer_sync(&led_cdev->blink_timer); in led_blink_set()
250 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_blink_set()
251 clear_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags); in led_blink_set()
252 clear_bit(LED_BLINK_ONESHOT_STOP, &led_cdev->work_flags); in led_blink_set()
263 if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) && in led_blink_set_oneshot()
264 timer_pending(&led_cdev->blink_timer)) in led_blink_set_oneshot()
267 set_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags); in led_blink_set_oneshot()
268 clear_bit(LED_BLINK_ONESHOT_STOP, &led_cdev->work_flags); in led_blink_set_oneshot()
271 set_bit(LED_BLINK_INVERT, &led_cdev->work_flags); in led_blink_set_oneshot()
273 clear_bit(LED_BLINK_INVERT, &led_cdev->work_flags); in led_blink_set_oneshot()
283 if (led_cdev->blink_set && led_cdev->brightness_set_blocking) { in led_blink_set_nosleep()
284 led_cdev->delayed_delay_on = delay_on; in led_blink_set_nosleep()
285 led_cdev->delayed_delay_off = delay_off; in led_blink_set_nosleep()
286 set_bit(LED_SET_BLINK, &led_cdev->work_flags); in led_blink_set_nosleep()
287 queue_work(led_cdev->wq, &led_cdev->set_brightness_work); in led_blink_set_nosleep()
297 del_timer_sync(&led_cdev->blink_timer); in led_stop_software_blink()
298 led_cdev->blink_delay_on = 0; in led_stop_software_blink()
299 led_cdev->blink_delay_off = 0; in led_stop_software_blink()
300 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_stop_software_blink()
310 if (test_bit(LED_BLINK_SW, &led_cdev->work_flags)) { in led_set_brightness()
317 set_bit(LED_BLINK_DISABLE, &led_cdev->work_flags); in led_set_brightness()
318 queue_work(led_cdev->wq, &led_cdev->set_brightness_work); in led_set_brightness()
321 &led_cdev->work_flags); in led_set_brightness()
322 led_cdev->new_blink_brightness = brightness; in led_set_brightness()
339 * value 0 / LED_OFF is special, since it also disables hw-blinking in led_set_brightness_nopm()
340 * (sw-blink disable is handled in led_set_brightness()). in led_set_brightness_nopm()
341 * To avoid a hw-blink-disable getting lost when a second brightness in led_set_brightness_nopm()
345 led_cdev->delayed_set_value = value; in led_set_brightness_nopm()
350 set_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags); in led_set_brightness_nopm()
352 clear_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags); in led_set_brightness_nopm()
353 clear_bit(LED_SET_BLINK, &led_cdev->work_flags); in led_set_brightness_nopm()
354 set_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags); in led_set_brightness_nopm()
357 queue_work(led_cdev->wq, &led_cdev->set_brightness_work); in led_set_brightness_nopm()
363 led_cdev->brightness = min(value, led_cdev->max_brightness); in led_set_brightness_nosleep()
365 if (led_cdev->flags & LED_SUSPENDED) in led_set_brightness_nosleep()
368 led_set_brightness_nopm(led_cdev, led_cdev->brightness); in led_set_brightness_nosleep()
374 if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) in led_set_brightness_sync()
375 return -EBUSY; in led_set_brightness_sync()
377 led_cdev->brightness = min(value, led_cdev->max_brightness); in led_set_brightness_sync()
379 if (led_cdev->flags & LED_SUSPENDED) in led_set_brightness_sync()
382 return __led_set_brightness_blocking(led_cdev, led_cdev->brightness); in led_set_brightness_sync()
387 * This is a led-core function because just like led_set_brightness()
397 if (!(led_cdev->flags & LED_MULTI_COLOR)) { in led_mc_set_brightness()
398 dev_err_once(led_cdev->dev, "error not a multi-color LED\n"); in led_mc_set_brightness()
403 if (num_colors != mcled_cdev->num_colors) { in led_mc_set_brightness()
404 dev_err_once(led_cdev->dev, "error num_colors mismatch %u != %u\n", in led_mc_set_brightness()
405 num_colors, mcled_cdev->num_colors); in led_mc_set_brightness()
409 for (i = 0; i < mcled_cdev->num_colors; i++) in led_mc_set_brightness()
410 mcled_cdev->subled_info[i].intensity = intensity_value[i]; in led_mc_set_brightness()
420 if (led_cdev->brightness_get) { in led_update_brightness()
421 ret = led_cdev->brightness_get(led_cdev); in led_update_brightness()
425 led_cdev->brightness = ret; in led_update_brightness()
434 struct fwnode_handle *fwnode = led_cdev->dev->fwnode; in led_get_default_pattern()
435 u32 *pattern; in led_get_default_pattern() local
438 count = fwnode_property_count_u32(fwnode, "led-pattern"); in led_get_default_pattern()
442 pattern = kcalloc(count, sizeof(*pattern), GFP_KERNEL); in led_get_default_pattern()
443 if (!pattern) in led_get_default_pattern()
446 if (fwnode_property_read_u32_array(fwnode, "led-pattern", pattern, count)) { in led_get_default_pattern()
447 kfree(pattern); in led_get_default_pattern()
453 return pattern; in led_get_default_pattern()
457 /* Caller must ensure led_cdev->led_access held */
460 lockdep_assert_held(&led_cdev->led_access); in led_sysfs_disable()
462 led_cdev->flags |= LED_SYSFS_DISABLE; in led_sysfs_disable()
466 /* Caller must ensure led_cdev->led_access held */
469 lockdep_assert_held(&led_cdev->led_access); in led_sysfs_enable()
471 led_cdev->flags &= ~LED_SYSFS_DISABLE; in led_sysfs_enable()
485 ret = fwnode_property_read_string(fwnode, "label", &props->label); in led_parse_fwnode_props()
492 ret = fwnode_property_read_u32(fwnode, "color", &props->color); in led_parse_fwnode_props()
495 else if (props->color >= LED_COLOR_ID_MAX) in led_parse_fwnode_props()
496 dev_err(dev, "LED color identifier out of range\n"); in led_parse_fwnode_props()
498 props->color_present = true; in led_parse_fwnode_props()
505 ret = fwnode_property_read_string(fwnode, "function", &props->function); in led_parse_fwnode_props()
512 if (!fwnode_property_present(fwnode, "function-enumerator")) in led_parse_fwnode_props()
515 ret = fwnode_property_read_u32(fwnode, "function-enumerator", in led_parse_fwnode_props()
516 &props->func_enum); in led_parse_fwnode_props()
519 "Error parsing 'function-enumerator' property (%d)\n", in led_parse_fwnode_props()
522 props->func_enum_present = true; in led_parse_fwnode_props()
530 struct fwnode_handle *fwnode = init_data->fwnode; in led_compose_name()
531 const char *devicename = init_data->devicename; in led_compose_name()
534 return -EINVAL; in led_compose_name()
541 * DT label should be used as-is for LED class device name. in led_compose_name()
543 * the final LED class device name. in led_compose_name()
556 snprintf(tmp_buf, LED_MAX_NAME_SIZE, "%s:%s-%d", in led_compose_name()
564 if (init_data->devname_mandatory) { in led_compose_name()
571 } else if (init_data->default_label) { in led_compose_name()
573 dev_err(dev, "Legacy LED naming requires devicename segment"); in led_compose_name()
574 return -EINVAL; in led_compose_name()
577 devicename, init_data->default_label); in led_compose_name()
579 strscpy(led_classdev_name, to_of_node(fwnode)->name, in led_compose_name()
582 return -EINVAL; in led_compose_name()
601 if (!fwnode_property_read_string(fwnode, "default-state", &state)) { in led_init_default_state_get()