DP mainlink can be either enabled or disabled at the time of suspend happen. Therefore DP phy teared down at suspend should base on mainlink status at that instance. Signed-off-by: Kuogee Hsieh <khsieh@xxxxxxxxxxxxxx> --- drivers/gpu/drm/msm/dp/dp_ctrl.c | 5 ++++- drivers/gpu/drm/msm/dp/dp_ctrl.h | 2 +- drivers/gpu/drm/msm/dp/dp_display.c | 9 ++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c index dbd8943..5115c05 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c @@ -1398,7 +1398,7 @@ int dp_ctrl_host_init(struct dp_ctrl *dp_ctrl, bool flip, bool reset) * Perform required steps to uninitialize DP controller * and its resources. */ -void dp_ctrl_host_deinit(struct dp_ctrl *dp_ctrl) +void dp_ctrl_host_deinit(struct dp_ctrl *dp_ctrl, bool mainlink_on) { struct dp_ctrl_private *ctrl; struct dp_io *dp_io; @@ -1414,6 +1414,9 @@ void dp_ctrl_host_deinit(struct dp_ctrl *dp_ctrl) phy = dp_io->phy; dp_catalog_ctrl_enable_irq(ctrl->catalog, false); + if (mainlink_on) + phy_power_off(phy); + phy_exit(phy); DRM_DEBUG_DP("Host deinitialized successfully\n"); diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.h b/drivers/gpu/drm/msm/dp/dp_ctrl.h index 25e4f75..a23ee2b 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.h +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.h @@ -20,7 +20,7 @@ struct dp_ctrl { }; int dp_ctrl_host_init(struct dp_ctrl *dp_ctrl, bool flip, bool reset); -void dp_ctrl_host_deinit(struct dp_ctrl *dp_ctrl); +void dp_ctrl_host_deinit(struct dp_ctrl *dp_ctrl, bool mainlink_on); int dp_ctrl_on_link(struct dp_ctrl *dp_ctrl); int dp_ctrl_on_stream(struct dp_ctrl *dp_ctrl); int dp_ctrl_off_link_stream(struct dp_ctrl *dp_ctrl); diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index cdec0a3..88eeeb5 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -104,6 +104,8 @@ struct dp_display_private { bool encoder_mode_set; + bool mainlink_on; + /* wait for audio signaling */ struct completion audio_comp; @@ -353,11 +355,14 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) dp_link_psm_config(dp->link, &dp->panel->link_info, false); dp_link_reset_phy_params_vx_px(dp->link); + + dp->mainlink_on = false; rc = dp_ctrl_on_link(dp->ctrl); if (rc) { DRM_ERROR("failed to complete DP link training\n"); goto end; } + dp->mainlink_on = true; dp_add_event(dp, EV_USER_NOTIFICATION, true, 0); @@ -392,7 +397,7 @@ static void dp_display_host_deinit(struct dp_display_private *dp) return; } - dp_ctrl_host_deinit(dp->ctrl); + dp_ctrl_host_deinit(dp->ctrl, dp->mainlink_on); dp_aux_deinit(dp->aux); dp_power_deinit(dp->power); @@ -941,6 +946,8 @@ static int dp_display_disable(struct dp_display_private *dp, u32 data) dp->core_initialized = false; } + dp->mainlink_on = false; + dp_display->power_on = false; return 0; -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project