From 4037c8a7696f62c54c0c2696c19a51eecdd07b00 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 30 Sep 2022 17:05:54 +0800 Subject: [PATCH] media: rockchip: isp: drop first output for fast case Change-Id: I7e303b6307032187a70b5558f2a78ccd6b8f3ca5 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture_v32.c | 10 +++++++++- drivers/media/platform/rockchip/isp/rkisp.c | 12 +++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index 637b5e882f6d..67cb27c320eb 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1253,6 +1253,7 @@ static int mi_frame_start(struct rkisp_stream *stream, u32 mis) */ static int mi_frame_end(struct rkisp_stream *stream) { + struct rkisp_device *dev = stream->ispdev; struct capture_fmt *isp_fmt = &stream->out_isp_fmt; unsigned long lock_flags = 0; u32 i; @@ -1262,6 +1263,13 @@ static int mi_frame_end(struct rkisp_stream *stream) if (stream->curr_buf) { struct vb2_buffer *vb2_buf = &stream->curr_buf->vb.vb2_buf; + if (dev->skip_frame) { + spin_lock_irqsave(&stream->vbq_lock, lock_flags); + list_add_tail(&stream->curr_buf->queue, &stream->buf_queue); + spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); + goto next; + } + for (i = 0; i < isp_fmt->mplanes; i++) { u32 payload_size = stream->out_fmt.plane_fmt[i].sizeimage; @@ -1273,7 +1281,7 @@ static int mi_frame_end(struct rkisp_stream *stream) else rkisp_rockit_buf_done(stream, ROCKIT_DVBM_END); } - +next: spin_lock_irqsave(&stream->vbq_lock, lock_flags); stream->curr_buf = stream->next_buf; stream->next_buf = NULL; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index b89935cd4aac..7597539eb919 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -789,8 +789,10 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd) isp->sw_rd_cnt = 1; times = 0; } - if (dev->is_pre_on && t.frame_id == 0) + if (dev->is_pre_on && t.frame_id == 0) { dev->is_first_double = true; + dev->skip_frame = 1; + } } end: spin_unlock_irqrestore(&hw->rdbk_lock, lock_flags); @@ -847,8 +849,6 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq) { u32 val = 0; - if (dev->is_first_double) - return; if (dev->hw_dev->is_multi_overflow && dev->sw_rd_cnt && irq & ISP_FRAME_END) @@ -867,6 +867,12 @@ void rkisp_check_idle(struct rkisp_device *dev, u32 irq) if (dev->irq_ends != dev->irq_ends_mask || !IS_HDR_RDBK(dev->rd_mode)) return; + if (dev->is_first_double) { + dev->skip_frame = 0; + dev->irq_ends = 0; + return; + } + /* check output stream is off */ val = ISP_FRAME_MP | ISP_FRAME_SP | ISP_FRAME_MPFBC | ISP_FRAME_BP; if (!(dev->irq_ends_mask & val)) {