diff options
| author | Ping Li <quicpingli@codeaurora.org> | 2014-03-17 10:06:47 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:28:56 -0700 |
| commit | ee779a5bd98d47e27019cbb9bc74a97053dc77a6 (patch) | |
| tree | ac3cd8eaf5046278ecdf379bddb1b65ce3c66a21 | |
| parent | 01ea04c62e5cfd3e64058f21b31cbb9dd9073917 (diff) | |
msm: mdss: Add update notify for backlight change in static screen
Previously, the change of backlight sysfs node value will not trigger
notify updates if display is in static screen case. This will cause
delay or wrong configuration for assertive display. This patch fixes
the above issue by adding an update notify if backlight changes when
there are no display updates.
Change-Id: I1475896214a50dc1fa71739aa751b2e626d27adb
Signed-off-by: Ping Li <quicpingli@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.c | 40 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.h | 1 | ||||
| -rw-r--r-- | include/uapi/linux/msm_mdp.h | 1 |
3 files changed, 42 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index 62e48490e791..cbf0d03bd794 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -109,6 +109,31 @@ void mdss_fb_no_update_notify_timer_cb(unsigned long data) complete(&mfd->no_update.comp); } +void mdss_fb_bl_update_notify(struct msm_fb_data_type *mfd) +{ + if (!mfd) { + pr_err("%s mfd NULL\n", __func__); + return; + } + mutex_lock(&mfd->update.lock); + if (mfd->update.ref_count > 0) { + mutex_unlock(&mfd->update.lock); + mfd->update.value = NOTIFY_TYPE_BL_UPDATE; + complete(&mfd->update.comp); + mutex_lock(&mfd->update.lock); + } + mutex_unlock(&mfd->update.lock); + + mutex_lock(&mfd->no_update.lock); + if (mfd->no_update.ref_count > 0) { + mutex_unlock(&mfd->no_update.lock); + mfd->no_update.value = NOTIFY_TYPE_BL_UPDATE; + complete(&mfd->no_update.comp); + mutex_lock(&mfd->no_update.lock); + } + mutex_unlock(&mfd->no_update.lock); +} + static int mdss_fb_notify_update(struct msm_fb_data_type *mfd, unsigned long *argp) { @@ -130,8 +155,14 @@ static int mdss_fb_notify_update(struct msm_fb_data_type *mfd, ret = 1; } else if (notify == NOTIFY_UPDATE_START) { INIT_COMPLETION(mfd->update.comp); + mutex_lock(&mfd->update.lock); + mfd->update.ref_count++; + mutex_unlock(&mfd->update.lock); ret = wait_for_completion_interruptible_timeout( &mfd->update.comp, 4 * HZ); + mutex_lock(&mfd->update.lock); + mfd->update.ref_count--; + mutex_unlock(&mfd->update.lock); to_user = (unsigned int)mfd->update.value; if (mfd->update.type == NOTIFY_TYPE_SUSPEND) { to_user = (unsigned int)mfd->update.type; @@ -139,8 +170,14 @@ static int mdss_fb_notify_update(struct msm_fb_data_type *mfd, } } else if (notify == NOTIFY_UPDATE_STOP) { INIT_COMPLETION(mfd->no_update.comp); + mutex_lock(&mfd->no_update.lock); + mfd->no_update.ref_count++; + mutex_unlock(&mfd->no_update.lock); ret = wait_for_completion_interruptible_timeout( &mfd->no_update.comp, 4 * HZ); + mutex_lock(&mfd->no_update.lock); + mfd->no_update.ref_count--; + mutex_unlock(&mfd->no_update.lock); to_user = (unsigned int)mfd->no_update.value; } else { if (mfd->panel_power_on) { @@ -841,6 +878,7 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl) mutex_unlock(&mfd->bl_lock); /* Will trigger ad_setup which will grab bl_lock */ update_ad_input(mfd); + mdss_fb_bl_update_notify(mfd); mutex_lock(&mfd->bl_lock); } } @@ -1401,6 +1439,8 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) init_timer(&mfd->no_update.timer); mfd->no_update.timer.function = mdss_fb_no_update_notify_timer_cb; mfd->no_update.timer.data = (unsigned long)mfd; + mfd->update.ref_count = 0; + mfd->no_update.ref_count = 0; init_completion(&mfd->update.comp); init_completion(&mfd->no_update.comp); init_completion(&mfd->power_off_comp); diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h index 9272b96a436f..66330b73d605 100644 --- a/drivers/video/fbdev/msm/mdss_fb.h +++ b/drivers/video/fbdev/msm/mdss_fb.h @@ -89,6 +89,7 @@ struct disp_info_notify { struct mutex lock; int value; int is_suspend; + int ref_count; }; struct msm_sync_pt_data { diff --git a/include/uapi/linux/msm_mdp.h b/include/uapi/linux/msm_mdp.h index 8169f51ddeb6..0ea47d495353 100644 --- a/include/uapi/linux/msm_mdp.h +++ b/include/uapi/linux/msm_mdp.h @@ -110,6 +110,7 @@ enum { NOTIFY_TYPE_NO_UPDATE, NOTIFY_TYPE_SUSPEND, NOTIFY_TYPE_UPDATE, + NOTIFY_TYPE_BL_UPDATE, }; enum { |
