media: rockchip: isp: remove dmatx lock by hw dev_lock

hw dev_lock for multi device such as mainpath and selfpath output

Change-Id: I905040fee2836e4cc3e36f2bf523f45bb5b226eb
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2023-05-11 11:36:43 +08:00
parent 9376d46218
commit fb44ec8883

View File

@ -1207,6 +1207,22 @@ static void destroy_buf_queue(struct rkisp_stream *stream,
spin_unlock_irqrestore(&stream->vbq_lock, lock_flags);
}
static void rkisp_stop_streaming_tx(struct rkisp_stream *stream)
{
struct rkisp_device *dev = stream->ispdev;
stream->stopping = true;
if (dev->isp_state & ISP_START &&
!stream->ops->is_stream_stopped(dev->base_addr)) {
stream->ops->stop_mi(stream);
wait_event_timeout(stream->done, !stream->streaming,
msecs_to_jiffies(300));
}
stream->stopping = false;
stream->streaming = false;
destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
}
static void rkisp_stop_streaming(struct vb2_queue *queue)
{
struct rkisp_stream *stream = queue->drv_priv;
@ -1215,24 +1231,23 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
int ret;
mutex_lock(&dev->hw_dev->dev_lock);
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
"%s %d\n", __func__, stream->id);
if (!stream->streaming)
goto end;
return;
if (stream->id != RKISP_STREAM_MP && stream->id != RKISP_STREAM_SP)
return rkisp_stop_streaming_tx(stream);
mutex_lock(&dev->hw_dev->dev_lock);
rkisp_stream_stop(stream);
if (stream->id == RKISP_STREAM_MP ||
stream->id == RKISP_STREAM_SP) {
/* call to the other devices */
media_pipeline_stop(&node->vdev.entity);
ret = dev->pipe.set_stream(&dev->pipe, false);
if (ret < 0)
v4l2_err(v4l2_dev,
"pipeline stream-off failed:%d\n", ret);
}
/* call to the other devices */
media_pipeline_stop(&node->vdev.entity);
ret = dev->pipe.set_stream(&dev->pipe, false);
if (ret < 0)
v4l2_err(v4l2_dev,
"pipeline stream-off failed:%d\n", ret);
/* release buffers */
destroy_buf_queue(stream, VB2_BUF_STATE_ERROR);
@ -1243,7 +1258,6 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
rkisp_destroy_dummy_buf(stream);
atomic_dec(&dev->cap_dev.refcnt);
end:
mutex_unlock(&dev->hw_dev->dev_lock);
}
@ -1285,6 +1299,25 @@ end:
return rkisp_start(stream);
}
static int
rkisp_start_streaming_tx(struct rkisp_stream *stream)
{
struct rkisp_device *dev = stream->ispdev;
int ret = -1;
if (!dev->isp_inp || !stream->linked)
goto buffer_done;
ret = rkisp_stream_start(stream);
if (ret < 0)
goto buffer_done;
return 0;
buffer_done:
destroy_buf_queue(stream, VB2_BUF_STATE_QUEUED);
stream->streaming = false;
return ret;
}
static int
rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
{
@ -1294,17 +1327,16 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
int ret = -1;
mutex_lock(&dev->hw_dev->dev_lock);
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
"%s %d\n", __func__, stream->id);
if (WARN_ON(stream->streaming)) {
mutex_unlock(&dev->hw_dev->dev_lock);
if (WARN_ON(stream->streaming))
return -EBUSY;
}
memset(&stream->dbg, 0, sizeof(stream->dbg));
if (stream->id != RKISP_STREAM_MP && stream->id != RKISP_STREAM_SP)
return rkisp_start_streaming_tx(stream);
mutex_lock(&dev->hw_dev->dev_lock);
atomic_inc(&dev->cap_dev.refcnt);
if (!dev->isp_inp || !stream->linked) {
v4l2_err(v4l2_dev, "check video link or isp input\n");
@ -1354,19 +1386,16 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
goto close_pipe;
}
if (stream->id == RKISP_STREAM_MP ||
stream->id == RKISP_STREAM_SP) {
/* start sub-devices */
ret = dev->pipe.set_stream(&dev->pipe, true);
if (ret < 0)
goto stop_stream;
/* start sub-devices */
ret = dev->pipe.set_stream(&dev->pipe, true);
if (ret < 0)
goto stop_stream;
ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
if (ret < 0) {
v4l2_err(&dev->v4l2_dev,
"start pipeline failed %d\n", ret);
goto pipe_stream_off;
}
ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
if (ret < 0) {
v4l2_err(&dev->v4l2_dev,
"start pipeline failed %d\n", ret);
goto pipe_stream_off;
}
mutex_unlock(&dev->hw_dev->dev_lock);