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.
44 if (!led_cdev->brightness_set) in __led_set_brightness()
45 return -ENOTSUPP; in __led_set_brightness()
47 led_cdev->brightness_set(led_cdev, value); in __led_set_brightness()
54 if (!led_cdev->brightness_set_blocking) in __led_set_brightness_blocking()
55 return -ENOTSUPP; in __led_set_brightness_blocking()
57 return led_cdev->brightness_set_blocking(led_cdev, value); in __led_set_brightness_blocking()
66 if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) { in led_timer_function()
68 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_timer_function()
73 &led_cdev->work_flags)) { in led_timer_function()
74 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_timer_function()
80 /* Time to switch the LED on. */ in led_timer_function()
82 &led_cdev->work_flags)) in led_timer_function()
83 brightness = led_cdev->new_blink_brightness; in led_timer_function()
85 brightness = led_cdev->blink_brightness; in led_timer_function()
86 delay = led_cdev->blink_delay_on; in led_timer_function()
91 led_cdev->blink_brightness = brightness; in led_timer_function()
93 delay = led_cdev->blink_delay_off; in led_timer_function()
98 /* Return in next iteration if led is in one-shot mode and we are in in led_timer_function()
99 * the final blink state so that the led is toggled each delay_on + in led_timer_function()
102 if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags)) { in led_timer_function()
103 if (test_bit(LED_BLINK_INVERT, &led_cdev->work_flags)) { in led_timer_function()
106 &led_cdev->work_flags); in led_timer_function()
110 &led_cdev->work_flags); in led_timer_function()
114 mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay)); in led_timer_function()
123 if (test_and_clear_bit(LED_BLINK_DISABLE, &led_cdev->work_flags)) { in set_brightness_delayed()
124 led_cdev->delayed_set_value = LED_OFF; in set_brightness_delayed()
128 ret = __led_set_brightness(led_cdev, led_cdev->delayed_set_value); in set_brightness_delayed()
129 if (ret == -ENOTSUPP) in set_brightness_delayed()
131 led_cdev->delayed_set_value); in set_brightness_delayed()
133 /* LED HW might have been unplugged, therefore don't warn */ in set_brightness_delayed()
134 !(ret == -ENODEV && (led_cdev->flags & LED_UNREGISTERING) && in set_brightness_delayed()
135 (led_cdev->flags & LED_HW_PLUGGABLE))) in set_brightness_delayed()
136 dev_err(led_cdev->dev, in set_brightness_delayed()
137 "Setting an LED's brightness failed (%d)\n", ret); in set_brightness_delayed()
148 led_cdev->blink_brightness = current_brightness; in led_set_software_blink()
149 if (!led_cdev->blink_brightness) in led_set_software_blink()
150 led_cdev->blink_brightness = led_cdev->max_brightness; in led_set_software_blink()
152 led_cdev->blink_delay_on = delay_on; in led_set_software_blink()
153 led_cdev->blink_delay_off = delay_off; in led_set_software_blink()
155 /* never on - just set to off */ in led_set_software_blink()
161 /* never off - just set to brightness */ in led_set_software_blink()
164 led_cdev->blink_brightness); in led_set_software_blink()
168 set_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_set_software_blink()
169 mod_timer(&led_cdev->blink_timer, jiffies + 1); in led_set_software_blink()
177 if (!test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) && in led_blink_setup()
178 led_cdev->blink_set && in led_blink_setup()
179 !led_cdev->blink_set(led_cdev, delay_on, delay_off)) in led_blink_setup()
191 INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed); in led_init_core()
193 timer_setup(&led_cdev->blink_timer, led_timer_function, 0); in led_init_core()
201 del_timer_sync(&led_cdev->blink_timer); in led_blink_set()
203 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_blink_set()
204 clear_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags); in led_blink_set()
205 clear_bit(LED_BLINK_ONESHOT_STOP, &led_cdev->work_flags); in led_blink_set()
216 if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) && in led_blink_set_oneshot()
217 timer_pending(&led_cdev->blink_timer)) in led_blink_set_oneshot()
220 set_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags); in led_blink_set_oneshot()
221 clear_bit(LED_BLINK_ONESHOT_STOP, &led_cdev->work_flags); in led_blink_set_oneshot()
224 set_bit(LED_BLINK_INVERT, &led_cdev->work_flags); in led_blink_set_oneshot()
226 clear_bit(LED_BLINK_INVERT, &led_cdev->work_flags); in led_blink_set_oneshot()
234 del_timer_sync(&led_cdev->blink_timer); in led_stop_software_blink()
235 led_cdev->blink_delay_on = 0; in led_stop_software_blink()
236 led_cdev->blink_delay_off = 0; in led_stop_software_blink()
237 clear_bit(LED_BLINK_SW, &led_cdev->work_flags); in led_stop_software_blink()
247 if (test_bit(LED_BLINK_SW, &led_cdev->work_flags)) { in led_set_brightness()
254 set_bit(LED_BLINK_DISABLE, &led_cdev->work_flags); in led_set_brightness()
255 schedule_work(&led_cdev->set_brightness_work); in led_set_brightness()
258 &led_cdev->work_flags); in led_set_brightness()
259 led_cdev->new_blink_brightness = brightness; in led_set_brightness()
275 led_cdev->delayed_set_value = value; in led_set_brightness_nopm()
276 schedule_work(&led_cdev->set_brightness_work); in led_set_brightness_nopm()
282 led_cdev->brightness = min(value, led_cdev->max_brightness); in led_set_brightness_nosleep()
284 if (led_cdev->flags & LED_SUSPENDED) in led_set_brightness_nosleep()
287 led_set_brightness_nopm(led_cdev, led_cdev->brightness); in led_set_brightness_nosleep()
293 if (led_cdev->blink_delay_on || led_cdev->blink_delay_off) in led_set_brightness_sync()
294 return -EBUSY; in led_set_brightness_sync()
296 led_cdev->brightness = min(value, led_cdev->max_brightness); in led_set_brightness_sync()
298 if (led_cdev->flags & LED_SUSPENDED) in led_set_brightness_sync()
301 return __led_set_brightness_blocking(led_cdev, led_cdev->brightness); in led_set_brightness_sync()
309 if (led_cdev->brightness_get) { in led_update_brightness()
310 ret = led_cdev->brightness_get(led_cdev); in led_update_brightness()
312 led_cdev->brightness = ret; in led_update_brightness()
323 struct fwnode_handle *fwnode = led_cdev->dev->fwnode; in led_get_default_pattern()
324 u32 *pattern; in led_get_default_pattern() local
327 count = fwnode_property_count_u32(fwnode, "led-pattern"); in led_get_default_pattern()
331 pattern = kcalloc(count, sizeof(*pattern), GFP_KERNEL); in led_get_default_pattern()
332 if (!pattern) in led_get_default_pattern()
335 if (fwnode_property_read_u32_array(fwnode, "led-pattern", pattern, count)) { in led_get_default_pattern()
336 kfree(pattern); in led_get_default_pattern()
342 return pattern; in led_get_default_pattern()
346 /* Caller must ensure led_cdev->led_access held */
349 lockdep_assert_held(&led_cdev->led_access); in led_sysfs_disable()
351 led_cdev->flags |= LED_SYSFS_DISABLE; in led_sysfs_disable()
355 /* Caller must ensure led_cdev->led_access held */
358 lockdep_assert_held(&led_cdev->led_access); in led_sysfs_enable()
360 led_cdev->flags &= ~LED_SYSFS_DISABLE; in led_sysfs_enable()
374 ret = fwnode_property_read_string(fwnode, "label", &props->label); in led_parse_fwnode_props()
381 ret = fwnode_property_read_u32(fwnode, "color", &props->color); in led_parse_fwnode_props()
384 else if (props->color >= LED_COLOR_ID_MAX) in led_parse_fwnode_props()
385 dev_err(dev, "LED color identifier out of range\n"); in led_parse_fwnode_props()
387 props->color_present = true; in led_parse_fwnode_props()
394 ret = fwnode_property_read_string(fwnode, "function", &props->function); in led_parse_fwnode_props()
401 if (!fwnode_property_present(fwnode, "function-enumerator")) in led_parse_fwnode_props()
404 ret = fwnode_property_read_u32(fwnode, "function-enumerator", in led_parse_fwnode_props()
405 &props->func_enum); in led_parse_fwnode_props()
408 "Error parsing 'function-enumerator' property (%d)\n", in led_parse_fwnode_props()
411 props->func_enum_present = true; in led_parse_fwnode_props()
419 struct fwnode_handle *fwnode = init_data->fwnode; in led_compose_name()
420 const char *devicename = init_data->devicename; in led_compose_name()
427 return -EINVAL; in led_compose_name()
434 * DT label should be used as-is for LED class device name. in led_compose_name()
436 * the final LED class device name. in led_compose_name()
449 snprintf(tmp_buf, LED_MAX_NAME_SIZE, "%s:%s-%d", in led_compose_name()
457 if (init_data->devname_mandatory) { in led_compose_name()
464 } else if (init_data->default_label) { in led_compose_name()
466 dev_err(dev, "Legacy LED naming requires devicename segment"); in led_compose_name()
467 return -EINVAL; in led_compose_name()
470 devicename, init_data->default_label); in led_compose_name()
472 strscpy(led_classdev_name, to_of_node(fwnode)->name, in led_compose_name()
475 return -EINVAL; in led_compose_name()
485 if (!fwnode_property_read_string(fwnode, "default-state", &state)) { in led_init_default_state_get()