|
@@ -3381,10 +3381,10 @@ void sde_encoder_helper_phys_disable(struct sde_encoder_phys *phys_enc,
|
|
{
|
|
{
|
|
struct sde_encoder_virt *sde_enc;
|
|
struct sde_encoder_virt *sde_enc;
|
|
|
|
|
|
- if (wb_enc) {
|
|
|
|
- if (sde_encoder_helper_reset_mixers(phys_enc, NULL))
|
|
|
|
- return;
|
|
|
|
|
|
+ phys_enc->hw_ctl->ops.reset(phys_enc->hw_ctl);
|
|
|
|
+ sde_encoder_helper_reset_mixers(phys_enc, NULL);
|
|
|
|
|
|
|
|
+ if (wb_enc) {
|
|
if (wb_enc->hw_wb->ops.bind_pingpong_blk) {
|
|
if (wb_enc->hw_wb->ops.bind_pingpong_blk) {
|
|
wb_enc->hw_wb->ops.bind_pingpong_blk(wb_enc->hw_wb,
|
|
wb_enc->hw_wb->ops.bind_pingpong_blk(wb_enc->hw_wb,
|
|
false, phys_enc->hw_pp->idx);
|
|
false, phys_enc->hw_pp->idx);
|
|
@@ -4180,34 +4180,22 @@ void sde_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc)
|
|
struct sde_encoder_phys *phys;
|
|
struct sde_encoder_phys *phys;
|
|
unsigned int i;
|
|
unsigned int i;
|
|
struct sde_hw_ctl *ctl;
|
|
struct sde_hw_ctl *ctl;
|
|
- struct msm_display_info *disp_info;
|
|
|
|
|
|
|
|
if (!drm_enc) {
|
|
if (!drm_enc) {
|
|
SDE_ERROR("invalid encoder\n");
|
|
SDE_ERROR("invalid encoder\n");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
sde_enc = to_sde_encoder_virt(drm_enc);
|
|
sde_enc = to_sde_encoder_virt(drm_enc);
|
|
- disp_info = &sde_enc->disp_info;
|
|
|
|
|
|
|
|
for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
|
for (i = 0; i < sde_enc->num_phys_encs; i++) {
|
|
phys = sde_enc->phys_encs[i];
|
|
phys = sde_enc->phys_encs[i];
|
|
|
|
|
|
- if (phys && phys->hw_ctl) {
|
|
|
|
|
|
+ if (phys && phys->hw_ctl && (phys == sde_enc->cur_master) &&
|
|
|
|
+ sde_encoder_check_curr_mode(drm_enc,
|
|
|
|
+ MSM_DISPLAY_CMD_MODE)) {
|
|
ctl = phys->hw_ctl;
|
|
ctl = phys->hw_ctl;
|
|
- /*
|
|
|
|
- * avoid clearing the pending flush during the first
|
|
|
|
- * frame update after idle power collpase as the
|
|
|
|
- * restore path would have updated the pending flush
|
|
|
|
- */
|
|
|
|
- if (!sde_enc->idle_pc_restore &&
|
|
|
|
- ctl->ops.clear_pending_flush)
|
|
|
|
- ctl->ops.clear_pending_flush(ctl);
|
|
|
|
-
|
|
|
|
|
|
+ if (ctl->ops.trigger_pending)
|
|
/* update only for command mode primary ctl */
|
|
/* update only for command mode primary ctl */
|
|
- if ((phys == sde_enc->cur_master) &&
|
|
|
|
- (sde_encoder_check_curr_mode(drm_enc,
|
|
|
|
- MSM_DISPLAY_CMD_MODE))
|
|
|
|
- && ctl->ops.trigger_pending)
|
|
|
|
ctl->ops.trigger_pending(ctl);
|
|
ctl->ops.trigger_pending(ctl);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -4933,6 +4921,7 @@ void sde_encoder_prepare_commit(struct drm_encoder *drm_enc)
|
|
struct sde_encoder_virt *sde_enc;
|
|
struct sde_encoder_virt *sde_enc;
|
|
struct sde_encoder_phys *phys;
|
|
struct sde_encoder_phys *phys;
|
|
int i;
|
|
int i;
|
|
|
|
+ struct sde_hw_ctl *ctl;
|
|
|
|
|
|
if (!drm_enc) {
|
|
if (!drm_enc) {
|
|
SDE_ERROR("invalid encoder\n");
|
|
SDE_ERROR("invalid encoder\n");
|
|
@@ -4944,6 +4933,18 @@ void sde_encoder_prepare_commit(struct drm_encoder *drm_enc)
|
|
phys = sde_enc->phys_encs[i];
|
|
phys = sde_enc->phys_encs[i];
|
|
if (phys && phys->ops.prepare_commit)
|
|
if (phys && phys->ops.prepare_commit)
|
|
phys->ops.prepare_commit(phys);
|
|
phys->ops.prepare_commit(phys);
|
|
|
|
+
|
|
|
|
+ if (phys && phys->hw_ctl) {
|
|
|
|
+ ctl = phys->hw_ctl;
|
|
|
|
+ /*
|
|
|
|
+ * avoid clearing the pending flush during the first
|
|
|
|
+ * frame update after idle power collpase as the
|
|
|
|
+ * restore path would have updated the pending flush
|
|
|
|
+ */
|
|
|
|
+ if (!sde_enc->idle_pc_restore &&
|
|
|
|
+ ctl->ops.clear_pending_flush)
|
|
|
|
+ ctl->ops.clear_pending_flush(ctl);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|