drm/msm/dp: dp_link_parse_sink_count() return immediately if aux read failed
Add checking aux read/write status at both dp_link_parse_sink_count() and dp_link_parse_sink_status_filed() to avoid long timeout delay if dp aux read/write failed at timeout due to cable unplugged. Changes in V4: -- split this patch as stand alone patch Changes in v5: -- rebase on msm-next branch Signed-off-by: Kuogee Hsieh <quic_khsieh@quicinc.com> Reviewed-by: Stephen Boyd <swboyd@chromium.org> Tested-by: Stephen Boyd <swboyd@chromium.org> Link: https://lore.kernel.org/r/1638985262-2072-1-git-send-email-quic_khsieh@quicinc.com Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
Родитель
44bf8704b7
Коммит
f61550b386
|
@ -693,9 +693,15 @@ static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
ret = dp_display_usbpd_attention_cb(&dp->pdev->dev);
|
||||
if (ret == -ECONNRESET) { /* cable unplugged */
|
||||
dp->core_initialized = false;
|
||||
/*
|
||||
* dp core (ahb/aux clks) must be initialized before
|
||||
* irq_hpd be handled
|
||||
*/
|
||||
if (dp->core_initialized) {
|
||||
ret = dp_display_usbpd_attention_cb(&dp->pdev->dev);
|
||||
if (ret == -ECONNRESET) { /* cable unplugged */
|
||||
dp->core_initialized = false;
|
||||
}
|
||||
}
|
||||
DRM_DEBUG_DP("hpd_state=%d\n", state);
|
||||
|
||||
|
|
|
@ -737,18 +737,25 @@ static int dp_link_parse_sink_count(struct dp_link *dp_link)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void dp_link_parse_sink_status_field(struct dp_link_private *link)
|
||||
static int dp_link_parse_sink_status_field(struct dp_link_private *link)
|
||||
{
|
||||
int len = 0;
|
||||
|
||||
link->prev_sink_count = link->dp_link.sink_count;
|
||||
dp_link_parse_sink_count(&link->dp_link);
|
||||
len = dp_link_parse_sink_count(&link->dp_link);
|
||||
if (len < 0) {
|
||||
DRM_ERROR("DP parse sink count failed\n");
|
||||
return len;
|
||||
}
|
||||
|
||||
len = drm_dp_dpcd_read_link_status(link->aux,
|
||||
link->link_status);
|
||||
if (len < DP_LINK_STATUS_SIZE)
|
||||
if (len < DP_LINK_STATUS_SIZE) {
|
||||
DRM_ERROR("DP link status read failed\n");
|
||||
dp_link_parse_request(link);
|
||||
return len;
|
||||
}
|
||||
|
||||
return dp_link_parse_request(link);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1023,7 +1030,9 @@ int dp_link_process_request(struct dp_link *dp_link)
|
|||
|
||||
dp_link_reset_data(link);
|
||||
|
||||
dp_link_parse_sink_status_field(link);
|
||||
ret = dp_link_parse_sink_status_field(link);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (link->request.test_requested == DP_TEST_LINK_EDID_READ) {
|
||||
dp_link->sink_request |= DP_TEST_LINK_EDID_READ;
|
||||
|
|
Загрузка…
Ссылка в новой задаче