diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 5ff69f9e..86c573d9 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -6652,16 +6652,6 @@ static void sde_crtc_install_properties(struct drm_crtc *crtc, vfree(info); } -static bool _is_crtc_intf_mode_wb(struct drm_crtc *crtc) -{ - enum sde_intf_mode intf_mode = sde_crtc_get_intf_mode(crtc, crtc->state); - - if ((intf_mode != INTF_MODE_WB_BLOCK) && (intf_mode != INTF_MODE_WB_LINE)) - return false; - - return true; -} - static int _sde_crtc_get_output_fence(struct drm_crtc *crtc, const struct drm_crtc_state *state, uint64_t *val) { diff --git a/msm/sde/sde_crtc.h b/msm/sde/sde_crtc.h index e3f24fb9..c506defc 100644 --- a/msm/sde/sde_crtc.h +++ b/msm/sde/sde_crtc.h @@ -950,6 +950,16 @@ static inline bool sde_crtc_state_in_clone_mode(struct drm_encoder *encoder, return false; } +static inline bool _is_crtc_intf_mode_wb(struct drm_crtc *crtc) +{ + enum sde_intf_mode intf_mode = sde_crtc_get_intf_mode(crtc, crtc->state); + + if ((intf_mode != INTF_MODE_WB_BLOCK) && (intf_mode != INTF_MODE_WB_LINE)) + return false; + + return true; +} + /** * sde_crtc_get_ds_io_res - populates the destination scaler src/dst w/h * @state: pointer to drm crtc state diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index acb746a9..9d03eba4 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -2232,7 +2232,11 @@ static int _sde_encoder_rc_idle(struct drm_encoder *drm_enc, } crtc_id = drm_crtc_index(crtc); - if (is_vid_mode) { + /** + * Avoid power collapse entry for writeback crtc since HAL does not repopulate + * crtc, plane properties like luts for idlepc exit commit. + */ + if (is_vid_mode || _is_crtc_intf_mode_wb(crtc)) { sde_encoder_irq_control(drm_enc, false); _sde_encoder_pm_qos_remove_request(drm_enc); } else {