Now that bridges can expose the bus format/flags they expect, we can use those instead of the relying on the display_info provided by the connector (which is only valid if the encoder is directly connected to bridge element driving the panel/display). We also explicitly expose the bus formats supported by our encoder by filling encoder->output_bus_caps with proper info. Signed-off-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> --- drivers/gpu/drm/imx/parallel-display.c | 28 +++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c index 35f20edab9fd..57fee48d6bb6 100644 --- a/drivers/gpu/drm/imx/parallel-display.c +++ b/drivers/gpu/drm/imx/parallel-display.c @@ -115,8 +115,18 @@ static int imx_pd_encoder_atomic_check(struct drm_encoder *encoder, struct imx_crtc_state *imx_crtc_state = to_imx_crtc_state(crtc_state); struct drm_display_info *di = &conn_state->connector->display_info; struct imx_parallel_display *imxpd = enc_to_imxpd(encoder); + struct drm_bridge_state *bridge_state = NULL; + struct drm_bridge *bridge; - if (!imxpd->bus_format && di->num_bus_formats) { + bridge = drm_bridge_chain_get_first_bridge(encoder); + if (bridge) + bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, + bridge); + + if (bridge_state && bridge_state->input_bus_cfg.fmt) { + imx_crtc_state->bus_format = bridge_state->input_bus_cfg.fmt; + imx_crtc_state->bus_flags = bridge_state->input_bus_cfg.flags; + } else if (!imxpd->bus_format && di->num_bus_formats) { imx_crtc_state->bus_flags = di->bus_flags; imx_crtc_state->bus_format = di->bus_formats[0]; } else { @@ -152,10 +162,18 @@ static const struct drm_encoder_helper_funcs imx_pd_encoder_helper_funcs = { .atomic_check = imx_pd_encoder_atomic_check, }; +static const u32 imx_pd_bus_fmts[] = { + MEDIA_BUS_FMT_RGB888_1X24, + MEDIA_BUS_FMT_RGB565_1X16, + MEDIA_BUS_FMT_RGB666_1X18, + MEDIA_BUS_FMT_RGB666_1X24_CPADHI, +}; + static int imx_pd_register(struct drm_device *drm, struct imx_parallel_display *imxpd) { struct drm_encoder *encoder = &imxpd->encoder; + struct drm_bus_caps *bus_caps = &encoder->output_bus_caps; int ret; ret = imx_drm_encoder_parse_of(drm, encoder, imxpd->dev->of_node); @@ -173,6 +191,14 @@ static int imx_pd_register(struct drm_device *drm, drm_encoder_init(drm, encoder, &imx_pd_encoder_funcs, DRM_MODE_ENCODER_NONE, NULL); + if (imxpd->bus_format) { + bus_caps->supported_fmts = &imxpd->bus_format; + bus_caps->num_supported_fmts = 1; + } else { + bus_caps->supported_fmts = imx_pd_bus_fmts; + bus_caps->num_supported_fmts = ARRAY_SIZE(imx_pd_bus_fmts); + } + if (!imxpd->bridge) { drm_connector_helper_add(&imxpd->connector, &imx_pd_connector_helper_funcs); -- 2.21.0 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel