diff options
| author | Jeevan Shriram <jshriram@codeaurora.org> | 2015-04-27 18:44:05 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:43:21 -0700 |
| commit | 8bd3e27fb64c233e95e87a06347030774d70ab15 (patch) | |
| tree | 2f8c2809b335c571641d8e8b1a7e318bb5221ca1 | |
| parent | d6bf565bedd22038d1b7a5f85357ff5b2db4586a (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.c | 29 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.c | 25 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.h | 1 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 1 |
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; |
