linux/drivers/leds
Christian Hitz 4d29edea49 leds: leds-lp50xx: Enable chip before any communication
commit 434959618c upstream.

If a GPIO is used to control the chip's enable pin, it needs to be pulled
high before any i2c communication is attempted.

Currently, the enable GPIO handling is not correct.

Assume the enable GPIO is low when the probe function is entered. In this
case the device is in SHUTDOWN mode and does not react to i2c commands.

During probe the following sequence happens:
 1. The call to lp50xx_reset() on line 548 has no effect as i2c is not
    possible yet.
 2. Then - on line 552 - lp50xx_enable_disable() is called. As
    "priv->enable_gpio“ has not yet been initialized, setting the GPIO has
    no effect. Also the i2c enable command is not executed as the device
    is still in SHUTDOWN.
 3. On line 556 the call to lp50xx_probe_dt() finally parses the rest of
    the DT and the configured priv->enable_gpio is set up.

As a result the device is still in SHUTDOWN mode and not ready for
operation.

Split lp50xx_enable_disable() into distinct enable and disable functions
to enforce correct ordering between enable_gpio manipulations and i2c
commands.
Read enable_gpio configuration from DT before attempting to manipulate
enable_gpio.
Add delays to observe correct wait timing after manipulating enable_gpio
and before any i2c communication.

