Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [High] Changing the lookup priority from panel to bridge breaks drivers that 
use `panel != NULL` checks to apply panel-specific hardware constraints or 
initialization logic.
--

--- Patch [3]: [PATCH 03/11] drm: of: drm_of_find_panel_or_bridge: prioritize 
the bridge, not the panel ---
commit e0a1351b53c705f02789905fd967720e44e8a076
Author: Luca Ceresoli <[email protected]>

drm: of: drm_of_find_panel_or_bridge: prioritize the bridge, not the panel

This commit changes drm_of_find_panel_or_bridge() to prioritize returning
a drm_bridge instead of a drm_panel when both are present. This avoids
re-creating a panel_bridge if a panel already automatically creates one.

> diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
> index 8ec352f3df93e..f92f02f9b202a 100644
> --- a/drivers/gpu/drm/drm_of.c
> +++ b/drivers/gpu/drm/drm_of.c
> @@ -308,14 +308,7 @@ int drm_of_find_panel_or_bridge(const struct device_node 
> *np,
>       if (!remote)
>               return -ENODEV;
>  
> -     *panel = of_drm_find_panel(remote);
> -     if (!IS_ERR(*panel))
> -             return 0;
> -
> -     *panel = NULL;
> -
>       if (bridge) {
> -             /* No panel found yet, check for a bridge next. */
>               *bridge = of_drm_find_bridge(remote);
>               if (*bridge)
>                       return 0;

[Severity: High]
Will changing the lookup priority to return a bridge before a panel break
drivers that rely on the panel pointer being non-NULL to apply
hardware-specific logic?

For example, in sun4i_rgb_mode_valid(), if a panel wraps itself in a bridge,
the panel pointer will be NULL, causing valid modes to be rejected:

drivers/gpu/drm/sun4i/sun4i_rgb.c:sun4i_rgb_mode_valid() {
        if (rgb->panel) {
                DRM_DEBUG_DRIVER("RGB panel used, skipping clock rate checks");
                goto out;
        }
        ...
}

Similarly in fsl_dcu_create_outputs(), it relies on panel to enforce
hdisplay alignment and custom connector initialization:

drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c:fsl_dcu_create_outputs() {
        if (panel) {
                ret = devm_add_action_or_reset(fsl_dev->dev,
                                               fsl_dcu_panel_put_action, panel);
                if (ret)
                        return ret;

                fsl_dev->connector.panel = panel;
                return fsl_dcu_attach_panel(fsl_dev, panel);
        }
        ...
}

And tegra_sor_dp_enable() uses the panel pointer to identify eDPs and
misconfigures internal eDP panels as standard DP displays if panel is NULL:

drivers/gpu/drm/tegra/sor.c:tegra_sor_dp_enable() {
        if (output->panel)
                value |= SOR_CLK_CNTRL_DP_CLK_SEL_SINGLE_DPCLK;
        else
                value |= SOR_CLK_CNTRL_DP_CLK_SEL_DIFF_DPCLK;

        tegra_sor_writel(sor, value, SOR_CLK_CNTRL);
        ...
}

Could this cause display initialization to fail on these platforms?

>  
>               *bridge = NULL;
>       }
>  
> +     /* No bridge found yet, check for a panel next. */
> +     *panel = of_drm_find_panel(remote);
> +     if (!IS_ERR(*panel))
> +             return 0;
> +
> +     *panel = NULL;
> +
>       return -EPROBE_DEFER;
>  }

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=3

Reply via email to