All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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.