From 7d07b3ae8ddad407913c5301877e694430a3263f Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Thu, 23 Nov 2023 08:24:31 +0000
Subject: [PATCH] add build kerneldeb
---
kernel/drivers/media/platform/rockchip/isp/capture_v21.c | 113 ++++++++++++++++++++++++++++++++------------------------
1 files changed, 64 insertions(+), 49 deletions(-)
diff --git a/kernel/drivers/media/platform/rockchip/isp/capture_v21.c b/kernel/drivers/media/platform/rockchip/isp/capture_v21.c
index 79402c5..a243756 100644
--- a/kernel/drivers/media/platform/rockchip/isp/capture_v21.c
+++ b/kernel/drivers/media/platform/rockchip/isp/capture_v21.c
@@ -1046,14 +1046,7 @@
{
void __iomem *base = stream->ispdev->base_addr;
struct rkisp_device *dev = stream->ispdev;
- bool is_update = false;
int ret;
-
- if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) {
- is_update = (stream->id == RKISP_STREAM_MP) ?
- !dev->cap_dev.stream[RKISP_STREAM_SP].streaming :
- !dev->cap_dev.stream[RKISP_STREAM_MP].streaming;
- }
if (stream->ops->set_data_path)
stream->ops->set_data_path(base);
@@ -1064,9 +1057,6 @@
stream->ops->enable_mi(stream);
if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP)
hdr_config_dmatx(dev);
- if (is_update)
- dev->irq_ends_mask |=
- (stream->id == RKISP_STREAM_MP) ? ISP_FRAME_MP : ISP_FRAME_SP;
stream->streaming = true;
return 0;
@@ -1217,6 +1207,22 @@
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;
@@ -1225,24 +1231,23 @@
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);
@@ -1253,7 +1258,6 @@
rkisp_destroy_dummy_buf(stream);
atomic_dec(&dev->cap_dev.refcnt);
-end:
mutex_unlock(&dev->hw_dev->dev_lock);
}
@@ -1296,6 +1300,25 @@
}
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)
{
struct rkisp_stream *stream = queue->drv_priv;
@@ -1304,17 +1327,16 @@
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");
@@ -1364,19 +1386,16 @@
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);
@@ -1613,17 +1632,13 @@
stream = &dev->cap_dev.stream[RKISP_STREAM_MP];
if (!stream->streaming)
dev->irq_ends_mask &= ~ISP_FRAME_MP;
- else
- dev->irq_ends_mask |= ISP_FRAME_MP;
- rkisp_check_idle(dev, ISP_FRAME_MP);
+ rkisp_check_idle(dev, ISP_FRAME_MP & dev->irq_ends_mask);
}
if (mis_val & CIF_MI_SP_FRAME) {
stream = &dev->cap_dev.stream[RKISP_STREAM_SP];
if (!stream->streaming)
dev->irq_ends_mask &= ~ISP_FRAME_SP;
- else
- dev->irq_ends_mask |= ISP_FRAME_SP;
- rkisp_check_idle(dev, ISP_FRAME_SP);
+ rkisp_check_idle(dev, ISP_FRAME_SP & dev->irq_ends_mask);
}
}
--
Gitblit v1.6.2