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: 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 20:20:04 +0800 [thread overview]
Message-ID: <202601022018.gzb8zblD-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: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20260102/202601022018.gzb8zblD-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260102/202601022018.gzb8zblD-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/202601022018.gzb8zblD-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/leds/led-core.c: In function 'led_timer_function':
drivers/leds/led-core.c:73:17: error: implicit declaration of function 'led_set_brightness_nosleep'; did you mean 'led_set_brightness_sync'? [-Wimplicit-function-declaration]
73 | led_set_brightness_nosleep(led_cdev, LED_OFF);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
| led_set_brightness_sync
drivers/leds/led-core.c:84:22: error: implicit declaration of function 'led_get_brightness'; did you mean 'led_set_brightness'? [-Wimplicit-function-declaration]
84 | brightness = led_get_brightness(led_cdev);
| ^~~~~~~~~~~~~~~~~~
| led_set_brightness
drivers/leds/led-core.c: In function 'set_brightness_delayed':
drivers/leds/led-core.c:152:17: error: implicit declaration of function 'led_stop_software_blink' [-Wimplicit-function-declaration]
152 | led_stop_software_blink(led_cdev);
| ^~~~~~~~~~~~~~~~~~~~~~~
drivers/leds/led-core.c: At top level:
>> drivers/leds/led-core.c:237:6: warning: no previous prototype for 'led_init_core' [-Wmissing-prototypes]
237 | void led_init_core(struct led_classdev *led_cdev)
| ^~~~~~~~~~~~~
>> drivers/leds/led-core.c:296:6: warning: no previous prototype for 'led_stop_software_blink' [-Wmissing-prototypes]
296 | void led_stop_software_blink(struct led_classdev *led_cdev)
| ^~~~~~~~~~~~~~~~~~~~~~~
>> drivers/leds/led-core.c:296:6: warning: conflicting types for 'led_stop_software_blink'; have 'void(struct led_classdev *)'
drivers/leds/led-core.c:152:17: note: previous implicit declaration of 'led_stop_software_blink' with type 'void(struct led_classdev *)'
152 | led_stop_software_blink(led_cdev);
| ^~~~~~~~~~~~~~~~~~~~~~~
>> drivers/leds/led-core.c:332:6: warning: no previous prototype for '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:362:6: warning: no previous prototype for 'led_set_brightness_nosleep' [-Wmissing-prototypes]
362 | void led_set_brightness_nosleep(struct led_classdev *led_cdev, unsigned int value)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/leds/led-core.c:362:6: warning: conflicting types for 'led_set_brightness_nosleep'; have 'void(struct led_classdev *, unsigned int)'
drivers/leds/led-core.c:73:17: note: previous implicit declaration of 'led_set_brightness_nosleep' with type 'void(struct led_classdev *, unsigned int)'
73 | led_set_brightness_nosleep(led_cdev, LED_OFF);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
--
In file included from include/linux/kobject.h:20,
from include/linux/energy_model.h:7,
from include/linux/device.h:16,
from drivers/leds/led-class.c:10:
drivers/leds/led-class.c:87:32: error: 'led_trigger_read' undeclared here (not in a function); did you mean 'led_trigger_set'?
87 | static BIN_ATTR(trigger, 0644, led_trigger_read, led_trigger_write, 0);
| ^~~~~~~~~~~~~~~~
include/linux/sysfs.h:341:17: note: in definition of macro '__BIN_ATTR'
341 | .read = _read, \
| ^~~~~
drivers/leds/led-class.c:87:8: note: in expansion of macro 'BIN_ATTR'
87 | static BIN_ATTR(trigger, 0644, led_trigger_read, led_trigger_write, 0);
| ^~~~~~~~
drivers/leds/led-class.c:87:50: error: 'led_trigger_write' undeclared here (not in a function); did you mean 'led_trigger_set'?
87 | static BIN_ATTR(trigger, 0644, led_trigger_read, led_trigger_write, 0);
| ^~~~~~~~~~~~~~~~~
include/linux/sysfs.h:342:18: note: in definition of macro '__BIN_ATTR'
342 | .write = _write, \
| ^~~~~~
drivers/leds/led-class.c:87:8: note: in expansion of macro 'BIN_ATTR'
87 | static BIN_ATTR(trigger, 0644, led_trigger_read, led_trigger_write, 0);
| ^~~~~~~~
drivers/leds/led-class.c:93:22: error: initialization of 'const struct bin_attribute * const*' from incompatible pointer type 'struct bin_attribute **' [-Wincompatible-pointer-types]
93 | .bin_attrs = led_trigger_bin_attrs,
| ^~~~~~~~~~~~~~~~~~~~~
drivers/leds/led-class.c:93:22: note: (near initialization for 'led_trigger_group.bin_attrs')
drivers/leds/led-class.c: In function 'led_classdev_suspend':
drivers/leds/led-class.c:183:9: error: implicit declaration of function 'led_set_brightness_nopm'; did you mean 'led_set_brightness_sync'? [-Wimplicit-function-declaration]
183 | led_set_brightness_nopm(led_cdev, 0);
| ^~~~~~~~~~~~~~~~~~~~~~~
| led_set_brightness_sync
drivers/leds/led-class.c: At top level:
>> drivers/leds/led-class.c:258:22: warning: no previous prototype for 'of_led_get' [-Wmissing-prototypes]
258 | struct led_classdev *of_led_get(struct device_node *np, int index)
| ^~~~~~~~~~
>> drivers/leds/led-class.c:303:22: warning: no previous prototype for 'fwnode_led_get' [-Wmissing-prototypes]
303 | struct led_classdev *fwnode_led_get(const struct fwnode_handle *fwnode,
| ^~~~~~~~~~~~~~
drivers/leds/led-class.c: In function 'fwnode_led_get':
drivers/leds/led-class.c:348:19: error: implicit declaration of function 'fwnode_get_next_parent_dev'; did you mean 'fwnode_get_next_parent'? [-Wimplicit-function-declaration]
348 | led_dev = fwnode_get_next_parent_dev((struct fwnode_handle *)args.fwnode);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
| fwnode_get_next_parent
drivers/leds/led-class.c:348:17: error: assignment to 'struct device *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
348 | led_dev = fwnode_get_next_parent_dev((struct fwnode_handle *)args.fwnode);
| ^
drivers/leds/led-class.c: In function 'led_classdev_register_ext':
drivers/leds/led-class.c:647:21: error: 'leds_list_lock' undeclared (first use in this function); did you mean 'leds_lookup_lock'?
647 | down_write(&leds_list_lock);
| ^~~~~~~~~~~~~~
| leds_lookup_lock
drivers/leds/led-class.c:647:21: note: each undeclared identifier is reported only once for each function it appears in
drivers/leds/led-class.c:648:41: error: 'leds_list' undeclared (first use in this function); did you mean 'leds_class'?
648 | list_add_tail(&led_cdev->node, &leds_list);
| ^~~~~~~~~
| leds_class
drivers/leds/led-class.c:656:9: error: implicit declaration of function 'led_init_core' [-Wimplicit-function-declaration]
656 | led_init_core(led_cdev);
| ^~~~~~~~~~~~~
drivers/leds/led-class.c: In function 'led_classdev_unregister':
drivers/leds/led-class.c:692:9: error: implicit declaration of function 'led_stop_software_blink' [-Wimplicit-function-declaration]
692 | led_stop_software_blink(led_cdev);
| ^~~~~~~~~~~~~~~~~~~~~~~
drivers/leds/led-class.c:704:21: error: 'leds_list_lock' undeclared (first use in this function); did you mean 'leds_lookup_lock'?
704 | down_write(&leds_list_lock);
| ^~~~~~~~~~~~~~
| leds_lookup_lock
--
>> drivers/leds/led-triggers.c:36:9: warning: no previous prototype for 'led_trigger_write' [-Wmissing-prototypes]
36 | ssize_t led_trigger_write(struct file *filp, struct kobject *kobj,
| ^~~~~~~~~~~~~~~~~
>> drivers/leds/led-triggers.c:133:9: warning: no previous prototype for 'led_trigger_read' [-Wmissing-prototypes]
133 | ssize_t led_trigger_read(struct file *filp, struct kobject *kobj,
| ^~~~~~~~~~~~~~~~
drivers/leds/led-triggers.c: In function 'led_trigger_set':
drivers/leds/led-triggers.c:189:17: error: implicit declaration of function 'led_stop_software_blink' [-Wimplicit-function-declaration]
189 | led_stop_software_blink(led_cdev);
| ^~~~~~~~~~~~~~~~~~~~~~~
drivers/leds/led-triggers.c: In function 'led_trigger_register':
drivers/leds/led-triggers.c:341:20: error: 'leds_list_lock' undeclared (first use in this function); did you mean 'tasklist_lock'?
341 | down_read(&leds_list_lock);
| ^~~~~~~~~~~~~~
| tasklist_lock
drivers/leds/led-triggers.c:341:20: note: each undeclared identifier is reported only once for each function it appears in
In file included from include/linux/kernel.h:22,
from drivers/leds/led-triggers.c:11:
drivers/leds/led-triggers.c:342:40: error: 'leds_list' undeclared (first use in this function); did you mean 'lru_list'?
342 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~
include/linux/container_of.h:20:33: note: in definition of macro 'container_of'
20 | void *__mptr = (void *)(ptr); \
| ^~~
include/linux/list.h:620:9: note: in expansion of macro 'list_entry'
620 | list_entry((ptr)->next, type, member)
| ^~~~~~~~~~
include/linux/list.h:782:20: note: in expansion of macro 'list_first_entry'
782 | for (pos = list_first_entry(head, typeof(*pos), member); \
| ^~~~~~~~~~~~~~~~
drivers/leds/led-triggers.c:342:9: note: in expansion of macro 'list_for_each_entry'
342 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~~~~~~~~~~~
In file included from include/linux/container_of.h:5:
include/linux/compiler_types.h:565:27: error: expression in static assertion is not an integer
565 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/container_of.h:21:9: note: in expansion of macro 'static_assert'
21 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~~~
include/linux/container_of.h:21:23: note: in expansion of macro '__same_type'
21 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~
include/linux/list.h:609:9: note: in expansion of macro 'container_of'
609 | container_of(ptr, type, member)
| ^~~~~~~~~~~~
include/linux/list.h:620:9: note: in expansion of macro 'list_entry'
620 | list_entry((ptr)->next, type, member)
| ^~~~~~~~~~
include/linux/list.h:782:20: note: in expansion of macro 'list_first_entry'
782 | for (pos = list_first_entry(head, typeof(*pos), member); \
| ^~~~~~~~~~~~~~~~
drivers/leds/led-triggers.c:342:9: note: in expansion of macro 'list_for_each_entry'
342 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~~~~~~~~~~~
drivers/leds/led-triggers.c: In function 'led_trigger_unregister':
drivers/leds/led-triggers.c:367:20: error: 'leds_list_lock' undeclared (first use in this function); did you mean 'tasklist_lock'?
367 | down_read(&leds_list_lock);
| ^~~~~~~~~~~~~~
| tasklist_lock
drivers/leds/led-triggers.c:368:40: error: 'leds_list' undeclared (first use in this function); did you mean 'lru_list'?
368 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~
include/linux/container_of.h:20:33: note: in definition of macro 'container_of'
20 | void *__mptr = (void *)(ptr); \
| ^~~
include/linux/list.h:620:9: note: in expansion of macro 'list_entry'
620 | list_entry((ptr)->next, type, member)
| ^~~~~~~~~~
include/linux/list.h:782:20: note: in expansion of macro 'list_first_entry'
782 | for (pos = list_first_entry(head, typeof(*pos), member); \
| ^~~~~~~~~~~~~~~~
drivers/leds/led-triggers.c:368:9: note: in expansion of macro 'list_for_each_entry'
368 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~~~~~~~~~~~
include/linux/compiler_types.h:565:27: error: expression in static assertion is not an integer
565 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:78:56: note: in definition of macro '__static_assert'
78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
| ^~~~
include/linux/container_of.h:21:9: note: in expansion of macro 'static_assert'
21 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~~~
include/linux/container_of.h:21:23: note: in expansion of macro '__same_type'
21 | static_assert(__same_type(*(ptr), ((type *)0)->member) || \
| ^~~~~~~~~~~
include/linux/list.h:609:9: note: in expansion of macro 'container_of'
609 | container_of(ptr, type, member)
| ^~~~~~~~~~~~
include/linux/list.h:620:9: note: in expansion of macro 'list_entry'
620 | list_entry((ptr)->next, type, member)
| ^~~~~~~~~~
include/linux/list.h:782:20: note: in expansion of macro 'list_first_entry'
782 | for (pos = list_first_entry(head, typeof(*pos), member); \
| ^~~~~~~~~~~~~~~~
drivers/leds/led-triggers.c:368:9: note: in expansion of macro 'list_for_each_entry'
368 | list_for_each_entry(led_cdev, &leds_list, node) {
| ^~~~~~~~~~~~~~~~~~~
vim +/led_init_core +237 drivers/leds/led-core.c
d4887af9c2b6ab5 Heiner Kallweit 2016-02-16 64
49404665b935447 Kees Cook 2017-10-25 65 static void led_timer_function(struct timer_list *t)
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 66 {
41cb08555c41649 Ingo Molnar 2025-05-09 67 struct led_classdev *led_cdev = timer_container_of(led_cdev, t,
41cb08555c41649 Ingo Molnar 2025-05-09 68 blink_timer);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 69 unsigned long brightness;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 70 unsigned long delay;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 71
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 72 if (!led_cdev->blink_delay_on || !led_cdev->blink_delay_off) {
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 73 led_set_brightness_nosleep(led_cdev, LED_OFF);
a9c6ce57ec2f136 Hans de Goede 2016-11-08 74 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 75 return;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 76 }
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 77
a9c6ce57ec2f136 Hans de Goede 2016-11-08 78 if (test_and_clear_bit(LED_BLINK_ONESHOT_STOP,
a9c6ce57ec2f136 Hans de Goede 2016-11-08 79 &led_cdev->work_flags)) {
a9c6ce57ec2f136 Hans de Goede 2016-11-08 80 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 81 return;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 82 }
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 83
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 @84 brightness = led_get_brightness(led_cdev);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 85 if (!brightness) {
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 86 /* Time to switch the LED on. */
eb1610b4c273370 Hans de Goede 2016-10-23 87 if (test_and_clear_bit(LED_BLINK_BRIGHTNESS_CHANGE,
eb1610b4c273370 Hans de Goede 2016-10-23 88 &led_cdev->work_flags))
eb1610b4c273370 Hans de Goede 2016-10-23 89 brightness = led_cdev->new_blink_brightness;
eb1610b4c273370 Hans de Goede 2016-10-23 90 else
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 91 brightness = led_cdev->blink_brightness;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 92 delay = led_cdev->blink_delay_on;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 93 } else {
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 94 /* Store the current brightness value to be able
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 95 * to restore it when the delay_off period is over.
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 96 */
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 97 led_cdev->blink_brightness = brightness;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 98 brightness = LED_OFF;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 99 delay = led_cdev->blink_delay_off;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 100 }
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 101
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 102 led_set_brightness_nosleep(led_cdev, brightness);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 103
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 104 /* Return in next iteration if led is in one-shot mode and we are in
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 105 * the final blink state so that the led is toggled each delay_on +
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 106 * delay_off milliseconds in worst case.
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 107 */
a9c6ce57ec2f136 Hans de Goede 2016-11-08 108 if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags)) {
a9c6ce57ec2f136 Hans de Goede 2016-11-08 109 if (test_bit(LED_BLINK_INVERT, &led_cdev->work_flags)) {
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 110 if (brightness)
a9c6ce57ec2f136 Hans de Goede 2016-11-08 111 set_bit(LED_BLINK_ONESHOT_STOP,
a9c6ce57ec2f136 Hans de Goede 2016-11-08 112 &led_cdev->work_flags);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 113 } else {
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 114 if (!brightness)
a9c6ce57ec2f136 Hans de Goede 2016-11-08 115 set_bit(LED_BLINK_ONESHOT_STOP,
a9c6ce57ec2f136 Hans de Goede 2016-11-08 116 &led_cdev->work_flags);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 117 }
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 118 }
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 119
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 120 mod_timer(&led_cdev->blink_timer, jiffies + msecs_to_jiffies(delay));
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 121 }
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 122
fa15d8c69238b35 Hans de Goede 2023-05-10 123 static void set_brightness_delayed_set_brightness(struct led_classdev *led_cdev,
fa15d8c69238b35 Hans de Goede 2023-05-10 124 unsigned int value)
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 125 {
d33d1214a1ddf9e Lee Jones 2024-06-12 126 int ret;
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 127
fa15d8c69238b35 Hans de Goede 2023-05-10 128 ret = __led_set_brightness(led_cdev, value);
d33d1214a1ddf9e Lee Jones 2024-06-12 129 if (ret == -ENOTSUPP) {
fa15d8c69238b35 Hans de Goede 2023-05-10 130 ret = __led_set_brightness_blocking(led_cdev, value);
d33d1214a1ddf9e Lee Jones 2024-06-12 131 if (ret == -ENOTSUPP)
d33d1214a1ddf9e Lee Jones 2024-06-12 132 /* No back-end support to set a fixed brightness value */
d33d1214a1ddf9e Lee Jones 2024-06-12 133 return;
d33d1214a1ddf9e Lee Jones 2024-06-12 134 }
d33d1214a1ddf9e Lee Jones 2024-06-12 135
d84d80f38f0ff4e Heiner Kallweit 2016-01-22 136 /* LED HW might have been unplugged, therefore don't warn */
d33d1214a1ddf9e Lee Jones 2024-06-12 137 if (ret == -ENODEV && led_cdev->flags & LED_UNREGISTERING &&
d33d1214a1ddf9e Lee Jones 2024-06-12 138 led_cdev->flags & LED_HW_PLUGGABLE)
d33d1214a1ddf9e Lee Jones 2024-06-12 139 return;
d33d1214a1ddf9e Lee Jones 2024-06-12 140
d33d1214a1ddf9e Lee Jones 2024-06-12 141 if (ret < 0)
1afcadfcd184c3b Jacek Anaszewski 2015-10-19 142 dev_err(led_cdev->dev,
1afcadfcd184c3b Jacek Anaszewski 2015-10-19 143 "Setting an LED's brightness failed (%d)\n", ret);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 144 }
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 145
fa15d8c69238b35 Hans de Goede 2023-05-10 146 static void set_brightness_delayed(struct work_struct *ws)
fa15d8c69238b35 Hans de Goede 2023-05-10 147 {
fa15d8c69238b35 Hans de Goede 2023-05-10 148 struct led_classdev *led_cdev =
fa15d8c69238b35 Hans de Goede 2023-05-10 149 container_of(ws, struct led_classdev, set_brightness_work);
fa15d8c69238b35 Hans de Goede 2023-05-10 150
fa15d8c69238b35 Hans de Goede 2023-05-10 151 if (test_and_clear_bit(LED_BLINK_DISABLE, &led_cdev->work_flags)) {
fa15d8c69238b35 Hans de Goede 2023-05-10 @152 led_stop_software_blink(led_cdev);
fa15d8c69238b35 Hans de Goede 2023-05-10 153 set_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags);
fa15d8c69238b35 Hans de Goede 2023-05-10 154 }
fa15d8c69238b35 Hans de Goede 2023-05-10 155
fa15d8c69238b35 Hans de Goede 2023-05-10 156 /*
fa15d8c69238b35 Hans de Goede 2023-05-10 157 * Triggers may call led_set_brightness(LED_OFF),
fa15d8c69238b35 Hans de Goede 2023-05-10 158 * led_set_brightness(LED_FULL) in quick succession to disable blinking
fa15d8c69238b35 Hans de Goede 2023-05-10 159 * and turn the LED on. Both actions may have been scheduled to run
fa15d8c69238b35 Hans de Goede 2023-05-10 160 * before this work item runs once. To make sure this works properly
fa15d8c69238b35 Hans de Goede 2023-05-10 161 * handle LED_SET_BRIGHTNESS_OFF first.
fa15d8c69238b35 Hans de Goede 2023-05-10 162 */
2c70953b6f535f7 Remi Pommarel 2025-02-20 163 if (test_and_clear_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags)) {
fa15d8c69238b35 Hans de Goede 2023-05-10 164 set_brightness_delayed_set_brightness(led_cdev, LED_OFF);
2c70953b6f535f7 Remi Pommarel 2025-02-20 165 /*
2c70953b6f535f7 Remi Pommarel 2025-02-20 166 * The consecutives led_set_brightness(LED_OFF),
2c70953b6f535f7 Remi Pommarel 2025-02-20 167 * led_set_brightness(LED_FULL) could have been executed out of
2c70953b6f535f7 Remi Pommarel 2025-02-20 168 * order (LED_FULL first), if the work_flags has been set
2c70953b6f535f7 Remi Pommarel 2025-02-20 169 * between LED_SET_BRIGHTNESS_OFF and LED_SET_BRIGHTNESS of this
2c70953b6f535f7 Remi Pommarel 2025-02-20 170 * work. To avoid ending with the LED turned off, turn the LED
2c70953b6f535f7 Remi Pommarel 2025-02-20 171 * on again.
2c70953b6f535f7 Remi Pommarel 2025-02-20 172 */
2c70953b6f535f7 Remi Pommarel 2025-02-20 173 if (led_cdev->delayed_set_value != LED_OFF)
2c70953b6f535f7 Remi Pommarel 2025-02-20 174 set_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags);
2c70953b6f535f7 Remi Pommarel 2025-02-20 175 }
fa15d8c69238b35 Hans de Goede 2023-05-10 176
fa15d8c69238b35 Hans de Goede 2023-05-10 177 if (test_and_clear_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags))
fa15d8c69238b35 Hans de Goede 2023-05-10 178 set_brightness_delayed_set_brightness(led_cdev, led_cdev->delayed_set_value);
22720a87d0a9667 Hans de Goede 2023-05-10 179
22720a87d0a9667 Hans de Goede 2023-05-10 180 if (test_and_clear_bit(LED_SET_BLINK, &led_cdev->work_flags)) {
22720a87d0a9667 Hans de Goede 2023-05-10 181 unsigned long delay_on = led_cdev->delayed_delay_on;
22720a87d0a9667 Hans de Goede 2023-05-10 182 unsigned long delay_off = led_cdev->delayed_delay_off;
22720a87d0a9667 Hans de Goede 2023-05-10 183
22720a87d0a9667 Hans de Goede 2023-05-10 184 led_blink_set(led_cdev, &delay_on, &delay_off);
22720a87d0a9667 Hans de Goede 2023-05-10 185 }
fa15d8c69238b35 Hans de Goede 2023-05-10 186 }
fa15d8c69238b35 Hans de Goede 2023-05-10 187
a403d930c58eb84 Bryan Wu 2012-03-23 188 static void led_set_software_blink(struct led_classdev *led_cdev,
a403d930c58eb84 Bryan Wu 2012-03-23 189 unsigned long delay_on,
a403d930c58eb84 Bryan Wu 2012-03-23 190 unsigned long delay_off)
a403d930c58eb84 Bryan Wu 2012-03-23 191 {
a403d930c58eb84 Bryan Wu 2012-03-23 192 int current_brightness;
a403d930c58eb84 Bryan Wu 2012-03-23 193
a403d930c58eb84 Bryan Wu 2012-03-23 194 current_brightness = led_get_brightness(led_cdev);
a403d930c58eb84 Bryan Wu 2012-03-23 195 if (current_brightness)
a403d930c58eb84 Bryan Wu 2012-03-23 196 led_cdev->blink_brightness = current_brightness;
a403d930c58eb84 Bryan Wu 2012-03-23 197 if (!led_cdev->blink_brightness)
a403d930c58eb84 Bryan Wu 2012-03-23 198 led_cdev->blink_brightness = led_cdev->max_brightness;
a403d930c58eb84 Bryan Wu 2012-03-23 199
a403d930c58eb84 Bryan Wu 2012-03-23 200 led_cdev->blink_delay_on = delay_on;
a403d930c58eb84 Bryan Wu 2012-03-23 201 led_cdev->blink_delay_off = delay_off;
a403d930c58eb84 Bryan Wu 2012-03-23 202
8d82fef8bbee588 Stefan Sørensen 2014-02-04 203 /* never on - just set to off */
8d82fef8bbee588 Stefan Sørensen 2014-02-04 204 if (!delay_on) {
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 205 led_set_brightness_nosleep(led_cdev, LED_OFF);
a403d930c58eb84 Bryan Wu 2012-03-23 206 return;
8d82fef8bbee588 Stefan Sørensen 2014-02-04 207 }
a403d930c58eb84 Bryan Wu 2012-03-23 208
a403d930c58eb84 Bryan Wu 2012-03-23 209 /* never off - just set to brightness */
a403d930c58eb84 Bryan Wu 2012-03-23 210 if (!delay_off) {
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 211 led_set_brightness_nosleep(led_cdev,
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 212 led_cdev->blink_brightness);
a403d930c58eb84 Bryan Wu 2012-03-23 213 return;
a403d930c58eb84 Bryan Wu 2012-03-23 214 }
a403d930c58eb84 Bryan Wu 2012-03-23 215
a9c6ce57ec2f136 Hans de Goede 2016-11-08 216 set_bit(LED_BLINK_SW, &led_cdev->work_flags);
9067359faf890b3 Jiri Kosina 2014-09-02 217 mod_timer(&led_cdev->blink_timer, jiffies + 1);
a403d930c58eb84 Bryan Wu 2012-03-23 218 }
a403d930c58eb84 Bryan Wu 2012-03-23 219
a403d930c58eb84 Bryan Wu 2012-03-23 220
20c0e6b8787c528 Bryan Wu 2012-06-15 221 static void led_blink_setup(struct led_classdev *led_cdev,
a403d930c58eb84 Bryan Wu 2012-03-23 222 unsigned long *delay_on,
a403d930c58eb84 Bryan Wu 2012-03-23 223 unsigned long *delay_off)
a403d930c58eb84 Bryan Wu 2012-03-23 224 {
a9c6ce57ec2f136 Hans de Goede 2016-11-08 225 if (!test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) &&
5bb629c504394f4 Fabio Baltieri 2012-05-27 226 led_cdev->blink_set &&
a403d930c58eb84 Bryan Wu 2012-03-23 227 !led_cdev->blink_set(led_cdev, delay_on, delay_off))
a403d930c58eb84 Bryan Wu 2012-03-23 228 return;
a403d930c58eb84 Bryan Wu 2012-03-23 229
a403d930c58eb84 Bryan Wu 2012-03-23 230 /* blink with 1 Hz as default if nothing specified */
a403d930c58eb84 Bryan Wu 2012-03-23 231 if (!*delay_on && !*delay_off)
a403d930c58eb84 Bryan Wu 2012-03-23 232 *delay_on = *delay_off = 500;
a403d930c58eb84 Bryan Wu 2012-03-23 233
a403d930c58eb84 Bryan Wu 2012-03-23 234 led_set_software_blink(led_cdev, *delay_on, *delay_off);
a403d930c58eb84 Bryan Wu 2012-03-23 235 }
5bb629c504394f4 Fabio Baltieri 2012-05-27 236
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 @237 void led_init_core(struct led_classdev *led_cdev)
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 238 {
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 239 INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 240
49404665b935447 Kees Cook 2017-10-25 241 timer_setup(&led_cdev->blink_timer, led_timer_function, 0);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 242 }
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 243 EXPORT_SYMBOL_GPL(led_init_core);
757b06ae04b3b6c Jacek Anaszewski 2015-09-28 244
5bb629c504394f4 Fabio Baltieri 2012-05-27 245 void led_blink_set(struct led_classdev *led_cdev,
5bb629c504394f4 Fabio Baltieri 2012-05-27 246 unsigned long *delay_on,
5bb629c504394f4 Fabio Baltieri 2012-05-27 247 unsigned long *delay_off)
5bb629c504394f4 Fabio Baltieri 2012-05-27 248 {
8fa7292fee5c524 Thomas Gleixner 2025-04-05 249 timer_delete_sync(&led_cdev->blink_timer);
5bb629c504394f4 Fabio Baltieri 2012-05-27 250
7b6af2c53192f17 Jacek Anaszewski 2018-01-03 251 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
a9c6ce57ec2f136 Hans de Goede 2016-11-08 252 clear_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags);
a9c6ce57ec2f136 Hans de Goede 2016-11-08 253 clear_bit(LED_BLINK_ONESHOT_STOP, &led_cdev->work_flags);
5bb629c504394f4 Fabio Baltieri 2012-05-27 254
5bb629c504394f4 Fabio Baltieri 2012-05-27 255 led_blink_setup(led_cdev, delay_on, delay_off);
5bb629c504394f4 Fabio Baltieri 2012-05-27 256 }
2806e2ff489975e Jacek Anaszewski 2015-09-28 257 EXPORT_SYMBOL_GPL(led_blink_set);
a403d930c58eb84 Bryan Wu 2012-03-23 258
5bb629c504394f4 Fabio Baltieri 2012-05-27 259 void led_blink_set_oneshot(struct led_classdev *led_cdev,
5bb629c504394f4 Fabio Baltieri 2012-05-27 260 unsigned long *delay_on,
5bb629c504394f4 Fabio Baltieri 2012-05-27 261 unsigned long *delay_off,
5bb629c504394f4 Fabio Baltieri 2012-05-27 262 int invert)
5bb629c504394f4 Fabio Baltieri 2012-05-27 263 {
a9c6ce57ec2f136 Hans de Goede 2016-11-08 264 if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) &&
9067359faf890b3 Jiri Kosina 2014-09-02 265 timer_pending(&led_cdev->blink_timer))
5bb629c504394f4 Fabio Baltieri 2012-05-27 266 return;
5bb629c504394f4 Fabio Baltieri 2012-05-27 267
a9c6ce57ec2f136 Hans de Goede 2016-11-08 268 set_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags);
a9c6ce57ec2f136 Hans de Goede 2016-11-08 269 clear_bit(LED_BLINK_ONESHOT_STOP, &led_cdev->work_flags);
5bb629c504394f4 Fabio Baltieri 2012-05-27 270
5bb629c504394f4 Fabio Baltieri 2012-05-27 271 if (invert)
a9c6ce57ec2f136 Hans de Goede 2016-11-08 272 set_bit(LED_BLINK_INVERT, &led_cdev->work_flags);
5bb629c504394f4 Fabio Baltieri 2012-05-27 273 else
a9c6ce57ec2f136 Hans de Goede 2016-11-08 274 clear_bit(LED_BLINK_INVERT, &led_cdev->work_flags);
5bb629c504394f4 Fabio Baltieri 2012-05-27 275
5bb629c504394f4 Fabio Baltieri 2012-05-27 276 led_blink_setup(led_cdev, delay_on, delay_off);
5bb629c504394f4 Fabio Baltieri 2012-05-27 277 }
2806e2ff489975e Jacek Anaszewski 2015-09-28 278 EXPORT_SYMBOL_GPL(led_blink_set_oneshot);
5bb629c504394f4 Fabio Baltieri 2012-05-27 279
22720a87d0a9667 Hans de Goede 2023-05-10 280 void led_blink_set_nosleep(struct led_classdev *led_cdev, unsigned long delay_on,
22720a87d0a9667 Hans de Goede 2023-05-10 281 unsigned long delay_off)
22720a87d0a9667 Hans de Goede 2023-05-10 282 {
22720a87d0a9667 Hans de Goede 2023-05-10 283 /* If necessary delegate to a work queue task. */
22720a87d0a9667 Hans de Goede 2023-05-10 284 if (led_cdev->blink_set && led_cdev->brightness_set_blocking) {
22720a87d0a9667 Hans de Goede 2023-05-10 285 led_cdev->delayed_delay_on = delay_on;
22720a87d0a9667 Hans de Goede 2023-05-10 286 led_cdev->delayed_delay_off = delay_off;
22720a87d0a9667 Hans de Goede 2023-05-10 287 set_bit(LED_SET_BLINK, &led_cdev->work_flags);
32360bf6a5d4016 Dmitry Rokosov 2024-09-04 288 queue_work(led_cdev->wq, &led_cdev->set_brightness_work);
22720a87d0a9667 Hans de Goede 2023-05-10 289 return;
22720a87d0a9667 Hans de Goede 2023-05-10 290 }
22720a87d0a9667 Hans de Goede 2023-05-10 291
22720a87d0a9667 Hans de Goede 2023-05-10 292 led_blink_set(led_cdev, &delay_on, &delay_off);
22720a87d0a9667 Hans de Goede 2023-05-10 293 }
22720a87d0a9667 Hans de Goede 2023-05-10 294 EXPORT_SYMBOL_GPL(led_blink_set_nosleep);
22720a87d0a9667 Hans de Goede 2023-05-10 295
d23a22a74fded23 Fabio Baltieri 2012-08-15 @296 void led_stop_software_blink(struct led_classdev *led_cdev)
a403d930c58eb84 Bryan Wu 2012-03-23 297 {
8fa7292fee5c524 Thomas Gleixner 2025-04-05 298 timer_delete_sync(&led_cdev->blink_timer);
437864828d82b9d Fabio Baltieri 2012-06-07 299 led_cdev->blink_delay_on = 0;
437864828d82b9d Fabio Baltieri 2012-06-07 300 led_cdev->blink_delay_off = 0;
a9c6ce57ec2f136 Hans de Goede 2016-11-08 301 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
d23a22a74fded23 Fabio Baltieri 2012-08-15 302 }
d23a22a74fded23 Fabio Baltieri 2012-08-15 303 EXPORT_SYMBOL_GPL(led_stop_software_blink);
d23a22a74fded23 Fabio Baltieri 2012-08-15 304
af0bfab907a011e Abanoub Sameh 2020-12-11 305 void led_set_brightness(struct led_classdev *led_cdev, unsigned int brightness)
d23a22a74fded23 Fabio Baltieri 2012-08-15 306 {
f1e80c07416adac Jacek Anaszewski 2015-10-07 307 /*
7cfe749fad51582 Tony Makkiel 2016-05-18 308 * If software blink is active, delay brightness setting
f1e80c07416adac Jacek Anaszewski 2015-10-07 309 * until the next timer tick.
f1e80c07416adac Jacek Anaszewski 2015-10-07 310 */
a9c6ce57ec2f136 Hans de Goede 2016-11-08 311 if (test_bit(LED_BLINK_SW, &led_cdev->work_flags)) {
f1e80c07416adac Jacek Anaszewski 2015-10-07 312 /*
f1e80c07416adac Jacek Anaszewski 2015-10-07 313 * If we need to disable soft blinking delegate this to the
f1e80c07416adac Jacek Anaszewski 2015-10-07 314 * work queue task to avoid problems in case we are called
f1e80c07416adac Jacek Anaszewski 2015-10-07 315 * from hard irq context.
f1e80c07416adac Jacek Anaszewski 2015-10-07 316 */
af0bfab907a011e Abanoub Sameh 2020-12-11 317 if (!brightness) {
a9c6ce57ec2f136 Hans de Goede 2016-11-08 318 set_bit(LED_BLINK_DISABLE, &led_cdev->work_flags);
32360bf6a5d4016 Dmitry Rokosov 2024-09-04 319 queue_work(led_cdev->wq, &led_cdev->set_brightness_work);
f1e80c07416adac Jacek Anaszewski 2015-10-07 320 } else {
a9c6ce57ec2f136 Hans de Goede 2016-11-08 321 set_bit(LED_BLINK_BRIGHTNESS_CHANGE,
a9c6ce57ec2f136 Hans de Goede 2016-11-08 322 &led_cdev->work_flags);
eb1610b4c273370 Hans de Goede 2016-10-23 323 led_cdev->new_blink_brightness = brightness;
f1e80c07416adac Jacek Anaszewski 2015-10-07 324 }
d23a22a74fded23 Fabio Baltieri 2012-08-15 325 return;
d23a22a74fded23 Fabio Baltieri 2012-08-15 326 }
437864828d82b9d Fabio Baltieri 2012-06-07 327
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 328 led_set_brightness_nosleep(led_cdev, brightness);
a403d930c58eb84 Bryan Wu 2012-03-23 329 }
2806e2ff489975e Jacek Anaszewski 2015-09-28 330 EXPORT_SYMBOL_GPL(led_set_brightness);
3ef7de5304edf60 Jacek Anaszewski 2014-08-20 331
af0bfab907a011e Abanoub Sameh 2020-12-11 @332 void led_set_brightness_nopm(struct led_classdev *led_cdev, unsigned int value)
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 333 {
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 334 /* Use brightness_set op if available, it is guaranteed not to sleep */
d4887af9c2b6ab5 Heiner Kallweit 2016-02-16 335 if (!__led_set_brightness(led_cdev, value))
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 336 return;
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 337
fa15d8c69238b35 Hans de Goede 2023-05-10 338 /*
fa15d8c69238b35 Hans de Goede 2023-05-10 339 * Brightness setting can sleep, delegate it to a work queue task.
fa15d8c69238b35 Hans de Goede 2023-05-10 340 * value 0 / LED_OFF is special, since it also disables hw-blinking
fa15d8c69238b35 Hans de Goede 2023-05-10 341 * (sw-blink disable is handled in led_set_brightness()).
fa15d8c69238b35 Hans de Goede 2023-05-10 342 * To avoid a hw-blink-disable getting lost when a second brightness
fa15d8c69238b35 Hans de Goede 2023-05-10 343 * change is done immediately afterwards (before the work runs),
fa15d8c69238b35 Hans de Goede 2023-05-10 344 * it uses a separate work_flag.
fa15d8c69238b35 Hans de Goede 2023-05-10 345 */
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 346 led_cdev->delayed_set_value = value;
2c70953b6f535f7 Remi Pommarel 2025-02-20 347 /* Ensure delayed_set_value is seen before work_flags modification */
2c70953b6f535f7 Remi Pommarel 2025-02-20 348 smp_mb__before_atomic();
2c70953b6f535f7 Remi Pommarel 2025-02-20 349
2c70953b6f535f7 Remi Pommarel 2025-02-20 350 if (value)
fa15d8c69238b35 Hans de Goede 2023-05-10 351 set_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags);
2c70953b6f535f7 Remi Pommarel 2025-02-20 352 else {
fa15d8c69238b35 Hans de Goede 2023-05-10 353 clear_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags);
22720a87d0a9667 Hans de Goede 2023-05-10 354 clear_bit(LED_SET_BLINK, &led_cdev->work_flags);
fa15d8c69238b35 Hans de Goede 2023-05-10 355 set_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags);
fa15d8c69238b35 Hans de Goede 2023-05-10 356 }
fa15d8c69238b35 Hans de Goede 2023-05-10 357
32360bf6a5d4016 Dmitry Rokosov 2024-09-04 358 queue_work(led_cdev->wq, &led_cdev->set_brightness_work);
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 359 }
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 360 EXPORT_SYMBOL_GPL(led_set_brightness_nopm);
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 361
af0bfab907a011e Abanoub Sameh 2020-12-11 @362 void led_set_brightness_nosleep(struct led_classdev *led_cdev, unsigned int value)
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 363 {
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 364 led_cdev->brightness = min(value, led_cdev->max_brightness);
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 365
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 366 if (led_cdev->flags & LED_SUSPENDED)
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 367 return;
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 368
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 369 led_set_brightness_nopm(led_cdev, led_cdev->brightness);
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 370 }
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 371 EXPORT_SYMBOL_GPL(led_set_brightness_nosleep);
81fe8e5b73e3f4d Jacek Anaszewski 2015-10-07 372
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
next prev parent reply other threads:[~2026-01-02 12:21 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 [this message]
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=202601022018.gzb8zblD-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=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.