Commit 62dd4acd authored by Kevin Hilman's avatar Kevin Hilman Committed by Mauro Carvalho Chehab

[media] davinci: vpif_capture: fix start/stop streaming locking

Video capture subdevs may be over I2C and may sleep during xfer, so we
cannot do IRQ-disabled locking when calling the subdev.

The IRQ-disabled locking is meant to protect the DMA queue list
throughout the rest of the driver, so update the locking in
[start|stop]_streaming to protect just this list, and update the irqlock
comment to reflect what it actually protects.
Suggested-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarKevin Hilman <khilman@baylibre.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 2d40cb3f
...@@ -175,8 +175,6 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -175,8 +175,6 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count)
unsigned long addr, flags; unsigned long addr, flags;
int ret; int ret;
spin_lock_irqsave(&common->irqlock, flags);
/* Initialize field_id */ /* Initialize field_id */
ch->field_id = 0; ch->field_id = 0;
...@@ -207,6 +205,7 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -207,6 +205,7 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count)
vpif_config_addr(ch, ret); vpif_config_addr(ch, ret);
/* Get the next frame from the buffer queue */ /* Get the next frame from the buffer queue */
spin_lock_irqsave(&common->irqlock, flags);
common->cur_frm = common->next_frm = list_entry(common->dma_queue.next, common->cur_frm = common->next_frm = list_entry(common->dma_queue.next,
struct vpif_cap_buffer, list); struct vpif_cap_buffer, list);
/* Remove buffer from the buffer queue */ /* Remove buffer from the buffer queue */
...@@ -240,6 +239,7 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -240,6 +239,7 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count)
return 0; return 0;
err: err:
spin_lock_irqsave(&common->irqlock, flags);
list_for_each_entry_safe(buf, tmp, &common->dma_queue, list) { list_for_each_entry_safe(buf, tmp, &common->dma_queue, list) {
list_del(&buf->list); list_del(&buf->list);
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED); vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_QUEUED);
...@@ -283,7 +283,6 @@ static void vpif_stop_streaming(struct vb2_queue *vq) ...@@ -283,7 +283,6 @@ static void vpif_stop_streaming(struct vb2_queue *vq)
vpif_dbg(1, debug, "stream off failed in subdev\n"); vpif_dbg(1, debug, "stream off failed in subdev\n");
/* release all active buffers */ /* release all active buffers */
spin_lock_irqsave(&common->irqlock, flags);
if (common->cur_frm == common->next_frm) { if (common->cur_frm == common->next_frm) {
vb2_buffer_done(&common->cur_frm->vb.vb2_buf, vb2_buffer_done(&common->cur_frm->vb.vb2_buf,
VB2_BUF_STATE_ERROR); VB2_BUF_STATE_ERROR);
...@@ -296,6 +295,7 @@ static void vpif_stop_streaming(struct vb2_queue *vq) ...@@ -296,6 +295,7 @@ static void vpif_stop_streaming(struct vb2_queue *vq)
VB2_BUF_STATE_ERROR); VB2_BUF_STATE_ERROR);
} }
spin_lock_irqsave(&common->irqlock, flags);
while (!list_empty(&common->dma_queue)) { while (!list_empty(&common->dma_queue)) {
common->next_frm = list_entry(common->dma_queue.next, common->next_frm = list_entry(common->dma_queue.next,
struct vpif_cap_buffer, list); struct vpif_cap_buffer, list);
......
...@@ -63,7 +63,7 @@ struct common_obj { ...@@ -63,7 +63,7 @@ struct common_obj {
struct vb2_queue buffer_queue; struct vb2_queue buffer_queue;
/* Queue of filled frames */ /* Queue of filled frames */
struct list_head dma_queue; struct list_head dma_queue;
/* Used in video-buf */ /* Protects the dma_queue field */
spinlock_t irqlock; spinlock_t irqlock;
/* lock used to access this structure */ /* lock used to access this structure */
struct mutex lock; struct mutex lock;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment