diff options
-rw-r--r-- | drivers/media/platform/ti-vps/vip.c | 18 | ||||
-rw-r--r-- | drivers/media/platform/ti-vps/vip.h | 1 |
2 files changed, 12 insertions, 7 deletions
diff --git a/drivers/media/platform/ti-vps/vip.c b/drivers/media/platform/ti-vps/vip.c index 7bb7513e4f5..38982275f05 100644 --- a/drivers/media/platform/ti-vps/vip.c +++ b/drivers/media/platform/ti-vps/vip.c | |||
@@ -932,7 +932,8 @@ static void vip_active_buf_next(struct vip_stream *stream) | |||
932 | if (list_empty(&stream->vidq)) { | 932 | if (list_empty(&stream->vidq)) { |
933 | vip_dprintk(dev, "Dropping frame"); | 933 | vip_dprintk(dev, "Dropping frame"); |
934 | /* Increment drop_count for last buffer in the list */ | 934 | /* Increment drop_count for last buffer in the list */ |
935 | buf = list_entry(dev->vip_bufs.prev, struct vip_buffer, list); | 935 | buf = list_entry(dev->vip_bufs.prev, |
936 | struct vip_buffer, dq_list); | ||
936 | buf->drop_count++; | 937 | buf->drop_count++; |
937 | buf = NULL; | 938 | buf = NULL; |
938 | 939 | ||
@@ -940,7 +941,8 @@ static void vip_active_buf_next(struct vip_stream *stream) | |||
940 | buf = list_entry(stream->vidq.next, struct vip_buffer, list); | 941 | buf = list_entry(stream->vidq.next, struct vip_buffer, list); |
941 | buf->drop_count = 0; | 942 | buf->drop_count = 0; |
942 | buf->allow_dq = true; | 943 | buf->allow_dq = true; |
943 | list_move_tail(&buf->list, &dev->vip_bufs); | 944 | list_del(&buf->list); |
945 | list_add_tail(&buf->dq_list, &dev->vip_bufs); | ||
944 | } else { | 946 | } else { |
945 | v4l2_err(&dev->v4l2_dev, "IRQ occurred when not streaming"); | 947 | v4l2_err(&dev->v4l2_dev, "IRQ occurred when not streaming"); |
946 | spin_unlock_irqrestore(&dev->slock, flags); | 948 | spin_unlock_irqrestore(&dev->slock, flags); |
@@ -958,7 +960,7 @@ static void vip_process_buffer_complete(struct vip_stream *stream) | |||
958 | struct vip_buffer *buf; | 960 | struct vip_buffer *buf; |
959 | unsigned long flags, fld; | 961 | unsigned long flags, fld; |
960 | 962 | ||
961 | buf = list_first_entry(&dev->vip_bufs, struct vip_buffer, list); | 963 | buf = list_first_entry(&dev->vip_bufs, struct vip_buffer, dq_list); |
962 | 964 | ||
963 | if (stream->port->flags & FLAG_INTERLACED) { | 965 | if (stream->port->flags & FLAG_INTERLACED) { |
964 | vpdma_buf_unmap(dev->shared->vpdma, &dev->desc_list.buf); | 966 | vpdma_buf_unmap(dev->shared->vpdma, &dev->desc_list.buf); |
@@ -977,7 +979,7 @@ static void vip_process_buffer_complete(struct vip_stream *stream) | |||
977 | 979 | ||
978 | if (buf->drop_count-- == 0) { | 980 | if (buf->drop_count-- == 0) { |
979 | spin_lock_irqsave(&dev->slock, flags); | 981 | spin_lock_irqsave(&dev->slock, flags); |
980 | list_del(&buf->list); | 982 | list_del(&buf->dq_list); |
981 | spin_unlock_irqrestore(&dev->slock, flags); | 983 | spin_unlock_irqrestore(&dev->slock, flags); |
982 | } | 984 | } |
983 | 985 | ||
@@ -1537,7 +1539,8 @@ static int vip_start_streaming(struct vb2_queue *vq, unsigned int count) | |||
1537 | return -EBUSY; | 1539 | return -EBUSY; |
1538 | } | 1540 | } |
1539 | 1541 | ||
1540 | list_move_tail(&buf->list, &dev->vip_bufs); | 1542 | list_del(&buf->list); |
1543 | list_add_tail(&buf->dq_list, &dev->vip_bufs); | ||
1541 | spin_unlock_irqrestore(&dev->slock, flags); | 1544 | spin_unlock_irqrestore(&dev->slock, flags); |
1542 | 1545 | ||
1543 | start_dma(dev, buf); | 1546 | start_dma(dev, buf); |
@@ -1564,8 +1567,9 @@ static int vip_stop_streaming(struct vb2_queue *vq) | |||
1564 | disable_irqs(dev, dev->slice_id); | 1567 | disable_irqs(dev, dev->slice_id); |
1565 | /* release all active buffers */ | 1568 | /* release all active buffers */ |
1566 | while (!list_empty(&dev->vip_bufs)) { | 1569 | while (!list_empty(&dev->vip_bufs)) { |
1567 | buf = list_entry(dev->vip_bufs.next, struct vip_buffer, list); | 1570 | buf = list_entry(dev->vip_bufs.next, |
1568 | list_del(&buf->list); | 1571 | struct vip_buffer, dq_list); |
1572 | list_del(&buf->dq_list); | ||
1569 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); | 1573 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); |
1570 | } | 1574 | } |
1571 | while (!list_empty(&stream->vidq)) { | 1575 | while (!list_empty(&stream->vidq)) { |
diff --git a/drivers/media/platform/ti-vps/vip.h b/drivers/media/platform/ti-vps/vip.h index 8cf04ef770d..1b41164f788 100644 --- a/drivers/media/platform/ti-vps/vip.h +++ b/drivers/media/platform/ti-vps/vip.h | |||
@@ -38,6 +38,7 @@ struct vip_buffer { | |||
38 | /* common v4l buffer stuff */ | 38 | /* common v4l buffer stuff */ |
39 | struct vb2_buffer vb; | 39 | struct vb2_buffer vb; |
40 | struct list_head list; | 40 | struct list_head list; |
41 | struct list_head dq_list; | ||
41 | /* Number of buffers to drop after this */ | 42 | /* Number of buffers to drop after this */ |
42 | int drop_count; | 43 | int drop_count; |
43 | /* To make sure same buffer isn't dequeued again */ | 44 | /* To make sure same buffer isn't dequeued again */ |