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 <sbillaka@codeaurora.org>
This commit is contained in:
Sankeerth Billakanti 2019-10-30 11:39:12 +05:30
parent d236dbd5e0
commit e7780e7526
2 changed files with 7 additions and 7 deletions

View File

@ -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); ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);
atomic_set(&ctrl->aborted, 0);
if (ctrl->power_on) if (ctrl->power_on)
goto end; goto end;
if (atomic_read(&ctrl->aborted)) {
rc = -EPERM;
goto end;
}
ctrl->mst_mode = mst_mode; ctrl->mst_mode = mst_mode;
if (fec_mode) { if (fec_mode) {
ctrl->fec_mode = fec_mode; ctrl->fec_mode = fec_mode;

View File

@ -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->dp_display.max_pclk_khz = min(dp->parser->max_pclk_khz,
dp->debug->max_pclk_khz); dp->debug->max_pclk_khz);
dp_display_host_init(dp);
dp_display_host_ready(dp); dp_display_host_ready(dp);
dp->link->psm_config(dp->link, &dp->panel->link_info, false); 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_clean(dp);
dp_display_host_unready(dp); dp_display_host_unready(dp);
dp_display_host_deinit(dp);
mutex_unlock(&dp->session_lock); mutex_unlock(&dp->session_lock);
@ -1131,10 +1132,6 @@ static int dp_display_usbpd_disconnect_cb(struct device *dev)
dp_display_disconnect_sync(dp); 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 if (!dp->debug->sim_mode && !dp->parser->no_aux_switch
&& !dp->parser->gpio_aux_switch) && !dp->parser->gpio_aux_switch)
dp->aux->aux_switch(dp->aux, false, ORIENTATION_NONE); dp->aux->aux_switch(dp->aux, false, ORIENTATION_NONE);