Cc: stable@vger.kernel.org
Fixes: 242b81170f ("leds: lp50xx: Add the LP50XX family of the RGB LED driver")
Signed-off-by: Christian Hitz <christian.hitz@bbv.ch>
Link: https://patch.msgid.link/20251028155141.1603193-1-christian@klarinett.li
Signed-off-by: Lee Jones <lee@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-01-08 10:16:58 +01:00
..
blink treewide: rename GPIO set callbacks back to their original names 2025-08-07 10:07:06 +02:00
flash leds: flash: leds-qcom-flash: Add a separate register map for PMI8998 2025-08-18 09:49:12 +01:00
rgb leds: rgb: leds-qcom-lpg: Don't enable TRILED when configuring PWM 2025-12-18 14:03:08 +01:00
simatic leds: Rename simple directory to simatic 2025-03-21 09:21:56 +00:00
trigger Revert "leds: trigger: netdev: Configure LED blink interval for HW offload" 2025-07-18 14:26:32 +01:00
.kunitconfig leds: Provide skeleton KUnit testing for the LEDs framework 2025-05-14 09:25:02 +01:00
Kconfig leds: Kconfig: Fix spelling mistake "limitiation" -> "limitation" 2025-08-18 09:48:13 +01:00
led-class-flash.c leds: flash: Add support for flash/strobe duration 2025-05-14 09:25:09 +01:00
led-class-multicolor.c leds: multicolor: Fix intensity setting while SW blinking 2025-05-14 09:24:45 +01:00
led-class.c leds: led-class: Add Device Tree support to led_get() 2025-09-16 16:49:28 +01:00
led-core.c treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
led-test.c leds: led-test: Provide tests for the lookup and get infrastructure 2025-05-14 09:25:07 +01:00
led-triggers.c leds: led-triggers: Improvements for default trigger 2025-04-15 17:57:54 +01:00
leds-88pm860x.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-acer-a500.c leds: Add driver for Acer Iconia Tab A500 2020-09-26 21:56:42 +02:00
leds-adp5520.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-an30259a.c leds: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-06-21 11:57:11 +01:00
leds-apu.c leds: apu: Remove duplicate DMI lookup data 2024-04-12 09:47:15 +01:00
leds-ariel.c leds: Explicitly include correct DT includes 2023-07-28 10:02:32 +01:00
leds-aw200xx.c leds: aw200xx: don't use return with gpiod_set_value() variants 2025-02-26 11:17:39 +01:00
leds-aw2013.c leds: aw2013: Simplify with scoped for each OF child loop 2024-08-22 14:23:03 +01:00
leds-bcm6328.c leds: bcm6328: Replace divide condition with comparison for shift value 2024-10-31 16:22:23 +00:00
leds-bcm6358.c leds: bcm6358: Simplify with scoped for each OF child loop 2024-08-22 14:23:05 +01:00
leds-bd2606mvv.c leds: bd2606mvv: Fix device child node usage in bd2606mvv_probe() 2024-08-01 13:40:07 +01:00
leds-bd2802.c leds: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-06-21 11:57:11 +01:00
leds-blinkm.c leds: Add multicolor support to BlinkM LED driver 2024-08-01 13:40:02 +01:00
leds-cht-wcove.c leds: cht-wcove: Use devm_led_classdev_register() to avoid memory leak 2025-01-09 10:57:16 +00:00
leds-clevo-mail.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-cobalt-qube.c treewide: Add SPDX license identifier for more missed files 2019-05-21 10:50:45 +02:00
leds-cobalt-raq.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 1 2019-05-21 11:28:39 +02:00
leds-cpcap.c leds: Explicitly include correct DT includes 2023-07-28 10:02:32 +01:00
leds-cr0014114.c leds: cr0014114: Switch to device_for_each_child_node_scoped() 2024-10-09 15:16:59 +01:00
leds-cros_ec.c leds: leds-cros_ec: Skip LEDs without color components 2026-01-08 10:16:58 +01:00
leds-da903x.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-da9052.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-dac124s085.c spi: make remove callback a void function 2022-02-09 13:00:45 +00:00
leds-el15203000.c leds: el15203000: Switch to device_for_each_child_node_scoped() 2024-10-09 15:17:06 +01:00
leds-expresswire.c module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
leds-gpio-register.c leds: leds-gpio-register: Reorganize kerneldoc parameter names 2024-10-10 14:42:33 +01:00
leds-gpio.c - Removed unused local header files from various drivers. 2024-11-22 16:25:20 -08:00
leds-hp6xx.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
leds-ip30.c leds: ip30: Convert to devm_platform_ioremap_resource() 2023-07-28 09:26:21 +01:00
leds-ipaq-micro.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
leds-is31fl32xx.c leds: leds-is31fl32xx: Add support for is31fl3236a 2025-08-18 09:48:11 +01:00
leds-is31fl319x.c leds: is31fl319x: Use devm_mutex_init() 2025-09-11 16:18:13 +01:00
leds-lm355x.c leds: Switch i2c drivers back to use .probe() 2023-05-25 12:16:22 +01:00
leds-lm3530.c leds: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-06-21 11:57:11 +01:00
leds-lm3532.c leds: lm3532: Switch to device_for_each_child_node_scoped() 2024-10-09 15:17:20 +01:00
leds-lm3533.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-lm3642.c leds: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-06-21 11:57:11 +01:00
leds-lm3692x.c leds: lm392x: Convert to use maple tree register cache 2023-11-01 11:29:02 +00:00
leds-lm3697.c leds: lm3697: Switch to device_for_each_child_node_scoped() 2024-10-09 15:17:27 +01:00
leds-lm36274.c leds: lm36274: Add missed property.h 2021-05-30 23:03:48 +02:00
leds-locomo.c ARM: pxa: split up mach/hardware.h 2022-04-19 16:27:05 +02:00
leds-lp50xx.c leds: leds-lp50xx: Enable chip before any communication 2026-01-08 10:16:58 +01:00
leds-lp55xx-common.c leds: leds-lp55xx: Use correct address for memory programming 2025-09-02 13:26:25 +01:00
leds-lp55xx-common.h leds: lp55xx: Use devm_clk_get_enabled() helpers 2024-08-22 14:48:24 +01:00
leds-lp3944.c leds: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-06-21 11:57:11 +01:00
leds-lp3952.c leds: Drop explicit initialization of struct i2c_device_id::driver_data to 0 2024-06-21 11:57:11 +01:00
leds-lp5521.c leds: leds-lp55xx: Convert mutex lock/unlock to guard API 2024-07-11 12:46:25 +01:00
leds-lp5523.c leds: leds-lp55xx: Convert mutex lock/unlock to guard API 2024-07-11 12:46:25 +01:00
leds-lp5562.c leds: lp5562: Add multicolor brightness control 2024-10-15 12:58:41 +01:00
leds-lp5569.c leds: leds-lp5569: Enable chip after chip configuration 2024-07-12 08:32:37 +01:00
leds-lp8501.c leds: leds-lp55xx: Drop deprecated defines 2024-06-26 17:08:31 +01:00
leds-lp8788.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
leds-lp8860.c leds: lp8860: Check return value of devm_mutex_init() 2025-07-11 15:11:19 -07:00
leds-lp8864.c leds: lp8864: Add support for Texas Instruments LP8864, LP8864S, LP8866 LED-backlights 2025-01-09 10:43:34 +00:00
leds-lt3593.c leds: lt3593: Put fwnode in any case during ->probe() 2021-08-03 23:49:31 +02:00
leds-max5970.c leds: max5970: Fix unreleased fwnode_handle in probe function 2024-11-06 08:13:14 +00:00
leds-max8997.c leds: max8997: Don't error if there is no pdata 2022-10-22 11:55:03 +02:00
leds-max77650.c leds: max77650: Switch to device_for_each_child_node_scoped() 2024-10-09 15:18:29 +01:00
leds-max77705.c leds: max77705: Function return instead of variable assignment 2025-08-18 09:49:04 +01:00
leds-mc13783.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-menf21bmc.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
leds-mlxcpld.c leds: mlxcpld: Remove unused ACPI header inclusion 2025-03-21 09:48:11 +00:00
leds-mlxreg.c leds: mlxreg: Use devm_mutex_init() for mutex initialization 2024-04-11 17:35:18 +01:00
leds-mt6323.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-net48xx.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
leds-netxbig.c leds: netxbig: Fix GPIO descriptor leak in error paths 2025-12-18 14:02:58 +01:00
leds-nic78bx.c leds: nic78bx: Tidy up ACPI ID table 2025-03-21 09:49:37 +00:00
leds-ns2.c leds: ns2: Switch to device_for_each_child_node_scoped() 2024-10-09 15:18:37 +01:00
leds-ot200.c leds: leds-ot200: Use devm_led_classdev_register 2015-11-03 08:59:13 +01:00
leds-pca955x.c treewide: rename GPIO set callbacks back to their original names 2025-08-07 10:07:06 +02:00
leds-pca963x.c leds: pca963x: Switch to device_for_each_child_node_scoped() 2024-10-09 15:18:44 +01:00
leds-pca995x.c leds: pca995x: Fix typo in pca995x_of_match's of_device_id entry 2025-05-14 09:25:04 +01:00
leds-pca9532.c treewide: rename GPIO set callbacks back to their original names 2025-08-07 10:07:06 +02:00
leds-pm8058.c leds: Explicitly include correct DT includes 2023-07-28 10:02:32 +01:00
leds-powernv.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-pwm.c leds: pwm: Add optional DT property default-brightness 2024-11-12 12:14:00 +00:00
leds-qnap-mcu.c leds: qnap-mcu: Add support for the red and green status LEDs 2025-09-02 08:54:46 +01:00
leds-rb532.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-regulator.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-sc27xx-bltc.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-spi-byte.c leds: spi-byte: Move OF ID table closer to their user 2024-06-26 16:56:07 +01:00
leds-ss4200.c leds: ss4200: Fix the wrong format specifier for 'blinking' 2024-11-12 14:39:26 +00:00
leds-st1202.c * pca955x: Add HW blink support, utilizing PWM0. It supports one frequency 2025-03-29 14:42:59 -07:00
leds-sun50i-a100.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-sunfire.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-syscon.c leds: syscon: Support 'reg' in addition to 'offset' for register address 2023-12-13 11:28:26 +00:00
leds-tca6507.c treewide: rename GPIO set callbacks back to their original names 2025-08-07 10:07:06 +02:00
leds-ti-lmu-common.c leds: Explicitly include correct DT includes 2023-07-28 10:02:32 +01:00
leds-tlc591xx.c leds: tlc591xx: Replace of_node_put to __free 2024-06-26 16:56:09 +01:00
leds-tps6105x.c leds: tps6105x: add driver for MFD chip LED mode 2019-12-21 20:10:02 +01:00
leds-turris-omnia.c leds: turris-omnia: Drop commas in the terminator entries 2025-05-14 09:24:57 +01:00
leds-upboard.c leds: upboard: Fix module alias 2025-12-18 14:02:38 +01:00
leds-wm831x-status.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-wm8350.c leds: Switch back to struct platform_driver::remove() 2024-10-15 09:58:10 +01:00
leds-wrap.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
leds.h leds: triggers: Constify 'struct bin_attribute' 2025-01-09 11:09:09 +00:00
Makefile leds: Provide skeleton KUnit testing for the LEDs framework 2025-05-14 09:25:02 +01:00
TODO leds: TODO: Add documentation about possible subsystem improvements 2020-09-30 19:15:33 +02:00
uleds.c [tree-wide] finally take no_llseek out 2024-09-27 08:18:43 -07:00