mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
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 <mingwei.yan@rock-chips.com> Change-Id: I969481c3a59fbff6ec621402e4b19d1647345fde
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user