From 688bc707751752159b5c2d317df2097f77c35dfe Mon Sep 17 00:00:00 2001 From: Jake Steinman Date: Fri, 26 Jun 2026 16:07:32 -0400 Subject: [PATCH] icvs: don't request a non-threaded IRQ with IRQF_ONESHOT cvs_init() registers cvs_irq_handler() as a primary (hardirq) handler via devm_request_irq(), but passes IRQF_ONESHOT. IRQF_ONESHOT is intended for threaded interrupts, where it keeps the interrupt line masked after the hardirq until the threaded handler has run. cvs_irq_handler() has no threaded component -- it only sets hostwake_event_arg and wakes a waitqueue -- so IRQF_ONESHOT is inappropriate here. On the Synaptics SVP7500 (06cb:0701) CVS bridge this leaves the device interrupt masked after an event; the bridge then stops delivering interrupts after a brief idle and wedges, after which libcamera can no longer drive the sensor and falls back to the "simple" pipeline with no frames flowing. Dropping IRQF_ONESHOT restores reliable interrupt delivery and streaming. Keep IRQF_NO_SUSPEND so the interrupt remains armed across system suspend. Fixes: 6a93817 ("gpio resources") Signed-off-by: Jake Steinman --- drivers/misc/icvs/intel_cvs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/misc/icvs/intel_cvs.c b/drivers/misc/icvs/intel_cvs.c index 061d8c9..fe621b1 100644 --- a/drivers/misc/icvs/intel_cvs.c +++ b/drivers/misc/icvs/intel_cvs.c @@ -37,7 +37,7 @@ static int cvs_init(struct intel_cvs *icvs) return -EINVAL; ret = devm_request_irq(icvs->dev, icvs->irq, cvs_irq_handler, - IRQF_ONESHOT | IRQF_NO_SUSPEND, + IRQF_NO_SUSPEND, dev_name(icvs->dev), icvs); if (ret) dev_err(icvs->dev, "Failed to request irq");