From fdb2dae76c6258e309d1713f0ed776a416d0c077 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Thu, 16 Apr 2026 23:53:02 +0200 Subject: [PATCH 2/9] drm/bridge: analogix-dp: disable IRQ before clock gating in suspend analogix_dp_suspend() powers off the PHY and disables the clock but leaves the eDP IRQ enabled. During the noirq suspend phase, suspend_device_irqs() calls synchronize_irq() which waits for any running handler to complete. If the eDP controller fires a spurious interrupt after the clock was gated, the hardirq handler accesses registers on a dead bus, hanging synchronize_irq(). Add disable_irq() before powering down and enable_irq() after re-initialization in the resume path. Ensure enable_irq() is called even if clk_prepare_enable() fails, to avoid leaving the IRQ permanently disabled. Generated-by: Claude Opus 4.6 Signed-off-by: Markus Fritsche --- drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index efe534977d12..1b1f811ba9f4 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -1577,6 +1577,8 @@ EXPORT_SYMBOL_GPL(analogix_dp_probe); int analogix_dp_suspend(struct analogix_dp_device *dp) { + disable_irq(dp->irq); + phy_power_off(dp->phy); if (dp->plat_data->power_off) @@ -1595,6 +1597,7 @@ int analogix_dp_resume(struct analogix_dp_device *dp) ret = clk_prepare_enable(dp->clock); if (ret < 0) { DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret); + enable_irq(dp->irq); return ret; } @@ -1606,6 +1609,8 @@ int analogix_dp_resume(struct analogix_dp_device *dp) analogix_dp_init_dp(dp); + enable_irq(dp->irq); + return 0; } EXPORT_SYMBOL_GPL(analogix_dp_resume); -- 2.54.0