drm/rockchip: vop2: bcsh add support 8k

Signed-off-by: Sandy Huang <hjc@rock-chips.com>
Change-Id: I2ff73d12b9d6100c5bbfb96229166800841356ac
This commit is contained in:
Sandy Huang
2021-12-08 15:38:18 +08:00
committed by Tao Huang
parent 4dad387418
commit 696cf91c28
2 changed files with 48 additions and 15 deletions

View File

@@ -84,6 +84,14 @@ struct rockchip_hdr_state {
struct rockchip_sdr2hdr_state sdr2hdr_state;
};
struct rockchip_bcsh_state {
int brightness;
int contrast;
int saturation;
int sin_hue;
int cos_hue;
};
struct rockchip_crtc {
struct drm_crtc crtc;
#if defined(CONFIG_ROCKCHIP_DRM_DEBUG)

View File

@@ -6839,6 +6839,31 @@ out:
kfree(vop2_zpos);
}
static void vop2_bcsh_reg_update(struct rockchip_crtc_state *vcstate,
struct vop2_video_port *vp,
struct rockchip_bcsh_state *bcsh_state)
{
struct vop2 *vop2 = vp->vop2;
VOP_MODULE_SET(vop2, vp, bcsh_r2y_en, vcstate->post_r2y_en);
VOP_MODULE_SET(vop2, vp, bcsh_y2r_en, vcstate->post_y2r_en);
VOP_MODULE_SET(vop2, vp, bcsh_r2y_csc_mode, vcstate->post_csc_mode);
VOP_MODULE_SET(vop2, vp, bcsh_y2r_csc_mode, vcstate->post_csc_mode);
if (!vcstate->bcsh_en) {
VOP_MODULE_SET(vop2, vp, bcsh_en, vcstate->bcsh_en);
return;
}
VOP_MODULE_SET(vop2, vp, bcsh_brightness, bcsh_state->brightness);
VOP_MODULE_SET(vop2, vp, bcsh_contrast, bcsh_state->contrast);
VOP_MODULE_SET(vop2, vp, bcsh_sat_con,
bcsh_state->saturation * bcsh_state->contrast / 0x100);
VOP_MODULE_SET(vop2, vp, bcsh_sin_hue, bcsh_state->sin_hue);
VOP_MODULE_SET(vop2, vp, bcsh_cos_hue, bcsh_state->cos_hue);
VOP_MODULE_SET(vop2, vp, bcsh_out_mode, BCSH_OUT_MODE_NORMAL_VIDEO);
VOP_MODULE_SET(vop2, vp, bcsh_en, vcstate->bcsh_en);
}
static void vop2_tv_config_update(struct drm_crtc *crtc,
struct drm_crtc_state *old_crtc_state)
{
@@ -6851,6 +6876,7 @@ static void vop2_tv_config_update(struct drm_crtc *crtc,
const struct vop2_data *vop2_data = vop2->data;
const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id];
int brightness, contrast, saturation, hue, sin_hue, cos_hue;
struct rockchip_bcsh_state bcsh_state;
if (!vcstate->tv_state)
return;
@@ -6891,14 +6917,6 @@ static void vop2_tv_config_update(struct drm_crtc *crtc,
}
vcstate->post_csc_mode = vop2_convert_csc_mode(vcstate->color_space);
VOP_MODULE_SET(vop2, vp, bcsh_r2y_en, vcstate->post_r2y_en);
VOP_MODULE_SET(vop2, vp, bcsh_y2r_en, vcstate->post_y2r_en);
VOP_MODULE_SET(vop2, vp, bcsh_r2y_csc_mode, vcstate->post_csc_mode);
VOP_MODULE_SET(vop2, vp, bcsh_y2r_csc_mode, vcstate->post_csc_mode);
if (!vcstate->bcsh_en) {
VOP_MODULE_SET(vop2, vp, bcsh_en, vcstate->bcsh_en);
return;
}
if (vp_data->feature & VOP_FEATURE_OUTPUT_10BIT)
brightness = interpolate(0, -128, 100, 127,
@@ -6920,13 +6938,20 @@ static void vop2_tv_config_update(struct drm_crtc *crtc,
*/
sin_hue = fixp_sin32(hue) >> 23;
cos_hue = fixp_cos32(hue) >> 23;
VOP_MODULE_SET(vop2, vp, bcsh_brightness, brightness);
VOP_MODULE_SET(vop2, vp, bcsh_contrast, contrast);
VOP_MODULE_SET(vop2, vp, bcsh_sat_con, saturation * contrast / 0x100);
VOP_MODULE_SET(vop2, vp, bcsh_sin_hue, sin_hue);
VOP_MODULE_SET(vop2, vp, bcsh_cos_hue, cos_hue);
VOP_MODULE_SET(vop2, vp, bcsh_out_mode, BCSH_OUT_MODE_NORMAL_VIDEO);
VOP_MODULE_SET(vop2, vp, bcsh_en, vcstate->bcsh_en);
bcsh_state.brightness = brightness;
bcsh_state.contrast = contrast;
bcsh_state.saturation = saturation;
bcsh_state.sin_hue = sin_hue;
bcsh_state.cos_hue = cos_hue;
vop2_bcsh_reg_update(vcstate, vp, &bcsh_state);
if (vcstate->splice_mode) {
const struct vop2_video_port_data *vp_data = &vop2->data->vp[vp->id];
struct vop2_video_port *splice_vp = &vop2->vps[vp_data->splice_vp_id];
vop2_bcsh_reg_update(vcstate, splice_vp, &bcsh_state);
}
}
static void vop2_cfg_update(struct drm_crtc *crtc,