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;