aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/ivtv/ivtv-irq.c
diff options
context:
space:
mode:
authorIan Armstrong <ian@iarmst.demon.co.uk>2008-10-09 11:04:23 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-10-13 07:08:30 -0400
commit2bd7ac55c31cb4f42e331d69dde9fc034a68944f (patch)
treec2547fc93abd5e35a33ed6876faa3b3d724f4c23 /drivers/media/video/ivtv/ivtv-irq.c
parentec9faa1cfac1dd64a2a865dc7c577f3d483656bd (diff)
V4L/DVB (9166): ivtv - Fix potential race condition in yuv handler
Modified yuv register update handling to remove a potential race condition which could occur with the first video frame. Also removed a forced yuv position update, since changing the source video dimensions or interlace settings doesn't affect the frame already being displayed. Signed-off-by: Ian Armstrong <ian@iarmst.demon.co.uk> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/ivtv/ivtv-irq.c')
-rw-r--r--drivers/media/video/ivtv/ivtv-irq.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/media/video/ivtv/ivtv-irq.c b/drivers/media/video/ivtv/ivtv-irq.c
index 34f3ab827858..f5d00ec5da73 100644
--- a/drivers/media/video/ivtv/ivtv-irq.c
+++ b/drivers/media/video/ivtv/ivtv-irq.c
@@ -753,7 +753,7 @@ static void ivtv_irq_vsync(struct ivtv *itv)
753 */ 753 */
754 unsigned int frame = read_reg(0x28c0) & 1; 754 unsigned int frame = read_reg(0x28c0) & 1;
755 struct yuv_playback_info *yi = &itv->yuv_info; 755 struct yuv_playback_info *yi = &itv->yuv_info;
756 int last_dma_frame = atomic_read(&itv->yuv_info.next_dma_frame); 756 int last_dma_frame = atomic_read(&yi->next_dma_frame);
757 struct yuv_frame_info *f = &yi->new_frame_info[last_dma_frame]; 757 struct yuv_frame_info *f = &yi->new_frame_info[last_dma_frame];
758 758
759 if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n"); 759 if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");
@@ -772,6 +772,7 @@ static void ivtv_irq_vsync(struct ivtv *itv)
772 next_dma_frame = (next_dma_frame + 1) % IVTV_YUV_BUFFERS; 772 next_dma_frame = (next_dma_frame + 1) % IVTV_YUV_BUFFERS;
773 atomic_set(&yi->next_dma_frame, next_dma_frame); 773 atomic_set(&yi->next_dma_frame, next_dma_frame);
774 yi->fields_lapsed = -1; 774 yi->fields_lapsed = -1;
775 yi->running = 1;
775 } 776 }
776 } 777 }
777 } 778 }
@@ -804,9 +805,11 @@ static void ivtv_irq_vsync(struct ivtv *itv)
804 } 805 }
805 806
806 /* Check if we need to update the yuv registers */ 807 /* Check if we need to update the yuv registers */
807 if ((yi->yuv_forced_update || f->update) && last_dma_frame != -1) { 808 if (yi->running && (yi->yuv_forced_update || f->update)) {
808 if (!f->update) { 809 if (!f->update) {
809 last_dma_frame = (u8)(last_dma_frame - 1) % IVTV_YUV_BUFFERS; 810 last_dma_frame =
811 (u8)(atomic_read(&yi->next_dma_frame) -
812 1) % IVTV_YUV_BUFFERS;
810 f = &yi->new_frame_info[last_dma_frame]; 813 f = &yi->new_frame_info[last_dma_frame];
811 } 814 }
812 815