static int rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); /* * FIXME(Yakir): driver should configure the CRTC output video * mode with the display information which indicated the monitor * support colorimetry. * * But don't know why the CRTC driver seems could only output the * RGBaaa rightly. For example, if connect the "innolux,n116bge" * eDP screen, EDID would indicated that screen only accepted the * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP * screen would show a blue picture (RGB888 show a green picture). * But if I configure CTRC to RGBaaa, and eDP driver still keep * RGB666 input video mode, then screen would works prefect. */ s->output_mode = ROCKCHIP_OUT_MODE_AAAA; s->output_type = DRM_MODE_CONNECTOR_eDP; return 0; }
static int dw_mipi_dsi_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder); switch (dsi->format) { case MIPI_DSI_FMT_RGB888: s->output_mode = ROCKCHIP_OUT_MODE_P888; break; case MIPI_DSI_FMT_RGB666: s->output_mode = ROCKCHIP_OUT_MODE_P666; break; case MIPI_DSI_FMT_RGB565: s->output_mode = ROCKCHIP_OUT_MODE_P565; break; default: WARN_ON(1); return -EINVAL; } s->output_type = DRM_MODE_CONNECTOR_DSI; return 0; }
static int rockchip_rgb_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); struct drm_connector *connector = conn_state->connector; struct drm_display_info *info = &connector->display_info; u32 bus_format; if (info->num_bus_formats) bus_format = info->bus_formats[0]; else bus_format = MEDIA_BUS_FMT_RGB888_1X24; switch (bus_format) { case MEDIA_BUS_FMT_RGB666_1X18: s->output_mode = ROCKCHIP_OUT_MODE_P666; break; case MEDIA_BUS_FMT_RGB565_1X16: s->output_mode = ROCKCHIP_OUT_MODE_P565; break; case MEDIA_BUS_FMT_RGB888_1X24: case MEDIA_BUS_FMT_RGB666_1X24_CPADHI: default: s->output_mode = ROCKCHIP_OUT_MODE_P888; break; } s->output_type = DRM_MODE_CONNECTOR_LVDS; return 0; }
static int rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); struct rockchip_dp_device *dp = to_dp(encoder); int ret; /* * The hardware IC designed that VOP must output the RGB10 video * format to eDP controller, and if eDP panel only support RGB8, * then eDP controller should cut down the video data, not via VOP * controller, that's why we need to hardcode the VOP output mode * to RGA10 here. */ s->output_mode = ROCKCHIP_OUT_MODE_AAAA; s->output_type = DRM_MODE_CONNECTOR_eDP; if (dp->data->chip_type == RK3399_EDP) { /* * For RK3399, VOP Lit must code the out mode to RGB888, * VOP Big must code the out mode to RGB10. */ ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder); if (ret > 0) s->output_mode = ROCKCHIP_OUT_MODE_P888; } return 0; }
static int dw_hdmi_rockchip_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) { struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state); s->output_mode = ROCKCHIP_OUT_MODE_AAAA; s->output_type = DRM_MODE_CONNECTOR_HDMIA; return 0; }