summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Hackmann <ghackmann@google.com>2012-05-14 16:21:44 -0700
committerGreg Hackmann <ghackmann@google.com>2012-05-15 14:06:11 -0700
commitc07d65d9fe5e0051156df941afddefcf8d7e8daf (patch)
tree8d6c9b5b5ba0fb0c038bbbdbbe92166f2197a4fe
parenta447a75f417f2e9127afe0d21cdb8770b9b058f0 (diff)
downloadsamsung-c07d65d9fe5e0051156df941afddefcf8d7e8daf.tar.gz
s3cfb: fix S3CFB_SET_VSYNC_INT ioctl
S3CFB_SET_VSYNC_INT previously moved the interrupt to back porch instead of disabling it. S3CFB_SET_VSYNC_ACTIVE is now redundant. The vsync_active flag is also redundant, and removing it fixes some heavily-delayed vsync events. Change-Id: I37d6bb357e0ccb5faa4618ed10573e40ca1a3c54 Signed-off-by: Greg Hackmann <ghackmann@google.com>
-rwxr-xr-xdrivers/video/samsung/s3cfb.c13
-rw-r--r--drivers/video/samsung/s3cfb.h2
-rw-r--r--drivers/video/samsung/s3cfb_fimd6x.c11
3 files changed, 7 insertions, 19 deletions
diff --git a/drivers/video/samsung/s3cfb.c b/drivers/video/samsung/s3cfb.c
index 77e8420ec6d..fbacba99233 100755
--- a/drivers/video/samsung/s3cfb.c
+++ b/drivers/video/samsung/s3cfb.c
@@ -680,16 +680,6 @@ static int s3cfb_ioctl(struct fb_info *fb, unsigned int cmd, unsigned long arg)
}
break;
- case S3CFB_SET_VSYNC_ACTIVE:
- if (get_user(p.vsync, (int __user *)arg))
- ret = -EFAULT;
-
- fbdev->vsync_active = p.vsync;
- wmb();
- if (p.vsync)
- wake_up(&fbdev->vsync_wq);
- break;
-
case S3CFB_GET_CURR_FB_INFO:
next_fb_info.phy_start_addr = fix->smem_start;
next_fb_info.xres = var->xres;
@@ -937,8 +927,7 @@ static int s3cfb_wait_for_vsync_thread(void *data)
ktime_t prev_timestamp = fbdev->vsync_timestamp;
int ret = wait_event_interruptible_timeout(fbdev->vsync_wq,
s3cfb_vsync_timestamp_changed(fbdev,
- prev_timestamp) &&
- fbdev->vsync_active,
+ prev_timestamp),
msecs_to_jiffies(100));
if (ret > 0) {
char *envp[2];
diff --git a/drivers/video/samsung/s3cfb.h b/drivers/video/samsung/s3cfb.h
index d8297dea676..21e581dff40 100644
--- a/drivers/video/samsung/s3cfb.h
+++ b/drivers/video/samsung/s3cfb.h
@@ -234,7 +234,6 @@ struct s3cfb_global {
wait_queue_head_t vsync_wq;
ktime_t vsync_timestamp;
- bool vsync_active;
int vsync_state;
struct task_struct *vsync_thread;
@@ -308,7 +307,6 @@ struct s3cfb_next_info {
struct s3cfb_user_chroma)
#define S3CFB_SET_VSYNC_INT _IOW('F', 206, u32)
#define S3CFB_GET_VSYNC_INT_STATUS _IOR('F', 207, u32)
-#define S3CFB_SET_VSYNC_ACTIVE _IOW('F', 208, u32)
#define S3CFB_GET_LCD_WIDTH _IOR('F', 302, int)
#define S3CFB_GET_LCD_HEIGHT _IOR('F', 303, int)
#define S3CFB_SET_WRITEBACK _IOW('F', 304, u32)
diff --git a/drivers/video/samsung/s3cfb_fimd6x.c b/drivers/video/samsung/s3cfb_fimd6x.c
index b5b73a1b6b3..bfe85afbdd4 100644
--- a/drivers/video/samsung/s3cfb_fimd6x.c
+++ b/drivers/video/samsung/s3cfb_fimd6x.c
@@ -308,14 +308,15 @@ int s3cfb_set_vsync_interrupt(struct s3cfb_global *ctrl, int enable)
u32 cfg = 0;
cfg = readl(ctrl->regs + S3C_VIDINTCON0);
- cfg &= ~S3C_VIDINTCON0_FRAMESEL0_MASK;
if (enable) {
dev_dbg(ctrl->dev, "vsync interrupt is on\n");
- cfg |= S3C_VIDINTCON0_FRAMESEL0_VSYNC;
+ cfg &= ~S3C_VIDINTCON0_FRAMESEL0_MASK;
+ cfg |= S3C_VIDINTCON0_INTFRMEN_ENABLE |
+ S3C_VIDINTCON0_FRAMESEL0_VSYNC;
} else {
dev_dbg(ctrl->dev, "vsync interrupt is off\n");
- cfg &= ~S3C_VIDINTCON0_FRAMESEL0_VSYNC;
+ cfg &= ~S3C_VIDINTCON0_INTFRMEN_ENABLE;
}
writel(cfg, ctrl->regs + S3C_VIDINTCON0);
@@ -328,9 +329,9 @@ int s3cfb_get_vsync_interrupt(struct s3cfb_global *ctrl)
u32 cfg = 0;
cfg = readl(ctrl->regs + S3C_VIDINTCON0);
- cfg &= S3C_VIDINTCON0_FRAMESEL0_VSYNC;
+ cfg &= S3C_VIDINTCON0_INTFRMEN_ENABLE;
- if (cfg & S3C_VIDINTCON0_FRAMESEL0_VSYNC) {
+ if (cfg & S3C_VIDINTCON0_INTFRMEN_ENABLE) {
dev_dbg(ctrl->dev, "vsync interrupt is on\n");
return 1;
} else {