On Mon, Sep 21, 2026 at 12:46:24PM +0200, David Heidelberg via B4 Relay wrote:
> From: David Heidelberg <[email protected]>
>
> wled_configure_ovp_irq() derives the initial state of the OVP interrupt
> from the hardware:
>
>         /* Keep OVP irq disabled until module is enabled */
>         if (!(val & WLED3_CTRL_REG_MOD_EN_MASK))
>                 disable_irq(wled->ovp_irq);
>
> but wled->brightness, which is what the rest of the driver uses to tell
> whether the module is on, is left at zero.
>
> On boards where the bootloader hands the kernel a lit backlight the two
> disagree. MOD_EN is already set, so the interrupt is left enabled, while
> wled_update_status() still believes the backlight is off and takes
>
>         if (!!brightness != !!wled->brightness)
>                 rc = wled_module_enable(wled, !!brightness);
>
> on the first backlight update. wled_module_enable() then schedules
> wled_ovp_work(), which calls enable_irq() on the already enabled
> interrupt:
>
>   Unbalanced enable for IRQ 176
>   WARNING: CPU: 0 PID: 160 at kernel/irq/manage.c:774 __enable_irq+0x50/0x80
>   Hardware name: Xiaomi Pocophone F1 (DT)
>   Workqueue: events wled_ovp_work
>   Call trace:
>    __enable_irq+0x50/0x80
>    enable_irq+0x48/0xa0
>    wled_ovp_work+0x18/0x24
>    process_one_work+0x1d0/0x350
>    worker_thread+0x13c/0x460
>    kthread+0x110/0x114
>    ret_from_fork+0x10/0x20
>
> The bootloader is not the only way to get there. The readback runs after
> wledN_setup(), and wled4_setup() sets MOD_EN itself on the path where the
> sink configuration does not already match, as does the tail of
> wled_auto_string_detection(), which all three setup paths can reach
> through wled_auto_detection_at_init(). A cold-booted board with a dark
> panel can therefore reach the same disagreement.
>
> Move the MOD_EN readback into wled_probe() and use it to seed
> wled->brightness, so the driver starts out agreeing with the hardware,
> and key the OVP interrupt off wled->brightness instead. The first
> backlight update then only reprograms the brightness registers and
> leaves both the module and the interrupt alone. The OVP interrupt also
> stays armed from probe whenever the module is already enabled, rather
> than being disabled at probe and only enabled once something writes
> brightness.
>
> Note that a backlight update requesting brightness 0 before any non-zero
> one now really does turn the module off wherever MOD_EN was already set,
> where before it was silently ignored.
>
> wled->brightness is seeded with default-brightness rather than the level
> the bootloader actually programmed, so the first update can still step
> the brightness. Reading that level back is version specific and is done
> in a follow-up, to keep this fix small enough to backport.
>
> Assisted-by: LLM
> Fixes: 8663c188beea ("backlight: qcom-wled: Add auto string detection logic")
> Cc: [email protected]
> Signed-off-by: David Heidelberg <[email protected]>

Reviewed-by: Daniel Thompson (RISCstar) <[email protected]>


Daniel.

Reply via email to