V4L/DVB (7564): em28xx: Some fixes to display logic

Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c
index 10928dc..d5728c2 100644
--- a/drivers/media/video/em28xx/em28xx-video.c
+++ b/drivers/media/video/em28xx/em28xx-video.c
@@ -365,32 +365,33 @@
 		/* FIXME: incomplete buffer checks where removed to make
 		   logic simpler. Impacts of those changes should be evaluated
 		 */
+		if (p[0] == 0x33 && p[1] == 0x95 && p[2] == 0x00) {
+			em28xx_isocdbg("VBI HEADER!!!\n");
+			/* FIXME: Should add vbi copy */
+			continue;
+		}
 		if (p[0] == 0x22 && p[1] == 0x5a) {
 			em28xx_isocdbg("Video frame %d, length=%i, %s\n", p[2],
 				       len, (p[2] & 1)? "odd" : "even");
 
 			if (p[2] & 1)
 				buf->top_field = 0;
-			else {
-				if (buf->receiving) {
-					buffer_filled(dev, dma_q, buf);
-					rc = get_next_buf(dma_q, &buf);
-					if (rc <= 0)
-						return rc;
-					outp = videobuf_to_vmalloc(&buf->vb);
-				}
-
+			else
 				buf->top_field = 1;
+
+//			if (dev->isoc_ctl.last_field && !buf->top_field) {
+			if (dev->isoc_ctl.last_field != buf->top_field) {
+				buffer_filled(dev, dma_q, buf);
+				rc = get_next_buf(dma_q, &buf);
+				if (rc <= 0)
+					return rc;
+				outp = videobuf_to_vmalloc(&buf->vb);
 			}
-			buf->receiving = 1;
+			dev->isoc_ctl.last_field =  buf->top_field;
+
 			dma_q->pos = 0;
-		} else if (p[0] == 0x33 && p[1] == 0x95 && p[2] == 0x00) {
-			em28xx_isocdbg("VBI HEADER!!!\n");
 		}
-
 		em28xx_copy_video(dev, dma_q, buf, p, outp, len);
-
-		/* FIXME: Should add vbi copy */
 	}
 	return rc;
 }
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h
index 6d62357..993c1ed 100644
--- a/drivers/media/video/em28xx/em28xx.h
+++ b/drivers/media/video/em28xx/em28xx.h
@@ -114,6 +114,9 @@
 		/* Stores already requested buffers */
 	struct em28xx_buffer    	*buf;
 
+		/* Store last filled frame */
+	int				last_field;
+
 		/* Stores the number of received fields */
 	int				nfields;
 };