From 4800a4346c8ab6a899d574967566a20630dadf19 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Thu, 23 Sep 2021 14:33:57 +0800 Subject: [PATCH] media: rockchip: cif fixed frame sequence bug in HDR mode Signed-off-by: Zefa Chen Change-Id: I6d1837bb6dd4ae2cbae397fb3a4cce404e5d3909 --- drivers/media/platform/rockchip/cif/capture.c | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 36bd2c99c707..51b523f4abfb 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -2163,6 +2163,9 @@ static void rkcif_buf_queue(struct vb2_buffer *vb) spin_lock_irqsave(&stream->vbq_lock, flags); list_add_tail(&cifbuf->queue, &stream->buf_head); spin_unlock_irqrestore(&stream->vbq_lock, flags); + v4l2_dbg(1, rkcif_debug, &stream->cifdev->v4l2_dev, + "stream[%d] buf queue, index: %d\n", + stream->id, vb->index); } static int rkcif_create_dummy_buf(struct rkcif_stream *stream) @@ -4361,6 +4364,9 @@ static void rkcif_vb_done_oneframe(struct rkcif_stream *stream, vb_done->vb2_buf.timestamp = ktime_get_ns(); vb2_buffer_done(&vb_done->vb2_buf, VB2_BUF_STATE_DONE); + v4l2_dbg(1, rkcif_debug, &stream->cifdev->v4l2_dev, + "stream[%d] vb done, index: %d, sequence %d\n", stream->id, + vb_done->vb2_buf.index, vb_done->sequence); } void rkcif_irq_oneframe(struct rkcif_device *cif_dev) @@ -4886,12 +4892,14 @@ static void rkcif_rdbk_frame_end(struct rkcif_stream *stream) goto RDBK_FRM_UNMATCH; } } - - dev->rdbk_buf[RDBK_M]->vb.sequence = dev->rdbk_buf[RDBK_L]->vb.sequence; - dev->rdbk_buf[RDBK_S]->vb.sequence = dev->rdbk_buf[RDBK_L]->vb.sequence; - rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_L]->vb); - rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_M]->vb); - rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_S]->vb); + dev->rdbk_buf[RDBK_L]->vb.sequence = dev->rdbk_buf[RDBK_S]->vb.sequence; + dev->rdbk_buf[RDBK_M]->vb.sequence = dev->rdbk_buf[RDBK_S]->vb.sequence; + rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID0], + &dev->rdbk_buf[RDBK_L]->vb); + rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID1], + &dev->rdbk_buf[RDBK_M]->vb); + rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID2], + &dev->rdbk_buf[RDBK_S]->vb); } else { if (!dev->rdbk_buf[RDBK_L]) v4l2_err(&dev->v4l2_dev, "lost long frames\n"); @@ -4933,11 +4941,11 @@ static void rkcif_rdbk_frame_end(struct rkcif_stream *stream) goto RDBK_FRM_UNMATCH; } } - - dev->rdbk_buf[RDBK_M]->vb.sequence = - dev->rdbk_buf[RDBK_L]->vb.sequence; - rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_L]->vb); - rkcif_vb_done_oneframe(stream, &dev->rdbk_buf[RDBK_M]->vb); + dev->rdbk_buf[RDBK_L]->vb.sequence = dev->rdbk_buf[RDBK_M]->vb.sequence; + rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID0], + &dev->rdbk_buf[RDBK_L]->vb); + rkcif_vb_done_oneframe(&dev->stream[RKCIF_STREAM_MIPI_ID1], + &dev->rdbk_buf[RDBK_M]->vb); } else { if (!dev->rdbk_buf[RDBK_L]) v4l2_err(&dev->v4l2_dev, "lost long frames\n"); @@ -5166,6 +5174,11 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev, if (cif_dev->inf_id == RKCIF_MIPI_LVDS) rkcif_deal_readout_time(stream); + if (cif_dev->chip_id == CHIP_RV1126_CIF || + cif_dev->chip_id == CHIP_RV1126_CIF_LITE || + cif_dev->chip_id == CHIP_RK3568_CIF) + rkcif_luma_isr(&cif_dev->luma_vdev, mipi_id, stream->frame_idx); + if (!stream->is_line_wake_up) { ret = rkcif_assign_new_buffer_pingpong(stream, RKCIF_YUV_ADDR_STATE_UPDATE, @@ -5177,16 +5190,12 @@ static void rkcif_update_stream(struct rkcif_device *cif_dev, if (ret) return; } - - if (cif_dev->chip_id == CHIP_RV1126_CIF || - cif_dev->chip_id == CHIP_RV1126_CIF_LITE || - cif_dev->chip_id == CHIP_RK3568_CIF) - rkcif_luma_isr(&cif_dev->luma_vdev, mipi_id, stream->frame_idx); - if (!stream->is_line_wake_up) { + if (!stream->is_line_wake_up) rkcif_buf_done_prepare(stream, active_buf, mipi_id, 0); + end: + if (!stream->is_line_wake_up) stream->frame_idx++; - } } u32 rkcif_get_sof(struct rkcif_device *cif_dev)