* [PATCH] media: s5p_cec: release IRQ before deleting the adapter @ 2026-10-18 3:51 ` Myeonghun Pak 2026-10-19 6:54 ` Marek Szyprowski 0 siblings, 1 reply; 3+ messages in thread From: Myeonghun Pak @ 2026-10-18 3:51 UTC (permalink / raw) To: Marek Szyprowski, Hans Verkuil, Mauro Carvalho Chehab Cc: linux-samsung-soc, linux-media, linux-kernel, Ijae Kim The threaded IRQ handler reports transmit and receive events through cec->adap. Adapter unregistration masks the hardware interrupts but does not wait for this handler. With no open device-node references, it can free the adapter while an already queued IRQ thread still uses it. Devres also unmaps the registers before releasing the IRQ, since the mapping was acquired after the IRQ. Free the managed IRQ before unregistering the adapter and disabling runtime PM. Request it only after the register mapping and adapter have been initialized, and free it on adapter registration failure before deleting the adapter. This also makes IRQ release precede MMIO release on probe unwind. This issue was identified as part of our ongoing research while reviewing kernel code. Fixes: 1bcbf6f4b6b0 ("[media] cec: s5p-cec: Add s5p-cec driver") Co-developed-by: Ijae Kim <ae878000@gmail.com> Signed-off-by: Ijae Kim <ae878000@gmail.com> Signed-off-by: Myeonghun Pak <mhun512@gmail.com> --- Compile-tested with Clang, W=1. No hardware runtime testing. Based on mainline 0fcb05b72344f40806cbe810de8872f1698bf053. diff --git a/drivers/media/cec/platform/s5p/s5p_cec.c b/drivers/media/cec/platform/s5p/s5p_cec.c index 4a92d32..e83705f 100644 --- a/drivers/media/cec/platform/s5p/s5p_cec.c +++ b/drivers/media/cec/platform/s5p/s5p_cec.c @@ -199,11 +199,6 @@ static int s5p_cec_probe(struct platform_device *pdev) if (cec->irq < 0) return cec->irq; - ret = devm_request_threaded_irq(dev, cec->irq, s5p_cec_irq_handler, - s5p_cec_irq_handler_thread, 0, pdev->name, cec); - if (ret) - return ret; - cec->clk = devm_clk_get(dev, "hdmicec"); if (IS_ERR(cec->clk)) return PTR_ERR(cec->clk); @@ -231,16 +226,24 @@ static int s5p_cec_probe(struct platform_device *pdev) goto err_delete_adapter; } - ret = cec_register_adapter(cec->adap, &pdev->dev); + ret = devm_request_threaded_irq(dev, cec->irq, s5p_cec_irq_handler, + s5p_cec_irq_handler_thread, 0, pdev->name, cec); if (ret) goto err_notifier; + ret = cec_register_adapter(cec->adap, &pdev->dev); + if (ret) + goto err_free_irq; + platform_set_drvdata(pdev, cec); pm_runtime_enable(dev); dev_dbg(dev, "successfully probed\n"); return 0; +err_free_irq: + devm_free_irq(dev, cec->irq, cec); + err_notifier: cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); @@ -253,6 +256,7 @@ static void s5p_cec_remove(struct platform_device *pdev) { struct s5p_cec_dev *cec = platform_get_drvdata(pdev); + devm_free_irq(&pdev->dev, cec->irq, cec); cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); cec_unregister_adapter(cec->adap); pm_runtime_disable(&pdev->dev); ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] media: s5p_cec: release IRQ before deleting the adapter 2026-10-18 3:51 ` [PATCH] media: s5p_cec: release IRQ before deleting the adapter Myeonghun Pak @ 2026-10-19 6:54 ` Marek Szyprowski 2026-10-19 23:03 ` Myeonghun Pak 0 siblings, 1 reply; 3+ messages in thread From: Marek Szyprowski @ 2026-10-19 6:54 UTC (permalink / raw) To: Myeonghun Pak, Hans Verkuil, Mauro Carvalho Chehab Cc: linux-samsung-soc, linux-media, linux-kernel, Ijae Kim On 18.10.2026 05:51, Myeonghun Pak wrote: > The threaded IRQ handler reports transmit and receive events through > cec->adap. Adapter unregistration masks the hardware interrupts but does > not wait for this handler. With no open device-node references, it can > free the adapter while an already queued IRQ thread still uses it. > Devres also unmaps the registers before releasing the IRQ, since the > mapping was acquired after the IRQ. > > Free the managed IRQ before unregistering the adapter and disabling > runtime PM. Request it only after the register mapping and adapter have > been initialized, and free it on adapter registration failure before > deleting the adapter. This also makes IRQ release precede MMIO release > on probe unwind. > > This issue was identified as part of our ongoing research while > reviewing kernel code. > > Fixes: 1bcbf6f4b6b0 ("[media] cec: s5p-cec: Add s5p-cec driver") > Co-developed-by: Ijae Kim <ae878000@gmail.com> > Signed-off-by: Ijae Kim <ae878000@gmail.com> > Signed-off-by: Myeonghun Pak <mhun512@gmail.com> > > --- > Compile-tested with Clang, W=1. No hardware runtime testing. > > Based on mainline 0fcb05b72344f40806cbe810de8872f1698bf053. > > diff --git a/drivers/media/cec/platform/s5p/s5p_cec.c b/drivers/media/cec/platform/s5p/s5p_cec.c > index 4a92d32..e83705f 100644 > --- a/drivers/media/cec/platform/s5p/s5p_cec.c > +++ b/drivers/media/cec/platform/s5p/s5p_cec.c > @@ -199,11 +199,6 @@ static int s5p_cec_probe(struct platform_device *pdev) > if (cec->irq < 0) > return cec->irq; > > - ret = devm_request_threaded_irq(dev, cec->irq, s5p_cec_irq_handler, > - s5p_cec_irq_handler_thread, 0, pdev->name, cec); > - if (ret) > - return ret; > - > cec->clk = devm_clk_get(dev, "hdmicec"); > if (IS_ERR(cec->clk)) > return PTR_ERR(cec->clk); > @@ -231,16 +226,24 @@ static int s5p_cec_probe(struct platform_device *pdev) > goto err_delete_adapter; > } > > - ret = cec_register_adapter(cec->adap, &pdev->dev); > + ret = devm_request_threaded_irq(dev, cec->irq, s5p_cec_irq_handler, > + s5p_cec_irq_handler_thread, 0, pdev->name, cec); > if (ret) > goto err_notifier; > > + ret = cec_register_adapter(cec->adap, &pdev->dev); > + if (ret) > + goto err_free_irq; > + > platform_set_drvdata(pdev, cec); > pm_runtime_enable(dev); > > dev_dbg(dev, "successfully probed\n"); > return 0; > > +err_free_irq: > + devm_free_irq(dev, cec->irq, cec); There is no point in using devm_* API if one needs to manually free the resource for whatever reason. > + > err_notifier: > cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); > > @@ -253,6 +256,7 @@ static void s5p_cec_remove(struct platform_device *pdev) > { > struct s5p_cec_dev *cec = platform_get_drvdata(pdev); > > + devm_free_irq(&pdev->dev, cec->irq, cec); > cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); > cec_unregister_adapter(cec->adap); > pm_runtime_disable(&pdev->dev); > Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] media: s5p_cec: release IRQ before deleting the adapter 2026-10-19 6:54 ` Marek Szyprowski @ 2026-10-19 23:03 ` Myeonghun Pak 0 siblings, 0 replies; 3+ messages in thread From: Myeonghun Pak @ 2026-10-19 23:03 UTC (permalink / raw) To: Marek Szyprowski Cc: Hans Verkuil, Mauro Carvalho Chehab, linux-samsung-soc, linux-media, linux-kernel, Ijae Kim Hi Marek, Agreed. I'll switch to request_threaded_irq() and free_irq() in v2. Thanks for the review. Best regards, Myeonghun 2026년 10월 19일 (월) 오전 2:54, Marek Szyprowski <m.szyprowski@samsung.com>님이 작성: > > On 18.10.2026 05:51, Myeonghun Pak wrote: > > The threaded IRQ handler reports transmit and receive events through > > cec->adap. Adapter unregistration masks the hardware interrupts but does > > not wait for this handler. With no open device-node references, it can > > free the adapter while an already queued IRQ thread still uses it. > > Devres also unmaps the registers before releasing the IRQ, since the > > mapping was acquired after the IRQ. > > > > Free the managed IRQ before unregistering the adapter and disabling > > runtime PM. Request it only after the register mapping and adapter have > > been initialized, and free it on adapter registration failure before > > deleting the adapter. This also makes IRQ release precede MMIO release > > on probe unwind. > > > > This issue was identified as part of our ongoing research while > > reviewing kernel code. > > > > Fixes: 1bcbf6f4b6b0 ("[media] cec: s5p-cec: Add s5p-cec driver") > > Co-developed-by: Ijae Kim <ae878000@gmail.com> > > Signed-off-by: Ijae Kim <ae878000@gmail.com> > > Signed-off-by: Myeonghun Pak <mhun512@gmail.com> > > > > --- > > Compile-tested with Clang, W=1. No hardware runtime testing. > > > > Based on mainline 0fcb05b72344f40806cbe810de8872f1698bf053. > > > > diff --git a/drivers/media/cec/platform/s5p/s5p_cec.c b/drivers/media/cec/platform/s5p/s5p_cec.c > > index 4a92d32..e83705f 100644 > > --- a/drivers/media/cec/platform/s5p/s5p_cec.c > > +++ b/drivers/media/cec/platform/s5p/s5p_cec.c > > @@ -199,11 +199,6 @@ static int s5p_cec_probe(struct platform_device *pdev) > > if (cec->irq < 0) > > return cec->irq; > > > > - ret = devm_request_threaded_irq(dev, cec->irq, s5p_cec_irq_handler, > > - s5p_cec_irq_handler_thread, 0, pdev->name, cec); > > - if (ret) > > - return ret; > > - > > cec->clk = devm_clk_get(dev, "hdmicec"); > > if (IS_ERR(cec->clk)) > > return PTR_ERR(cec->clk); > > @@ -231,16 +226,24 @@ static int s5p_cec_probe(struct platform_device *pdev) > > goto err_delete_adapter; > > } > > > > - ret = cec_register_adapter(cec->adap, &pdev->dev); > > + ret = devm_request_threaded_irq(dev, cec->irq, s5p_cec_irq_handler, > > + s5p_cec_irq_handler_thread, 0, pdev->name, cec); > > if (ret) > > goto err_notifier; > > > > + ret = cec_register_adapter(cec->adap, &pdev->dev); > > + if (ret) > > + goto err_free_irq; > > + > > platform_set_drvdata(pdev, cec); > > pm_runtime_enable(dev); > > > > dev_dbg(dev, "successfully probed\n"); > > return 0; > > > > +err_free_irq: > > + devm_free_irq(dev, cec->irq, cec); > There is no point in using devm_* API if one needs to manually free the > resource for whatever reason. > > > > + > > err_notifier: > > cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); > > > > @@ -253,6 +256,7 @@ static void s5p_cec_remove(struct platform_device *pdev) > > { > > struct s5p_cec_dev *cec = platform_get_drvdata(pdev); > > > > + devm_free_irq(&pdev->dev, cec->irq, cec); > > cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); > > cec_unregister_adapter(cec->adap); > > pm_runtime_disable(&pdev->dev); > > > Best regards > -- > Marek Szyprowski, PhD > Samsung R&D Institute Poland > ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-19 23:03 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <CGME20261018035132eucas1p2ccd8f0233fd196fd8801506c1c213b39@eucas1p2.samsung.com>
2026-10-18 3:51 ` [PATCH] media: s5p_cec: release IRQ before deleting the adapter Myeonghun Pak
2026-10-19 6:54 ` Marek Szyprowski
2026-10-19 23:03 ` Myeonghun Pak
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®