summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Salido-Moreno <adrianm@codeaurora.org>2013-04-30 14:13:55 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:16:50 -0700
commitdee85f563cd31ef86eedc5c3598296a753b438a7 (patch)
tree716f59d33875912c031cfcf01c09a3285f84ca47
parent4b1c8a55667752061e3fef39964a52be6db82d12 (diff)
msm: mdss: propagate error in case of panel on failure
There are cases in which panel on can fail for any reason, such as unable to properly get and lock on to hardware resources. For such cases the error needs to be properly propagated so that the state of MDP can be reset and user space application can invoke some recovery mechanism. Change-Id: I0da17038e11e6b972740dd6362c1a75bd2bd2b28 Signed-off-by: Adrian Salido-Moreno <adrianm@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_video.c10
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c18
3 files changed, 19 insertions, 10 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index 7fb5ffaefa28..920da0daaf61 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -953,6 +953,7 @@ static int mdss_fb_open(struct fb_info *info, int user)
result = mdss_fb_blank_sub(FB_BLANK_UNBLANK, info,
mfd->op_enable);
if (result) {
+ pm_runtime_put(info->dev);
pr_err("mdss_fb_open: can't turn on display!\n");
return result;
}
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
index aa4b6df941ec..638c73ffab92 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
@@ -431,6 +431,8 @@ static int mdss_mdp_video_wait4comp(struct mdss_mdp_ctl *ctl, void *arg)
ctl->num);
ctx->polling_en++;
rc = mdss_mdp_video_pollwait(ctl);
+ } else {
+ rc = 0;
}
}
@@ -476,7 +478,13 @@ static int mdss_mdp_video_display(struct mdss_mdp_ctl *ctl, void *arg)
if (!ctx->timegen_en) {
rc = mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_UNBLANK, NULL);
- WARN(rc, "intf %d unblank error (%d)\n", ctl->intf_num, rc);
+ if (rc) {
+ pr_warn("intf #%d unblank error (%d)\n",
+ ctl->intf_num, rc);
+ video_vsync_irq_disable(ctl);
+ ctx->wait_pending = 0;
+ return rc;
+ }
pr_debug("enabling timing gen for intf=%d\n", ctl->intf_num);
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index 08dddea810e4..ac1c4ce565d4 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -39,6 +39,7 @@
static atomic_t ov_active_panels = ATOMIC_INIT(0);
static int mdss_mdp_overlay_free_fb_pipe(struct msm_fb_data_type *mfd);
static int mdss_mdp_overlay_fb_parse_dt(struct msm_fb_data_type *mfd);
+static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd);
static int mdss_mdp_overlay_get(struct msm_fb_data_type *mfd,
struct mdp_overlay *req)
@@ -603,7 +604,7 @@ static inline int mdss_mdp_overlay_free_buf(struct mdss_mdp_data *data)
return 0;
}
-static int mdss_mdp_overlay_cleanup(struct msm_fb_data_type *mfd)
+static void mdss_mdp_overlay_cleanup(struct msm_fb_data_type *mfd)
{
struct mdss_mdp_pipe *pipe, *tmp;
struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
@@ -628,8 +629,6 @@ static int mdss_mdp_overlay_cleanup(struct msm_fb_data_type *mfd)
mutex_unlock(&mfd->lock);
list_for_each_entry_safe(pipe, tmp, &destroy_pipes, cleanup_list)
mdss_mdp_pipe_destroy(pipe);
-
- return 0;
}
static int mdss_mdp_overlay_start(struct msm_fb_data_type *mfd)
@@ -740,7 +739,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd)
mutex_unlock(&mfd->no_update.lock);
commit_fail:
- ret = mdss_mdp_overlay_cleanup(mfd);
+ mdss_mdp_overlay_cleanup(mfd);
mutex_unlock(&mdp5_data->ov_lock);
@@ -935,7 +934,7 @@ static int mdss_mdp_overlay_queue(struct msm_fb_data_type *mfd,
return ret;
}
-static int mdss_mdp_overlay_force_cleanup(struct msm_fb_data_type *mfd)
+static void mdss_mdp_overlay_force_cleanup(struct msm_fb_data_type *mfd)
{
struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd);
struct mdss_mdp_ctl *ctl = mdp5_data->ctl;
@@ -953,9 +952,7 @@ static int mdss_mdp_overlay_force_cleanup(struct msm_fb_data_type *mfd)
mdss_mdp_display_wait4comp(ctl);
}
- ret = mdss_mdp_overlay_cleanup(mfd);
-
- return ret;
+ mdss_mdp_overlay_cleanup(mfd);
}
static void mdss_mdp_overlay_force_dma_cleanup(struct mdss_data_type *mdata)
@@ -1828,7 +1825,10 @@ static int mdss_mdp_overlay_on(struct msm_fb_data_type *mfd)
return rc;
}
- if (!IS_ERR_VALUE(rc) && mdp5_data->vsync_pending) {
+ if (IS_ERR_VALUE(rc)) {
+ pr_err("Failed to turn on fb%d\n", mfd->index);
+ mdss_mdp_overlay_off(mfd);
+ } else if (mdp5_data->vsync_pending) {
mdp5_data->vsync_pending = 0;
mdss_mdp_overlay_vsync_ctrl(mfd, mdp5_data->vsync_pending);
}