Since commit c9b1150a68d9 ("drm/atomic-helper: Re-order bridge chain pre-enable and post-disable"), the bridge pre_enable callbacks are now called before crtc enable, and the bridge post_disable callbacks after the crtc disable. In the mediatek-drm driver, this change leads to transfer errors on mtk_dsi_host_transfer callback processing during the panel bridge pre-enable sequence because the DSI host bridge pre_enable and CRTC enable sequences, that are enabling the required clocks and PHY using mtk_dsi_poweron function, are called after.
So, in order to fix this call order issue, request the DSI host bridge be pre-enabled before panel bridge by setting pre_enable_prev_first flag on DSI device bridge in the mtk_dsi_host_attach function. Fixes: c9b1150a68d9 ("drm/atomic-helper: Re-order bridge chain pre-enable and post-disable") Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyr...@collabora.com> --- This patch fixes an issue that can be observed on boards such as MediatekGenio 1200-EVK or 350-EVK with a kernel based on linux-next (tag: next-20250635) since commit c9b1150a68d9 ("drm/atomic-helper: Re-order bridge chain pre-enable and post-disable"). In boot logs, there are multiples errors such as IRQ timeouts and panel init errors, leading the DSI panel not being enabled: Example on Genio 1200-EVK: ``` [drm] Wait DSI IRQ(0x00000002) Timeout panel-himax-hx8279 1c008000.dsi.0: sending generic data b0 05 failed: -62 [drm] Wait DSI IRQ(0x00000008) Timeout [drm:mtk_dsi_host_transfer [mediatek_drm]] *ERROR* failed to switch cmd mode panel-himax-hx8279 1c008000.dsi.0: sending DCS SET_DISPLAY_ON failed: -62 ``` --- drivers/gpu/drm/mediatek/mtk_dsi.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c index d7726091819c4762698b41060b3d4d8d27940238..0e2bcd5f67b767d92f2697a5b8183f67ee178a38 100644 --- a/drivers/gpu/drm/mediatek/mtk_dsi.c +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c @@ -1002,6 +1002,12 @@ static int mtk_dsi_host_attach(struct mipi_dsi_host *host, return PTR_ERR(dsi->next_bridge); } + /* + * set flag to request the DSI host bridge be pre-enabled before device bridge + * in the chain, so the DSI host is ready when the device bridge is pre-enabled + */ + dsi->next_bridge->pre_enable_prev_first = true; + drm_bridge_add(&dsi->bridge); ret = component_add(host->dev, &mtk_dsi_component_ops); --- base-commit: c6a68d8f7b81a6ce8962885408cc2d0c1f8b9470 change-id: 20250630-mediatek-drm-fix-dsi-panel-init-1a4b534c40a6 Best regards, -- Louis-Alexis Eyraud <louisalexis.eyr...@collabora.com>