From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 03:04:41 +0000
Subject: [PATCH] rk3568 rt init

---
 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