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 <chandanu@codeaurora.org>
Signed-off-by: Benet Clark <benetc@codeaurora.org>
This commit is contained in:
Chandan Uddaraju 2014-04-14 18:56:24 -07:00 committed by David Keitel
parent f602fccdab
commit 7e06fea357
2 changed files with 16 additions and 5 deletions

View file

@ -610,6 +610,7 @@ static int mdss_fb_probe(struct platform_device *pdev)
mfd->ext_ad_ctrl = -1; mfd->ext_ad_ctrl = -1;
mfd->bl_level = 0; mfd->bl_level = 0;
mfd->bl_level_prev_scaled = 0;
mfd->bl_scale = 1024; mfd->bl_scale = 1024;
mfd->bl_min_lvl = 30; mfd->bl_min_lvl = 30;
mfd->fb_imgType = MDP_RGBA_8888; 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); pdata = dev_get_platdata(&mfd->pdev->dev);
if ((pdata) && (pdata->set_backlight)) { if ((pdata) && (pdata->set_backlight)) {
mfd->bl_level_prev_scaled = mfd->bl_level_scaled;
if (!IS_CALIB_MODE_BL(mfd)) if (!IS_CALIB_MODE_BL(mfd))
mdss_fb_scale_bl(mfd, &temp); 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 * as well as setting bl_level to bkl_lvl even though the
* backlight has been set to the scaled value. * 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; mfd->bl_level = bkl_lvl;
return; return;
} }
pdata->set_backlight(pdata, temp); pdata->set_backlight(pdata, temp);
mfd->bl_level = bkl_lvl; mfd->bl_level = bkl_lvl;
mfd->bl_level_old = temp; mfd->bl_level_scaled = temp;
if (mfd->mdp.update_ad_input) { if (mfd->mdp.update_ad_input) {
update_ad_input = 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)) { if ((pdata) && (pdata->set_backlight)) {
mfd->bl_level = mfd->unset_bl_level; mfd->bl_level = mfd->unset_bl_level;
pdata->set_backlight(pdata, mfd->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; 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, schedule_delayed_work(&mfd->idle_notify_work,
msecs_to_jiffies(mfd->idle_time)); 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; break;
case FB_BLANK_VSYNC_SUSPEND: 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; mfd->op_enable = false;
curr_pwr_state = mfd->panel_power_on; curr_pwr_state = mfd->panel_power_on;
mfd->panel_power_on = false;
mutex_lock(&mfd->bl_lock); mutex_lock(&mfd->bl_lock);
mdss_fb_set_backlight(mfd, 0);
mfd->panel_power_on = false;
mfd->bl_updated = 0; mfd->bl_updated = 0;
mutex_unlock(&mfd->bl_lock); mutex_unlock(&mfd->bl_lock);

View file

@ -213,7 +213,8 @@ struct msm_fb_data_type {
u32 bl_min_lvl; u32 bl_min_lvl;
u32 unset_bl_level; u32 unset_bl_level;
u32 bl_updated; u32 bl_updated;
u32 bl_level_old; u32 bl_level_scaled;
u32 bl_level_prev_scaled;
struct mutex bl_lock; struct mutex bl_lock;
struct platform_device *pdev; struct platform_device *pdev;