Re: [PATCH v4 3/4] backlight: qcom-wled: Fix unbalanced OVP IRQ enable at probe

From: Daniel Thompson

Date: Tue Oct 06 2026 - 06:09:41 EST


On Mon, Sep 21, 2026 at 12:46:24PM +0200, David Heidelberg via B4 Relay wrote:
> From: David Heidelberg <david@xxxxxxx>
>
> 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: stable@xxxxxxxxxxxxxxx
> Signed-off-by: David Heidelberg <david@xxxxxxx>

Reviewed-by: Daniel Thompson (RISCstar) <danielt@xxxxxxxxxx>


Daniel.