Skip to content

Commit 5d21dac

Browse files
author
Cai YiWei
committed
media: rockchip: isp1: clean list when stream failed
Change-Id: I94f409a68216e69f1a5b4e8c9b58666d156eb984 Signed-off-by: Cai YiWei <cyw@rock-chips.com>
1 parent a1a5435 commit 5d21dac

1 file changed

Lines changed: 26 additions & 24 deletions

File tree

  • drivers/media/platform/rockchip/isp1

drivers/media/platform/rockchip/isp1/capture.c

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1437,23 +1437,11 @@ static void rkisp1_destroy_dummy_buf(struct rkisp1_stream *stream)
14371437
dummy_buf->vaddr, dummy_buf->dma_addr);
14381438
}
14391439

1440-
static void rkisp1_stop_streaming(struct vb2_queue *queue)
1440+
static void destroy_buf_queue(struct rkisp1_stream *stream,
1441+
enum vb2_buffer_state state)
14411442
{
1442-
struct rkisp1_stream *stream = queue->drv_priv;
1443-
struct rkisp1_vdev_node *node = &stream->vnode;
1444-
struct rkisp1_device *dev = stream->ispdev;
1445-
struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
14461443
struct rkisp1_buffer *buf;
14471444
unsigned long lock_flags = 0;
1448-
int ret;
1449-
1450-
rkisp1_stream_stop(stream);
1451-
/* call to the other devices */
1452-
media_entity_pipeline_stop(&node->vdev.entity);
1453-
ret = dev->pipe.set_stream(&dev->pipe, false);
1454-
if (ret < 0)
1455-
v4l2_err(v4l2_dev, "pipeline stream-off failed error:%d\n",
1456-
ret);
14571445

14581446
/* release buffers */
14591447
spin_lock_irqsave(&stream->vbq_lock, lock_flags);
@@ -1471,10 +1459,31 @@ static void rkisp1_stop_streaming(struct vb2_queue *queue)
14711459
buf = list_first_entry(&stream->buf_queue,
14721460
struct rkisp1_buffer, queue);
14731461
list_del(&buf->queue);
1474-
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
1462+
vb2_buffer_done(&buf->vb.vb2_buf, state);
14751463
}
14761464
spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
14771465

1466+
}
1467+
1468+
static void rkisp1_stop_streaming(struct vb2_queue *queue)
1469+
{
1470+
struct rkisp1_stream *stream = queue->drv_priv;
1471+
struct rkisp1_vdev_node *node = &stream->vnode;
1472+
struct rkisp1_device *dev = stream->ispdev;
1473+
struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
1474+
int ret;
1475+
1476+
rkisp1_stream_stop(stream);
1477+
/* call to the other devices */
1478+
media_entity_pipeline_stop(&node->vdev.entity);
1479+
ret = dev->pipe.set_stream(&dev->pipe, false);
1480+
if (ret < 0)
1481+
v4l2_err(v4l2_dev, "pipeline stream-off failed error:%d\n",
1482+
ret);
1483+
1484+
/* release buffers */
1485+
destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
1486+
14781487
ret = dev->pipe.close(&dev->pipe);
14791488
if (ret < 0)
14801489
v4l2_err(v4l2_dev, "pipeline close failed error:%d\n", ret);
@@ -1524,7 +1533,6 @@ rkisp1_start_streaming(struct vb2_queue *queue, unsigned int count)
15241533
struct rkisp1_device *dev = stream->ispdev;
15251534
struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
15261535
int ret;
1527-
unsigned int i;
15281536

15291537
if (WARN_ON(stream->streaming))
15301538
return -EBUSY;
@@ -1594,14 +1602,8 @@ rkisp1_start_streaming(struct vb2_queue *queue, unsigned int count)
15941602
destroy_dummy_buf:
15951603
rkisp1_destroy_dummy_buf(stream);
15961604
buffer_done:
1597-
for (i = 0; i < queue->num_buffers; ++i) {
1598-
struct vb2_buffer *vb;
1599-
1600-
vb = queue->bufs[i];
1601-
if (vb->state == VB2_BUF_STATE_ACTIVE)
1602-
vb2_buffer_done(vb, VB2_BUF_STATE_QUEUED);
1603-
}
1604-
1605+
destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED);
1606+
stream->streaming = false;
16051607
return ret;
16061608
}
16071609

0 commit comments

Comments
 (0)