diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 37eb7e374cea..81b178ca3879 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -3408,6 +3408,14 @@ static void vop_update_csc(struct drm_crtc *crtc) else VOP_CTRL_SET(vop, dsp_data_swap, 0); + /* + * For RK3576 vopl, rg_swap and rb_swap need to be enabled in + * YUV444 bus_format. + */ + if ((VOP_MAJOR(vop->version) == 2 && VOP_MINOR(vop->version) == 0xd) && + s->bus_format == MEDIA_BUS_FMT_YUV8_1X24) + VOP_CTRL_SET(vop, dsp_data_swap, DSP_RG_SWAP | DSP_RB_SWAP); + VOP_CTRL_SET(vop, out_mode, s->output_mode); vop_dither_setup(crtc); diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index 13c62d1e01f2..ea0bf808af97 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -2016,7 +2016,7 @@ static const struct vop_ctrl rk3576_lit_ctrl_data = { .dither_down_en = VOP_REG(EBC_VOP_DSP_CTRL1, 0x1, 5), .dither_down_mode = VOP_REG(EBC_VOP_DSP_CTRL1, 0x1, 6), .dither_down_sel = VOP_REG(EBC_VOP_DSP_CTRL1, 0x1, 7), - .dsp_data_swap = VOP_REG(EBC_VOP_DSP_CTRL1, 0x1f, 9), + .dsp_data_swap = VOP_REG(EBC_VOP_DSP_CTRL1, 0x1f, 8), .dsp_bg_swap = VOP_REG(EBC_VOP_DSP_CTRL1, 0x1, 8), .dsp_rb_swap = VOP_REG(EBC_VOP_DSP_CTRL1, 0x1, 9), .dsp_rg_swap = VOP_REG(EBC_VOP_DSP_CTRL1, 0x1, 10),