summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeevan Shriram <jshriram@codeaurora.org>2015-04-27 18:44:05 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:43:21 -0700
commit8bd3e27fb64c233e95e87a06347030774d70ab15 (patch)
tree2f8c2809b335c571641d8e8b1a7e318bb5221ca1
parentd6bf565bedd22038d1b7a5f85357ff5b2db4586a (diff)
msm: mdss: reset panel when wait4pingpong timeout is received
Due to various reasons wait4pingpong timeout can be observed and this usually results in split screen behaviour for the end user. Split screen is manifested because for a given frame only half of the pixel data was sent and then some kind of hang was observed. So unless the panel and display pipeline is restarted, next frames will start from the location where it hanged. Improve user behavior by resetting the display pipeline including panel by sending panel dead event to user-space. Upon receiving this event user-space should issue blank and un-blank which should recover the display pipeline. Change-Id: Iec674a61229cbc037d24cf4f62ceb02a977b219c Signed-off-by: Ujwal Patel <ujwalp@codeaurora.org> Signed-off-by: Naseer Ahmed <naseer@codeaurora.org> Signed-off-by: Jeevan Shriram <jshriram@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/dsi_status_6g.c29
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c25
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c1
4 files changed, 28 insertions, 28 deletions
diff --git a/drivers/video/fbdev/msm/dsi_status_6g.c b/drivers/video/fbdev/msm/dsi_status_6g.c
index 4231d64d5df9..269fd2c7aa5c 100644
--- a/drivers/video/fbdev/msm/dsi_status_6g.c
+++ b/drivers/video/fbdev/msm/dsi_status_6g.c
@@ -19,33 +19,6 @@
#include "mdss_mdp.h"
/*
- * mdss_report_panel_dead() - Sends the PANEL_ALIVE=0 status to HAL layer.
- * @pstatus_data : dsi status data
- *
- * This function is called if the panel fails to respond as expected to
- * the register read/BTA or if the TE signal is not coming as expected
- * from the panel. The function sends the PANEL_ALIVE=0 status to HAL
- * layer.
- */
-static void mdss_report_panel_dead(struct dsi_status_data *pstatus_data)
-{
- char *envp[2] = {"PANEL_ALIVE=0", NULL};
- struct mdss_panel_data *pdata =
- dev_get_platdata(&pstatus_data->mfd->pdev->dev);
- if (!pdata) {
- pr_err("%s: Panel data not available\n", __func__);
- return;
- }
-
- pdata->panel_info.panel_dead = true;
- kobject_uevent_env(&pstatus_data->mfd->fbi->dev->kobj,
- KOBJ_CHANGE, envp);
- pr_err("%s: Panel has gone bad, sending uevent - %s\n",
- __func__, envp[0]);
- return;
-}
-
-/*
* mdss_check_te_status() - Check the status of panel for TE based ESD.
* @ctrl_pdata : dsi controller data
* @pstatus_data : dsi status data
@@ -210,5 +183,5 @@ void mdss_check_dsi_ctrl_status(struct work_struct *work, uint32_t interval)
return;
status_dead:
- mdss_report_panel_dead(pstatus_data);
+ mdss_fb_report_panel_dead(pstatus_data->mfd);
}
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index 7f81fa32b8c2..efae3a4295b9 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -4205,3 +4205,28 @@ int mdss_fb_suspres_panel(struct device *dev, void *data)
}
return rc;
}
+
+/*
+ * mdss_fb_report_panel_dead() - Sends the PANEL_ALIVE=0 status to HAL layer.
+ * @mfd : frame buffer structure associated with fb device.
+ *
+ * This function is called if the panel fails to respond as expected to
+ * the register read/BTA or if the TE signal is not coming as expected
+ * from the panel. The function sends the PANEL_ALIVE=0 status to HAL
+ * layer.
+ */
+void mdss_fb_report_panel_dead(struct msm_fb_data_type *mfd)
+{
+ char *envp[2] = {"PANEL_ALIVE=0", NULL};
+ struct mdss_panel_data *pdata =
+ dev_get_platdata(&mfd->pdev->dev);
+ if (!pdata) {
+ pr_err("Panel data not available\n");
+ return;
+ }
+
+ pdata->panel_info.panel_dead = true;
+ kobject_uevent_env(&mfd->fbi->dev->kobj,
+ KOBJ_CHANGE, envp);
+ pr_err("Panel has gone bad, sending uevent - %s\n", envp[0]);
+}
diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h
index c9659c3b934d..41ef4e2d2c48 100644
--- a/drivers/video/fbdev/msm/mdss_fb.h
+++ b/drivers/video/fbdev/msm/mdss_fb.h
@@ -427,4 +427,5 @@ int mdss_fb_async_position_update(struct fb_info *info,
struct mdp_position_update *update_pos);
u32 mdss_fb_get_mode_switch(struct msm_fb_data_type *mfd);
+void mdss_fb_report_panel_dead(struct msm_fb_data_type *mfd);
#endif /* MDSS_FB_H */
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
index 1c8277aeebb9..dce0a09a2589 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
@@ -694,6 +694,7 @@ static int mdss_mdp_cmd_wait4pingpong(struct mdss_mdp_ctl *ctl, void *arg)
rc, ctl->num);
MDSS_XLOG_TOUT_HANDLER("mdp", "dsi0_ctrl", "dsi0_phy",
"dsi1_ctrl", "dsi1_phy", "panic");
+ mdss_fb_report_panel_dead(ctl->mfd);
}
ctx->pp_timeout_report_cnt++;
rc = -EPERM;