diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h index 335254d23c31..d01c7ab1d131 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.h @@ -672,6 +672,7 @@ struct vop2_data { uint8_t nr_mixers; uint8_t nr_layers; uint8_t nr_axi_intr; + uint8_t nr_gammas; const struct vop_intr *axi_intr; const struct vop2_ctrl *ctrl; const struct vop2_win_data *win; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 8a67a7214937..3b02e3c29b9f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -2206,6 +2206,7 @@ static void vop2_crtc_load_lut(struct drm_crtc *crtc) struct vop2_video_port *vp = to_vop2_video_port(crtc); struct vop2 *vop2 = vp->vop2; int dle = 0, i = 0; + u8 vp_enable_gamma_nr = 0; if (!vop2->is_enabled || !vp->lut || !vop2->lut_regs) return; @@ -2213,6 +2214,18 @@ static void vop2_crtc_load_lut(struct drm_crtc *crtc) if (WARN_ON(!drm_modeset_is_locked(&crtc->mutex))) return; + for (i = 0; i < vop2->data->nr_vps; i++) { + struct vop2_video_port *vp = &vop2->vps[i]; + + if (vp->gamma_lut_active) + vp_enable_gamma_nr++; + } + + if (vop2->data->nr_gammas && vp_enable_gamma_nr >= vop2->data->nr_gammas) { + DRM_INFO("only support %d gamma\n", vop2->data->nr_gammas); + return; + } + spin_lock(&vop2->reg_lock); VOP_MODULE_SET(vop2, vp, dsp_lut_en, 0); vop2_cfg_done(crtc); diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index 7407031a9d60..c0931334ef02 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -1253,6 +1253,7 @@ static const struct vop2_data rk3568_vop = { .version = VOP_VERSION(0x40, 0x15), .nr_vps = 3, .nr_mixers = 5, + .nr_gammas = 1, .max_input = { 4096, 2304 }, .max_output = { 4096, 2304 }, .ctrl = &rk3568_vop_ctrl,