1. 26 Jun, 2024 17 commits
    • Bastien Curutchet's avatar
      leds: pca9532: Use PWM1 for hardware blinking · 48ca7f30
      Bastien Curutchet authored
      PSC0/PWM0 are used by all LEDs for brightness and blinking. This causes
      conflicts when you set a brightness of a new LED while an other one is
      already using PWM0 for blinking.
      
      Use PSC1/PWM1 for blinking.
      Check that no other LED is already blinking with a different PSC1/PWM1
      configuration to avoid conflict.
      Signed-off-by: default avatarBastien Curutchet <bastien.curutchet@bootlin.com>
      Link: https://lore.kernel.org/r/20240617143910.154546-3-bastien.curutchet@bootlin.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      48ca7f30
    • Bastien Curutchet's avatar
      leds: pca9532: Use defines to select PWM instance · 0e69c906
      Bastien Curutchet authored
      Two tables are used to configure the PWM and PSC registers of the two
      PWM available in the pca9532. Magic numbers are used to access this table
      instead of defines.
      
      Add defines PCA9532_PWM_ID_0 and PCA9532_PWM_ID_1 and use them in place of
      these magic numbers.
      Signed-off-by: default avatarBastien Curutchet <bastien.curutchet@bootlin.com>
      Link: https://lore.kernel.org/r/20240617143910.154546-2-bastien.curutchet@bootlin.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      0e69c906
    • Hans de Goede's avatar
      leds: trigger: input-events: Rewrite to fix a serious locking issue · a031c814
      Hans de Goede authored
      The input subsystem registers LEDs with default triggers while holding
      the input_lock and input_register_handler() takes the input_lock this
      means that a triggers activate method cannot directly call
      input_register_handler() as the old ledtrig-input-events code is doing.
      
      The initial implementation of the input-events trigger mainly did not use
      the simple LED trigger mechanism because that mechanism had an issue with
      the initial state of a newly activated LED not matching the last
      led_trigger_event() call for the trigger. This issue has been fixed in
      commit 822c91e7 ("leds: trigger: Store brightness set by
      led_trigger_event()").
      
      Rewrite the "input-events" trigger to use the simple LED trigger mechanism,
      registering a single input_handler at module_init() time and using
      led_trigger_event() to set the brightness for all LEDs controlled by this
      trigger.
      
      Compared to the old code this looses the ability for the user to configure
      a different brightness for the on state then LED_FULL, this is standard for
      simple LED triggers and since this trigger is only in for-leds-next ATM
      losing that functionality is not a regression.
      
      This also changes the configurability of the LED off timeout from a per
      LED setting to a global setting (runtime modifiable module-parameter).
      
      Switching to registering a single input_handler at module_init() time fixes
      the following locking issue reported by lockdep:
      
      [ 2840.220145] usb 1-1.3: new low-speed USB device number 3 using xhci_hcd
      [ 2840.307172] usb 1-1.3: New USB device found, idVendor=0603, idProduct=0002, bcdDevice= 2.21
      [ 2840.307375] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
      [ 2840.307423] usb 1-1.3: Product: USB Composite Device
      [ 2840.307456] usb 1-1.3: Manufacturer: SINO WEALTH
      [ 2840.333985] input: SINO WEALTH USB Composite Device as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.3/1-1.3:1.0/0003:0603:0002.0007/input/input19
      
      [ 2840.386545] ======================================================
      [ 2840.386549] WARNING: possible circular locking dependency detected
      [ 2840.386554] 6.10.0-rc1+ #97 Tainted: G         C  E
      [ 2840.386558] ------------------------------------------------------
      [ 2840.386562] kworker/1:1/52 is trying to acquire lock:
      [ 2840.386566] ffff98fcf1629300 (&led_cdev->led_access){+.+.}-{3:3}, at: led_classdev_register_ext+0x1c6/0x380
      [ 2840.386590]
                     but task is already holding lock:
      [ 2840.386593] ffffffff88130cc8 (input_mutex){+.+.}-{3:3}, at: input_register_device.cold+0x47/0x150
      [ 2840.386608]
                     which lock already depends on the new lock.
      
      [ 2840.386611]
                     the existing dependency chain (in reverse order) is:
      [ 2840.386615]
                     -> #3 (input_mutex){+.+.}-{3:3}:
      [ 2840.386624]        __mutex_lock+0x8c/0xc10
      [ 2840.386634]        input_register_handler+0x1c/0xf0
      [ 2840.386641]        0xffffffffc142c437
      [ 2840.386655]        led_trigger_set+0x1e1/0x2e0
      [ 2840.386661]        led_trigger_register+0x170/0x1b0
      [ 2840.386666]        do_one_initcall+0x5e/0x3a0
      [ 2840.386675]        do_init_module+0x60/0x220
      [ 2840.386683]        __do_sys_init_module+0x15f/0x190
      [ 2840.386689]        do_syscall_64+0x93/0x180
      [ 2840.386696]        entry_SYSCALL_64_after_hwframe+0x76/0x7e
      [ 2840.386705]
                     -> #2 (&led_cdev->trigger_lock){+.+.}-{3:3}:
      [ 2840.386714]        down_write+0x3b/0xd0
      [ 2840.386720]        led_trigger_register+0x12c/0x1b0
      [ 2840.386725]        rfkill_register+0xec/0x340 [rfkill]
      [ 2840.386739]        wiphy_register+0x82a/0x930 [cfg80211]
      [ 2840.386907]        brcmf_cfg80211_attach+0xcbd/0x1430 [brcmfmac]
      [ 2840.386952]        brcmf_attach+0x1ba/0x4c0 [brcmfmac]
      [ 2840.386991]        brcmf_pcie_setup+0x899/0xc70 [brcmfmac]
      [ 2840.387030]        brcmf_fw_request_done+0x13b/0x180 [brcmfmac]
      [ 2840.387070]        request_firmware_work_func+0x3b/0x70
      [ 2840.387078]        process_one_work+0x21a/0x590
      [ 2840.387085]        worker_thread+0x1d1/0x3e0
      [ 2840.387090]        kthread+0xee/0x120
      [ 2840.387096]        ret_from_fork+0x30/0x50
      [ 2840.387105]        ret_from_fork_asm+0x1a/0x30
      [ 2840.387112]
                     -> #1 (leds_list_lock){++++}-{3:3}:
      [ 2840.387123]        down_write+0x3b/0xd0
      [ 2840.387129]        led_classdev_register_ext+0x29e/0x380
      [ 2840.387134]        0xffffffffc0e6b74c
      [ 2840.387143]        platform_probe+0x40/0xa0
      [ 2840.387151]        really_probe+0xde/0x340
      [ 2840.387157]        __driver_probe_device+0x78/0x110
      [ 2840.387162]        driver_probe_device+0x1f/0xa0
      [ 2840.387168]        __driver_attach+0xba/0x1c0
      [ 2840.387173]        bus_for_each_dev+0x6b/0xb0
      [ 2840.387180]        bus_add_driver+0x111/0x1f0
      [ 2840.387185]        driver_register+0x6e/0xc0
      [ 2840.387191]        do_one_initcall+0x5e/0x3a0
      [ 2840.387197]        do_init_module+0x60/0x220
      [ 2840.387204]        __do_sys_init_module+0x15f/0x190
      [ 2840.387210]        do_syscall_64+0x93/0x180
      [ 2840.387217]        entry_SYSCALL_64_after_hwframe+0x76/0x7e
      [ 2840.387224]
                     -> #0 (&led_cdev->led_access){+.+.}-{3:3}:
      [ 2840.387233]        __lock_acquire+0x11c6/0x1f20
      [ 2840.387239]        lock_acquire+0xc8/0x2b0
      [ 2840.387244]        __mutex_lock+0x8c/0xc10
      [ 2840.387251]        led_classdev_register_ext+0x1c6/0x380
      [ 2840.387256]        input_leds_connect+0x139/0x260
      [ 2840.387262]        input_attach_handler.isra.0+0x75/0x90
      [ 2840.387268]        input_register_device.cold+0xa1/0x150
      [ 2840.387274]        hidinput_connect+0x848/0xb00
      [ 2840.387280]        hid_connect+0x567/0x5a0
      [ 2840.387288]        hid_hw_start+0x3f/0x60
      [ 2840.387294]        hid_device_probe+0x10d/0x190
      [ 2840.387298]        really_probe+0xde/0x340
      [ 2840.387304]        __driver_probe_device+0x78/0x110
      [ 2840.387309]        driver_probe_device+0x1f/0xa0
      [ 2840.387314]        __device_attach_driver+0x85/0x110
      [ 2840.387320]        bus_for_each_drv+0x78/0xc0
      [ 2840.387326]        __device_attach+0xb0/0x1b0
      [ 2840.387332]        bus_probe_device+0x94/0xb0
      [ 2840.387337]        device_add+0x64a/0x860
      [ 2840.387343]        hid_add_device+0xe5/0x240
      [ 2840.387349]        usbhid_probe+0x4bb/0x600
      [ 2840.387356]        usb_probe_interface+0xea/0x2b0
      [ 2840.387363]        really_probe+0xde/0x340
      [ 2840.387368]        __driver_probe_device+0x78/0x110
      [ 2840.387373]        driver_probe_device+0x1f/0xa0
      [ 2840.387378]        __device_attach_driver+0x85/0x110
      [ 2840.387383]        bus_for_each_drv+0x78/0xc0
      [ 2840.387390]        __device_attach+0xb0/0x1b0
      [ 2840.387395]        bus_probe_device+0x94/0xb0
      [ 2840.387400]        device_add+0x64a/0x860
      [ 2840.387405]        usb_set_configuration+0x5e8/0x880
      [ 2840.387411]        usb_generic_driver_probe+0x3e/0x60
      [ 2840.387418]        usb_probe_device+0x3d/0x120
      [ 2840.387423]        really_probe+0xde/0x340
      [ 2840.387428]        __driver_probe_device+0x78/0x110
      [ 2840.387434]        driver_probe_device+0x1f/0xa0
      [ 2840.387439]        __device_attach_driver+0x85/0x110
      [ 2840.387444]        bus_for_each_drv+0x78/0xc0
      [ 2840.387451]        __device_attach+0xb0/0x1b0
      [ 2840.387456]        bus_probe_device+0x94/0xb0
      [ 2840.387461]        device_add+0x64a/0x860
      [ 2840.387466]        usb_new_device.cold+0x141/0x38f
      [ 2840.387473]        hub_event+0x1166/0x1980
      [ 2840.387479]        process_one_work+0x21a/0x590
      [ 2840.387484]        worker_thread+0x1d1/0x3e0
      [ 2840.387488]        kthread+0xee/0x120
      [ 2840.387493]        ret_from_fork+0x30/0x50
      [ 2840.387500]        ret_from_fork_asm+0x1a/0x30
      [ 2840.387506]
                     other info that might help us debug this:
      
      [ 2840.387509] Chain exists of:
                       &led_cdev->led_access --> &led_cdev->trigger_lock --> input_mutex
      
      [ 2840.387520]  Possible unsafe locking scenario:
      
      [ 2840.387523]        CPU0                    CPU1
      [ 2840.387526]        ----                    ----
      [ 2840.387529]   lock(input_mutex);
      [ 2840.387534]                                lock(&led_cdev->trigger_lock);
      [ 2840.387540]                                lock(input_mutex);
      [ 2840.387545]   lock(&led_cdev->led_access);
      [ 2840.387550]
                      *** DEADLOCK ***
      
      [ 2840.387552] 7 locks held by kworker/1:1/52:
      [ 2840.387557]  #0: ffff98fcc1d07148 ((wq_completion)usb_hub_wq){+.+.}-{0:0}, at: process_one_work+0x4af/0x590
      [ 2840.387570]  #1: ffffb67e00213e60 ((work_completion)(&hub->events)){+.+.}-{0:0}, at: process_one_work+0x1d5/0x590
      [ 2840.387583]  #2: ffff98fcc6582190 (&dev->mutex){....}-{3:3}, at: hub_event+0x57/0x1980
      [ 2840.387596]  #3: ffff98fccb3c6990 (&dev->mutex){....}-{3:3}, at: __device_attach+0x26/0x1b0
      [ 2840.387610]  #4: ffff98fcc5260960 (&dev->mutex){....}-{3:3}, at: __device_attach+0x26/0x1b0
      [ 2840.387622]  #5: ffff98fce3999a20 (&dev->mutex){....}-{3:3}, at: __device_attach+0x26/0x1b0
      [ 2840.387635]  #6: ffffffff88130cc8 (input_mutex){+.+.}-{3:3}, at: input_register_device.cold+0x47/0x150
      [ 2840.387649]
                     stack backtrace:
      [ 2840.387653] CPU: 1 PID: 52 Comm: kworker/1:1 Tainted: G         C  E      6.10.0-rc1+ #97
      [ 2840.387659] Hardware name: Xiaomi Inc Mipad2/Mipad, BIOS MIPad-P4.X64.0043.R03.1603071414 03/07/2016
      [ 2840.387665] Workqueue: usb_hub_wq hub_event
      [ 2840.387674] Call Trace:
      [ 2840.387681]  <TASK>
      [ 2840.387689]  dump_stack_lvl+0x68/0x90
      [ 2840.387700]  check_noncircular+0x10d/0x120
      [ 2840.387710]  ? register_lock_class+0x38/0x480
      [ 2840.387717]  ? check_noncircular+0x74/0x120
      [ 2840.387727]  __lock_acquire+0x11c6/0x1f20
      [ 2840.387736]  lock_acquire+0xc8/0x2b0
      [ 2840.387743]  ? led_classdev_register_ext+0x1c6/0x380
      [ 2840.387753]  __mutex_lock+0x8c/0xc10
      [ 2840.387760]  ? led_classdev_register_ext+0x1c6/0x380
      [ 2840.387766]  ? _raw_spin_unlock_irqrestore+0x35/0x60
      [ 2840.387773]  ? klist_next+0x158/0x160
      [ 2840.387781]  ? led_classdev_register_ext+0x1c6/0x380
      [ 2840.387787]  ? lockdep_init_map_type+0x58/0x250
      [ 2840.387796]  ? led_classdev_register_ext+0x1c6/0x380
      [ 2840.387802]  led_classdev_register_ext+0x1c6/0x380
      [ 2840.387810]  ? kvasprintf+0x70/0xb0
      [ 2840.387820]  ? kasprintf+0x3e/0x50
      [ 2840.387829]  input_leds_connect+0x139/0x260
      [ 2840.387838]  input_attach_handler.isra.0+0x75/0x90
      [ 2840.387846]  input_register_device.cold+0xa1/0x150
      [ 2840.387854]  hidinput_connect+0x848/0xb00
      [ 2840.387862]  ? usbhid_start+0x45b/0x7b0
      [ 2840.387870]  hid_connect+0x567/0x5a0
      [ 2840.387878]  ? __mutex_unlock_slowpath+0x2d/0x260
      [ 2840.387891]  hid_hw_start+0x3f/0x60
      [ 2840.387899]  hid_device_probe+0x10d/0x190
      [ 2840.387906]  ? __pfx___device_attach_driver+0x10/0x10
      [ 2840.387913]  really_probe+0xde/0x340
      [ 2840.387919]  ? pm_runtime_barrier+0x50/0x90
      [ 2840.387927]  __driver_probe_device+0x78/0x110
      [ 2840.387934]  driver_probe_device+0x1f/0xa0
      [ 2840.387941]  __device_attach_driver+0x85/0x110
      [ 2840.387949]  bus_for_each_drv+0x78/0xc0
      [ 2840.387959]  __device_attach+0xb0/0x1b0
      [ 2840.387967]  bus_probe_device+0x94/0xb0
      [ 2840.387974]  device_add+0x64a/0x860
      [ 2840.387982]  ? __debugfs_create_file+0x14a/0x1c0
      [ 2840.387993]  hid_add_device+0xe5/0x240
      [ 2840.388002]  usbhid_probe+0x4bb/0x600
      [ 2840.388013]  usb_probe_interface+0xea/0x2b0
      [ 2840.388021]  ? __pfx___device_attach_driver+0x10/0x10
      [ 2840.388028]  really_probe+0xde/0x340
      [ 2840.388034]  ? pm_runtime_barrier+0x50/0x90
      [ 2840.388040]  __driver_probe_device+0x78/0x110
      [ 2840.388048]  driver_probe_device+0x1f/0xa0
      [ 2840.388055]  __device_attach_driver+0x85/0x110
      [ 2840.388062]  bus_for_each_drv+0x78/0xc0
      [ 2840.388071]  __device_attach+0xb0/0x1b0
      [ 2840.388079]  bus_probe_device+0x94/0xb0
      [ 2840.388086]  device_add+0x64a/0x860
      [ 2840.388094]  ? __mutex_unlock_slowpath+0x2d/0x260
      [ 2840.388103]  usb_set_configuration+0x5e8/0x880
      [ 2840.388114]  ? __pfx___device_attach_driver+0x10/0x10
      [ 2840.388121]  usb_generic_driver_probe+0x3e/0x60
      [ 2840.388129]  usb_probe_device+0x3d/0x120
      [ 2840.388137]  really_probe+0xde/0x340
      [ 2840.388142]  ? pm_runtime_barrier+0x50/0x90
      [ 2840.388149]  __driver_probe_device+0x78/0x110
      [ 2840.388156]  driver_probe_device+0x1f/0xa0
      [ 2840.388163]  __device_attach_driver+0x85/0x110
      [ 2840.388171]  bus_for_each_drv+0x78/0xc0
      [ 2840.388180]  __device_attach+0xb0/0x1b0
      [ 2840.388188]  bus_probe_device+0x94/0xb0
      [ 2840.388195]  device_add+0x64a/0x860
      [ 2840.388202]  ? lockdep_hardirqs_on+0x78/0x100
      [ 2840.388210]  ? _raw_spin_unlock_irqrestore+0x35/0x60
      [ 2840.388219]  usb_new_device.cold+0x141/0x38f
      [ 2840.388227]  hub_event+0x1166/0x1980
      [ 2840.388242]  process_one_work+0x21a/0x590
      [ 2840.388249]  ? move_linked_works+0x70/0xa0
      [ 2840.388260]  worker_thread+0x1d1/0x3e0
      [ 2840.388268]  ? __pfx_worker_thread+0x10/0x10
      [ 2840.388273]  kthread+0xee/0x120
      [ 2840.388279]  ? __pfx_kthread+0x10/0x10
      [ 2840.388287]  ret_from_fork+0x30/0x50
      [ 2840.388294]  ? __pfx_kthread+0x10/0x10
      [ 2840.388301]  ret_from_fork_asm+0x1a/0x30
      [ 2840.388315]  </TASK>
      [ 2840.415630] hid-generic 0003:0603:0002.0007: input,hidraw6: USB HID v1.10 Keyboard [SINO WEALTH USB Composite Device] on usb-0000:00:14.0-1.3/input0
      Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
      Link: https://lore.kernel.org/r/20240602160203.27339-2-hdegoede@redhat.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      a031c814
    • MarileneGarcia's avatar
      leds: powernv: Replace of_node_put to __free · d3562573
      MarileneGarcia authored
      Use __free for device_node values, and thus drop calls to
      of_node_put.
      
      The variable attribute __free adds a scope based cleanup to
      the device node. The goal is to reduce memory management issues
      in the kernel code.
      
      The of_node_put calls were removed, and the
      for_each_available_child_of_node was replaced to the equivalent
      for_each_available_child_of_node_scoped which use the __free.
      Suggested-by: default avatarJulia Lawall <julia.lawall@inria.fr>
      Signed-off-by: default avatarMarileneGarcia <marilene.agarcia@gmail.com>
      Link: https://lore.kernel.org/r/20240601031713.1307859-1-marilene.agarcia@gmail.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      d3562573
    • Lee Jones's avatar
      MAINTAINERS: Update LED's active maintainer tree · e786348b
      Lee Jones authored
      Pavel's repo hasn't been used actively for quite some time.
      
      Let's make it official.
      
      Cc: Pavel Machek <pavel@ucw.cz>
      Signed-off-by: default avatarLee Jones <lee@kernel.org>
      e786348b
    • Javier Carrasco's avatar
      leds: mt6360: Fix memory leak in mt6360_init_isnk_properties() · e41d574b
      Javier Carrasco authored
      The fwnode_for_each_child_node() loop requires manual intervention to
      decrement the child refcount in case of an early return.
      
      Add the missing calls to fwnode_handle_put(child) to avoid memory leaks
      in the error paths.
      
      Cc: stable@vger.kernel.org
      Fixes: 679f8652 ("leds: Add mt6360 driver")
      Signed-off-by: default avatarJavier Carrasco <javier.carrasco.cruz@gmail.com>
      Acked-by: default avatarPavel Machek <pavel@ucw.cz>
      Link: https://lore.kernel.org/r/20240611-leds-mt6360-memleak-v1-1-93642eb5011e@gmail.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      e41d574b
    • Marilene A Garcia's avatar
      leds: tlc591xx: Replace of_node_put to __free · 8d89afc6
      Marilene A Garcia authored
      Use __free() for device_node values, and thus drop calls to
      of_node_put().
      
      The variable attribute __free() adds a scope based cleanup to
      the device node. The goal is to reduce memory management issues
      in the kernel code.
      
      The for_each_available_child_of_node() was replaced to the equivalent
      for_each_available_child_of_node_scoped() which uses the __free().
      Suggested-by: default avatarJulia Lawall <julia.lawall@inria.fr>
      Signed-off-by: default avatarMarilene A Garcia <marilene.agarcia@gmail.com>
      Link: https://lore.kernel.org/r/20240611001740.10490-1-marilene.agarcia@gmail.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      8d89afc6
    • Anjelique Melendez's avatar
      leds: rgb: leds-qcom-lpg: Add PPG check for setting/clearing PBS triggers · 7e776e21
      Anjelique Melendez authored
      Currently, all LED LPG devices will call lpg_{set,clear}_pbs_trigger()
      when setting brightness regardless of if they support PPG and have PBS
      triggers. Check if device supports PPG before setting/clearing PBS
      triggers.
      
      Fixes: 6ab1f766 ("leds: rgb: leds-qcom-lpg: Add support for PPG through single SDAM")
      Fixes: 5e9ff626 ("leds: rgb: leds-qcom-lpg: Include support for PPG with dedicated LUT SDAM")
      Signed-off-by: default avatarAnjelique Melendez <quic_amelende@quicinc.com>
      Reviewed-by: default avatarBjorn Andersson <andersson@kernel.org>
      Link: https://lore.kernel.org/r/20240607005250.4047135-1-quic_amelende@quicinc.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      7e776e21
    • Thomas Weißschuh's avatar
      leds: triggers: Flush pending brightness before activating trigger · ab477b76
      Thomas Weißschuh authored
      The race fixed in timer_trig_activate() between a blocking
      set_brightness() call and trigger->activate() can affect any trigger.
      So move the call to flush_work() into led_trigger_set() where it can
      avoid the race for all triggers.
      
      Fixes: 0db37915 ("leds: avoid races with workqueue")
      Fixes: 8c0f693c ("leds: avoid flush_work in atomic context")
      Cc: stable@vger.kernel.org
      Tested-by: default avatarDustin L. Howett <dustin@howett.net>
      Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
      Link: https://lore.kernel.org/r/20240613-led-trigger-flush-v2-1-f4f970799d77@weissschuh.netSigned-off-by: default avatarLee Jones <lee@kernel.org>
      ab477b76
    • Andy Shevchenko's avatar
      leds: spi-byte: Move OF ID table closer to their user · 25458b2a
      Andy Shevchenko authored
      There is no code that uses ID table directly, except the
      struct device_driver at the end of the file. Hence, move
      table closer to its user. It's always possible to access
      them via a pointer.
      Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Link: https://lore.kernel.org/r/20240606173037.3091598-7-andriy.shevchenko@linux.intel.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      25458b2a
    • Andy Shevchenko's avatar
      leds: spi-byte: Use devm_mutex_init() for mutex initialization · 133f941f
      Andy Shevchenko authored
      In this driver LEDs are registered using devm_led_classdev_register()
      so they are automatically unregistered after module's remove() is done.
      led_classdev_unregister() calls module's led_set_brightness() to turn off
      the LEDs and that callback uses mutex which was destroyed already
      in module's remove() so use devm API instead.
      Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Link: https://lore.kernel.org/r/20240606173037.3091598-6-andriy.shevchenko@linux.intel.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      133f941f
    • Andy Shevchenko's avatar
      leds: spi-byte: Utilise temporary variable for struct device · 9ed388d1
      Andy Shevchenko authored
      We have a temporary variable to keep a pointer to struct device.
      Utilise it where it makes sense.
      Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Link: https://lore.kernel.org/r/20240606173037.3091598-5-andriy.shevchenko@linux.intel.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      9ed388d1
    • Andy Shevchenko's avatar
      leds: spi-byte: Make use of device properties · 67b66160
      Andy Shevchenko authored
      Convert the module to be property provider agnostic and allow
      it to be used on non-OF platforms.
      
      Add mod_devicetable.h include.
      Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Link: https://lore.kernel.org/r/20240606173037.3091598-4-andriy.shevchenko@linux.intel.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      67b66160
    • Andy Shevchenko's avatar
      leds: spi-byte: Get rid of custom led_init_default_state_get() · 4b268456
      Andy Shevchenko authored
      LED core provides a helper to parse default state from firmware node.
      Use it instead of custom implementation.
      Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Link: https://lore.kernel.org/r/20240606173037.3091598-3-andriy.shevchenko@linux.intel.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
      4b268456
    • Andy Shevchenko's avatar
    • Markus Elfring's avatar
      leds: ncp5623: Use common error handling code in ncp5623_probe() · e1524a62
      Markus Elfring authored
      Add a label so that a bit of exception handling can be better reused
      at the end of this function implementation.
      Signed-off-by: default avatarMarkus Elfring <elfring@users.sourceforge.net>
      Link: https://lore.kernel.org/r/5faec5de-fc36-4b38-abcb-c61954a824cd@web.deSigned-off-by: default avatarLee Jones <lee@kernel.org>
      e1524a62
    • Lee Jones's avatar
      leds: core: Omit set_brightness error message for a LED supporting hw trigger only · d33d1214
      Lee Jones authored
      If both set_brightness functions return -ENOTSUPP, then the LED doesn't
      support setting a fixed brightness value, and the error message isn't
      helpful. This can be the case e.g. for LEDs supporting a specific hw
      trigger only.
      
      Pinched the subject line and commit message from Heiner:
      Link: https://lore.kernel.org/all/44177e37-9512-4044-8991-bb23b184bf37@gmail.com/
      
      Reworked the function to provide Heiner's required semantics whilst
      simultaneously increasing readability and flow.
      
      Cc: Pavel Machek <pavel@ucw.cz>
      Cc: linux-leds@vger.kernel.org
      Suggested-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
      Reviewed-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
      Signed-off-by: default avatarLee Jones <lee@kernel.org>
      d33d1214
  2. 21 Jun, 2024 16 commits
  3. 14 Jun, 2024 4 commits
  4. 31 May, 2024 3 commits