diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index bd48437f7f6c..e70704519d44 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -662,7 +662,7 @@ static int mdss_fb_blanking_mode_switch(struct msm_fb_data_type *mfd, int mode) unlock_fb_info(mfd->fbi); mutex_lock(&mfd->bl_lock); - mfd->bl_updated = true; + mfd->allow_bl_update = true; mdss_fb_set_backlight(mfd, bl_lvl); mutex_unlock(&mfd->bl_lock); @@ -1472,7 +1472,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) bool bl_notify_needed = false; if ((((mdss_fb_is_power_off(mfd) && mfd->dcm_state != DCM_ENTER) - || !mfd->bl_updated) && !IS_CALIB_MODE_BL(mfd)) || + || !mfd->allow_bl_update) && !IS_CALIB_MODE_BL(mfd)) || mfd->panel_info->cont_splash_enabled) { mfd->unset_bl_level = bkl_lvl; return; @@ -1526,7 +1526,7 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) if (!mfd->unset_bl_level) return; mutex_lock(&mfd->bl_lock); - if (!mfd->bl_updated) { + if (!mfd->allow_bl_update) { pdata = dev_get_platdata(&mfd->pdev->dev); if ((pdata) && (pdata->set_backlight)) { mfd->bl_level = mfd->unset_bl_level; @@ -1539,7 +1539,7 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) NOTIFY_TYPE_BL_AD_ATTEN_UPDATE); pdata->set_backlight(pdata, temp); mfd->bl_level_scaled = mfd->unset_bl_level; - mfd->bl_updated = 1; + mfd->allow_bl_update = true; } } mutex_unlock(&mfd->bl_lock); @@ -1645,7 +1645,7 @@ static int mdss_fb_blank_blank(struct msm_fb_data_type *mfd, mutex_lock(&mfd->bl_lock); current_bl = mfd->bl_level; mdss_fb_set_backlight(mfd, 0); - mfd->bl_updated = 0; + mfd->allow_bl_update = false; mfd->unset_bl_level = current_bl; mutex_unlock(&mfd->bl_lock); } @@ -1722,8 +1722,8 @@ static int mdss_fb_blank_unblank(struct msm_fb_data_type *mfd) /* Reset the backlight only if the panel was off */ if (mdss_panel_is_power_off(cur_power_state)) { mutex_lock(&mfd->bl_lock); - if (!mfd->bl_updated) { - mfd->bl_updated = 1; + if (!mfd->allow_bl_update) { + mfd->allow_bl_update = true; /* * If in AD calibration mode then frameworks would not * be allowed to update backlight hence post unblank @@ -1734,6 +1734,13 @@ static int mdss_fb_blank_unblank(struct msm_fb_data_type *mfd) mdss_fb_set_backlight(mfd, mfd->unset_bl_level); else mdss_fb_set_backlight(mfd, mfd->calib_mode_bl); + + /* + * it blocks the backlight update between unblank and + * first kickoff to avoid backlight turn on before black + * frame is transferred to panel through unblank call. + */ + mfd->allow_bl_update = false; } mutex_unlock(&mfd->bl_lock); } diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h index 9bb8b40cefab..4cc84e174b59 100644 --- a/drivers/video/fbdev/msm/mdss_fb.h +++ b/drivers/video/fbdev/msm/mdss_fb.h @@ -301,7 +301,7 @@ struct msm_fb_data_type { u32 bl_scale; u32 bl_min_lvl; u32 unset_bl_level; - u32 bl_updated; + bool allow_bl_update; u32 bl_level_scaled; struct mutex bl_lock; diff --git a/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c b/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c index f3e2b7e12e37..44ed609388e3 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c +++ b/drivers/video/fbdev/msm/mdss_mdp_splash_logo.c @@ -587,7 +587,7 @@ static int mdss_mdp_splash_thread(void *data) unlock_fb_info(mfd->fbi); mutex_lock(&mfd->bl_lock); - mfd->bl_updated = true; + mfd->allow_bl_update = true; mdss_fb_set_backlight(mfd, mfd->panel_info->bl_max >> 1); mutex_unlock(&mfd->bl_lock);