summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorTatenda Chipeperekwa <tatendac@codeaurora.org>2016-11-15 14:34:42 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-11-29 11:43:11 -0800
commit53863e53970ab9bfef1f085e3fad7bc5311cb1bd (patch)
tree333c54cc1006b42fd51be88a5040300cc208810e /drivers/video
parent0178c6e499024f16f90cbe2e8b95a078b8a3a339 (diff)
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>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/fbdev/msm/mdss_dp.c16
-rw-r--r--drivers/video/fbdev/msm/mdss_dp_aux.c9
2 files changed, 19 insertions, 6 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dp.c b/drivers/video/fbdev/msm/mdss_dp.c
index ee0f43573c56..59c660002759 100644
--- a/drivers/video/fbdev/msm/mdss_dp.c
+++ b/drivers/video/fbdev/msm/mdss_dp.c
@@ -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);
diff --git a/drivers/video/fbdev/msm/mdss_dp_aux.c b/drivers/video/fbdev/msm/mdss_dp_aux.c
index 90afae40faa1..173851071b7a 100644
--- a/drivers/video/fbdev/msm/mdss_dp_aux.c
+++ b/drivers/video/fbdev/msm/mdss_dp_aux.c
@@ -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,