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: Thu, 1 Jan 2026 00:37:20 +0100 [thread overview]
Message-ID: <202601010059.KObE3Pop-lkp@intel.com> (raw)
In-Reply-To: <20251230082336.3308403-7-professorjonny98@gmail.com>
Hi Jonathan,
kernel test robot noticed the following build warnings:
[auto build test WARNING on lee-leds/for-leds-next]
[also build test WARNING 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: x86_64-kexec (https://download.01.org/0day-ci/archive/20260101/202601010059.KObE3Pop-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260101/202601010059.KObE3Pop-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/202601010059.KObE3Pop-lkp@intel.com/
All 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-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/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'; did you mean 'pgd_list'?
342 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~
| pgd_list
include/linux/list.h:782:30: note: expanded from macro 'list_for_each_entry'
782 | for (pos = list_first_entry(head, typeof(*pos), member); \
| ^
include/linux/list.h:620:14: note: expanded from macro 'list_first_entry'
620 | list_entry((ptr)->next, type, member)
| ^
include/linux/list.h:609:15: note: expanded from macro 'list_entry'
609 | container_of(ptr, type, member)
| ^
include/linux/container_of.h:20:26: note: expanded from macro 'container_of'
20 | void *__mptr = (void *)(ptr); \
| ^
arch/x86/include/asm/pgtable.h:59:25: note: 'pgd_list' declared here
59 | extern struct list_head pgd_list;
| ^
drivers/leds/led-triggers.c:342:33: error: use of undeclared identifier 'leds_list'; did you mean 'pgd_list'?
342 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~
| pgd_list
include/linux/list.h:782:30: note: expanded from macro 'list_for_each_entry'
782 | for (pos = list_first_entry(head, typeof(*pos), member); \
| ^
include/linux/list.h:620:14: note: expanded from macro 'list_first_entry'
620 | list_entry((ptr)->next, type, member)
| ^
include/linux/list.h:609:15: note: expanded from macro 'list_entry'
609 | container_of(ptr, type, member)
| ^
note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:565:63: note: expanded from macro '__same_type'
565 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
| ^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
77 | #define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
| ^
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^
arch/x86/include/asm/pgtable.h:59:25: note: 'pgd_list' declared here
59 | extern struct list_head pgd_list;
| ^
drivers/leds/led-triggers.c:342:33: error: use of undeclared identifier 'leds_list'; did you mean 'pgd_list'?
342 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~
| pgd_list
include/linux/list.h:782:30: note: expanded from macro 'list_for_each_entry'
782 | for (pos = list_first_entry(head, typeof(*pos), member); \
| ^
include/linux/list.h:620:14: note: expanded from macro 'list_first_entry'
620 | list_entry((ptr)->next, type, member)
| ^
include/linux/list.h:609:15: note: expanded from macro 'list_entry'
609 | container_of(ptr, type, member)
| ^
note: (skipping 1 expansions in backtrace; use -fmacro-backtrace-limit=0 to see all)
include/linux/compiler_types.h:565:63: note: expanded from macro '__same_type'
565 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
| ^
include/linux/build_bug.h:77:50: note: expanded from macro 'static_assert'
77 | #define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
| ^
include/linux/build_bug.h:78:56: note: expanded from macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^
arch/x86/include/asm/pgtable.h:59:25: note: 'pgd_list' declared here
59 | extern struct list_head pgd_list;
| ^
drivers/leds/led-triggers.c:342:33: error: use of undeclared identifier 'leds_list'; did you mean 'pgd_list'?
342 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~
| pgd_list
include/linux/list.h:783:32: note: expanded from macro 'list_for_each_entry'
783 | !list_entry_is_head(pos, head, member); \
| ^
include/linux/list.h:773:30: note: expanded from macro 'list_entry_is_head'
773 | list_is_head(&pos->member, (head))
| ^
arch/x86/include/asm/pgtable.h:59:25: note: 'pgd_list' declared here
59 | extern struct list_head pgd_list;
| ^
vim +/led_init_core +237 drivers/leds/led-core.c
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
5bb629c504394f Fabio Baltieri 2012-05-27 245 void led_blink_set(struct led_classdev *led_cdev,
5bb629c504394f Fabio Baltieri 2012-05-27 246 unsigned long *delay_on,
5bb629c504394f Fabio Baltieri 2012-05-27 247 unsigned long *delay_off)
5bb629c504394f Fabio Baltieri 2012-05-27 248 {
8fa7292fee5c52 Thomas Gleixner 2025-04-05 249 timer_delete_sync(&led_cdev->blink_timer);
5bb629c504394f Fabio Baltieri 2012-05-27 250
7b6af2c53192f1 Jacek Anaszewski 2018-01-03 251 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
a9c6ce57ec2f13 Hans de Goede 2016-11-08 252 clear_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags);
a9c6ce57ec2f13 Hans de Goede 2016-11-08 253 clear_bit(LED_BLINK_ONESHOT_STOP, &led_cdev->work_flags);
5bb629c504394f Fabio Baltieri 2012-05-27 254
5bb629c504394f Fabio Baltieri 2012-05-27 255 led_blink_setup(led_cdev, delay_on, delay_off);
5bb629c504394f Fabio Baltieri 2012-05-27 256 }
2806e2ff489975 Jacek Anaszewski 2015-09-28 257 EXPORT_SYMBOL_GPL(led_blink_set);
a403d930c58eb8 Bryan Wu 2012-03-23 258
5bb629c504394f Fabio Baltieri 2012-05-27 259 void led_blink_set_oneshot(struct led_classdev *led_cdev,
5bb629c504394f Fabio Baltieri 2012-05-27 260 unsigned long *delay_on,
5bb629c504394f Fabio Baltieri 2012-05-27 261 unsigned long *delay_off,
5bb629c504394f Fabio Baltieri 2012-05-27 262 int invert)
5bb629c504394f Fabio Baltieri 2012-05-27 263 {
a9c6ce57ec2f13 Hans de Goede 2016-11-08 264 if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) &&
9067359faf890b Jiri Kosina 2014-09-02 265 timer_pending(&led_cdev->blink_timer))
5bb629c504394f Fabio Baltieri 2012-05-27 266 return;
5bb629c504394f Fabio Baltieri 2012-05-27 267
a9c6ce57ec2f13 Hans de Goede 2016-11-08 268 set_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags);
a9c6ce57ec2f13 Hans de Goede 2016-11-08 269 clear_bit(LED_BLINK_ONESHOT_STOP, &led_cdev->work_flags);
5bb629c504394f Fabio Baltieri 2012-05-27 270
5bb629c504394f Fabio Baltieri 2012-05-27 271 if (invert)
a9c6ce57ec2f13 Hans de Goede 2016-11-08 272 set_bit(LED_BLINK_INVERT, &led_cdev->work_flags);
5bb629c504394f Fabio Baltieri 2012-05-27 273 else
a9c6ce57ec2f13 Hans de Goede 2016-11-08 274 clear_bit(LED_BLINK_INVERT, &led_cdev->work_flags);
5bb629c504394f Fabio Baltieri 2012-05-27 275
5bb629c504394f Fabio Baltieri 2012-05-27 276 led_blink_setup(led_cdev, delay_on, delay_off);
5bb629c504394f Fabio Baltieri 2012-05-27 277 }
2806e2ff489975 Jacek Anaszewski 2015-09-28 278 EXPORT_SYMBOL_GPL(led_blink_set_oneshot);
5bb629c504394f Fabio Baltieri 2012-05-27 279
22720a87d0a966 Hans de Goede 2023-05-10 280 void led_blink_set_nosleep(struct led_classdev *led_cdev, unsigned long delay_on,
22720a87d0a966 Hans de Goede 2023-05-10 281 unsigned long delay_off)
22720a87d0a966 Hans de Goede 2023-05-10 282 {
22720a87d0a966 Hans de Goede 2023-05-10 283 /* If necessary delegate to a work queue task. */
22720a87d0a966 Hans de Goede 2023-05-10 284 if (led_cdev->blink_set && led_cdev->brightness_set_blocking) {
22720a87d0a966 Hans de Goede 2023-05-10 285 led_cdev->delayed_delay_on = delay_on;
22720a87d0a966 Hans de Goede 2023-05-10 286 led_cdev->delayed_delay_off = delay_off;
22720a87d0a966 Hans de Goede 2023-05-10 287 set_bit(LED_SET_BLINK, &led_cdev->work_flags);
32360bf6a5d401 Dmitry Rokosov 2024-09-04 288 queue_work(led_cdev->wq, &led_cdev->set_brightness_work);
22720a87d0a966 Hans de Goede 2023-05-10 289 return;
22720a87d0a966 Hans de Goede 2023-05-10 290 }
22720a87d0a966 Hans de Goede 2023-05-10 291
22720a87d0a966 Hans de Goede 2023-05-10 292 led_blink_set(led_cdev, &delay_on, &delay_off);
22720a87d0a966 Hans de Goede 2023-05-10 293 }
22720a87d0a966 Hans de Goede 2023-05-10 294 EXPORT_SYMBOL_GPL(led_blink_set_nosleep);
22720a87d0a966 Hans de Goede 2023-05-10 295
d23a22a74fded2 Fabio Baltieri 2012-08-15 @296 void led_stop_software_blink(struct led_classdev *led_cdev)
a403d930c58eb8 Bryan Wu 2012-03-23 297 {
8fa7292fee5c52 Thomas Gleixner 2025-04-05 298 timer_delete_sync(&led_cdev->blink_timer);
437864828d82b9 Fabio Baltieri 2012-06-07 299 led_cdev->blink_delay_on = 0;
437864828d82b9 Fabio Baltieri 2012-06-07 300 led_cdev->blink_delay_off = 0;
a9c6ce57ec2f13 Hans de Goede 2016-11-08 301 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
d23a22a74fded2 Fabio Baltieri 2012-08-15 302 }
d23a22a74fded2 Fabio Baltieri 2012-08-15 303 EXPORT_SYMBOL_GPL(led_stop_software_blink);
d23a22a74fded2 Fabio Baltieri 2012-08-15 304
af0bfab907a011 Abanoub Sameh 2020-12-11 305 void led_set_brightness(struct led_classdev *led_cdev, unsigned int brightness)
d23a22a74fded2 Fabio Baltieri 2012-08-15 306 {
f1e80c07416ada Jacek Anaszewski 2015-10-07 307 /*
7cfe749fad5158 Tony Makkiel 2016-05-18 308 * If software blink is active, delay brightness setting
f1e80c07416ada Jacek Anaszewski 2015-10-07 309 * until the next timer tick.
f1e80c07416ada Jacek Anaszewski 2015-10-07 310 */
a9c6ce57ec2f13 Hans de Goede 2016-11-08 311 if (test_bit(LED_BLINK_SW, &led_cdev->work_flags)) {
f1e80c07416ada Jacek Anaszewski 2015-10-07 312 /*
f1e80c07416ada Jacek Anaszewski 2015-10-07 313 * If we need to disable soft blinking delegate this to the
f1e80c07416ada Jacek Anaszewski 2015-10-07 314 * work queue task to avoid problems in case we are called
f1e80c07416ada Jacek Anaszewski 2015-10-07 315 * from hard irq context.
f1e80c07416ada Jacek Anaszewski 2015-10-07 316 */
af0bfab907a011 Abanoub Sameh 2020-12-11 317 if (!brightness) {
a9c6ce57ec2f13 Hans de Goede 2016-11-08 318 set_bit(LED_BLINK_DISABLE, &led_cdev->work_flags);
32360bf6a5d401 Dmitry Rokosov 2024-09-04 319 queue_work(led_cdev->wq, &led_cdev->set_brightness_work);
f1e80c07416ada Jacek Anaszewski 2015-10-07 320 } else {
a9c6ce57ec2f13 Hans de Goede 2016-11-08 321 set_bit(LED_BLINK_BRIGHTNESS_CHANGE,
a9c6ce57ec2f13 Hans de Goede 2016-11-08 322 &led_cdev->work_flags);
eb1610b4c27337 Hans de Goede 2016-10-23 323 led_cdev->new_blink_brightness = brightness;
f1e80c07416ada Jacek Anaszewski 2015-10-07 324 }
d23a22a74fded2 Fabio Baltieri 2012-08-15 325 return;
d23a22a74fded2 Fabio Baltieri 2012-08-15 326 }
437864828d82b9 Fabio Baltieri 2012-06-07 327
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 328 led_set_brightness_nosleep(led_cdev, brightness);
a403d930c58eb8 Bryan Wu 2012-03-23 329 }
2806e2ff489975 Jacek Anaszewski 2015-09-28 330 EXPORT_SYMBOL_GPL(led_set_brightness);
3ef7de5304edf6 Jacek Anaszewski 2014-08-20 331
af0bfab907a011 Abanoub Sameh 2020-12-11 @332 void led_set_brightness_nopm(struct led_classdev *led_cdev, unsigned int value)
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 333 {
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 334 /* Use brightness_set op if available, it is guaranteed not to sleep */
d4887af9c2b6ab Heiner Kallweit 2016-02-16 335 if (!__led_set_brightness(led_cdev, value))
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 336 return;
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 337
fa15d8c69238b3 Hans de Goede 2023-05-10 338 /*
fa15d8c69238b3 Hans de Goede 2023-05-10 339 * Brightness setting can sleep, delegate it to a work queue task.
fa15d8c69238b3 Hans de Goede 2023-05-10 340 * value 0 / LED_OFF is special, since it also disables hw-blinking
fa15d8c69238b3 Hans de Goede 2023-05-10 341 * (sw-blink disable is handled in led_set_brightness()).
fa15d8c69238b3 Hans de Goede 2023-05-10 342 * To avoid a hw-blink-disable getting lost when a second brightness
fa15d8c69238b3 Hans de Goede 2023-05-10 343 * change is done immediately afterwards (before the work runs),
fa15d8c69238b3 Hans de Goede 2023-05-10 344 * it uses a separate work_flag.
fa15d8c69238b3 Hans de Goede 2023-05-10 345 */
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 346 led_cdev->delayed_set_value = value;
2c70953b6f535f Remi Pommarel 2025-02-20 347 /* Ensure delayed_set_value is seen before work_flags modification */
2c70953b6f535f Remi Pommarel 2025-02-20 348 smp_mb__before_atomic();
2c70953b6f535f Remi Pommarel 2025-02-20 349
2c70953b6f535f Remi Pommarel 2025-02-20 350 if (value)
fa15d8c69238b3 Hans de Goede 2023-05-10 351 set_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags);
2c70953b6f535f Remi Pommarel 2025-02-20 352 else {
fa15d8c69238b3 Hans de Goede 2023-05-10 353 clear_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags);
22720a87d0a966 Hans de Goede 2023-05-10 354 clear_bit(LED_SET_BLINK, &led_cdev->work_flags);
fa15d8c69238b3 Hans de Goede 2023-05-10 355 set_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags);
fa15d8c69238b3 Hans de Goede 2023-05-10 356 }
fa15d8c69238b3 Hans de Goede 2023-05-10 357
32360bf6a5d401 Dmitry Rokosov 2024-09-04 358 queue_work(led_cdev->wq, &led_cdev->set_brightness_work);
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 359 }
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 360 EXPORT_SYMBOL_GPL(led_set_brightness_nopm);
81fe8e5b73e3f4 Jacek Anaszewski 2015-10-07 361
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2025-12-31 23:37 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 [this message]
2025-12-31 23:45 ` kernel test robot
2026-01-02 12:20 ` kernel test robot
2026-01-02 15:07 ` kernel test robot
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=202601010059.KObE3Pop-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.