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;
*/
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;
}