[PATCH] drm/mediatek: dpi: Find next bridge during probe

CK Hu (胡俊光) ck.hu at mediatek.com
Fri Jan 16 01:08:10 PST 2026


On Wed, 2026-01-14 at 17:22 +0800, Chen-Yu Tsai wrote:
> Trying to find the next bridge and deferring probe in the bridge attach
> callback is much too late. At this point the driver has already finished
> probing and is now running the component bind code path. What's even
> worse is that in the specific case of the DSI host being the last
> component to be added as part of the dsi_host_attach callback, the code
> path that this is in:
> 
>  -> devm_drm_of_get_bridge()
>     mtk_dpi_bridge_attach()
>     drm_bridge_attach()
>     mtk_dpi_bind()
>     ...
>     component_add()
>     mtk_dsi_host_attach()
>     anx7625_attach_dsi()
>     anx7625_link_bridge() - done_probing callback for of_dp_aux_populate_bus()
>     of_dp_aux_populate_bus()
>     anx7625_i2c_probe()
> 
> _cannot_ return probe defer:
> 
>     anx7625 4-0058: [drm:anx7625_bridge_attach] drm attach
>     mediatek-drm mediatek-drm.15.auto: bound 14014000.dsi (ops mtk_dsi_component_ops)
>     mediatek-drm mediatek-drm.15.auto: error -EPROBE_DEFER: failed to attach bridge /soc/dpi at 14015000 to encoder TMDS-37
>     [drm:mtk_dsi_host_attach] *ERROR* failed to add dsi_host component: -517
>     anx7625 4-0058: [drm:anx7625_link_bridge] *ERROR* fail to attach dsi to host.
>     panel-simple-dp-aux aux-4-0058: DP AUX done_probing() can't defer
>     panel-simple-dp-aux aux-4-0058: probe with driver panel-simple-dp-aux failed with error -22
>     anx7625 4-0058: [drm:anx7625_i2c_probe] probe done
> 
> This results in the whole display driver failing to probe.
> 
> Perhaps this was an attempt to mirror the structure in the DSI driver;
> but in the DSI driver the next bridge is retrieved in the DSI attach
> callback, not the bridge attach callback.
> 
> Move the code finding the next bridge back to the probe function so that
> deferred probing works correctly. Also rework the fallback to the old OF
> graph endpoint numbering scheme so that deferred probing logs in both
> cases.
> 
> This issue was found on an MT8183 Jacuzzi device with an extra patch
> enabling the DPI-based external display pipeline. Also tested on an
> MT8192 Hayato device with both DSI and DPI display pipelines enabled.

Reviewed-by: CK Hu <ck.hu at mediatek.com>

> 
> Fixes: 4c932840db1d ("drm/mediatek: Implement OF graphs support for display paths")
> Signed-off-by: Chen-Yu Tsai <wenst at chromium.org>
> ---
>  drivers/gpu/drm/mediatek/mtk_dpi.c | 23 +++++++++--------------
>  1 file changed, 9 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
> index 61cab32e213a..53360b5d12ba 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> @@ -836,20 +836,6 @@ static int mtk_dpi_bridge_attach(struct drm_bridge *bridge,
>  				 enum drm_bridge_attach_flags flags)
>  {
>  	struct mtk_dpi *dpi = bridge_to_dpi(bridge);
> -	int ret;
> -
> -	dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 1, -1);
> -	if (IS_ERR(dpi->next_bridge)) {
> -		ret = PTR_ERR(dpi->next_bridge);
> -		if (ret == -EPROBE_DEFER)
> -			return ret;
> -
> -		/* Old devicetree has only one endpoint */
> -		dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 0, 0);
> -		if (IS_ERR(dpi->next_bridge))
> -			return dev_err_probe(dpi->dev, PTR_ERR(dpi->next_bridge),
> -					     "Failed to get bridge\n");
> -	}
>  
>  	return drm_bridge_attach(encoder, dpi->next_bridge,
>  				 &dpi->bridge, flags);
> @@ -1319,6 +1305,15 @@ static int mtk_dpi_probe(struct platform_device *pdev)
>  	if (dpi->irq < 0)
>  		return dpi->irq;
>  
> +	dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 1, -1);
> +	if (IS_ERR(dpi->next_bridge) && PTR_ERR(dpi->next_bridge) == -ENODEV) {
> +		/* Old devicetree has only one endpoint */
> +		dpi->next_bridge = devm_drm_of_get_bridge(dpi->dev, dpi->dev->of_node, 0, 0);
> +	}
> +	if (IS_ERR(dpi->next_bridge))
> +		return dev_err_probe(dpi->dev, PTR_ERR(dpi->next_bridge),
> +				     "Failed to get bridge\n");
> +
>  	platform_set_drvdata(pdev, dpi);
>  
>  	dpi->bridge.of_node = dev->of_node;



More information about the linux-arm-kernel mailing list