leds: leds-lp55xx: Use correct address for memory programming
authorAndrei Lalaev <andrei.lalaev@anton-paar.com>
Wed, 20 Aug 2025 08:47:12 +0000 (10:47 +0200)
committerLee Jones <lee@kernel.org>
Tue, 2 Sep 2025 12:26:25 +0000 (13:26 +0100)
Memory programming doesn't work for devices without page support.
For example, LP5562 has 3 engines but doesn't support pages,
the start address is changed depending on engine number.
According to datasheet [1], the PROG MEM register addresses for each
engine are as follows:

  Engine 1: 0x10
  Engine 2: 0x30
  Engine 3: 0x50

However, the current implementation incorrectly calculates the address
of PROG MEM register using the engine index starting from 1:

  prog_mem_base = 0x10
  LP55xx_BYTES_PER_PAGE = 0x20

  Engine 1: 0x10 + 0x20 * 1 = 0x30
  Engine 2: 0x10 + 0x20 * 2 = 0x50
  Engine 3: 0x10 + 0x20 * 3 = 0x70

This results in writing to the wrong engine memory, causing pattern
programming to fail.

To correct it, the engine index should be decreased:
  Engine 1: 0x10 + 0x20 * 0 = 0x10
  Engine 2: 0x10 + 0x20 * 1 = 0x30
  Engine 3: 0x10 + 0x20 * 2 = 0x50

1 - https://www.ti.com/lit/ds/symlink/lp5562.pdf

Fixes: 31379a57cf2f ("leds: leds-lp55xx: Generalize update_program_memory function")
Signed-off-by: Andrei Lalaev <andrei.lalaev@anton-paar.com>
Link: https://lore.kernel.org/r/20250820-lp5562-prog-mem-address-v1-1-8569647fa71d@anton-paar.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/leds/leds-lp55xx-common.c

index e71456a..fd447eb 100644 (file)
@@ -212,7 +212,7 @@ int lp55xx_update_program_memory(struct lp55xx_chip *chip,
         * For LED chip that support page, PAGE is already set in load_engine.
         */
        if (!cfg->pages_per_engine)
-               start_addr += LP55xx_BYTES_PER_PAGE * idx;
+               start_addr += LP55xx_BYTES_PER_PAGE * (idx - 1);
 
        for (page = 0; page < program_length / LP55xx_BYTES_PER_PAGE; page++) {
                /* Write to the next page each 32 bytes (if supported) */