| .. | .. |
|---|
| 97 | 97 | return false; |
|---|
| 98 | 98 | } |
|---|
| 99 | 99 | |
|---|
| 100 | +static bool is_rb_swap(uint32_t bus_format, uint32_t output_mode) |
|---|
| 101 | +{ |
|---|
| 102 | + /* |
|---|
| 103 | + * The default component order of serial rgb3x8 formats |
|---|
| 104 | + * is BGR. So it is needed to enable RB swap. |
|---|
| 105 | + */ |
|---|
| 106 | + if (bus_format == MEDIA_BUS_FMT_SRGB888_3X8 || |
|---|
| 107 | + bus_format == MEDIA_BUS_FMT_SRGB888_DUMMY_4X8) |
|---|
| 108 | + return true; |
|---|
| 109 | + else |
|---|
| 110 | + return false; |
|---|
| 111 | +} |
|---|
| 112 | + |
|---|
| 100 | 113 | static int rockchip_vop_init_gamma(struct vop *vop, struct display_state *state) |
|---|
| 101 | 114 | { |
|---|
| 102 | 115 | struct crtc_state *crtc_state = &state->crtc_state; |
|---|
| .. | .. |
|---|
| 298 | 311 | VOP_CTRL_SET(vop, win_channel[2], 0x56); |
|---|
| 299 | 312 | VOP_CTRL_SET(vop, dsp_blank, 0); |
|---|
| 300 | 313 | |
|---|
| 301 | | - dclk_inv = (mode->flags & DRM_MODE_FLAG_PPIXDATA) ? 0 : 1; |
|---|
| 314 | + dclk_inv = (conn_state->bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE) ? 1 : 0; |
|---|
| 302 | 315 | /* For improving signal quality, dclk need to be inverted by default on rv1106. */ |
|---|
| 303 | 316 | if ((VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) == 12)) |
|---|
| 304 | 317 | dclk_inv = !dclk_inv; |
|---|
| .. | .. |
|---|
| 403 | 416 | VOP_CTRL_SET(vop, hdmi_dclk_out_en, |
|---|
| 404 | 417 | conn_state->output_mode == ROCKCHIP_OUT_MODE_YUV420 ? 1 : 0); |
|---|
| 405 | 418 | |
|---|
| 406 | | - if (is_uv_swap(conn_state->bus_format, conn_state->output_mode)) |
|---|
| 407 | | - VOP_CTRL_SET(vop, dsp_data_swap, DSP_RB_SWAP); |
|---|
| 419 | + if (is_uv_swap(conn_state->bus_format, conn_state->output_mode) || |
|---|
| 420 | + is_rb_swap(conn_state->bus_format, conn_state->output_mode)) |
|---|
| 421 | + VOP_CTRL_SET(vop, dsp_rb_swap, 1); |
|---|
| 408 | 422 | else |
|---|
| 409 | 423 | VOP_CTRL_SET(vop, dsp_data_swap, 0); |
|---|
| 410 | 424 | |
|---|
| .. | .. |
|---|
| 888 | 902 | return 0; |
|---|
| 889 | 903 | } |
|---|
| 890 | 904 | |
|---|
| 905 | +static int rockchip_vop_mode_fixup(struct display_state *state) |
|---|
| 906 | +{ |
|---|
| 907 | + struct connector_state *conn_state = &state->conn_state; |
|---|
| 908 | + struct drm_display_mode *mode = &conn_state->mode; |
|---|
| 909 | + |
|---|
| 910 | + drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V | CRTC_STEREO_DOUBLE); |
|---|
| 911 | + |
|---|
| 912 | + return 0; |
|---|
| 913 | +} |
|---|
| 914 | + |
|---|
| 891 | 915 | const struct rockchip_crtc_funcs rockchip_vop_funcs = { |
|---|
| 892 | 916 | .preinit = rockchip_vop_preinit, |
|---|
| 893 | 917 | .init = rockchip_vop_init, |
|---|
| .. | .. |
|---|
| 899 | 923 | .send_mcu_cmd = rockchip_vop_send_mcu_cmd, |
|---|
| 900 | 924 | .mode_valid = rockchip_vop_mode_valid, |
|---|
| 901 | 925 | .plane_check = rockchip_vop_plane_check, |
|---|
| 926 | + .mode_fixup = rockchip_vop_mode_fixup, |
|---|
| 902 | 927 | }; |
|---|