]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
leds: leds-lp5569: Better handle enabling clock internal setting
authorChristian Marangi <ansuelsmth@gmail.com>
Fri, 12 Jul 2024 00:45:53 +0000 (02:45 +0200)
committerLee Jones <lee@kernel.org>
Fri, 12 Jul 2024 07:32:37 +0000 (08:32 +0100)
Better handle enabling clock internal setting. In further testing it was
notice that internal clock config MUST be set before clock output config
or the LED CHIP might stop working.

This wasn't documented and was actually found on devices that have 2
chip chained where one chip provide clock for the other.

Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
Link: https://lore.kernel.org/r/20240712004556.15601-2-ansuelsmth@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/leds/leds-lp5569.c

index 2253c19f0cd2139c00dc91cb778101e4c4188004..c976b10b65580cd275b726010edca983bafafd4d 100644 (file)
@@ -180,20 +180,25 @@ static int lp5569_post_init_device(struct lp55xx_chip *chip)
 
        val = LP5569_DEFAULT_CONFIG;
        val |= FIELD_PREP(LP5569_CP_MODE_MASK, chip->pdata->charge_pump_mode);
+       ret = lp55xx_write(chip, LP5569_REG_MISC, val);
+       if (ret)
+               return ret;
 
        if (chip->pdata->clock_mode == LP55XX_CLOCK_INT) {
+               /* Internal clock MUST be configured before CLK output */
+               ret = lp55xx_update_bits(chip, LP5569_REG_MISC,
+                                        LP5569_INTERNAL_CLK,
+                                        LP5569_INTERNAL_CLK);
+               if (ret)
+                       return ret;
+
                ret = lp55xx_update_bits(chip, LP5569_REG_IO_CONTROL,
                                         LP5569_CLK_OUTPUT,
                                         LP5569_CLK_OUTPUT);
                if (ret)
                        return ret;
-
-               val |= LP5569_INTERNAL_CLK;
        }
 
-       ret = lp55xx_write(chip, LP5569_REG_MISC, val);
-       if (ret)
-               return ret;
 
        return lp5569_init_program_engine(chip);
 }