]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/mediatek: dsi: Fix DSI host and panel bridge pre-enable order
authorLouis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
Tue, 1 Jul 2025 07:30:40 +0000 (09:30 +0200)
committerChun-Kuang Hu <chunkuang.hu@kernel.org>
Thu, 14 Aug 2025 14:07:06 +0000 (14:07 +0000)
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.eyraud@collabora.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: CK Hu <ck.hu@mediatek.com>
Link: https://patchwork.kernel.org/project/dri-devel/patch/20250701-mediatek-drm-fix-dsi-panel-init-v1-1-7af4adb9fdeb@collabora.com/
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
drivers/gpu/drm/mediatek/mtk_dsi.c

index d7726091819c4762698b41060b3d4d8d27940238..0e2bcd5f67b767d92f2697a5b8183f67ee178a38 100644 (file)
@@ -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);