changeset 29946:54bacf6a38ca

Update the SuperH VEU vidix driver with code that calls fsync() after each frame to make sure the frame is flushed in case of deferred io. Patch by Magnus Damm, damm opensource se
author cehoyos
date Thu, 10 Dec 2009 23:16:08 +0000
parents 38485def91ba
children 2c0a16bf54bb
files vidix/sh_veu_vid.c
diffstat 1 files changed, 8 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/vidix/sh_veu_vid.c	Wed Dec 09 20:20:18 2009 +0000
+++ b/vidix/sh_veu_vid.c	Thu Dec 10 23:16:08 2009 +0000
@@ -1,6 +1,6 @@
 /*
  * VIDIX driver for SuperH Mobile VEU hardware block.
- * Copyright (C) 2008 Magnus Damm
+ * Copyright (C) 2008, 2009 Magnus Damm
  *
  * Requires a kernel that exposes the VEU hardware block to user space
  * using UIO. Available in upstream linux-2.6.27 or later.
@@ -179,8 +179,7 @@
     memset(iomem, 0, fip->line_length * fip->height);
     munmap(iomem, fip->size);
 
-    close(fd);
-    return 0;
+    return fd;
 }
 
 #define VESTR 0x00 /* start register */
@@ -268,6 +267,7 @@
 
 static struct sh_veu_plane _src, _dst;
 static vidix_playback_t my_info;
+static int fb_fd;
 
 static int sh_veu_probe(int verbose, int force)
 {
@@ -276,6 +276,7 @@
     ret = get_fb_info("/dev/fb0", &fbi);
     if (ret < 0)
         return ret;
+    fb_fd = ret;
 
     if (fbi.bpp != 16) {
         printf("sh_veu: only 16bpp supported\n");
@@ -315,6 +316,9 @@
     read(uio_dev.fd, &n_pending, sizeof(unsigned long));
 
     write_reg(&uio_mmio, 0x100, VEVTR); /* ack int, write 0 to bit 0 */
+
+    /* flush framebuffer to handle deferred io case */
+    fsync(fb_fd);
 }
 
 static int sh_veu_is_veu2h(void)
@@ -486,6 +490,7 @@
 
 static void sh_veu_destroy(void)
 {
+    close(fb_fd);
 }
 
 static int sh_veu_get_caps(vidix_capability_t *to)