[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <5028381.GXAFRqVoOG@diego>
Date: Sun, 23 Nov 2025 21:25:58 +0100
From: Heiko StĂĽbner <heiko@...ech.de>
To: Andrzej Hajda <andrzej.hajda@...el.com>,
Neil Armstrong <neil.armstrong@...aro.org>, Robert Foss <rfoss@...nel.org>,
Laurent Pinchart <Laurent.pinchart@...asonboard.com>,
Jonas Karlman <jonas@...boo.se>, Jernej Skrabec <jernej.skrabec@...il.com>,
Sandy Huang <hjc@...k-chips.com>, Andy Yan <andy.yan@...k-chips.com>,
Sebastian Reichel <sebastian.reichel@...labora.com>
Cc: Cristian Ciocaltea <cristian.ciocaltea@...labora.com>,
dri-devel@...ts.freedesktop.org, linux-kernel@...r.kernel.org,
linux-rockchip@...ts.infradead.org, kernel@...labora.com,
Sebastian Reichel <sebastian.reichel@...labora.com>,
Dmitry Baryshkov <dmitry.baryshkov@....qualcomm.com>
Subject: Re: [PATCH] drm/bridge: dw-hdmi-qp: Fix spurious IRQ on resume
Am Dienstag, 14. Oktober 2025, 18:00:57 Mitteleuropäische Normalzeit schrieb Sebastian Reichel:
> After resume from suspend to RAM, the following splash is generated if
> the HDMI driver is probed (independent of a connected cable):
>
> [ 1194.484052] irq 80: nobody cared (try booting with the "irqpoll" option)
> [ 1194.484074] CPU: 0 UID: 0 PID: 627 Comm: rtcwake Not tainted 6.17.0-rc7-g96f1a11414b3 #1 PREEMPT
> [ 1194.484082] Hardware name: Rockchip RK3576 EVB V10 Board (DT)
> [ 1194.484085] Call trace:
> [ 1194.484087] ... (stripped)
> [ 1194.484283] handlers:
> [ 1194.484285] [<00000000bc363dcb>] dw_hdmi_qp_main_hardirq [dw_hdmi_qp]
> [ 1194.484302] Disabling IRQ #80
>
> Apparently the HDMI IP is losing part of its state while the system
> is suspended and generates spurious interrupts during resume. The
> bug has not yet been noticed, as system suspend does not yet work
> properly on upstream kernel with either the Rockchip RK3588 or RK3576
> platform.
>
> Fixes: 128a9bf8ace2 ("drm/rockchip: Add basic RK3588 HDMI output support")
> Signed-off-by: Sebastian Reichel <sebastian.reichel@...labora.com>
so, just to say, to me this looks good and also I guess the changes to the
main bridge are not looking controversial and most likely the issue
should appear in all (future) dw-hdmi-qp variants.
So I'll give that a day or two more and then apply it.
Heiko
> ---
> drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 9 +++++++++
> drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 12 +++++++++++-
> include/drm/bridge/dw_hdmi_qp.h | 1 +
> 3 files changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
> index 39332c57f2c5..c85eb340e5a3 100644
> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c
> @@ -143,6 +143,7 @@ struct dw_hdmi_qp {
> } phy;
>
> struct regmap *regm;
> + int main_irq;
>
> unsigned long tmds_char_rate;
> };
> @@ -1068,6 +1069,7 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev,
>
> dw_hdmi_qp_init_hw(hdmi);
>
> + hdmi->main_irq = plat_data->main_irq;
> ret = devm_request_threaded_irq(dev, plat_data->main_irq,
> dw_hdmi_qp_main_hardirq, NULL,
> IRQF_SHARED, dev_name(dev), hdmi);
> @@ -1106,9 +1108,16 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev,
> }
> EXPORT_SYMBOL_GPL(dw_hdmi_qp_bind);
>
> +void dw_hdmi_qp_suspend(struct device *dev, struct dw_hdmi_qp *hdmi)
> +{
> + disable_irq(hdmi->main_irq);
> +}
> +EXPORT_SYMBOL_GPL(dw_hdmi_qp_suspend);
> +
> void dw_hdmi_qp_resume(struct device *dev, struct dw_hdmi_qp *hdmi)
> {
> dw_hdmi_qp_init_hw(hdmi);
> + enable_irq(hdmi->main_irq);
> }
> EXPORT_SYMBOL_GPL(dw_hdmi_qp_resume);
>
> diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
> index ed6e8f036f4b..9ac45e7bc987 100644
> --- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
> +++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
> @@ -597,6 +597,15 @@ static void dw_hdmi_qp_rockchip_remove(struct platform_device *pdev)
> component_del(&pdev->dev, &dw_hdmi_qp_rockchip_ops);
> }
>
> +static int __maybe_unused dw_hdmi_qp_rockchip_suspend(struct device *dev)
> +{
> + struct rockchip_hdmi_qp *hdmi = dev_get_drvdata(dev);
> +
> + dw_hdmi_qp_suspend(dev, hdmi->hdmi);
> +
> + return 0;
> +}
> +
> static int __maybe_unused dw_hdmi_qp_rockchip_resume(struct device *dev)
> {
> struct rockchip_hdmi_qp *hdmi = dev_get_drvdata(dev);
> @@ -612,7 +621,8 @@ static int __maybe_unused dw_hdmi_qp_rockchip_resume(struct device *dev)
> }
>
> static const struct dev_pm_ops dw_hdmi_qp_rockchip_pm = {
> - SET_SYSTEM_SLEEP_PM_OPS(NULL, dw_hdmi_qp_rockchip_resume)
> + SET_SYSTEM_SLEEP_PM_OPS(dw_hdmi_qp_rockchip_suspend,
> + dw_hdmi_qp_rockchip_resume)
> };
>
> struct platform_driver dw_hdmi_qp_rockchip_pltfm_driver = {
> diff --git a/include/drm/bridge/dw_hdmi_qp.h b/include/drm/bridge/dw_hdmi_qp.h
> index e9be6d507ad9..8955450663e5 100644
> --- a/include/drm/bridge/dw_hdmi_qp.h
> +++ b/include/drm/bridge/dw_hdmi_qp.h
> @@ -28,5 +28,6 @@ struct dw_hdmi_qp_plat_data {
> struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev,
> struct drm_encoder *encoder,
> const struct dw_hdmi_qp_plat_data *plat_data);
> +void dw_hdmi_qp_suspend(struct device *dev, struct dw_hdmi_qp *hdmi);
> void dw_hdmi_qp_resume(struct device *dev, struct dw_hdmi_qp *hdmi);
> #endif /* __DW_HDMI_QP__ */
>
> ---
> base-commit: 3a8660878839faadb4f1a6dd72c3179c1df56787
> change-id: 20251014-rockchip-hdmi-suspend-fix-e9bd48588453
>
> Best regards,
>
Powered by blists - more mailing lists