From bbc9d3fcf69bfda06000e9dadd806833871750d9 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Wed, 9 Nov 2022 16:56:25 +0800 Subject: [PATCH] media: rockchip: vicap disable dma capture in fs intr before stop stream if disable dma capture in fe intr, register write to device may delay after real fs, the register need effect in next real fs, may cause iommu error or size error Signed-off-by: Zefa Chen Change-Id: I451c18f175e89c5ddf7c8a31f2f288dd8c01a8f1 --- drivers/media/platform/rockchip/cif/capture.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 75aaa69a74d4..edcb7e2edacf 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -9071,8 +9071,7 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev) cif_dev->sditf[0]->mode.rdbk_mode) stream->buf_wake_up_cnt++; - if (stream->stopping && - !(stream->cur_stream_mode & RKCIF_STREAM_MODE_TOISP)) { + if (stream->stopping && (!stream->dma_en)) { rkcif_stream_stop(stream); stream->stopping = false; wake_up(&stream->wq_stopped); @@ -9181,6 +9180,12 @@ void rkcif_irq_pingpong_v1(struct rkcif_device *cif_dev) spin_unlock_irqrestore(&stream->fps_lock, flags); } stream->is_in_vblank = false; + if (stream->stopping && stream->dma_en) { + if (stream->dma_en & RKCIF_DMAEN_BY_VICAP) + stream->to_stop_dma = RKCIF_DMAEN_BY_VICAP; + else if (stream->dma_en & RKCIF_DMAEN_BY_ISP) + stream->to_stop_dma = RKCIF_DMAEN_BY_ISP; + } if (stream->to_stop_dma) { ret = rkcif_stop_dma_capture(stream); if (!ret)