On 03.03.2022 17:36, Jagan Teki wrote:
> MIC drivers in the Exynos5433 display pipeline are already registered
> as bridge drivers and it is more advisable to attach the downstream
> bridge on the bridge attach call instead of doing the same in the
> DSI driver.
>
> This makes bridge attachment more meaningful and avoids the races
> during bridge function calls.
>
> So, move the bridge finding and drm_bridge_attach from DSI to MIC.
>
> Signed-off-by: Jagan Teki <ja...@amarulasolutions.com>

Acked-by: Marek Szyprowski <m.szyprow...@samsung.com>

Tested-by: Marek Szyprowski <m.szyprow...@samsung.com>

> ---
> Changes for v6:
> - new patch
>
>   drivers/gpu/drm/exynos/exynos_drm_dsi.c | 15 ---------------
>   drivers/gpu/drm/exynos/exynos_drm_mic.c | 22 ++++++++++++++++++++++
>   2 files changed, 22 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c 
> b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> index b7d0a4aead0a..741c046513e8 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
> @@ -1660,11 +1660,6 @@ static int exynos_dsi_of_read_u32(const struct 
> device_node *np,
>       return ret;
>   }
>   
> -enum {
> -     DSI_PORT_IN,
> -     DSI_PORT_OUT
> -};
> -
>   static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)
>   {
>       struct device *dev = dsi->dev;
> @@ -1695,8 +1690,6 @@ static int exynos_dsi_bind(struct device *dev, struct 
> device *master,
>       struct exynos_dsi *dsi = dev_get_drvdata(dev);
>       struct drm_encoder *encoder = &dsi->encoder;
>       struct drm_device *drm_dev = data;
> -     struct device_node *in_bridge_node;
> -     struct drm_bridge *in_bridge;
>       int ret;
>   
>       drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
> @@ -1707,14 +1700,6 @@ static int exynos_dsi_bind(struct device *dev, struct 
> device *master,
>       if (ret < 0)
>               return ret;
>   
> -     in_bridge_node = of_graph_get_remote_node(dev->of_node, DSI_PORT_IN, 0);
> -     if (in_bridge_node) {
> -             in_bridge = of_drm_find_bridge(in_bridge_node);
> -             if (in_bridge)
> -                     drm_bridge_attach(encoder, in_bridge, NULL, 0);
> -             of_node_put(in_bridge_node);
> -     }
> -
>       return mipi_dsi_host_register(&dsi->dsi_host);
>   }
>   
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_mic.c 
> b/drivers/gpu/drm/exynos/exynos_drm_mic.c
> index 32672bf8ae4a..9e06f8e2a863 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_mic.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_mic.c
> @@ -102,6 +102,7 @@ struct exynos_mic {
>       struct videomode vm;
>       struct drm_encoder *encoder;
>       struct drm_bridge bridge;
> +     struct drm_bridge *next_bridge;
>   
>       bool enabled;
>   };
> @@ -298,12 +299,22 @@ static void mic_pre_enable(struct drm_bridge *bridge)
>   
>   static void mic_enable(struct drm_bridge *bridge) { }
>   
> +static int mic_attach(struct drm_bridge *bridge,
> +                   enum drm_bridge_attach_flags flags)
> +{
> +     struct exynos_mic *mic = bridge->driver_private;
> +
> +     return drm_bridge_attach(bridge->encoder, mic->next_bridge,
> +                              &mic->bridge, flags);
> +}
> +
>   static const struct drm_bridge_funcs mic_bridge_funcs = {
>       .disable = mic_disable,
>       .post_disable = mic_post_disable,
>       .mode_set = mic_mode_set,
>       .pre_enable = mic_pre_enable,
>       .enable = mic_enable,
> +     .attach = mic_attach,
>   };
>   
>   static int exynos_mic_bind(struct device *dev, struct device *master,
> @@ -377,6 +388,7 @@ static int exynos_mic_probe(struct platform_device *pdev)
>   {
>       struct device *dev = &pdev->dev;
>       struct exynos_mic *mic;
> +     struct device_node *remote;
>       struct resource res;
>       int ret, i;
>   
> @@ -420,6 +432,16 @@ static int exynos_mic_probe(struct platform_device *pdev)
>               }
>       }
>   
> +     remote = of_graph_get_remote_node(dev->of_node, 1, 0);
> +     mic->next_bridge = of_drm_find_bridge(remote);
> +     if (IS_ERR(mic->next_bridge)) {
> +             DRM_DEV_ERROR(dev, "mic: Failed to find next bridge\n");
> +             ret = PTR_ERR(mic->next_bridge);
> +             goto err;
> +     }
> +
> +     of_node_put(remote);
> +
>       platform_set_drvdata(pdev, mic);
>   
>       mic->bridge.funcs = &mic_bridge_funcs;

Best regards
-- 
Marek Szyprowski, PhD
Samsung R&D Institute Poland

Reply via email to