forked from luck/tmp_suning_uos_patched
V4L/DVB (8088): ivtv: yuv decoder lock fix
write() operations to the yuv device may not always 'start' the decoder. Although yuv output will be correct, some functions which should be disabled while the decoder is in use remain enabled. This can result in hardware registers being corrupted, causing problems with the mpeg decoder. This patch simply moves the existing decoder 'start' sequence to earlier in the write() handler. 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@infradead.org>
This commit is contained in:
parent
0b5a30e90d
commit
464e9f3a0c
@ -582,6 +582,19 @@ ssize_t ivtv_v4l2_write(struct file *filp, const char __user *user_buf, size_t c
|
||||
ivtv_queue_init(&q);
|
||||
set_bit(IVTV_F_S_APPL_IO, &s->s_flags);
|
||||
|
||||
/* Start decoder (returns 0 if already started) */
|
||||
mutex_lock(&itv->serialize_lock);
|
||||
rc = ivtv_start_decoding(id, itv->speed);
|
||||
mutex_unlock(&itv->serialize_lock);
|
||||
if (rc) {
|
||||
IVTV_DEBUG_WARN("Failed start decode stream %s\n", s->name);
|
||||
|
||||
/* failure, clean up */
|
||||
clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
|
||||
clear_bit(IVTV_F_S_APPL_IO, &s->s_flags);
|
||||
return rc;
|
||||
}
|
||||
|
||||
retry:
|
||||
/* If possible, just DMA the entire frame - Check the data transfer size
|
||||
since we may get here before the stream has been fully set-up */
|
||||
@ -664,18 +677,6 @@ ssize_t ivtv_v4l2_write(struct file *filp, const char __user *user_buf, size_t c
|
||||
ivtv_enqueue(s, buf, &s->q_full);
|
||||
}
|
||||
|
||||
/* Start decoder (returns 0 if already started) */
|
||||
mutex_lock(&itv->serialize_lock);
|
||||
rc = ivtv_start_decoding(id, itv->speed);
|
||||
mutex_unlock(&itv->serialize_lock);
|
||||
if (rc) {
|
||||
IVTV_DEBUG_WARN("Failed start decode stream %s\n", s->name);
|
||||
|
||||
/* failure, clean up */
|
||||
clear_bit(IVTV_F_S_STREAMING, &s->s_flags);
|
||||
clear_bit(IVTV_F_S_APPL_IO, &s->s_flags);
|
||||
return rc;
|
||||
}
|
||||
if (test_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags)) {
|
||||
if (s->q_full.length >= itv->dma_data_req_size) {
|
||||
int got_sig;
|
||||
|
Loading…
Reference in New Issue
Block a user