media: rockchip: vicap fixes logic error of skip frame

Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
Change-Id: Ic1428169c8a60786decf3d8926bd86f2df7670e1
This commit is contained in:
Zefa Chen 2023-12-26 10:03:34 +08:00
commit 9f585815cc
2 changed files with 17 additions and 21 deletions

View file

@ -1659,8 +1659,9 @@ static void rkcif_s_rx_buffer(struct rkcif_stream *stream, struct rkisp_rx_buf *
sd = get_rkisp_sd(dev->sditf[0]);
if (!sd)
return;
if (dev->rdbk_debug &&
dbufs->sequence < 15) {
if ((dev->rdbk_debug &&
dbufs->sequence < 15) ||
rkcif_debug == 3) {
rx_buf = to_cif_rx_buf(dbufs);
v4l2_info(&dev->v4l2_dev,
"s_buf seq %d type %d, dma addr %x, %lld\n",
@ -2532,7 +2533,6 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
int ret = 0;
u32 buff_addr_y, buff_addr_cbcr;
unsigned long flags;
int on = 0;
if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY ||
mbus_cfg->type == V4L2_MBUS_CSI2_CPHY ||
@ -2631,18 +2631,6 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
}
}
stream->frame_phase_cache = stream->frame_phase;
if (stream->is_single_cap && !stream->cur_skip_frame) {
stream->to_stop_dma = RKCIF_DMAEN_BY_VICAP;
rkcif_stop_dma_capture(stream);
rkcif_dphy_quick_stream(stream->cifdev, on);
stream->is_single_cap = false;
if ((dev->hdr.hdr_mode == NO_HDR && atomic_read(&dev->streamoff_cnt) == 1) ||
(dev->hdr.hdr_mode == HDR_X2 && atomic_read(&dev->streamoff_cnt) == 2) ||
(dev->hdr.hdr_mode == HDR_X3 && atomic_read(&dev->streamoff_cnt) == 3)) {
dev->sensor_work.on = on;
schedule_work(&dev->sensor_work.work);
}
}
if (buffer) {
buff_addr_y = buffer->buff_addr[RKCIF_PLANE_Y];
@ -10180,7 +10168,10 @@ static void rkcif_toisp_check_stop_status(struct sditf_priv *priv,
complete(&stream->stop_complete);
}
}
if (stream->is_single_cap && (!stream->cur_skip_frame)) {
if (stream->is_single_cap && (!stream->cur_skip_frame) &&
(stream->cifdev->hdr.hdr_mode == NO_HDR ||
(stream->cifdev->hdr.hdr_mode == HDR_X2 && stream->id == 1) ||
(stream->cifdev->hdr.hdr_mode == HDR_X3 && stream->id == 2))) {
rkcif_dphy_quick_stream(stream->cifdev, on);
stream->cifdev->sensor_work.on = 0;
schedule_work(&stream->cifdev->sensor_work.work);
@ -10188,8 +10179,8 @@ static void rkcif_toisp_check_stop_status(struct sditf_priv *priv,
}
if (stream->cur_skip_frame &&
(stream->cifdev->hdr.hdr_mode == NO_HDR ||
(stream->cifdev->hdr.hdr_mode == HDR_X2 && stream->id == 1) ||
(stream->cifdev->hdr.hdr_mode == HDR_X3 && stream->id == 2)))
(stream->cifdev->hdr.hdr_mode == HDR_X2 && stream->id == 1) ||
(stream->cifdev->hdr.hdr_mode == HDR_X3 && stream->id == 2)))
stream->cur_skip_frame--;
if (stream->cifdev->chip_id >= CHIP_RV1106_CIF)
rkcif_modify_frame_skip_config(stream);
@ -11142,8 +11133,13 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev)
stream->dma_en);
rkcif_update_stream_rockit(cif_dev, stream, mipi_id);
}
if (stream->is_single_cap) {
stream->to_stop_dma = RKCIF_DMAEN_BY_ISP;
if (stream->is_single_cap && !stream->cur_skip_frame) {
if (stream->dma_en & RKCIF_DMAEN_BY_ISP)
stream->to_stop_dma = RKCIF_DMAEN_BY_ISP;
else if (stream->dma_en & RKCIF_DMAEN_BY_VICAP)
stream->to_stop_dma = RKCIF_DMAEN_BY_VICAP;
else if (stream->dma_en & RKCIF_DMAEN_BY_ROCKIT)
stream->to_stop_dma = RKCIF_DMAEN_BY_ROCKIT;
rkcif_stop_dma_capture(stream);
stream->is_single_cap = false;
if ((cif_dev->hdr.hdr_mode == NO_HDR && atomic_read(&cif_dev->streamoff_cnt) == 1) ||

View file

@ -184,7 +184,7 @@
_IOW('V', BASE_VIDIOC_PRIVATE + 40, struct rkmodule_capture_info)
#define RKMODULE_GET_SKIP_FRAME \
_IOW('V', BASE_VIDIOC_PRIVATE + 41, __u32)
_IOR('V', BASE_VIDIOC_PRIVATE + 41, __u32)
struct rkmodule_i2cdev_info {
__u8 slave_addr;