diff options
author | Krzysztof Hałasa <khalasa@piap.pl> | 2016-01-27 14:26:56 +0100 |
---|---|---|
committer | Krzysztof Hałasa <khalasa@piap.pl> | 2016-01-28 09:58:56 +0100 |
commit | e7a6b94be701f131203b97096c890a59f85b192b (patch) | |
tree | 1ea6ffcebdb6fb306f81935c8ba6fe62c6b08ee1 | |
parent | 19655377eb31fd27b858e0e99578a1b843e5c1f5 (diff) | |
download | linux-techwell-4.4.tar.gz |
[MEDIA] TW686x: return VB2_BUF_STATE_ERROR frames on timeout/errorstechwell-4.4
Signed-off-by: Krzysztof Hałasa <khalasa@piap.pl>
-rw-r--r-- | drivers/media/pci/tw686x/tw686x-video.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/drivers/media/pci/tw686x/tw686x-video.c b/drivers/media/pci/tw686x/tw686x-video.c index d09a4b06ebab5..bb77c1b523a18 100644 --- a/drivers/media/pci/tw686x/tw686x-video.c +++ b/drivers/media/pci/tw686x/tw686x-video.c @@ -551,7 +551,7 @@ static int video_thread(void *arg) for (ch = 0; ch < max_channels(dev); ch++) { struct tw686x_video_channel *vc; unsigned long flags; - u32 request, n; + u32 request, n, stat = VB2_BUF_STATE_DONE; vc = &dev->video_channels[ch]; if (!(dev->video_active & (1 << ch))) @@ -581,28 +581,29 @@ static int video_thread(void *arg) reg_write(dev, DMA_CMD, reg & ~(1 << ch)); reg_write(dev, DMA_CMD, reg); spin_unlock_irqrestore(&dev->irq_lock, flags); - } else { - /* handle video stream */ - mutex_lock(&vc->vb_mutex); - spin_lock(&vc->qlock); - n = !!(reg_read(dev, PB_STATUS) & (1 << ch)); - if (vc->curr_bufs[n]) { - struct vb2_v4l2_buffer *vb; - - vb = &vc->curr_bufs[n]->vb; - v4l2_get_timestamp(&vb->timestamp); - vb->field = vc->field; - if (V4L2_FIELD_HAS_BOTH(vc->field)) - vb->sequence = vc->seq++; - else - vb->sequence = (vc->seq++) / 2; - vb2_set_plane_payload(&vb->vb2_buf, 0, vc->width * vc->height * vc->format->depth / 8); - vb2_buffer_done(&vb->vb2_buf, VB2_BUF_STATE_DONE); - } - setup_descs(vc, n); - spin_unlock(&vc->qlock); - mutex_unlock(&vc->vb_mutex); + stat = VB2_BUF_STATE_ERROR; + } + + /* handle video stream */ + mutex_lock(&vc->vb_mutex); + spin_lock(&vc->qlock); + n = !!(reg_read(dev, PB_STATUS) & (1 << ch)); + if (vc->curr_bufs[n]) { + struct vb2_v4l2_buffer *vb; + + vb = &vc->curr_bufs[n]->vb; + v4l2_get_timestamp(&vb->timestamp); + vb->field = vc->field; + if (V4L2_FIELD_HAS_BOTH(vc->field)) + vb->sequence = vc->seq++; + else + vb->sequence = (vc->seq++) / 2; + vb2_set_plane_payload(&vb->vb2_buf, 0, vc->width * vc->height * vc->format->depth / 8); + vb2_buffer_done(&vb->vb2_buf, stat); } + setup_descs(vc, n); + spin_unlock(&vc->qlock); + mutex_unlock(&vc->vb_mutex); } try_to_freeze(); } |