diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index e9af5f4981..1e6002ce8e 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -1546,14 +1546,11 @@ static void _sde_crtc_blend_setup(struct drm_crtc *crtc, } for (i = 0; i < sde_crtc->num_mixers; i++) { - if (!mixer[i].hw_lm || !mixer[i].hw_ctl) { + if (!mixer[i].hw_lm) { SDE_ERROR("invalid lm or ctl assigned to mixer\n"); return; } mixer[i].mixer_op_mode = 0; - if (mixer[i].hw_ctl->ops.clear_all_blendstages) - mixer[i].hw_ctl->ops.clear_all_blendstages( - mixer[i].hw_ctl); /* clear dim_layer settings */ lm = mixer[i].hw_lm; @@ -3078,6 +3075,22 @@ static void _sde_crtc_setup_lm_bounds(struct drm_crtc *crtc, drm_mode_debug_printmodeline(adj_mode); } +static void _sde_crtc_clear_all_blend_stages(struct sde_crtc *sde_crtc) +{ + struct sde_crtc_mixer mixer; + + /* + * Use mixer[0] to get hw_ctl which will use ops to clear + * all blendstages. Clear all blendstages will iterate through + * all mixers. + */ + if (sde_crtc->num_mixers) { + mixer = sde_crtc->mixers[0]; + if (mixer.hw_ctl && mixer.hw_ctl->ops.clear_all_blendstages) + mixer.hw_ctl->ops.clear_all_blendstages(mixer.hw_ctl); + } +} + static void sde_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_crtc_state *old_state) { @@ -3119,6 +3132,7 @@ static void sde_crtc_atomic_begin(struct drm_crtc *crtc, _sde_crtc_setup_mixers(crtc); _sde_crtc_setup_is_ppsplit(crtc->state); _sde_crtc_setup_lm_bounds(crtc, crtc->state); + _sde_crtc_clear_all_blend_stages(sde_crtc); } list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { @@ -3999,6 +4013,7 @@ static void sde_crtc_disable(struct drm_crtc *crtc) ktime_get()); } + _sde_crtc_clear_all_blend_stages(sde_crtc); memset(sde_crtc->mixers, 0, sizeof(sde_crtc->mixers)); sde_crtc->num_mixers = 0; sde_crtc->mixers_swapped = false;