[PATCH v6 3/6] exynos: drm: dsi: Attach in_bridge in MIC driver
Marek Szyprowski
m.szyprowski at samsung.com
Fri Mar 25 15:01:55 UTC 2022
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 at amarulasolutions.com>
Acked-by: Marek Szyprowski <m.szyprowski at samsung.com>
Tested-by: Marek Szyprowski <m.szyprowski at 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
More information about the dri-devel
mailing list