[PATCH v2 10/11] leds: rgb: ktd202x: Fail the probe when the chip does not answer

From: Joseph Telaak via B4 Relay

Date: Mon Nov 09 2026 - 14:10:34 EST


From: Joseph Telaak <joseph@xxxxxxxxxx>

The driver never reads from the chip: the register cache starts from the
defaults. So with a wrong address, or no chip at all, the LEDs get
registered anyway, and every later write fails.

The reset write can't tell: the KTD202x does not ACK the byte that
resets it, and its data sheet says to ignore that. So once the reset
is done, put the chip to sleep, as ktd202x_chip_disable() does, and
fail the probe when that write fails.

Signed-off-by: Joseph Telaak <joseph@xxxxxxxxxx>
---
drivers/leds/rgb/leds-ktd202x.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/leds/rgb/leds-ktd202x.c b/drivers/leds/rgb/leds-ktd202x.c
index 2a3fda860e68..0cc2ec3f6a7f 100644
--- a/drivers/leds/rgb/leds-ktd202x.c
+++ b/drivers/leds/rgb/leds-ktd202x.c
@@ -738,20 +738,29 @@ static int ktd202x_probe_fw(struct ktd202x *chip)
{
struct device *dev = chip->dev;
int count;
+ int ret;
int i = 0;

count = device_get_child_node_count(dev);
if (!count || count > chip->num_leds)
return -EINVAL;

+ /* The KTD202x does not ACK the byte that resets it, so ignore the result */
regmap_write(chip->regmap, KTD202X_REG_RESET_CONTROL, KTD202X_RSTR_RESET);

/* Allow the device to execute the complete reset */
usleep_range(200, 300);

- device_for_each_child_node_scoped(dev, child) {
- int ret = ktd202x_add_led(chip, child, i);
+ /*
+ * Nothing is read back, so a failed write is the only sign of a missing
+ * chip. Leave it asleep until a LED is turned on.
+ */
+ ret = regmap_write(chip->regmap, KTD202X_REG_RESET_CONTROL, KTD202X_ENABLE_CTRL_SLEEP);
+ if (ret)
+ return dev_err_probe(dev, ret, "Failed to reach the chip\n");

+ device_for_each_child_node_scoped(dev, child) {
+ ret = ktd202x_add_led(chip, child, i);
if (ret)
return ret;


--
Git-155)