From 39c3a52c259d98a96c4fb5193d94fec09711d0ab Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 26 Aug 2022 09:23:57 +0800 Subject: [PATCH] media: rockchip: isp: stop without waiting if isp idle for readback mode Change-Id: Iba8f4f16a270deb209c022f9cbbf192496388288 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture_v21.c | 11 +++++++++-- drivers/media/platform/rockchip/isp/capture_v30.c | 7 +++++++ drivers/media/platform/rockchip/isp/capture_v32.c | 7 +++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index 614947dbcf23..650b8cb85659 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -1329,6 +1329,7 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; struct v4l2_device *v4l2_dev = &dev->v4l2_dev; + unsigned long lock_flags = 0; int ret = 0; if (!dev->dmarx_dev.trigger && @@ -1342,9 +1343,15 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) stream->id != RKISP_STREAM_SP) || dev->hw_dev->is_single) stream->ops->stop_mi(stream); - if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) + if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) { hdr_stop_dmatx(dev); - + if (IS_HDR_RDBK(dev->rd_mode)) { + spin_lock_irqsave(&dev->hw_dev->rdbk_lock, lock_flags); + if (dev->hw_dev->cur_dev_id != dev->dev_id || dev->hw_dev->is_idle) + dev->isp_state = ISP_STOP; + spin_unlock_irqrestore(&dev->hw_dev->rdbk_lock, lock_flags); + } + } if (dev->isp_state & ISP_START && !stream->ops->is_stream_stopped(stream)) { ret = wait_event_timeout(stream->done, diff --git a/drivers/media/platform/rockchip/isp/capture_v30.c b/drivers/media/platform/rockchip/isp/capture_v30.c index 691e98e78bc3..683df04e317a 100644 --- a/drivers/media/platform/rockchip/isp/capture_v30.c +++ b/drivers/media/platform/rockchip/isp/capture_v30.c @@ -964,11 +964,18 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; struct v4l2_device *v4l2_dev = &dev->v4l2_dev; + unsigned long lock_flags = 0; int ret = 0; stream->stopping = true; if (dev->hw_dev->is_single) stream->ops->disable_mi(stream); + if (IS_HDR_RDBK(dev->rd_mode)) { + spin_lock_irqsave(&dev->hw_dev->rdbk_lock, lock_flags); + if (dev->hw_dev->cur_dev_id != dev->dev_id || dev->hw_dev->is_idle) + dev->isp_state = ISP_STOP; + spin_unlock_irqrestore(&dev->hw_dev->rdbk_lock, lock_flags); + } if (dev->isp_state & ISP_START && !stream->ops->is_stream_stopped(stream)) { ret = wait_event_timeout(stream->done, diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index db4448de155f..709f9e445040 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1297,12 +1297,19 @@ static void rkisp_stream_stop(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; struct v4l2_device *v4l2_dev = &dev->v4l2_dev; + unsigned long lock_flags = 0; int ret = 0; stream->stopping = true; stream->is_pause = false; if (dev->hw_dev->is_single && stream->ops->disable_mi) stream->ops->disable_mi(stream); + if (IS_HDR_RDBK(dev->rd_mode)) { + spin_lock_irqsave(&dev->hw_dev->rdbk_lock, lock_flags); + if (dev->hw_dev->cur_dev_id != dev->dev_id || dev->hw_dev->is_idle) + dev->isp_state = ISP_STOP; + spin_unlock_irqrestore(&dev->hw_dev->rdbk_lock, lock_flags); + } if (dev->isp_state & ISP_START && !stream->ops->is_stream_stopped(stream)) { ret = wait_event_timeout(stream->done,