From: kernel test robot <lkp@intel.com>
To: Jonathan Brophy <professorjonny98@gmail.com>,
lee Jones <lee@kernel.org>, Pavel Machek <pavel@kernel.org>,
Andriy Shevencho <andriy.shevchenko@linux.intel.com>,
Jonathan Brophy <professor_jonny@hotmail.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Radoslav Tsvetkov <rtsvetkov@gradotech.eu>
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-leds@vger.kernel.org
Subject: Re: [PATCH v5 6/7] leds: Add fwnode_led_get() for firmware-agnostic LED resolution
Date: Fri, 2 Jan 2026 23:07:23 +0800 [thread overview]
Message-ID: <202601022309.ToOxpSSg-lkp@intel.com> (raw)
In-Reply-To: <20251230082336.3308403-7-professorjonny98@gmail.com>
Hi Jonathan,
kernel test robot noticed the following build errors:
[auto build test ERROR on lee-leds/for-leds-next]
[also build test ERROR on robh/for-next linus/master v6.19-rc3 next-20251219]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Jonathan-Brophy/dt-bindings-leds-add-function-virtual_status-to-led-common-properties/20251230-162857
base: https://git.kernel.org/pub/scm/linux/kernel/git/lee/leds.git for-leds-next
patch link: https://lore.kernel.org/r/20251230082336.3308403-7-professorjonny98%40gmail.com
patch subject: [PATCH v5 6/7] leds: Add fwnode_led_get() for firmware-agnostic LED resolution
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20260102/202601022309.ToOxpSSg-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260102/202601022309.ToOxpSSg-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601022309.ToOxpSSg-lkp@intel.com/
All error/warnings (new ones prefixed by >>):
>> drivers/leds/led-core.c:73:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
73 | led_set_brightness_nosleep(led_cdev, LED_OFF);
| ^
drivers/leds/led-core.c:73:3: note: did you mean 'led_set_brightness_sync'?
include/linux/leds.h:376:5: note: 'led_set_brightness_sync' declared here
376 | int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value);
| ^
>> drivers/leds/led-core.c:84:15: error: call to undeclared function 'led_get_brightness'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
84 | brightness = led_get_brightness(led_cdev);
| ^
drivers/leds/led-core.c:84:15: note: did you mean 'led_set_brightness'?
include/linux/leds.h:363:6: note: 'led_set_brightness' declared here
363 | void led_set_brightness(struct led_classdev *led_cdev, unsigned int brightness);
| ^
drivers/leds/led-core.c:102:2: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
102 | led_set_brightness_nosleep(led_cdev, brightness);
| ^
>> drivers/leds/led-core.c:152:3: error: call to undeclared function 'led_stop_software_blink'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
152 | led_stop_software_blink(led_cdev);
| ^
drivers/leds/led-core.c:194:23: error: call to undeclared function 'led_get_brightness'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
194 | current_brightness = led_get_brightness(led_cdev);
| ^
drivers/leds/led-core.c:205:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
205 | led_set_brightness_nosleep(led_cdev, LED_OFF);
| ^
drivers/leds/led-core.c:211:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
211 | led_set_brightness_nosleep(led_cdev,
| ^
>> drivers/leds/led-core.c:237:6: warning: no previous prototype for function 'led_init_core' [-Wmissing-prototypes]
237 | void led_init_core(struct led_classdev *led_cdev)
| ^
drivers/leds/led-core.c:237:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
237 | void led_init_core(struct led_classdev *led_cdev)
| ^
| static
>> drivers/leds/led-core.c:296:6: error: conflicting types for 'led_stop_software_blink'
296 | void led_stop_software_blink(struct led_classdev *led_cdev)
| ^
drivers/leds/led-core.c:152:3: note: previous implicit declaration is here
152 | led_stop_software_blink(led_cdev);
| ^
drivers/leds/led-core.c:328:2: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
328 | led_set_brightness_nosleep(led_cdev, brightness);
| ^
>> drivers/leds/led-core.c:332:6: warning: no previous prototype for function 'led_set_brightness_nopm' [-Wmissing-prototypes]
332 | void led_set_brightness_nopm(struct led_classdev *led_cdev, unsigned int value)
| ^
drivers/leds/led-core.c:332:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
332 | void led_set_brightness_nopm(struct led_classdev *led_cdev, unsigned int value)
| ^
| static
>> drivers/leds/led-core.c:362:6: error: conflicting types for 'led_set_brightness_nosleep'
362 | void led_set_brightness_nosleep(struct led_classdev *led_cdev, unsigned int value)
| ^
drivers/leds/led-core.c:73:3: note: previous implicit declaration is here
73 | led_set_brightness_nosleep(led_cdev, LED_OFF);
| ^
2 warnings and 10 errors generated.
--
>> drivers/leds/led-triggers.c:36:9: warning: no previous prototype for function 'led_trigger_write' [-Wmissing-prototypes]
36 | ssize_t led_trigger_write(struct file *filp, struct kobject *kobj,
| ^
drivers/leds/led-triggers.c:36:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
36 | ssize_t led_trigger_write(struct file *filp, struct kobject *kobj,
| ^
| static
>> drivers/leds/led-triggers.c:133:9: warning: no previous prototype for function 'led_trigger_read' [-Wmissing-prototypes]
133 | ssize_t led_trigger_read(struct file *filp, struct kobject *kobj,
| ^
drivers/leds/led-triggers.c:133:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
133 | ssize_t led_trigger_read(struct file *filp, struct kobject *kobj,
| ^
| static
>> drivers/leds/led-triggers.c:189:3: error: call to undeclared function 'led_stop_software_blink'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
189 | led_stop_software_blink(led_cdev);
| ^
>> drivers/leds/led-triggers.c:341:13: error: use of undeclared identifier 'leds_list_lock'; did you mean 'tasklist_lock'?
341 | down_read(&leds_list_lock);
| ^~~~~~~~~~~~~~
| tasklist_lock
include/linux/sched/task.h:55:17: note: 'tasklist_lock' declared here
55 | extern rwlock_t tasklist_lock;
| ^
>> drivers/leds/led-triggers.c:342:33: error: use of undeclared identifier 'leds_list'
342 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^
>> drivers/leds/led-triggers.c:342:33: error: use of undeclared identifier 'leds_list'
>> drivers/leds/led-triggers.c:342:33: error: use of undeclared identifier 'leds_list'
>> drivers/leds/led-triggers.c:342:33: error: use of undeclared identifier 'leds_list'
drivers/leds/led-triggers.c:348:11: error: use of undeclared identifier 'leds_list_lock'; did you mean 'tasklist_lock'?
348 | up_read(&leds_list_lock);
| ^~~~~~~~~~~~~~
| tasklist_lock
include/linux/sched/task.h:55:17: note: 'tasklist_lock' declared here
55 | extern rwlock_t tasklist_lock;
| ^
drivers/leds/led-triggers.c:367:13: error: use of undeclared identifier 'leds_list_lock'; did you mean 'tasklist_lock'?
367 | down_read(&leds_list_lock);
| ^~~~~~~~~~~~~~
| tasklist_lock
include/linux/sched/task.h:55:17: note: 'tasklist_lock' declared here
55 | extern rwlock_t tasklist_lock;
| ^
drivers/leds/led-triggers.c:368:33: error: use of undeclared identifier 'leds_list'
368 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^
drivers/leds/led-triggers.c:368:33: error: use of undeclared identifier 'leds_list'
drivers/leds/led-triggers.c:368:33: error: use of undeclared identifier 'leds_list'
drivers/leds/led-triggers.c:368:33: error: use of undeclared identifier 'leds_list'
drivers/leds/led-triggers.c:374:11: error: use of undeclared identifier 'leds_list_lock'; did you mean 'tasklist_lock'?
374 | up_read(&leds_list_lock);
| ^~~~~~~~~~~~~~
| tasklist_lock
include/linux/sched/task.h:55:17: note: 'tasklist_lock' declared here
55 | extern rwlock_t tasklist_lock;
| ^
2 warnings and 13 errors generated.
--
>> drivers/leds/led-class.c:87:32: error: use of undeclared identifier 'led_trigger_read'; did you mean 'led_trigger_set'?
87 | static BIN_ATTR(trigger, 0644, led_trigger_read, led_trigger_write, 0);
| ^~~~~~~~~~~~~~~~
| led_trigger_set
include/linux/sysfs.h:358:66: note: expanded from macro 'BIN_ATTR'
358 | struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read, \
| ^
include/linux/sysfs.h:341:10: note: expanded from macro '__BIN_ATTR'
341 | .read = _read, \
| ^
include/linux/leds.h:534:5: note: 'led_trigger_set' declared here
534 | int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trigger);
| ^
>> drivers/leds/led-class.c:87:50: error: use of undeclared identifier 'led_trigger_write'
87 | static BIN_ATTR(trigger, 0644, led_trigger_read, led_trigger_write, 0);
| ^
>> drivers/leds/led-class.c:93:15: error: initializing 'const struct bin_attribute *const *' with an expression of type 'struct bin_attribute *[2]' discards qualifiers in nested pointer types [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
93 | .bin_attrs = led_trigger_bin_attrs,
| ^~~~~~~~~~~~~~~~~~~~~
>> drivers/leds/led-class.c:183:2: error: call to undeclared function 'led_set_brightness_nopm'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
183 | led_set_brightness_nopm(led_cdev, 0);
| ^
drivers/leds/led-class.c:183:2: note: did you mean 'led_set_brightness_sync'?
include/linux/leds.h:376:5: note: 'led_set_brightness_sync' declared here
376 | int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value);
| ^
drivers/leds/led-class.c:194:2: error: call to undeclared function 'led_set_brightness_nopm'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
194 | led_set_brightness_nopm(led_cdev, led_cdev->brightness);
| ^
>> drivers/leds/led-class.c:258:22: warning: no previous prototype for function 'of_led_get' [-Wmissing-prototypes]
258 | struct led_classdev *of_led_get(struct device_node *np, int index)
| ^
drivers/leds/led-class.c:258:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
258 | struct led_classdev *of_led_get(struct device_node *np, int index)
| ^
| static
>> drivers/leds/led-class.c:348:12: error: call to undeclared function 'fwnode_get_next_parent_dev'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
348 | led_dev = fwnode_get_next_parent_dev((struct fwnode_handle *)args.fwnode);
| ^
drivers/leds/led-class.c:348:12: note: did you mean 'fwnode_get_next_parent'?
include/linux/property.h:153:23: note: 'fwnode_get_next_parent' declared here
153 | struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode);
| ^
>> drivers/leds/led-class.c:348:10: error: incompatible integer to pointer conversion assigning to 'struct device *' from 'int' [-Wint-conversion]
348 | led_dev = fwnode_get_next_parent_dev((struct fwnode_handle *)args.fwnode);
| ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/leds/led-class.c:303:22: warning: no previous prototype for function 'fwnode_led_get' [-Wmissing-prototypes]
303 | struct led_classdev *fwnode_led_get(const struct fwnode_handle *fwnode,
| ^
drivers/leds/led-class.c:303:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
303 | struct led_classdev *fwnode_led_get(const struct fwnode_handle *fwnode,
| ^
| static
>> drivers/leds/led-class.c:647:14: error: use of undeclared identifier 'leds_list_lock'; did you mean 'leds_lookup_lock'?
647 | down_write(&leds_list_lock);
| ^~~~~~~~~~~~~~
| leds_lookup_lock
drivers/leds/led-class.c:25:21: note: 'leds_lookup_lock' declared here
25 | static DEFINE_MUTEX(leds_lookup_lock);
| ^
>> drivers/leds/led-class.c:648:34: error: use of undeclared identifier 'leds_list'; did you mean 'leds_class'?
648 | list_add_tail(&led_cdev->node, &leds_list);
| ^~~~~~~~~
| leds_class
drivers/leds/led-class.c:244:27: note: 'leds_class' declared here
244 | static const struct class leds_class = {
| ^
drivers/leds/led-class.c:649:12: error: use of undeclared identifier 'leds_list_lock'; did you mean 'leds_lookup_lock'?
649 | up_write(&leds_list_lock);
| ^~~~~~~~~~~~~~
| leds_lookup_lock
drivers/leds/led-class.c:25:21: note: 'leds_lookup_lock' declared here
25 | static DEFINE_MUTEX(leds_lookup_lock);
| ^
>> drivers/leds/led-class.c:656:2: error: call to undeclared function 'led_init_core'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
656 | led_init_core(led_cdev);
| ^
>> drivers/leds/led-class.c:692:2: error: call to undeclared function 'led_stop_software_blink'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
692 | led_stop_software_blink(led_cdev);
| ^
drivers/leds/led-class.c:704:14: error: use of undeclared identifier 'leds_list_lock'; did you mean 'leds_lookup_lock'?
704 | down_write(&leds_list_lock);
| ^~~~~~~~~~~~~~
| leds_lookup_lock
drivers/leds/led-class.c:25:21: note: 'leds_lookup_lock' declared here
25 | static DEFINE_MUTEX(leds_lookup_lock);
| ^
drivers/leds/led-class.c:706:12: error: use of undeclared identifier 'leds_list_lock'; did you mean 'leds_lookup_lock'?
706 | up_write(&leds_list_lock);
| ^~~~~~~~~~~~~~
| leds_lookup_lock
drivers/leds/led-class.c:25:21: note: 'leds_lookup_lock' declared here
25 | static DEFINE_MUTEX(leds_lookup_lock);
| ^
2 warnings and 14 errors generated.
--
>> drivers/leds/leds-ns2.c:146:7: error: call to undeclared function 'led_get_brightness'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
146 | if (!led_get_brightness(led_cdev))
| ^
drivers/leds/leds-ns2.c:146:7: note: did you mean 'led_set_brightness'?
include/linux/leds.h:363:6: note: 'led_set_brightness' declared here
363 | void led_set_brightness(struct led_classdev *led_cdev, unsigned int brightness);
| ^
1 error generated.
--
>> drivers/leds/trigger/ledtrig-panic.c:40:33: error: use of undeclared identifier 'leds_list'
40 | list_for_each_entry(led_cdev, &leds_list, node)
| ^
>> drivers/leds/trigger/ledtrig-panic.c:40:33: error: use of undeclared identifier 'leds_list'
>> drivers/leds/trigger/ledtrig-panic.c:40:33: error: use of undeclared identifier 'leds_list'
>> drivers/leds/trigger/ledtrig-panic.c:40:33: error: use of undeclared identifier 'leds_list'
4 errors generated.
--
>> drivers/leds/trigger/ledtrig-oneshot.c:61:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
61 | led_set_brightness_nosleep(led_cdev, LED_FULL);
| ^
drivers/leds/trigger/ledtrig-oneshot.c:61:3: note: did you mean 'led_set_brightness_sync'?
include/linux/leds.h:376:5: note: 'led_set_brightness_sync' declared here
376 | int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value);
| ^
1 error generated.
--
>> drivers/leds/trigger/ledtrig-heartbeat.c:44:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
44 | led_set_brightness_nosleep(led_cdev, LED_OFF);
| ^
drivers/leds/trigger/ledtrig-heartbeat.c:44:3: note: did you mean 'led_set_brightness_sync'?
include/linux/leds.h:376:5: note: 'led_set_brightness_sync' declared here
376 | int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value);
| ^
drivers/leds/trigger/ledtrig-heartbeat.c:90:2: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
90 | led_set_brightness_nosleep(led_cdev, brightness);
| ^
2 errors generated.
--
>> drivers/leds/trigger/ledtrig-backlight.c:40:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
40 | led_set_brightness_nosleep(led, LED_OFF);
| ^
drivers/leds/trigger/ledtrig-backlight.c:40:3: note: did you mean 'led_set_brightness_sync'?
include/linux/leds.h:376:5: note: 'led_set_brightness_sync' declared here
376 | int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value);
| ^
drivers/leds/trigger/ledtrig-backlight.c:42:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
42 | led_set_brightness_nosleep(led, n->brightness);
| ^
drivers/leds/trigger/ledtrig-backlight.c:87:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
87 | led_set_brightness_nosleep(led, LED_OFF);
| ^
3 errors generated.
--
>> drivers/leds/trigger/ledtrig-gpio.c:33:4: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
33 | led_set_brightness_nosleep(gpio_data->led,
| ^
drivers/leds/trigger/ledtrig-gpio.c:33:4: note: did you mean 'led_set_brightness_sync'?
include/linux/leds.h:376:5: note: 'led_set_brightness_sync' declared here
376 | int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value);
| ^
drivers/leds/trigger/ledtrig-gpio.c:38:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
38 | led_set_brightness_nosleep(gpio_data->led, LED_OFF);
| ^
2 errors generated.
--
>> drivers/leds/trigger/ledtrig-activity.c:53:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
53 | led_set_brightness_nosleep(led_cdev, led_cdev->blink_brightness);
| ^
drivers/leds/trigger/ledtrig-activity.c:53:3: note: did you mean 'led_set_brightness_sync'?
include/linux/leds.h:376:5: note: 'led_set_brightness_sync' declared here
376 | int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value);
| ^
drivers/leds/trigger/ledtrig-activity.c:130:3: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
130 | led_set_brightness_nosleep(led_cdev,
| ^
2 errors generated.
--
>> drivers/leds/trigger/ledtrig-default-on.c:18:2: error: call to undeclared function 'led_set_brightness_nosleep'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
18 | led_set_brightness_nosleep(led_cdev, led_cdev->max_brightness);
| ^
drivers/leds/trigger/ledtrig-default-on.c:18:2: note: did you mean 'led_set_brightness_sync'?
include/linux/leds.h:376:5: note: 'led_set_brightness_sync' declared here
376 | int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value);
| ^
1 error generated.
..
vim +/led_set_brightness_nosleep +73 drivers/leds/led-core.c
d4887af9c2b6ab Heiner Kallweit 2016-02-16 64
49404665b93544 Kees Cook 2017-10-25 65 static void led_timer_function(struct timer_list *t)
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 66 {
41cb08555c4164 Ingo Molnar 2025-05-09 67 struct led_classdev *led_cdev = timer_container_of(led_cdev, t,
41cb08555c4164 Ingo Molnar 2025-05-09 68 blink_timer);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 69 unsigned long brightness;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 70 unsigned long delay;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 71
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 72 if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) {
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 @73 led_set_brightness_nosleep(led_cdev, LED_OFF);
a9c6ce57ec2f13 Hans de Goede 2016-11-08 74 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 75 return;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 76 }
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 77
a9c6ce57ec2f13 Hans de Goede 2016-11-08 78 if (test_and_clear_bit(LED_BLINK_ONESHOT_STOP,
a9c6ce57ec2f13 Hans de Goede 2016-11-08 79 &led_cdev->work_flags)) {
a9c6ce57ec2f13 Hans de Goede 2016-11-08 80 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 81 return;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 82 }
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 83
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 @84 brightness = led_get_brightness(led_cdev);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 85 if (!brightness) {
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 86 /* Time to switch the LED on. */
eb1610b4c27337 Hans de Goede 2016-10-23 87 if (test_and_clear_bit(LED_BLINK_BRIGHTNESS_CHANGE,
eb1610b4c27337 Hans de Goede 2016-10-23 88 &led_cdev->work_flags))
eb1610b4c27337 Hans de Goede 2016-10-23 89 brightness = led_cdev->new_blink_brightness;
eb1610b4c27337 Hans de Goede 2016-10-23 90 else
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 91 brightness = led_cdev->blink_brightness;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 92 delay = led_cdev->blink_delay_on;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 93 } else {
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 94 /* Store the current brightness value to be able
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 95 * to restore it when the delay_off period is over.
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 96 */
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 97 led_cdev->blink_brightness = brightness;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 98 brightness = LED_OFF;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 99 delay = led_cdev->blink_delay_off;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 100 }
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 101
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 102 led_set_brightness_nosleep(led_cdev, brightness);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 103
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 104 /* Return in next iteration if led is in one-shot mode and we are in
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 105 * the final blink state so that the led is toggled each delay_on +
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 106 * delay_off milliseconds in worst case.
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 107 */
a9c6ce57ec2f13 Hans de Goede 2016-11-08 108 if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags)) {
a9c6ce57ec2f13 Hans de Goede 2016-11-08 109 if (test_bit(LED_BLINK_INVERT, &led_cdev->work_flags)) {
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 110 if (brightness)
a9c6ce57ec2f13 Hans de Goede 2016-11-08 111 set_bit(LED_BLINK_ONESHOT_STOP,
a9c6ce57ec2f13 Hans de Goede 2016-11-08 112 &led_cdev->work_flags);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 113 } else {
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 114 if (!brightness)
a9c6ce57ec2f13 Hans de Goede 2016-11-08 115 set_bit(LED_BLINK_ONESHOT_STOP,
a9c6ce57ec2f13 Hans de Goede 2016-11-08 116 &led_cdev->work_flags);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 117 }
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 118 }
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 119
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 120 mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay));
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 121 }
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 122
fa15d8c69238b3 Hans de Goede 2023-05-10 123 static void set_brightness_delayed_set_brightness(struct led_classdev *led_cdev,
fa15d8c69238b3 Hans de Goede 2023-05-10 124 unsigned int value)
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 125 {
d33d1214a1ddf9 Lee Jones 2024-06-12 126 int ret;
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 127
fa15d8c69238b3 Hans de Goede 2023-05-10 128 ret = __led_set_brightness(led_cdev, value);
d33d1214a1ddf9 Lee Jones 2024-06-12 129 if (ret == -ENOTSUPP) {
fa15d8c69238b3 Hans de Goede 2023-05-10 130 ret = __led_set_brightness_blocking(led_cdev, value);
d33d1214a1ddf9 Lee Jones 2024-06-12 131 if (ret == -ENOTSUPP)
d33d1214a1ddf9 Lee Jones 2024-06-12 132 /* No back-end support to set a fixed brightness value */
d33d1214a1ddf9 Lee Jones 2024-06-12 133 return;
d33d1214a1ddf9 Lee Jones 2024-06-12 134 }
d33d1214a1ddf9 Lee Jones 2024-06-12 135
d84d80f38f0ff4 Heiner Kallweit 2016-01-22 136 /* LED HW might have been unplugged, therefore don't warn */
d33d1214a1ddf9 Lee Jones 2024-06-12 137 if (ret == -ENODEV && led_cdev->flags & LED_UNREGISTERING &&
d33d1214a1ddf9 Lee Jones 2024-06-12 138 led_cdev->flags & LED_HW_PLUGGABLE)
d33d1214a1ddf9 Lee Jones 2024-06-12 139 return;
d33d1214a1ddf9 Lee Jones 2024-06-12 140
d33d1214a1ddf9 Lee Jones 2024-06-12 141 if (ret < 0)
1afcadfcd184c3 Jacek Anaszewski 2015-10-19 142 dev_err(led_cdev->dev,
1afcadfcd184c3 Jacek Anaszewski 2015-10-19 143 "Setting an LED's brightness failed (%d)\n", ret);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 144 }
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 145
fa15d8c69238b3 Hans de Goede 2023-05-10 146 static void set_brightness_delayed(struct work_struct *ws)
fa15d8c69238b3 Hans de Goede 2023-05-10 147 {
fa15d8c69238b3 Hans de Goede 2023-05-10 148 struct led_classdev *led_cdev =
fa15d8c69238b3 Hans de Goede 2023-05-10 149 container_of(ws, struct led_classdev, set_brightness_work);
fa15d8c69238b3 Hans de Goede 2023-05-10 150
fa15d8c69238b3 Hans de Goede 2023-05-10 151 if (test_and_clear_bit(LED_BLINK_DISABLE, &led_cdev->work_flags)) {
fa15d8c69238b3 Hans de Goede 2023-05-10 @152 led_stop_software_blink(led_cdev);
fa15d8c69238b3 Hans de Goede 2023-05-10 153 set_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags);
fa15d8c69238b3 Hans de Goede 2023-05-10 154 }
fa15d8c69238b3 Hans de Goede 2023-05-10 155
fa15d8c69238b3 Hans de Goede 2023-05-10 156 /*
fa15d8c69238b3 Hans de Goede 2023-05-10 157 * Triggers may call led_set_brightness(LED_OFF),
fa15d8c69238b3 Hans de Goede 2023-05-10 158 * led_set_brightness(LED_FULL) in quick succession to disable blinking
fa15d8c69238b3 Hans de Goede 2023-05-10 159 * and turn the LED on. Both actions may have been scheduled to run
fa15d8c69238b3 Hans de Goede 2023-05-10 160 * before this work item runs once. To make sure this works properly
fa15d8c69238b3 Hans de Goede 2023-05-10 161 * handle LED_SET_BRIGHTNESS_OFF first.
fa15d8c69238b3 Hans de Goede 2023-05-10 162 */
2c70953b6f535f Remi Pommarel 2025-02-20 163 if (test_and_clear_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags)) {
fa15d8c69238b3 Hans de Goede 2023-05-10 164 set_brightness_delayed_set_brightness(led_cdev, LED_OFF);
2c70953b6f535f Remi Pommarel 2025-02-20 165 /*
2c70953b6f535f Remi Pommarel 2025-02-20 166 * The consecutives led_set_brightness(LED_OFF),
2c70953b6f535f Remi Pommarel 2025-02-20 167 * led_set_brightness(LED_FULL) could have been executed out of
2c70953b6f535f Remi Pommarel 2025-02-20 168 * order (LED_FULL first), if the work_flags has been set
2c70953b6f535f Remi Pommarel 2025-02-20 169 * between LED_SET_BRIGHTNESS_OFF and LED_SET_BRIGHTNESS of this
2c70953b6f535f Remi Pommarel 2025-02-20 170 * work. To avoid ending with the LED turned off, turn the LED
2c70953b6f535f Remi Pommarel 2025-02-20 171 * on again.
2c70953b6f535f Remi Pommarel 2025-02-20 172 */
2c70953b6f535f Remi Pommarel 2025-02-20 173 if (led_cdev->delayed_set_value != LED_OFF)
2c70953b6f535f Remi Pommarel 2025-02-20 174 set_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags);
2c70953b6f535f Remi Pommarel 2025-02-20 175 }
fa15d8c69238b3 Hans de Goede 2023-05-10 176
fa15d8c69238b3 Hans de Goede 2023-05-10 177 if (test_and_clear_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags))
fa15d8c69238b3 Hans de Goede 2023-05-10 178 set_brightness_delayed_set_brightness(led_cdev, led_cdev->delayed_set_value);
22720a87d0a966 Hans de Goede 2023-05-10 179
22720a87d0a966 Hans de Goede 2023-05-10 180 if (test_and_clear_bit(LED_SET_BLINK, &led_cdev->work_flags)) {
22720a87d0a966 Hans de Goede 2023-05-10 181 unsigned long delay_on = led_cdev->delayed_delay_on;
22720a87d0a966 Hans de Goede 2023-05-10 182 unsigned long delay_off = led_cdev->delayed_delay_off;
22720a87d0a966 Hans de Goede 2023-05-10 183
22720a87d0a966 Hans de Goede 2023-05-10 184 led_blink_set(led_cdev, &delay_on, &delay_off);
22720a87d0a966 Hans de Goede 2023-05-10 185 }
fa15d8c69238b3 Hans de Goede 2023-05-10 186 }
fa15d8c69238b3 Hans de Goede 2023-05-10 187
a403d930c58eb8 Bryan Wu 2012-03-23 188 static void led_set_software_blink(struct led_classdev *led_cdev,
a403d930c58eb8 Bryan Wu 2012-03-23 189 unsigned long delay_on,
a403d930c58eb8 Bryan Wu 2012-03-23 190 unsigned long delay_off)
a403d930c58eb8 Bryan Wu 2012-03-23 191 {
a403d930c58eb8 Bryan Wu 2012-03-23 192 int current_brightness;
a403d930c58eb8 Bryan Wu 2012-03-23 193
a403d930c58eb8 Bryan Wu 2012-03-23 @194 current_brightness = led_get_brightness(led_cdev);
a403d930c58eb8 Bryan Wu 2012-03-23 195 if (current_brightness)
a403d930c58eb8 Bryan Wu 2012-03-23 196 led_cdev->blink_brightness = current_brightness;
a403d930c58eb8 Bryan Wu 2012-03-23 197 if (!led_cdev->blink_brightness)
a403d930c58eb8 Bryan Wu 2012-03-23 198 led_cdev->blink_brightness = led_cdev->max_brightness;
a403d930c58eb8 Bryan Wu 2012-03-23 199
a403d930c58eb8 Bryan Wu 2012-03-23 200 led_cdev->blink_delay_on = delay_on;
a403d930c58eb8 Bryan Wu 2012-03-23 201 led_cdev->blink_delay_off = delay_off;
a403d930c58eb8 Bryan Wu 2012-03-23 202
8d82fef8bbee58 Stefan Sørensen 2014-02-04 203 /* never on - just set to off */
8d82fef8bbee58 Stefan Sørensen 2014-02-04 204 if (!delay_on) {
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 205 led_set_brightness_nosleep(led_cdev, LED_OFF);
a403d930c58eb8 Bryan Wu 2012-03-23 206 return;
8d82fef8bbee58 Stefan Sørensen 2014-02-04 207 }
a403d930c58eb8 Bryan Wu 2012-03-23 208
a403d930c58eb8 Bryan Wu 2012-03-23 209 /* never off - just set to brightness */
a403d930c58eb8 Bryan Wu 2012-03-23 210 if (!delay_off) {
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 211 led_set_brightness_nosleep(led_cdev,
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 212 led_cdev->blink_brightness);
a403d930c58eb8 Bryan Wu 2012-03-23 213 return;
a403d930c58eb8 Bryan Wu 2012-03-23 214 }
a403d930c58eb8 Bryan Wu 2012-03-23 215
a9c6ce57ec2f13 Hans de Goede 2016-11-08 216 set_bit(LED_BLINK_SW, &led_cdev->work_flags);
9067359faf890b Jiri Kosina 2014-09-02 217 mod_timer(&led_cdev->blink_timer, jiffies + 1);
a403d930c58eb8 Bryan Wu 2012-03-23 218 }
a403d930c58eb8 Bryan Wu 2012-03-23 219
a403d930c58eb8 Bryan Wu 2012-03-23 220
20c0e6b8787c52 Bryan Wu 2012-06-15 221 static void led_blink_setup(struct led_classdev *led_cdev,
a403d930c58eb8 Bryan Wu 2012-03-23 222 unsigned long *delay_on,
a403d930c58eb8 Bryan Wu 2012-03-23 223 unsigned long *delay_off)
a403d930c58eb8 Bryan Wu 2012-03-23 224 {
a9c6ce57ec2f13 Hans de Goede 2016-11-08 225 if (!test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) &&
5bb629c504394f Fabio Baltieri 2012-05-27 226 led_cdev->blink_set &&
a403d930c58eb8 Bryan Wu 2012-03-23 227 !led_cdev->blink_set(led_cdev, delay_on, delay_off))
a403d930c58eb8 Bryan Wu 2012-03-23 228 return;
a403d930c58eb8 Bryan Wu 2012-03-23 229
a403d930c58eb8 Bryan Wu 2012-03-23 230 /* blink with 1 Hz as default if nothing specified */
a403d930c58eb8 Bryan Wu 2012-03-23 231 if (!*delay_on && !*delay_off)
a403d930c58eb8 Bryan Wu 2012-03-23 232 *delay_on = *delay_off = 500;
a403d930c58eb8 Bryan Wu 2012-03-23 233
a403d930c58eb8 Bryan Wu 2012-03-23 234 led_set_software_blink(led_cdev, *delay_on, *delay_off);
a403d930c58eb8 Bryan Wu 2012-03-23 235 }
5bb629c504394f Fabio Baltieri 2012-05-27 236
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 @237 void led_init_core(struct led_classdev *led_cdev)
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 238 {
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 239 INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 240
49404665b93544 Kees Cook 2017-10-25 241 timer_setup(&led_cdev->blink_timer, led_timer_function, 0);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 242 }
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 243 EXPORT_SYMBOL_GPL(led_init_core);
757b06ae04b3b6 Jacek Anaszewski 2015-09-28 244
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2026-01-02 15:08 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-30 8:23 [PATCH v5 0/7] leds: Add virtual LED group driver with priority arbitration Jonathan Brophy
2025-12-30 8:23 ` [PATCH v5 1/7] dt-bindings: leds: add function virtual_status to led common properties Jonathan Brophy
2025-12-30 8:23 ` [PATCH v5 2/7] dt-bindings: leds: Add virtual LED class bindings Jonathan Brophy
2025-12-30 8:23 ` [PATCH v5 3/7] dt-bindings: leds: Add virtual LED group controller bindings Jonathan Brophy
2025-12-30 8:23 ` [PATCH v5 4/7] ABI: Add sysfs documentation for leds-group-virtualcolor Jonathan Brophy
2025-12-30 11:52 ` Andriy Shevencho
2025-12-30 8:23 ` [PATCH v5 5/7] leds: Add driver " Jonathan Brophy
2025-12-30 8:23 ` [PATCH v5 6/7] leds: Add fwnode_led_get() for firmware-agnostic LED resolution Jonathan Brophy
2025-12-30 12:00 ` Andriy Shevencho
2025-12-31 2:30 ` kernel test robot
2025-12-31 23:37 ` kernel test robot
2025-12-31 23:45 ` kernel test robot
2026-01-02 12:20 ` kernel test robot
2026-01-02 15:07 ` kernel test robot [this message]
2026-01-02 16:29 ` kernel test robot
2025-12-30 8:23 ` [PATCH v5 7/7] leds: Add virtual LED group driver with priority arbitration Jonathan Brophy
2025-12-30 12:19 ` Andriy Shevencho
2026-01-03 8:22 ` [PATCH v5 7/7] leds: Add virtual LED group driver Jonathan Brophy
2026-01-03 12:56 ` Andriy Shevencho
2026-01-06 16:59 ` [PATCH v5 0/7] leds: Add virtual LED group driver with priority arbitration Rob Herring
2026-01-13 11:52 ` Lee Jones
2026-01-13 11:57 ` Lee Jones
2026-01-13 20:35 ` Jonathan Brophy
2026-01-15 15:07 ` Lee Jones
2026-01-15 16:58 ` Andriy Shevencho
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202601022309.ToOxpSSg-lkp@intel.com \
--to=lkp@intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=krzk@kernel.org \
--cc=lee@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=llvm@lists.linux.dev \
--cc=oe-kbuild-all@lists.linux.dev \
--cc=pavel@kernel.org \
--cc=professor_jonny@hotmail.com \
--cc=professorjonny98@gmail.com \
--cc=robh@kernel.org \
--cc=rtsvetkov@gradotech.eu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.