diff --git a/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c b/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c index bc985dd22fb3..548c3566bb9b 100644 --- a/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c +++ b/drivers/gpu/drm/imx/sec_mipi_dsim-imx.c @@ -132,8 +132,30 @@ static int imx_sec_dsim_encoder_helper_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) { + int i; + u32 bus_format; + unsigned int num_bus_formats; + struct imx_sec_dsim_device *dsim_dev = enc_to_dsim(encoder); struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode; struct imx_crtc_state *imx_crtc_state = to_imx_crtc_state(crtc_state); + struct drm_display_info *display_info = &conn_state->connector->display_info; + + num_bus_formats = display_info->num_bus_formats; + if (unlikely(!num_bus_formats)) + dev_warn(dsim_dev->dev, "no bus formats assigned by connector\n"); + + bus_format = adjusted_mode->private_flags & 0xffff; + + for (i = 0; i < num_bus_formats; i++) { + if (display_info->bus_formats[i] != bus_format) + continue; + break; + } + + if (i && i == num_bus_formats) { + dev_err(dsim_dev->dev, "invalid bus format for connector\n"); + return -EINVAL; + } /* sec dsim can only accept active hight DE */ imx_crtc_state->bus_flags |= DRM_BUS_FLAG_DE_HIGH; @@ -144,7 +166,11 @@ static int imx_sec_dsim_encoder_helper_atomic_check(struct drm_encoder *encoder, */ imx_crtc_state->bus_flags |= DRM_BUS_FLAG_PIXDATA_NEGEDGE; - imx_crtc_state->bus_format = adjusted_mode->private_flags & 0xffff; + /* set the bus format for CRTC output which should be + * the same as the bus format between dsim and connector, + * since dsim cannot do any pixel conversions. + */ + imx_crtc_state->bus_format = bus_format; return 0; }