[PATCH 09/16] media: rkisp1: Switch to calling .enable/disable_streams() in ISP subdev

Daniel Scally dan.scally at ideasonboard.com
Mon Nov 2 23:40:45 PST 2026


Switch to calling .enable_streams() and .disable_streams() for the
downstream subdevice in the rkisp1 ISP subdevice's .s_stream()
operation.

Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
---
 .../media/platform/rockchip/rkisp1/rkisp1-common.h |  4 ++--
 .../media/platform/rockchip/rkisp1/rkisp1-isp.c    | 28 ++++++++++++----------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
index 357a6bd8db7da4c881e4cba5b5f54e40fd21c38c..90942b22df313d83d9722cc550f01758cda9fa27 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
@@ -501,7 +501,7 @@ struct rkisp1_debug {
  * @v4l2_dev:	   v4l2_device variable
  * @media_dev:	   media_device variable
  * @notifier:	   a notifier to register on the v4l2-async API to be notified on the sensor
- * @source:        source subdev in-use, set when starting streaming
+ * @source:        source media pad in-use, set when starting streaming
  * @csi:	   internal CSI-2 receiver
  * @isp:	   ISP sub-device
  * @resizer_devs:  resizer sub-devices
@@ -526,7 +526,7 @@ struct rkisp1_device {
 	struct v4l2_device v4l2_dev;
 	struct media_device media_dev;
 	struct v4l2_async_notifier notifier;
-	struct v4l2_subdev *source;
+	struct media_pad *source;
 	struct rkisp1_csi csi;
 	struct rkisp1_isp isp;
 	struct rkisp1_resizer resizer_devs[2];
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
index 4043a75ca3f0c5e0373b7fb01468cf2ad350de6b..95e9cdccd650b7bcf89dd6cdd42bdf8af2113ced 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
@@ -924,40 +924,44 @@ static int rkisp1_isp_s_stream(struct v4l2_subdev *sd, int enable)
 	struct rkisp1_isp *isp = to_rkisp1_isp(sd);
 	struct rkisp1_device *rkisp1 = isp->rkisp1;
 	struct v4l2_subdev_state *sd_state;
-	struct media_pad *source_pad;
-	struct media_pad *sink_pad;
 	enum v4l2_mbus_type mbus_type;
+	struct media_pad *sink_pad;
+	struct v4l2_subdev *src_sd;
 	u32 mbus_flags;
 	int ret;
 
 	if (!enable) {
-		v4l2_subdev_call(rkisp1->source, video, s_stream, false);
+		src_sd = media_entity_to_v4l2_subdev(rkisp1->source->entity);
+		if (!src_sd)
+			return -EPIPE;
+
+		v4l2_subdev_disable_streams(src_sd, rkisp1->source->index, BIT(0));
 		rkisp1_isp_stop(isp);
 		return 0;
 	}
 
 	sink_pad = &isp->pads[RKISP1_ISP_PAD_SINK_VIDEO];
-	source_pad = media_pad_remote_pad_unique(sink_pad);
-	if (IS_ERR(source_pad)) {
+	rkisp1->source = media_pad_remote_pad_unique(sink_pad);
+	if (IS_ERR(rkisp1->source)) {
 		dev_dbg(rkisp1->dev, "Failed to get source for ISP: %pe\n",
-			source_pad);
+			rkisp1->source);
 		return -EPIPE;
 	}
 
-	rkisp1->source = media_entity_to_v4l2_subdev(source_pad->entity);
-	if (!rkisp1->source) {
+	src_sd = media_entity_to_v4l2_subdev(rkisp1->source->entity);
+	if (!src_sd) {
 		/* This should really not happen, so is not worth a message. */
 		return -EPIPE;
 	}
 
-	if (rkisp1->source == &rkisp1->csi.sd) {
+	if (src_sd == &rkisp1->csi.sd) {
 		mbus_type = V4L2_MBUS_CSI2_DPHY;
 		mbus_flags = 0;
 	} else {
 		const struct rkisp1_sensor_async *asd;
 		struct v4l2_async_connection *asc;
 
-		asc = v4l2_async_connection_unique(rkisp1->source);
+		asc = v4l2_async_connection_unique(src_sd);
 		if (!asc)
 			return -EPIPE;
 
@@ -976,11 +980,11 @@ static int rkisp1_isp_s_stream(struct v4l2_subdev *sd, int enable)
 	if (ret)
 		goto out_unlock;
 
-	ret = rkisp1_isp_start(isp, sd_state, source_pad);
+	ret = rkisp1_isp_start(isp, sd_state, rkisp1->source);
 	if (ret)
 		goto out_unlock;
 
-	ret = v4l2_subdev_call(rkisp1->source, video, s_stream, true);
+	ret = v4l2_subdev_enable_streams(src_sd, rkisp1->source->index, BIT(0));
 	if (ret) {
 		rkisp1_isp_stop(isp);
 		goto out_unlock;

-- 
2.43.0




More information about the linux-arm-kernel mailing list