msm: mdss: dp: enter failsafe mode on EDID read failure

Add support to enter failsafe mode on EDID read failures
that might be caused by corrupt EDID blocks or AUX
transaction failures. The failsafe mode for this driver
is 640x480 at 60fps, in accordance with the Display Port
v1.3 specification.

CRs-Fixed: 1076516
Change-Id: Ia3895fb0e860991173ffcde604c165d007cfa972
Signed-off-by: Tatenda Chipeperekwa <tatendac@codeaurora.org>
This commit is contained in:
Tatenda Chipeperekwa 2016-11-15 14:34:42 -08:00 committed by Gerrit - the friendly Code Review server
parent 0178c6e499
commit 53863e5397
2 changed files with 19 additions and 6 deletions

View file

@ -1450,6 +1450,12 @@ static int mdss_dp_notify_clients(struct mdss_dp_drv_pdata *dp, bool enable)
return mdss_dp_send_cable_notification(dp, enable);
}
static void mdss_dp_set_default_resolution(struct mdss_dp_drv_pdata *dp)
{
hdmi_edid_set_video_resolution(dp->panel_data.panel_info.edid_data,
DEFAULT_VIDEO_RESOLUTION, true);
}
static int mdss_dp_edid_init(struct mdss_panel_data *pdata)
{
struct mdss_dp_drv_pdata *dp_drv = NULL;
@ -1484,6 +1490,8 @@ static int mdss_dp_edid_init(struct mdss_panel_data *pdata)
dp_drv->edid_buf = edid_init_data.buf;
dp_drv->edid_buf_size = edid_init_data.buf_size;
mdss_dp_set_default_resolution(dp_drv);
return 0;
}
@ -1548,8 +1556,11 @@ static int mdss_dp_host_init(struct mdss_panel_data *pdata)
mdss_dp_dpcd_cap_read(dp_drv);
ret = mdss_dp_edid_read(dp_drv);
if (ret)
if (ret) {
pr_info("edid read error, setting default resolution\n");
mdss_dp_set_default_resolution(dp_drv);
goto edid_error;
}
pr_debug("edid_read success. buf_size=%d\n",
dp_drv->edid_buf_size);
@ -1560,14 +1571,13 @@ static int mdss_dp_host_init(struct mdss_panel_data *pdata)
goto edid_error;
}
edid_error:
mdss_dp_update_cable_status(dp_drv, true);
mdss_dp_notify_clients(dp_drv, true);
dp_drv->dp_initialized = true;
return ret;
edid_error:
mdss_dp_clk_ctrl(dp_drv, DP_CORE_PM, false);
clk_error:
mdss_dp_regulator_ctrl(dp_drv, false);
mdss_dp_config_gpios(dp_drv, false);

View file

@ -770,8 +770,11 @@ int mdss_dp_edid_read(struct mdss_dp_drv_pdata *dp)
pr_debug("blk_num=%d, rlen=%d\n", blk_num, rlen);
if (dp_edid_is_valid_header(rp->data)) {
if (dp_edid_buf_error(rp->data, rp->len))
continue;
ret = dp_edid_buf_error(rp->data, rp->len);
if (ret) {
pr_err("corrupt edid block detected\n");
goto end;
}
if (edid_parsing_done) {
blk_num++;
@ -817,7 +820,7 @@ end:
dp->test_data = (const struct dpcd_test_request){ 0 };
}
return 0;
return ret;
}
static void dp_sink_capability_read(struct mdss_dp_drv_pdata *ep,