From e7780e75260fc59d8ba9d88fc268668ab03066ec Mon Sep 17 00:00:00 2001 From: Sankeerth Billakanti Date: Wed, 30 Oct 2019 11:39:12 +0530 Subject: [PATCH] disp: msm: dp: perform host_init/deinit to reset abort When doing multiple immediate plug-unplug, the DP display driver is waiting for a link training to exhaust the retry count before processing the disconnect request while flushing the connect_work. The driver should stop link training and exit if the link is disconnected. This change will use the ctrl_aborted flag to early return from link training and perform the host init/deinit and host ready/unready in pairs while handling connect/disconnect to reset the abort flags for the next connect. Change-Id: If321136ecf12ab2f67d13ef841f1590142aad406 Signed-off-by: Sankeerth Billakanti --- msm/dp/dp_ctrl.c | 7 +++++-- msm/dp/dp_display.c | 7 ++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/msm/dp/dp_ctrl.c b/msm/dp/dp_ctrl.c index d12ba53681..e4248297fd 100644 --- a/msm/dp/dp_ctrl.c +++ b/msm/dp/dp_ctrl.c @@ -1280,11 +1280,14 @@ static int dp_ctrl_on(struct dp_ctrl *dp_ctrl, bool mst_mode, ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); - atomic_set(&ctrl->aborted, 0); - if (ctrl->power_on) goto end; + if (atomic_read(&ctrl->aborted)) { + rc = -EPERM; + goto end; + } + ctrl->mst_mode = mst_mode; if (fec_mode) { ctrl->fec_mode = fec_mode; diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index 45b1a689ca..2e158b396f 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -859,7 +859,7 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp) dp->dp_display.max_pclk_khz = min(dp->parser->max_pclk_khz, dp->debug->max_pclk_khz); - + dp_display_host_init(dp); dp_display_host_ready(dp); dp->link->psm_config(dp->link, &dp->panel->link_info, false); @@ -1084,6 +1084,7 @@ static int dp_display_handle_disconnect(struct dp_display_private *dp) dp_display_clean(dp); dp_display_host_unready(dp); + dp_display_host_deinit(dp); mutex_unlock(&dp->session_lock); @@ -1131,10 +1132,6 @@ static int dp_display_usbpd_disconnect_cb(struct device *dev) dp_display_disconnect_sync(dp); - mutex_lock(&dp->session_lock); - dp_display_host_deinit(dp); - mutex_unlock(&dp->session_lock); - if (!dp->debug->sim_mode && !dp->parser->no_aux_switch && !dp->parser->gpio_aux_switch) dp->aux->aux_switch(dp->aux, false, ORIENTATION_NONE);