diff options
| author | Carl Vanderlip <carlv@codeaurora.org> | 2012-08-28 12:03:28 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:12:59 -0700 |
| commit | 7b2726a393f1388b809f2a3228786ac3def560d8 (patch) | |
| tree | 90d6a9088d64dc85134bc7130797543bb60d26af | |
| parent | 728069952b10fce517e5813a6c83b47c51254a6e (diff) | |
video: msm: MDSS: Add Update Notify
Add update notify ioctl to MDSS driver. "Update notify" is able to signal
userspace processes when there has been a screen update or if there has
been a 22 second period without screen updates.
Change-Id: I90cf7f7e6650236186452c1a9f86850731ad785d
Signed-off-by: Carl Vanderlip <carlv@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.c | 52 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_fb.h | 9 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 9 |
3 files changed, 70 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c index d3ba2fa5b48b..ccbb80b391ca 100644 --- a/drivers/video/fbdev/msm/mdss_fb.c +++ b/drivers/video/fbdev/msm/mdss_fb.c @@ -81,6 +81,42 @@ static int mdss_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg); static int mdss_fb_mmap(struct fb_info *info, struct vm_area_struct *vma); +void mdss_fb_no_update_notify_timer_cb(unsigned long data) +{ + struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)data; + if (!mfd) + pr_err("%s mfd NULL\n", __func__); + complete(&mfd->no_update.comp); +} + +static int mdss_fb_notify_update(struct msm_fb_data_type *mfd, + unsigned long *argp) +{ + int ret, notify; + + ret = copy_from_user(¬ify, argp, sizeof(int)); + if (ret) { + pr_err("%s:ioctl failed\n", __func__); + return ret; + } + + if (notify > NOTIFY_UPDATE_STOP) + return -EINVAL; + + if (notify == NOTIFY_UPDATE_START) { + INIT_COMPLETION(mfd->update.comp); + ret = wait_for_completion_interruptible_timeout( + &mfd->update.comp, 4 * HZ); + } else { + INIT_COMPLETION(mfd->no_update.comp); + ret = wait_for_completion_interruptible_timeout( + &mfd->no_update.comp, 4 * HZ); + } + if (ret == 0) + ret = -ETIMEDOUT; + return (ret > 0) ? 0 : ret; +} + #define MAX_BACKLIGHT_BRIGHTNESS 255 static int lcd_backlight_registered; @@ -273,6 +309,11 @@ static int mdss_fb_remove(struct platform_device *pdev) pr_err("msm_fb_remove: can't stop the device %d\n", mfd->index); + if (mfd->no_update.timer.function) + del_timer(&mfd->no_update.timer); + complete(&mfd->no_update.comp); + complete(&mfd->update.comp); + /* remove /dev/fb* */ unregister_framebuffer(mfd->fbi); @@ -870,6 +911,13 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) mfd->op_enable = true; + mutex_init(&mfd->no_update.lock); + 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; + init_completion(&mfd->update.comp); + init_completion(&mfd->no_update.comp); + if (mfd->lut_update) { ret = fb_alloc_cmap(&fbi->cmap, 256, 0); if (ret) @@ -1312,6 +1360,10 @@ static int mdss_fb_ioctl(struct fb_info *info, unsigned int cmd, ret = mdss_fb_handle_pp_ioctl(mfd, argp); break; + case MSMFB_NOTIFY_UPDATE: + ret = mdss_fb_notify_update(mfd, argp); + break; + default: if (mfd->ioctl_handler) ret = mfd->ioctl_handler(mfd, cmd, argp); diff --git a/drivers/video/fbdev/msm/mdss_fb.h b/drivers/video/fbdev/msm/mdss_fb.h index 04aa949f35a4..f2365661ae63 100644 --- a/drivers/video/fbdev/msm/mdss_fb.h +++ b/drivers/video/fbdev/msm/mdss_fb.h @@ -41,6 +41,13 @@ struct disp_info_type_suspend { int panel_power_on; }; +struct disp_info_notify { + int type; + struct timer_list timer; + struct completion comp; + struct mutex lock; +}; + struct msm_fb_data_type { u32 key; u32 index; @@ -100,6 +107,8 @@ struct msm_fb_data_type { struct list_head overlay_list; struct list_head pipes_used; struct list_head pipes_cleanup; + struct disp_info_notify update; + struct disp_info_notify no_update; }; int mdss_fb_get_phys_info(unsigned long *start, unsigned long *len, int fb_num); diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index d7aa83041526..44793c843c82 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -406,6 +406,15 @@ static int mdss_mdp_overlay_kickoff(struct mdss_mdp_ctl *ctl) if (IS_ERR_VALUE(ret)) return ret; + complete(&mfd->update.comp); + mutex_lock(&mfd->no_update.lock); + if (mfd->no_update.timer.function) + del_timer(&(mfd->no_update.timer)); + + mfd->no_update.timer.expires = jiffies + (2 * HZ); + add_timer(&mfd->no_update.timer); + mutex_unlock(&mfd->no_update.lock); + mutex_lock(&mfd->lock); list_for_each_entry_safe(pipe, tmp, &mfd->pipes_cleanup, cleanup_list) { list_del(&pipe->cleanup_list); |
