media: rockchip: cif fixed frame sequence bug in HDR mode

Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
Change-Id: I6d1837bb6dd4ae2cbae397fb3a4cce404e5d3909
This commit is contained in:
Zefa Chen
2021-09-23 14:33:57 +08:00
committed by Tao Huang
parent 927d72b998
commit 4800a4346c

View File

@@ -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)