From 7e06fea357f74f121ff9705247a3073686aaa313 Mon Sep 17 00:00:00 2001 From: Chandan Uddaraju Date: Mon, 14 Apr 2014 18:56:24 -0700 Subject: [PATCH] msm: mdss: control backlight level during blank and unblank events Add code to set the backlight level to zero for blank event and restore the backlight level to its previous value during unblank event. This will fix any unexpected panel flicker that might show up on the screen during panel ON sequence. CRs-Fixed: 608091 Change-Id: I871a067b0cc40d893b8b7e5a25103ebb914f9b7a Signed-off-by: Chandan Uddaraju Signed-off-by: Benet Clark --- drivers/video/fbdev/msm/mdss_fb.c | 18 ++++++++++++++---- drivers/video/fbdev/msm/mdss_fb.h | 3 ++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 2b7484e18701..3ed543431cbd 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -610,6 +610,7 @@ static int mdss_fb_probe(struct platform_device *pdev) mfd->ext_ad_ctrl = -1; mfd->bl_level = 0; + mfd->bl_level_prev_scaled = 0; mfd->bl_scale = 1024; mfd->bl_min_lvl = 30; mfd->fb_imgType = MDP_RGBA_8888; @@ -944,6 +945,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) pdata = dev_get_platdata(&mfd->pdev->dev); if ((pdata) && (pdata->set_backlight)) { + mfd->bl_level_prev_scaled = mfd->bl_level_scaled; if (!IS_CALIB_MODE_BL(mfd)) mdss_fb_scale_bl(mfd, &temp); /* @@ -954,13 +956,13 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) * as well as setting bl_level to bkl_lvl even though the * backlight has been set to the scaled value. */ - if (mfd->bl_level_old == temp) { + if (mfd->bl_level_scaled == temp) { mfd->bl_level = bkl_lvl; return; } pdata->set_backlight(pdata, temp); mfd->bl_level = bkl_lvl; - mfd->bl_level_old = temp; + mfd->bl_level_scaled = temp; if (mfd->mdp.update_ad_input) { update_ad_input = mfd->mdp.update_ad_input; @@ -983,7 +985,7 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) if ((pdata) && (pdata->set_backlight)) { mfd->bl_level = mfd->unset_bl_level; pdata->set_backlight(pdata, mfd->bl_level); - mfd->bl_level_old = mfd->unset_bl_level; + mfd->bl_level_scaled = mfd->unset_bl_level; mfd->bl_updated = 1; } } @@ -1020,6 +1022,13 @@ static int mdss_fb_blank_sub(int blank_mode, struct fb_info *info, schedule_delayed_work(&mfd->idle_notify_work, msecs_to_jiffies(mfd->idle_time)); } + + mutex_lock(&mfd->bl_lock); + if (!mfd->bl_updated) { + mfd->bl_updated = 1; + mdss_fb_set_backlight(mfd, mfd->bl_level_prev_scaled); + } + mutex_unlock(&mfd->bl_lock); break; case FB_BLANK_VSYNC_SUSPEND: @@ -1041,8 +1050,9 @@ static int mdss_fb_blank_sub(int blank_mode, struct fb_info *info, mfd->op_enable = false; curr_pwr_state = mfd->panel_power_on; - mfd->panel_power_on = false; mutex_lock(&mfd->bl_lock); + mdss_fb_set_backlight(mfd, 0); + mfd->panel_power_on = false; mfd->bl_updated = 0; mutex_unlock(&mfd->bl_lock); diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h index 990a8a83717f..6a791bfa7f55 100644 --- a/drivers/video/fbdev/msm/mdss_fb.h +++ b/drivers/video/fbdev/msm/mdss_fb.h @@ -213,7 +213,8 @@ struct msm_fb_data_type { u32 bl_min_lvl; u32 unset_bl_level; u32 bl_updated; - u32 bl_level_old; + u32 bl_level_scaled; + u32 bl_level_prev_scaled; struct mutex bl_lock; struct platform_device *pdev;