diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index f28edac9fe06..667bc2865416 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -628,6 +628,8 @@ static bool is_yuv_output(uint32_t bus_format) case MEDIA_BUS_FMT_YUV10_1X30: case MEDIA_BUS_FMT_UYYVYY8_0_5X24: case MEDIA_BUS_FMT_UYYVYY10_0_5X30: + case MEDIA_BUS_FMT_YUYV8_2X8: + case MEDIA_BUS_FMT_YUYV8_1X16: return true; default: return false; @@ -2861,7 +2863,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, */ if (vop->lut_active) vop_crtc_load_lut(crtc); - dclk_inv = (adjusted_mode->flags & DRM_MODE_FLAG_CLKDIV2) ? 0 : 1; + dclk_inv = (adjusted_mode->flags & DRM_MODE_FLAG_PPIXDATA) ? 0 : 1; VOP_CTRL_SET(vop, dclk_pol, dclk_inv); val = (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) ? @@ -2885,8 +2887,12 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc, VOP_CTRL_SET(vop, lvds_en, 1); VOP_CTRL_SET(vop, lvds_pin_pol, val); VOP_CTRL_SET(vop, lvds_dclk_pol, dclk_inv); + VOP_GRF_SET(vop, grf_dclk_inv, dclk_inv); - VOP_GRF_SET(vop, grf_dclk_inv, !dclk_inv); + if (s->bus_format == MEDIA_BUS_FMT_YUYV8_1X16) { + VOP_CTRL_SET(vop, bt1120_en, 1); + VOP_CTRL_SET(vop, bt1120_yc_swap, 1); + } break; case DRM_MODE_CONNECTOR_eDP: VOP_CTRL_SET(vop, edp_en, 1); diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 3b079a09c87a..ac191386d0d3 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -81,10 +81,11 @@ struct vop_reg_data { struct vop_reg { uint32_t mask; - uint32_t offset:12; + uint32_t offset:17; uint32_t shift:5; uint32_t begin_minor:4; uint32_t end_minor:4; + uint32_t reserved:2; uint32_t major:3; uint32_t write_mask:1; }; @@ -239,6 +240,10 @@ struct vop_ctrl { struct vop_reg mcu_type; struct vop_reg mcu_rw_bypass_port; + /* bt1120 */ + struct vop_reg bt1120_yc_swap; + struct vop_reg bt1120_en; + struct vop_reg reg_done_frm; struct vop_reg cfg_done; }; @@ -511,8 +516,10 @@ struct vop_data { * display output interface supported by rockchip lcdc */ #define ROCKCHIP_OUT_MODE_P888 0 +#define ROCKCHIP_OUT_MODE_BT1120 0 #define ROCKCHIP_OUT_MODE_P666 1 #define ROCKCHIP_OUT_MODE_P565 2 +#define ROCKCHIP_OUT_MODE_BT656 5 #define ROCKCHIP_OUT_MODE_S888 8 #define ROCKCHIP_OUT_MODE_S888_DUMMY 12 #define ROCKCHIP_OUT_MODE_YUV420 14