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:
parent
0178c6e499
commit
53863e5397
2 changed files with 19 additions and 6 deletions
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue