From ea2f26927f938f3dbad37a568d299f3ba7b1f122 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Tue, 11 Apr 2023 20:36:38 +0800 Subject: [PATCH] media: rockchip: vicap: fixes dvp capture not config buffer in rockit mode Signed-off-by: Zefa Chen Change-Id: I97fbc49e73574339708882efe4a435b8716ce606 --- drivers/media/platform/rockchip/cif/capture.c | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 411e912c2124..ee077bf725de 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -5268,13 +5268,24 @@ static int rkcif_stream_start(struct rkcif_stream *stream, unsigned int mode) } if (stream->dma_en) { - if (dev->chip_id < CHIP_RK1808_CIF) + if (dev->chip_id < CHIP_RK1808_CIF) { rkcif_assign_new_buffer_oneframe(stream, RKCIF_YUV_ADDR_STATE_INIT); - else - rkcif_assign_new_buffer_pingpong(stream, - RKCIF_YUV_ADDR_STATE_INIT, - stream->id); + } else { + if (mode == RKCIF_STREAM_MODE_CAPTURE) + rkcif_assign_new_buffer_pingpong(stream, + RKCIF_YUV_ADDR_STATE_INIT, + stream->id); + else if (mode == RKCIF_STREAM_MODE_TOISP || + mode == RKCIF_STREAM_MODE_TOISP_RDBK) + rkcif_assign_new_buffer_pingpong_toisp(stream, + RKCIF_YUV_ADDR_STATE_INIT, + stream->id); + else if (mode == RKCIF_STREAM_MODE_ROCKIT) + rkcif_assign_new_buffer_pingpong_rockit(stream, + RKCIF_YUV_ADDR_STATE_INIT, + stream->id); + } } rkcif_write_register_or(dev, CIF_REG_DVP_INTEN, DVP_DMA_END_INTSTAT(stream->id) | @@ -9843,8 +9854,19 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev) intstat &= ~DVP_ALL_END_ID3; break; } - if (stream->dma_en) - rkcif_update_stream(cif_dev, stream, ch_id); + if (stream->dma_en & RKCIF_DMAEN_BY_VICAP) { + if (cif_dev->sync_cfg.type == RKCIF_NOSYNC_MODE) + is_update = true; + else + is_update = rkcif_check_buffer_prepare(stream); + if (is_update) + rkcif_update_stream(cif_dev, stream, ch_id); + } else if (stream->dma_en & RKCIF_DMAEN_BY_ISP) { + rkcif_update_stream_toisp(cif_dev, stream, ch_id); + } else if (stream->dma_en & RKCIF_DMAEN_BY_ROCKIT) { + rkcif_update_stream_rockit(cif_dev, stream, ch_id); + } + if (stream->to_en_dma) rkcif_enable_dma_capture(stream, false); if (stream->to_stop_dma) {