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.

