[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(¶ms->config_lock);
+ spin_lock(¶ms->buf.lock);
- cur_buf = list_first_entry_or_null(¶ms->params,
- struct rkisp1_params_buffer, queue);
- if (!cur_buf)
+ params->buf.curr = list_first_entry_or_null(¶ms->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(¶ms->config_lock);
+ spin_unlock(¶ms->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(¶ms->config_lock);
+ spin_lock_irq(¶ms->buf.lock);
/* apply the first buffer if there is one already */
- cur_buf = list_first_entry_or_null(¶ms->params,
- struct rkisp1_params_buffer, queue);
- if (!cur_buf)
+ params->buf.curr = list_first_entry_or_null(¶ms->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(¶ms->config_lock);
+ spin_unlock_irq(¶ms->buf.lock);
}
void rkisp1_params_post_configure(struct rkisp1_params *params)
{
- struct rkisp1_params_buffer *cur_buf;
-
- spin_lock_irq(¶ms->config_lock);
+ spin_lock_irq(¶ms->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(¶ms->params,
- struct rkisp1_params_buffer, queue);
- if (!cur_buf)
+ params->buf.curr = list_first_entry_or_null(¶ms->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(¶ms->config_lock);
+ spin_unlock_irq(¶ms->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(¶ms->config_lock);
- list_add_tail(¶ms_buf->queue, ¶ms->params);
- spin_unlock_irq(¶ms->config_lock);
+ spin_lock_irq(¶ms->buf.lock);
+ list_add_tail(¶ms_buf->queue, ¶ms->buf.queue);
+ spin_unlock_irq(¶ms->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(¶ms->config_lock);
- list_splice_init(¶ms->params, &tmp_list);
- spin_unlock_irq(¶ms->config_lock);
+ spin_lock_irq(¶ms->buf.lock);
+ list_splice_init(¶ms->buf.queue, &tmp_list);
+ spin_unlock_irq(¶ms->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(¶ms->params);
- spin_lock_init(¶ms->config_lock);
+ INIT_LIST_HEAD(¶ms->buf.queue);
+ spin_lock_init(¶ms->buf.lock);
strscpy(vdev->name, RKISP1_PARAMS_DEV_NAME, sizeof(vdev->name));
--
2.43.0
More information about the linux-arm-kernel
mailing list