diff options
| -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 { |
