media: rockchip: vicap fixed error state of group mode and add some debug log

Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
Change-Id: I6484ea72caa89bd420c68d607e3fec21e2bceac1
This commit is contained in:
Zefa Chen
2023-06-15 15:43:52 +08:00
committed by Tao Huang
parent cfe0bad194
commit 9c2112878e
4 changed files with 39 additions and 8 deletions

View File

@@ -4200,6 +4200,7 @@ void rkcif_buf_queue(struct vb2_buffer *vb)
v4l2_dbg(3, rkcif_debug, &stream->cifdev->v4l2_dev,
"stream[%d] buf queue, index: %d, dma_addr 0x%x\n",
stream->id, vb->index, cifbuf->buff_addr[0]);
atomic_inc(&stream->buf_cnt);
}
void rkcif_free_rx_buf(struct rkcif_stream *stream, int buf_num)
@@ -4664,6 +4665,8 @@ void rkcif_do_stop_stream(struct rkcif_stream *stream,
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
}
}
atomic_set(&stream->buf_cnt, 0);
stream->lack_buf_cnt = 0;
stream->dma_en &= ~RKCIF_DMAEN_BY_VICAP;
}
@@ -5610,12 +5613,12 @@ static void rkcif_attach_sync_mode(struct rkcif_device *cifdev)
else
sync_cfg.group = 0;
}
cifdev->sync_cfg = sync_cfg;
if (sync_cfg.type == NO_SYNC_MODE ||
hw->sync_config[sync_cfg.group].is_attach) {
mutex_unlock(&hw->dev_lock);
return;
}
cifdev->sync_cfg = sync_cfg;
sync_config = &hw->sync_config[sync_cfg.group];
memset(sync_config, 0, sizeof(struct rkcif_multi_sync_config));
@@ -6184,6 +6187,7 @@ void rkcif_stream_init(struct rkcif_device *dev, u32 id)
stream->buf_owner = 0;
stream->buf_replace_cnt = 0;
stream->is_stop_capture = false;
atomic_set(&stream->buf_cnt, 0);
}
static int rkcif_fh_open(struct file *filp)
@@ -6876,6 +6880,7 @@ void rkcif_vb_done_oneframe(struct rkcif_stream *stream,
v4l2_dbg(2, 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);
atomic_dec(&stream->buf_cnt);
}
static void rkcif_tasklet_handle(unsigned long data)
@@ -9616,15 +9621,16 @@ static int rkcif_check_group_sync_state(struct rkcif_device *cif_dev)
sync_config = &hw->sync_config[cif_dev->sync_cfg.group];
sync_config->sync_code |= BIT(cif_dev->csi_host_idx);
if (sync_config->sync_code != sync_config->sync_mask)
return -EINVAL;
v4l2_dbg(3, rkcif_debug, &cif_dev->v4l2_dev,
"sync code 0x%x, mask 0x%x, update 0x%x, cache 0x%x\n",
"sync code 0x%x, mask 0x%x, update 0x%x, cache 0x%x, timestamp %llu\n",
sync_config->sync_code,
sync_config->sync_mask,
sync_config->update_code,
sync_config->update_cache);
sync_config->update_cache,
detect_stream->readout.fs_timestamp);
if (sync_config->sync_code != sync_config->sync_mask)
return -EINVAL;
for (i = 0; i < sync_config->dev_cnt; i++) {
if (sync_config->mode == RKCIF_MASTER_MASTER) {
@@ -9982,11 +9988,20 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev)
is_update = true;
else
is_update = rkcif_check_buffer_prepare(stream);
v4l2_dbg(4, rkcif_debug, &cif_dev->v4l2_dev,
"dma capture by vicap, is_updata %d, group mode %d, dma_en %d\n",
is_update, cif_dev->sync_cfg.type, stream->dma_en);
if (is_update)
rkcif_update_stream(cif_dev, stream, mipi_id);
} else if (stream->dma_en & RKCIF_DMAEN_BY_ISP) {
v4l2_dbg(4, rkcif_debug, &cif_dev->v4l2_dev,
"dma capture by isp, dma_en 0x%x\n",
stream->dma_en);
rkcif_update_stream_toisp(cif_dev, stream, mipi_id);
} else if (stream->dma_en & RKCIF_DMAEN_BY_ROCKIT) {
v4l2_dbg(4, rkcif_debug, &cif_dev->v4l2_dev,
"dma capture by rockit, dma_en 0x%x\n",
stream->dma_en);
rkcif_update_stream_rockit(cif_dev, stream, mipi_id);
}

View File

@@ -644,12 +644,16 @@ void rkcif_write_register(struct rkcif_device *dev,
}
}
if (index < CIF_REG_INDEX_MAX) {
if (index == CIF_REG_DVP_CTRL || reg->offset != 0x0)
if (index == CIF_REG_DVP_CTRL || reg->offset != 0x0) {
write_cif_reg(base, reg->offset + csi_offset, val);
else
v4l2_dbg(4, rkcif_debug, &dev->v4l2_dev,
"write reg[0x%x]:0x%x!!!\n",
reg->offset + csi_offset, val);
} else {
v4l2_dbg(1, rkcif_debug, &dev->v4l2_dev,
"write reg[%d]:0x%x failed, maybe useless!!!\n",
index, val);
}
}
}
@@ -681,6 +685,9 @@ void rkcif_write_register_or(struct rkcif_device *dev,
reg_val = read_cif_reg(base, reg->offset + csi_offset);
reg_val |= val;
write_cif_reg(base, reg->offset + csi_offset, reg_val);
v4l2_dbg(4, rkcif_debug, &dev->v4l2_dev,
"write or reg[0x%x]:0x%x!!!\n",
reg->offset + csi_offset, val);
} else {
v4l2_dbg(1, rkcif_debug, &dev->v4l2_dev,
"write reg[%d]:0x%x with OR failed, maybe useless!!!\n",
@@ -717,6 +724,9 @@ void rkcif_write_register_and(struct rkcif_device *dev,
reg_val = read_cif_reg(base, reg->offset + csi_offset);
reg_val &= val;
write_cif_reg(base, reg->offset + csi_offset, reg_val);
v4l2_dbg(4, rkcif_debug, &dev->v4l2_dev,
"write and reg[0x%x]:0x%x!!!\n",
reg->offset + csi_offset, val);
} else {
v4l2_dbg(1, rkcif_debug, &dev->v4l2_dev,
"write reg[%d]:0x%x with OR failed, maybe useless!!!\n",

View File

@@ -536,6 +536,7 @@ struct rkcif_stream {
int last_rx_buf_idx;
int last_frame_idx;
int new_fource_idx;
atomic_t buf_cnt;
bool stopping;
bool crop_enable;
bool crop_dyn_en;

View File

@@ -371,6 +371,11 @@ static void rkcif_show_format(struct rkcif_device *dev, struct seq_file *f)
seq_printf(f, "dma enable: 0x%x 0x%x 0x%x 0x%x\n",
dev->stream[0].dma_en, dev->stream[1].dma_en,
dev->stream[2].dma_en, dev->stream[3].dma_en);
seq_printf(f, "buf_cnt in drv: %d %d %d %d\n",
atomic_read(&dev->stream[0].buf_cnt),
atomic_read(&dev->stream[1].buf_cnt),
atomic_read(&dev->stream[2].buf_cnt),
atomic_read(&dev->stream[3].buf_cnt));
}
}