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 <jagan@xxxxxxxxxxxxxxxxxxxx> Acked-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> Tested-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > --- > 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