[PATCH 05/16] media: rkisp1: Store the current params buffer

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


If we suspend the ISP during an active stream, we need to be able to
re-apply the last-applied configuration when we re-start the stream
on resume. Store a pointer to the current params buffer within a
re-organised struct rkisp1_params.

Signed-off-by: Daniel Scally <dan.scally at ideasonboard.com>
---
 .../media/platform/rockchip/rkisp1/rkisp1-common.h | 10 ++-
 .../media/platform/rockchip/rkisp1/rkisp1-params.c | 75 +++++++++++-----------
 2 files changed, 45 insertions(+), 40 deletions(-)

diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
index 5e6a4d5f6fd12baf45a0083eff75de1095162b2d..6a017a2077f6fdef3a3fd0998f182baa19bfc5b6 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
@@ -405,6 +405,9 @@ struct rkisp1_params_ops {
  * @vnode:		video node
  * @rkisp1:		pointer to the rkisp1 device
  * @ops:		pointer to the variant-specific operations
+ * @buf.lock:		locks the buffer list 'params'
+ * @buf.queue:		queue of rkisp1_params_buffer
+ * @buf.curr:		pointer to the current rkisp1_params_buffer
  * @config_lock:	locks the buffer list 'params'
  * @params:		queue of rkisp1_buffer
  * @metafmt		the currently enabled metadata format
@@ -418,8 +421,11 @@ struct rkisp1_params {
 	struct rkisp1_device *rkisp1;
 	const struct rkisp1_params_ops *ops;
 
-	spinlock_t config_lock; /* locks the buffers list 'params' */
-	struct list_head params;
+	struct {
+		spinlock_t lock; /* locks the buffers list 'params' */
+		struct list_head queue;
+		struct rkisp1_params_buffer *curr;
+	} buf;
 
 	struct v4l2_ctrl_handler ctrls;
 
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
index 042b759eba625e00c65d27710e9db3aa7f09ab7f..e5913f8b73726d16362e429960e251b48b62d9aa 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-params.c
@@ -2338,21 +2338,21 @@ static void rkisp1_params_complete_buffer(struct rkisp1_params *params,
 void rkisp1_params_isr(struct rkisp1_device *rkisp1)
 {
 	struct rkisp1_params *params = &rkisp1->params;
-	struct rkisp1_params_buffer *cur_buf;
 
-	spin_lock(&params->config_lock);
+	spin_lock(&params->buf.lock);
 
-	cur_buf = list_first_entry_or_null(&params->params,
-					   struct rkisp1_params_buffer, queue);
-	if (!cur_buf)
+	params->buf.curr = list_first_entry_or_null(&params->buf.queue,
+						    struct rkisp1_params_buffer,
+						    queue);
+	if (!params->buf.curr)
 		goto unlock;
 
 	if (params->metafmt->dataformat == V4L2_META_FMT_RK_ISP1_PARAMS) {
-		rkisp1_isp_isr_other_config(params, cur_buf->cfg);
-		rkisp1_isp_isr_lsc_config(params, cur_buf->cfg);
-		rkisp1_isp_isr_meas_config(params, cur_buf->cfg);
+		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, cur_buf->cfg,
+		rkisp1_ext_params_config(params, params->buf.curr->cfg,
 					 RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS |
 					 RKISP1_EXT_PARAMS_BLOCK_GROUP_LSC);
 	}
@@ -2369,11 +2369,11 @@ void rkisp1_params_isr(struct rkisp1_device *rkisp1)
 	 * indicate to userspace on which frame these parameters are being
 	 * applied.
 	 */
-	rkisp1_params_complete_buffer(params, cur_buf,
+	rkisp1_params_complete_buffer(params, params->buf.curr,
 				      rkisp1->isp.frame_sequence + 1);
 
 unlock:
-	spin_unlock(&params->config_lock);
+	spin_unlock(&params->buf.lock);
 }
 
 static const struct rkisp1_cif_isp_awb_meas_config rkisp1_awb_params_default_config = {
@@ -2421,7 +2421,6 @@ void rkisp1_params_pre_configure(struct rkisp1_params *params,
 				 enum v4l2_ycbcr_encoding ycbcr_encoding)
 {
 	struct rkisp1_cif_isp_hst_config hst = rkisp1_hst_params_default_config;
-	struct rkisp1_params_buffer *cur_buf;
 
 	params->quantization = quantization;
 	params->ycbcr_encoding = ycbcr_encoding;
@@ -2446,20 +2445,21 @@ void rkisp1_params_pre_configure(struct rkisp1_params *params,
 
 	rkisp1_csm_config(params);
 
-	spin_lock_irq(&params->config_lock);
+	spin_lock_irq(&params->buf.lock);
 
 	/* apply the first buffer if there is one already */
 
-	cur_buf = list_first_entry_or_null(&params->params,
-					   struct rkisp1_params_buffer, queue);
-	if (!cur_buf)
+	params->buf.curr = list_first_entry_or_null(&params->buf.queue,
+						    struct rkisp1_params_buffer,
+						    queue);
+	if (!params->buf.curr)
 		goto unlock;
 
 	if (params->metafmt->dataformat == V4L2_META_FMT_RK_ISP1_PARAMS) {
-		rkisp1_isp_isr_other_config(params, cur_buf->cfg);
-		rkisp1_isp_isr_meas_config(params, cur_buf->cfg);
+		rkisp1_isp_isr_other_config(params, params->buf.curr->cfg);
+		rkisp1_isp_isr_meas_config(params, params->buf.curr->cfg);
 	} else {
-		rkisp1_ext_params_config(params, cur_buf->cfg,
+		rkisp1_ext_params_config(params, params->buf.curr->cfg,
 					 RKISP1_EXT_PARAMS_BLOCK_GROUP_OTHERS);
 	}
 
@@ -2468,14 +2468,12 @@ void rkisp1_params_pre_configure(struct rkisp1_params *params,
 			      RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD);
 
 unlock:
-	spin_unlock_irq(&params->config_lock);
+	spin_unlock_irq(&params->buf.lock);
 }
 
 void rkisp1_params_post_configure(struct rkisp1_params *params)
 {
-	struct rkisp1_params_buffer *cur_buf;
-
-	spin_lock_irq(&params->config_lock);
+	spin_lock_irq(&params->buf.lock);
 
 	/*
 	 * Apply LSC parameters from the first buffer (if any is already
@@ -2485,25 +2483,26 @@ void rkisp1_params_post_configure(struct rkisp1_params *params)
 	 * ordering doesn't affect other ISP versions negatively, do so
 	 * unconditionally.
 	 */
-	cur_buf = list_first_entry_or_null(&params->params,
-					   struct rkisp1_params_buffer, queue);
-	if (!cur_buf)
+	params->buf.curr = list_first_entry_or_null(&params->buf.queue,
+						    struct rkisp1_params_buffer,
+						    queue);
+	if (!params->buf.curr)
 		goto unlock;
 
 	if (params->metafmt->dataformat == V4L2_META_FMT_RK_ISP1_PARAMS)
-		rkisp1_isp_isr_lsc_config(params, cur_buf->cfg);
+		rkisp1_isp_isr_lsc_config(params, params->buf.curr->cfg);
 	else
-		rkisp1_ext_params_config(params, cur_buf->cfg,
+		rkisp1_ext_params_config(params, params->buf.curr->cfg,
 					 RKISP1_EXT_PARAMS_BLOCK_GROUP_LSC);
 
 	/* update shadow register immediately */
 	rkisp1_param_set_bits(params, RKISP1_CIF_ISP_CTRL,
 			      RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD);
 
-	rkisp1_params_complete_buffer(params, cur_buf, 0);
+	rkisp1_params_complete_buffer(params, params->buf.curr, 0);
 
 unlock:
-	spin_unlock_irq(&params->config_lock);
+	spin_unlock_irq(&params->buf.lock);
 }
 
 /*
@@ -2711,9 +2710,9 @@ static void rkisp1_params_vb2_buf_queue(struct vb2_buffer *vb)
 	struct vb2_queue *vq = vb->vb2_queue;
 	struct rkisp1_params *params = vq->drv_priv;
 
-	spin_lock_irq(&params->config_lock);
-	list_add_tail(&params_buf->queue, &params->params);
-	spin_unlock_irq(&params->config_lock);
+	spin_lock_irq(&params->buf.lock);
+	list_add_tail(&params_buf->queue, &params->buf.queue);
+	spin_unlock_irq(&params->buf.lock);
 }
 
 static int rkisp1_params_prepare_ext_params(struct rkisp1_params *params,
@@ -2782,9 +2781,9 @@ static void rkisp1_params_vb2_stop_streaming(struct vb2_queue *vq)
 	 * and then we can iterate it and call vb2_buffer_done
 	 * without holding the lock
 	 */
-	spin_lock_irq(&params->config_lock);
-	list_splice_init(&params->params, &tmp_list);
-	spin_unlock_irq(&params->config_lock);
+	spin_lock_irq(&params->buf.lock);
+	list_splice_init(&params->buf.queue, &tmp_list);
+	spin_unlock_irq(&params->buf.lock);
 
 	list_for_each_entry(buf, &tmp_list, queue)
 		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
@@ -2875,8 +2874,8 @@ int rkisp1_params_register(struct rkisp1_device *rkisp1)
 
 	params->rkisp1 = rkisp1;
 	mutex_init(&node->vlock);
-	INIT_LIST_HEAD(&params->params);
-	spin_lock_init(&params->config_lock);
+	INIT_LIST_HEAD(&params->buf.queue);
+	spin_lock_init(&params->buf.lock);
 
 	strscpy(vdev->name, RKISP1_PARAMS_DEV_NAME, sizeof(vdev->name));
 

-- 
2.43.0




More information about the linux-arm-kernel mailing list