From f97adf46f51a0e6629db292b162b850b0faad497 Mon Sep 17 00:00:00 2001 From: Dhaval Patel Date: Wed, 21 Oct 2015 10:55:51 -0700 Subject: [PATCH] msm: mdss: fix backlight update between unblank and kickoff The backlight update between unblank and kickoff call may result in garbage/snow screen on panel based on panel ram initialized status. For ex: -> Unblank the panel - black frame transfer start, panel is on but ram is still uninitialized. -> backlight update - turn on the backlight. It will show data from uninitialized ram because frame transfer is not complete yet. This can be avoided by blocking the backlight update request between unblank and first frame kickoff. This gives guarantee that panel has valid data to display when backlight was turned on. Change-Id: I09c707cd10acd53bd6aa0935885269ffc5aec649 Signed-off-by: Dhaval Patel --- drivers/video/fbdev/msm/mdss_fb.c | 21 ++++++++++++------- drivers/video/fbdev/msm/mdss_fb.h | 2 +- .../video/fbdev/msm/mdss_mdp_splash_logo.c | 2 +- 3 files changed, 16 insertions(+), 9 deletions(-) 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);