[PATCH 7/7] media: rkisp1: Re-apply v4l2-isp reset buffer on resume

Daniel Scally dan.scally at ideasonboard.com
Wed Nov 4 04:28:22 PST 2026


When resuming from suspension or hibernation with an active stream
the hardware will have lost all settings. The v4l2_isp framework
defines a configuration buffer format that is extensible, meaning
userspace does not need to pass in a full set of parameters for each
frame. As userspace is unaware of suspend / resume it's very unlikely
to pass a full reconfiguration.

Use the v4l2-isp reset buffer to re-apply configuration blocks marked
as needing to be reapplied.

Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
---
 .../media/platform/rockchip/rkisp1/rkisp1-params.c | 35 +++++++++++++++-------
 1 file changed, 25 insertions(+), 10 deletions(-)

diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
index 178da1f648869b7b963f634f29f5653cfb16dd77..952c4246ccefa81aa4853a18c941a6f10f456902 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
@@ -2326,20 +2326,31 @@ static void rkisp1_ext_params_config(struct rkisp1_params *params,
 
 void rkisp1_params_reapply_config(struct rkisp1_params *params)
 {
+	struct v4l2_isp_params_buffer *buffer = params->v4l2_isp.params.reset_buf;
+	struct rkisp1_ext_params_cfg *cfg;
+
 	guard(spinlock)(&params->buf.lock);
 
-	if (!params->buf.curr)
+	if (params->buf.curr) {
+		if (params->metafmt->dataformat == V4L2_META_FMT_RK_ISP1_PARAMS) {
+			rkisp1_isp_isr_other_config(params, params->buf.curr->cfg);
+			rkisp1_isp_isr_lsc_config(params, params->buf.curr->cfg);
+			rkisp1_isp_isr_meas_config(params, params->buf.curr->cfg);
+		} else {
+			rkisp1_ext_params_config(params, params->buf.curr->cfg,
+						RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS |
+						RKISP1_EXT_PARAMS_BLOCK_GROUP_LSC);
+		}
+	}
+
+	buffer = params->v4l2_isp.params.reset_buf;
+	if (!buffer)
 		return;
 
-	if (params->metafmt->dataformat == V4L2_META_FMT_RK_ISP1_PARAMS) {
-		rkisp1_isp_isr_other_config(params, params->buf.curr->cfg);
-		rkisp1_isp_isr_lsc_config(params, params->buf.curr->cfg);
-		rkisp1_isp_isr_meas_config(params, params->buf.curr->cfg);
-	} else {
-		rkisp1_ext_params_config(params, params->buf.curr->cfg,
-					 RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS |
-					 RKISP1_EXT_PARAMS_BLOCK_GROUP_LSC);
-	}
+	cfg = (struct rkisp1_ext_params_cfg *)buffer;
+	rkisp1_ext_params_config(params, cfg,
+				 RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS |
+				 RKISP1_EXT_PARAMS_BLOCK_GROUP_LSC);
 }
 
 static void rkisp1_params_complete_buffer(struct rkisp1_params *params,
@@ -2891,6 +2902,10 @@ int rkisp1_params_register(struct rkisp1_device *rkisp1)
 	if (ret)
 		return ret;
 
+	ret = v4l2_isp_params_init_reset_buf(&params->v4l2_isp);
+	if (ret)
+		return ret;
+
 	mutex_init(&node->vlock);
 	INIT_LIST_HEAD(&params->buf.queue);
 	spin_lock_init(&params->buf.lock);

-- 
2.43.0




More information about the Linux-rockchip mailing list