diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 0a557bd21570..94a2347feb78 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -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); } diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c index ca187563239e..f9081634bcd6 100644 --- a/drivers/media/platform/rockchip/cif/dev.c +++ b/drivers/media/platform/rockchip/cif/dev.c @@ -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", diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h index a23d20aa0fcb..503c5562f75d 100644 --- a/drivers/media/platform/rockchip/cif/dev.h +++ b/drivers/media/platform/rockchip/cif/dev.h @@ -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; diff --git a/drivers/media/platform/rockchip/cif/procfs.c b/drivers/media/platform/rockchip/cif/procfs.c index e8f61edecc29..9686faacf036 100644 --- a/drivers/media/platform/rockchip/cif/procfs.c +++ b/drivers/media/platform/rockchip/cif/procfs.c @@ -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)); } }