diff options
author | Ian Armstrong <ian@iarmst.demon.co.uk> | 2008-10-09 11:04:23 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-10-13 07:08:30 -0400 |
commit | 2bd7ac55c31cb4f42e331d69dde9fc034a68944f (patch) | |
tree | c2547fc93abd5e35a33ed6876faa3b3d724f4c23 /drivers/media/video/ivtv/ivtv-irq.c | |
parent | ec9faa1cfac1dd64a2a865dc7c577f3d483656bd (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.c | 9 |
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 | ||