hc
2023-11-06 9df731a176aab8e03b984b681b1bea01ccff6644
u-boot/drivers/video/drm/rockchip_vop.c
....@@ -97,6 +97,19 @@
9797 return false;
9898 }
9999
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
+
100113 static int rockchip_vop_init_gamma(struct vop *vop, struct display_state *state)
101114 {
102115 struct crtc_state *crtc_state = &state->crtc_state;
....@@ -298,7 +311,7 @@
298311 VOP_CTRL_SET(vop, win_channel[2], 0x56);
299312 VOP_CTRL_SET(vop, dsp_blank, 0);
300313
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;
302315 /* For improving signal quality, dclk need to be inverted by default on rv1106. */
303316 if ((VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) == 12))
304317 dclk_inv = !dclk_inv;
....@@ -403,8 +416,9 @@
403416 VOP_CTRL_SET(vop, hdmi_dclk_out_en,
404417 conn_state->output_mode == ROCKCHIP_OUT_MODE_YUV420 ? 1 : 0);
405418
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);
408422 else
409423 VOP_CTRL_SET(vop, dsp_data_swap, 0);
410424
....@@ -888,6 +902,16 @@
888902 return 0;
889903 }
890904
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
+
891915 const struct rockchip_crtc_funcs rockchip_vop_funcs = {
892916 .preinit = rockchip_vop_preinit,
893917 .init = rockchip_vop_init,
....@@ -899,4 +923,5 @@
899923 .send_mcu_cmd = rockchip_vop_send_mcu_cmd,
900924 .mode_valid = rockchip_vop_mode_valid,
901925 .plane_check = rockchip_vop_plane_check,
926
+ .mode_fixup = rockchip_vop_mode_fixup,
902927 };