From 3386aca09d2dfe005110e368f4ea47b74131fe98 Mon Sep 17 00:00:00 2001 From: Mingwei Yan Date: Tue, 24 Sep 2024 15:03:15 +0800 Subject: [PATCH] media: rockchip: isp: update iqtool video 1 diff isp version iqtool copy buffer use the same function 2 iqtool before memcpy sync src_buf cache Signed-off-by: Mingwei Yan Change-Id: I969481c3a59fbff6ec621402e4b19d1647345fde --- drivers/media/platform/rockchip/isp/capture.c | 114 ++++++++++++++++++ drivers/media/platform/rockchip/isp/capture.h | 1 + .../media/platform/rockchip/isp/capture_v21.c | 94 +-------------- .../media/platform/rockchip/isp/capture_v30.c | 93 +------------- .../media/platform/rockchip/isp/capture_v32.c | 102 ++-------------- .../media/platform/rockchip/isp/capture_v39.c | 93 +------------- 6 files changed, 127 insertions(+), 370 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 82a798b599c0..6dae02bae982 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -365,6 +365,108 @@ void rkisp_config_dmatx_valid_buf(struct rkisp_device *dev) } } +void rkisp_stream_vir_cpy_image(struct work_struct *work) +{ + struct rkisp_vir_cpy *cpy = container_of(work, struct rkisp_vir_cpy, work); + struct rkisp_stream *vir = cpy->stream; + struct rkisp_buffer *src_buf = NULL; + struct vb2_buffer *src_vb = NULL; + struct rkisp_device *isp_dev = vir->ispdev; + const struct vb2_mem_ops *g_ops = isp_dev->hw_dev->mem_ops; + void *src = NULL, *dst = NULL, *mem = NULL; + u32 payload_size = 0; + unsigned long lock_flags = 0; + u32 i; + + v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, + "%s enter\n", __func__); + + vir->streaming = true; + spin_lock_irqsave(&vir->vbq_lock, lock_flags); + if (!list_empty(&cpy->queue)) { + src_buf = list_first_entry(&cpy->queue, + struct rkisp_buffer, queue); + list_del(&src_buf->queue); + } + spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); + + while (src_buf || vir->streaming) { + if (vir->stopping || !vir->streaming) + goto end; + + if (!src_buf) + wait_for_completion(&cpy->cmpl); + + vir->frame_end = false; + + spin_lock_irqsave(&vir->vbq_lock, lock_flags); + if (!src_buf && !list_empty(&cpy->queue)) { + src_buf = list_first_entry(&cpy->queue, struct rkisp_buffer, queue); + list_del(&src_buf->queue); + } + + if (src_buf && !vir->curr_buf && !list_empty(&vir->buf_queue)) { + vir->curr_buf = list_first_entry(&vir->buf_queue, + struct rkisp_buffer, queue); + list_del(&vir->curr_buf->queue); + } + spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); + + if (!vir->curr_buf || !src_buf) + goto end; + + src_vb = &src_buf->vb.vb2_buf; + for (i = 0; i < vir->out_isp_fmt.mplanes; i++) { + payload_size = vir->out_fmt.plane_fmt[i].sizeimage; + dst = vb2_plane_vaddr(&vir->curr_buf->vb.vb2_buf, i); + mem = src_vb->planes[i].mem_priv; + src = vb2_plane_vaddr(&src_buf->vb.vb2_buf, i); + + if (!src || !dst) + break; + /* sync cache */ + if (mem) + g_ops->finish(mem); + + vb2_set_plane_payload(&vir->curr_buf->vb.vb2_buf, i, payload_size); + memcpy(dst, src, payload_size); + } + + vir->curr_buf->vb.sequence = src_buf->vb.sequence; + vir->curr_buf->vb.vb2_buf.timestamp = src_buf->vb.vb2_buf.timestamp; + vb2_buffer_done(&vir->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); + vir->curr_buf = NULL; + +end: + if (src_buf) + vb2_buffer_done(&src_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); + src_buf = NULL; + + spin_lock_irqsave(&vir->vbq_lock, lock_flags); + + if (!list_empty(&cpy->queue)) { + src_buf = list_first_entry(&cpy->queue, + struct rkisp_buffer, queue); + list_del(&src_buf->queue); + } else if (vir->stopping) { + vir->streaming = false; + } + + spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); + } + + vir->frame_end = true; + + if (vir->stopping) { + vir->stopping = false; + vir->streaming = false; + wake_up(&vir->done); + } + + v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, + "%s exit\n", __func__); +} + /* Get xsubs and ysubs for fourcc formats * * @xsubs: horizontal color samples in a 4*4 matrix, for yuv @@ -746,6 +848,11 @@ static int rkisp_set_fmt(struct rkisp_stream *stream, t = &dev->cap_dev.stream[i]; if (t->out_isp_fmt.fmt_type != FMT_YUV || !t->streaming) continue; + /* isp v32 v33 mp wrap can't use for iqtool */ + if (i == RKISP_STREAM_MP && + (dev->isp_ver == ISP_V32 || dev->isp_ver == ISP_V33) && + dev->cap_dev.wrap_line) + continue; if (t->out_fmt.plane_fmt[0].sizeimage > imagsize) { imagsize = t->out_fmt.plane_fmt[0].sizeimage; *pixm = t->out_fmt; @@ -1252,6 +1359,13 @@ static int rkisp_set_iqtool_connect_id(struct rkisp_stream *stream, int stream_i goto err; } + if ((dev->isp_ver == ISP_V32 || dev->isp_ver == ISP_V33) && + (stream_id == RKISP_STREAM_MP) && + dev->cap_dev.wrap_line) { + v4l2_err(&dev->v4l2_dev, "isp v32 v33 mp wrap can't use for iqtool"); + goto err; + } + stream->conn_id = stream_id; return 0; err: diff --git a/drivers/media/platform/rockchip/isp/capture.h b/drivers/media/platform/rockchip/isp/capture.h index 4c3d3fc627e9..65b7256fe65e 100644 --- a/drivers/media/platform/rockchip/isp/capture.h +++ b/drivers/media/platform/rockchip/isp/capture.h @@ -345,6 +345,7 @@ extern struct stream_config rkisp_mp_stream_config; extern struct stream_config rkisp_sp_stream_config; extern struct rockit_isp_ops rockit_isp_ops; +void rkisp_stream_vir_cpy_image(struct work_struct *work); void rkisp_stream_buf_done_early(struct rkisp_device *dev); void rkisp_stream_buf_done(struct rkisp_stream *stream, struct rkisp_buffer *buf); diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index e354747e9530..cb394befd7ab 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -1404,98 +1404,6 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) stream->interlaced = false; } -static void vir_cpy_image(struct work_struct *work) -{ - struct rkisp_vir_cpy *cpy = - container_of(work, struct rkisp_vir_cpy, work); - struct rkisp_stream *vir = cpy->stream; - struct rkisp_buffer *src_buf = NULL; - unsigned long lock_flags = 0; - u32 i; - - v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, - "%s enter\n", __func__); - - vir->streaming = true; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - if (!list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - - while (src_buf || vir->streaming) { - if (vir->stopping || !vir->streaming) - goto end; - - if (!src_buf) - wait_for_completion(&cpy->cmpl); - - vir->frame_end = false; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - - if (!src_buf && !list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } - - if (src_buf && !vir->curr_buf && !list_empty(&vir->buf_queue)) { - vir->curr_buf = list_first_entry(&vir->buf_queue, - struct rkisp_buffer, queue); - list_del(&vir->curr_buf->queue); - } - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - - if (!vir->curr_buf || !src_buf) - goto end; - - for (i = 0; i < vir->out_isp_fmt.mplanes; i++) { - u32 payload_size = vir->out_fmt.plane_fmt[i].sizeimage; - void *src = vb2_plane_vaddr(&src_buf->vb.vb2_buf, i); - void *dst = vb2_plane_vaddr(&vir->curr_buf->vb.vb2_buf, i); - - if (!src || !dst) - break; - vb2_set_plane_payload(&vir->curr_buf->vb.vb2_buf, i, payload_size); - memcpy(dst, src, payload_size); - } - - vir->curr_buf->vb.sequence = src_buf->vb.sequence; - vir->curr_buf->vb.vb2_buf.timestamp = src_buf->vb.vb2_buf.timestamp; - vb2_buffer_done(&vir->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - vir->curr_buf = NULL; -end: - if (src_buf) - vb2_buffer_done(&src_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - src_buf = NULL; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - - if (!list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } else if (vir->stopping) { - vir->streaming = false; - } - - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - } - - vir->frame_end = true; - - if (vir->stopping) { - vir->stopping = false; - vir->streaming = false; - wake_up(&vir->done); - } - - v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, - "%s exit\n", __func__); -} - - /* * Most of registers inside rockchip isp1 have shadow register since * they must be not changed during processing a frame. @@ -1793,7 +1701,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count) struct rkisp_stream *t = &dev->cap_dev.stream[stream->conn_id]; if (t->streaming) { - INIT_WORK(&dev->cap_dev.vir_cpy.work, vir_cpy_image); + INIT_WORK(&dev->cap_dev.vir_cpy.work, rkisp_stream_vir_cpy_image); init_completion(&dev->cap_dev.vir_cpy.cmpl); INIT_LIST_HEAD(&dev->cap_dev.vir_cpy.queue); dev->cap_dev.vir_cpy.stream = stream; diff --git a/drivers/media/platform/rockchip/isp/capture_v30.c b/drivers/media/platform/rockchip/isp/capture_v30.c index a4acb0eeafe9..532b1de9e8b8 100644 --- a/drivers/media/platform/rockchip/isp/capture_v30.c +++ b/drivers/media/platform/rockchip/isp/capture_v30.c @@ -1305,97 +1305,6 @@ end: mutex_unlock(&dev->hw_dev->dev_lock); } -static void vir_cpy_image(struct work_struct *work) -{ - struct rkisp_vir_cpy *cpy = - container_of(work, struct rkisp_vir_cpy, work); - struct rkisp_stream *vir = cpy->stream; - struct rkisp_buffer *src_buf = NULL; - unsigned long lock_flags = 0; - u32 i; - - v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, - "%s enter\n", __func__); - - vir->streaming = true; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - if (!list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - - while (src_buf || vir->streaming) { - if (vir->stopping || !vir->streaming) - goto end; - - if (!src_buf) - wait_for_completion(&cpy->cmpl); - - vir->frame_end = false; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - - if (!src_buf && !list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } - - if (src_buf && !vir->curr_buf && !list_empty(&vir->buf_queue)) { - vir->curr_buf = list_first_entry(&vir->buf_queue, - struct rkisp_buffer, queue); - list_del(&vir->curr_buf->queue); - } - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - - if (!vir->curr_buf || !src_buf) - goto end; - - for (i = 0; i < vir->out_isp_fmt.mplanes; i++) { - u32 payload_size = vir->out_fmt.plane_fmt[i].sizeimage; - void *src = vb2_plane_vaddr(&src_buf->vb.vb2_buf, i); - void *dst = vb2_plane_vaddr(&vir->curr_buf->vb.vb2_buf, i); - - if (!src || !dst) - break; - vb2_set_plane_payload(&vir->curr_buf->vb.vb2_buf, i, payload_size); - memcpy(dst, src, payload_size); - } - - vir->curr_buf->vb.sequence = src_buf->vb.sequence; - vir->curr_buf->vb.vb2_buf.timestamp = src_buf->vb.vb2_buf.timestamp; - vb2_buffer_done(&vir->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - vir->curr_buf = NULL; -end: - if (src_buf) - vb2_buffer_done(&src_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - src_buf = NULL; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - - if (!list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } else if (vir->stopping) { - vir->streaming = false; - } - - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - } - - vir->frame_end = true; - - if (vir->stopping) { - vir->stopping = false; - vir->streaming = false; - wake_up(&vir->done); - } - - v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, - "%s exit\n", __func__); -} - static int rkisp_stream_start(struct rkisp_stream *stream) { struct v4l2_device *v4l2_dev = &stream->ispdev->v4l2_dev; @@ -1452,7 +1361,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count) struct rkisp_stream *t = &dev->cap_dev.stream[stream->conn_id]; if (t->streaming) { - INIT_WORK(&dev->cap_dev.vir_cpy.work, vir_cpy_image); + INIT_WORK(&dev->cap_dev.vir_cpy.work, rkisp_stream_vir_cpy_image); init_completion(&dev->cap_dev.vir_cpy.cmpl); INIT_LIST_HEAD(&dev->cap_dev.vir_cpy.queue); dev->cap_dev.vir_cpy.stream = stream; diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index ca0186d52d53..db0b1b33e52b 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1943,97 +1943,6 @@ end: } } -static void vir_cpy_image(struct work_struct *work) -{ - struct rkisp_vir_cpy *cpy = - container_of(work, struct rkisp_vir_cpy, work); - struct rkisp_stream *vir = cpy->stream; - struct rkisp_buffer *src_buf = NULL; - unsigned long lock_flags = 0; - u32 i; - - v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, - "%s enter\n", __func__); - - vir->streaming = true; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - if (!list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - - while (src_buf || vir->streaming) { - if (vir->stopping || !vir->streaming) - goto end; - - if (!src_buf) - wait_for_completion(&cpy->cmpl); - - vir->frame_end = false; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - - if (!src_buf && !list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } - - if (src_buf && !vir->curr_buf && !list_empty(&vir->buf_queue)) { - vir->curr_buf = list_first_entry(&vir->buf_queue, - struct rkisp_buffer, queue); - list_del(&vir->curr_buf->queue); - } - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - - if (!vir->curr_buf || !src_buf) - goto end; - - for (i = 0; i < vir->out_isp_fmt.mplanes; i++) { - u32 payload_size = vir->out_fmt.plane_fmt[i].sizeimage; - void *src = vb2_plane_vaddr(&src_buf->vb.vb2_buf, i); - void *dst = vb2_plane_vaddr(&vir->curr_buf->vb.vb2_buf, i); - - if (!src || !dst) - break; - vb2_set_plane_payload(&vir->curr_buf->vb.vb2_buf, i, payload_size); - memcpy(dst, src, payload_size); - } - - vir->curr_buf->vb.sequence = src_buf->vb.sequence; - vir->curr_buf->vb.vb2_buf.timestamp = src_buf->vb.vb2_buf.timestamp; - vb2_buffer_done(&vir->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - vir->curr_buf = NULL; -end: - if (src_buf) - vb2_buffer_done(&src_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - src_buf = NULL; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - - if (!list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } else if (vir->stopping) { - vir->streaming = false; - } - - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - } - - vir->frame_end = true; - - if (vir->stopping) { - vir->stopping = false; - vir->streaming = false; - wake_up(&vir->done); - } - - v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, - "%s exit\n", __func__); -} - static int rkisp_stream_start(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; @@ -2096,7 +2005,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count) struct rkisp_stream *t = &dev->cap_dev.stream[stream->conn_id]; if (t->streaming) { - INIT_WORK(&dev->cap_dev.vir_cpy.work, vir_cpy_image); + INIT_WORK(&dev->cap_dev.vir_cpy.work, rkisp_stream_vir_cpy_image); init_completion(&dev->cap_dev.vir_cpy.cmpl); INIT_LIST_HEAD(&dev->cap_dev.vir_cpy.queue); dev->cap_dev.vir_cpy.stream = stream; @@ -2342,11 +2251,14 @@ int rkisp_register_stream_v32(struct rkisp_device *dev) ret = rkisp_stream_init(dev, RKISP_STREAM_SP); if (ret < 0) goto err_free_mp; + ret = rkisp_stream_init(dev, RKISP_STREAM_VIR); + if (ret < 0) + goto err_free_sp; if (dev->isp_ver == ISP_V32) { ret = rkisp_stream_init(dev, RKISP_STREAM_BP); if (ret < 0) - goto err_free_sp; + goto err_free_vir; ret = rkisp_stream_init(dev, RKISP_STREAM_MPDS); if (ret < 0) goto err_free_bp; @@ -2370,6 +2282,8 @@ err_free_mpds: rkisp_unregister_stream_vdev(&cap_dev->stream[RKISP_STREAM_MPDS]); err_free_bp: rkisp_unregister_stream_vdev(&cap_dev->stream[RKISP_STREAM_BP]); +err_free_vir: + rkisp_unregister_stream_vdev(&cap_dev->stream[RKISP_STREAM_VIR]); err_free_sp: rkisp_unregister_stream_vdev(&cap_dev->stream[RKISP_STREAM_SP]); err_free_mp: @@ -2387,6 +2301,8 @@ void rkisp_unregister_stream_v32(struct rkisp_device *dev) rkisp_unregister_stream_vdev(stream); stream = &cap_dev->stream[RKISP_STREAM_SP]; rkisp_unregister_stream_vdev(stream); + stream = &cap_dev->stream[RKISP_STREAM_VIR]; + rkisp_unregister_stream_vdev(stream); if (dev->isp_ver == ISP_V32) { stream = &cap_dev->stream[RKISP_STREAM_BP]; rkisp_unregister_stream_vdev(stream); diff --git a/drivers/media/platform/rockchip/isp/capture_v39.c b/drivers/media/platform/rockchip/isp/capture_v39.c index 1ed0b0a11ac7..e276c77248da 100644 --- a/drivers/media/platform/rockchip/isp/capture_v39.c +++ b/drivers/media/platform/rockchip/isp/capture_v39.c @@ -1387,97 +1387,6 @@ end: mutex_unlock(&dev->hw_dev->dev_lock); } -static void vir_cpy_image(struct work_struct *work) -{ - struct rkisp_vir_cpy *cpy = - container_of(work, struct rkisp_vir_cpy, work); - struct rkisp_stream *vir = cpy->stream; - struct rkisp_buffer *src_buf = NULL; - unsigned long lock_flags = 0; - u32 i; - - v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, - "%s enter\n", __func__); - - vir->streaming = true; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - if (!list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - - while (src_buf || vir->streaming) { - if (vir->stopping || !vir->streaming) - goto end; - - if (!src_buf) - wait_for_completion(&cpy->cmpl); - - vir->frame_end = false; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - - if (!src_buf && !list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } - - if (src_buf && !vir->curr_buf && !list_empty(&vir->buf_queue)) { - vir->curr_buf = list_first_entry(&vir->buf_queue, - struct rkisp_buffer, queue); - list_del(&vir->curr_buf->queue); - } - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - - if (!vir->curr_buf || !src_buf) - goto end; - - for (i = 0; i < vir->out_isp_fmt.mplanes; i++) { - u32 payload_size = vir->out_fmt.plane_fmt[i].sizeimage; - void *src = vb2_plane_vaddr(&src_buf->vb.vb2_buf, i); - void *dst = vb2_plane_vaddr(&vir->curr_buf->vb.vb2_buf, i); - - if (!src || !dst) - break; - vb2_set_plane_payload(&vir->curr_buf->vb.vb2_buf, i, payload_size); - memcpy(dst, src, payload_size); - } - - vir->curr_buf->vb.sequence = src_buf->vb.sequence; - vir->curr_buf->vb.vb2_buf.timestamp = src_buf->vb.vb2_buf.timestamp; - vb2_buffer_done(&vir->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - vir->curr_buf = NULL; -end: - if (src_buf) - vb2_buffer_done(&src_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); - src_buf = NULL; - spin_lock_irqsave(&vir->vbq_lock, lock_flags); - - if (!list_empty(&cpy->queue)) { - src_buf = list_first_entry(&cpy->queue, - struct rkisp_buffer, queue); - list_del(&src_buf->queue); - } else if (vir->stopping) { - vir->streaming = false; - } - - spin_unlock_irqrestore(&vir->vbq_lock, lock_flags); - } - - vir->frame_end = true; - - if (vir->stopping) { - vir->stopping = false; - vir->streaming = false; - wake_up(&vir->done); - } - - v4l2_dbg(1, rkisp_debug, &vir->ispdev->v4l2_dev, - "%s exit\n", __func__); -} - static int rkisp_stream_start(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; @@ -1536,7 +1445,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count) struct rkisp_stream *t = &dev->cap_dev.stream[stream->conn_id]; if (t->streaming) { - INIT_WORK(&dev->cap_dev.vir_cpy.work, vir_cpy_image); + INIT_WORK(&dev->cap_dev.vir_cpy.work, rkisp_stream_vir_cpy_image); init_completion(&dev->cap_dev.vir_cpy.cmpl); INIT_LIST_HEAD(&dev->cap_dev.vir_cpy.queue); dev->cap_dev.vir_cpy.stream = stream;