[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)(¶ms->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(¶ms->v4l2_isp);
+ if (ret)
+ return ret;
+
mutex_init(&node->vlock);
INIT_LIST_HEAD(¶ms->buf.queue);
spin_lock_init(¶ms->buf.lock);
--
2.43.0
More information about the Linux-rockchip
mailing list