summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2026-05-12 02:56:30 +0300
committerHans Verkuil <hverkuil+cisco@kernel.org>2026-05-21 09:10:15 +0200
commit2bf10aeb232e91d25799885343f2e282bf9659a9 (patch)
tree083a24c143347f12eefc07466a1204da2f0a719b
parent38abda35a6b8769a57c12338aab88e7e979f8c24 (diff)
media: renesas: vsp1: Use mutex scoped guards
Replace remaining manual mutex locking and unlocking with scoped guards. This simplifies error paths and reduces the amount of code. Reviewed-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Link: https://patch.msgid.link/20260511235637.3468558-7-laurent.pinchart+renesas@ideasonboard.com Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
-rw-r--r--drivers/media/platform/renesas/vsp1/vsp1_brx.c7
-rw-r--r--drivers/media/platform/renesas/vsp1/vsp1_drm.c115
-rw-r--r--drivers/media/platform/renesas/vsp1/vsp1_entity.c8
-rw-r--r--drivers/media/platform/renesas/vsp1/vsp1_hgo.c10
-rw-r--r--drivers/media/platform/renesas/vsp1/vsp1_hgt.c16
-rw-r--r--drivers/media/platform/renesas/vsp1/vsp1_video.c60
6 files changed, 101 insertions, 115 deletions
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_brx.c b/drivers/media/platform/renesas/vsp1/vsp1_brx.c
index ce68d911ac30..d150a92b2617 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_brx.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_brx.c
@@ -196,9 +196,10 @@ static int brx_get_selection(struct v4l2_subdev *subdev,
if (!state)
return -EINVAL;
- mutex_lock(&brx->entity.lock);
- sel->r = *v4l2_subdev_state_get_compose(state, sel->pad);
- mutex_unlock(&brx->entity.lock);
+ scoped_guard(mutex, &brx->entity.lock) {
+ sel->r = *v4l2_subdev_state_get_compose(state, sel->pad);
+ }
+
return 0;
default:
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_drm.c b/drivers/media/platform/renesas/vsp1/vsp1_drm.c
index 1439cf7bfb59..2b64d9b5a81c 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_drm.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_drm.c
@@ -675,43 +675,37 @@ int vsp1_du_enable(struct device *dev, unsigned int pipe_index,
__func__, pipe_index, cfg->width, cfg->height,
pipe->interlaced ? "i" : "");
- mutex_lock(&vsp1->drm->lock);
-
- /* Setup formats through the pipeline. */
- ret = vsp1_du_pipeline_setup_inputs(vsp1, pipe);
- if (ret < 0)
- goto unlock;
-
- ret = vsp1_du_pipeline_setup_output(vsp1, pipe);
- if (ret < 0)
- goto unlock;
-
- vsp1_pipeline_dump(pipe, "DU enable");
+ scoped_guard(mutex, &vsp1->drm->lock) {
+ /* Setup formats through the pipeline. */
+ ret = vsp1_du_pipeline_setup_inputs(vsp1, pipe);
+ if (ret < 0)
+ return ret;
- /* Enable the VSP1. */
- ret = vsp1_device_get(vsp1);
- if (ret < 0)
- goto unlock;
+ ret = vsp1_du_pipeline_setup_output(vsp1, pipe);
+ if (ret < 0)
+ return ret;
- /*
- * Register a callback to allow us to notify the DRM driver of frame
- * completion events.
- */
- drm_pipe->du_complete = cfg->callback;
- drm_pipe->du_private = cfg->callback_data;
+ vsp1_pipeline_dump(pipe, "DU enable");
- /* Disable the display interrupts. */
- vsp1_write(vsp1, VI6_DISP_IRQ_STA(pipe_index), 0);
- vsp1_write(vsp1, VI6_DISP_IRQ_ENB(pipe_index), 0);
+ /* Enable the VSP1. */
+ ret = vsp1_device_get(vsp1);
+ if (ret < 0)
+ return ret;
- /* Configure all entities in the pipeline. */
- vsp1_du_pipeline_configure(pipe);
+ /*
+ * Register a callback to allow us to notify the DRM driver of frame
+ * completion events.
+ */
+ drm_pipe->du_complete = cfg->callback;
+ drm_pipe->du_private = cfg->callback_data;
-unlock:
- mutex_unlock(&vsp1->drm->lock);
+ /* Disable the display interrupts. */
+ vsp1_write(vsp1, VI6_DISP_IRQ_STA(pipe_index), 0);
+ vsp1_write(vsp1, VI6_DISP_IRQ_ENB(pipe_index), 0);
- if (ret < 0)
- return ret;
+ /* Configure all entities in the pipeline. */
+ vsp1_du_pipeline_configure(pipe);
+ }
/* Start the pipeline. */
spin_lock_irqsave(&pipe->irqlock, flags);
@@ -739,7 +733,6 @@ int vsp1_du_disable(struct device *dev, unsigned int pipe_index)
struct vsp1_device *vsp1 = dev_get_drvdata(dev);
struct vsp1_drm_pipeline *drm_pipe;
struct vsp1_pipeline *pipe;
- struct vsp1_brx *brx;
unsigned int i;
int ret;
@@ -749,44 +742,42 @@ int vsp1_du_disable(struct device *dev, unsigned int pipe_index)
drm_pipe = &vsp1->drm->pipe[pipe_index];
pipe = &drm_pipe->pipe;
- mutex_lock(&vsp1->drm->lock);
-
- brx = to_brx(&pipe->brx->subdev);
-
- ret = vsp1_pipeline_stop(pipe);
- if (ret == -ETIMEDOUT)
- dev_err(vsp1->dev, "DRM pipeline stop timeout\n");
+ scoped_guard(mutex, &vsp1->drm->lock) {
+ struct vsp1_brx *brx = to_brx(&pipe->brx->subdev);
- for (i = 0; i < ARRAY_SIZE(pipe->inputs); ++i) {
- struct vsp1_rwpf *rpf = pipe->inputs[i];
+ ret = vsp1_pipeline_stop(pipe);
+ if (ret == -ETIMEDOUT)
+ dev_err(vsp1->dev, "DRM pipeline stop timeout\n");
- if (!rpf)
- continue;
+ for (i = 0; i < ARRAY_SIZE(pipe->inputs); ++i) {
+ struct vsp1_rwpf *rpf = pipe->inputs[i];
- /*
- * Remove the RPF from the pipe and the list of BRx
- * inputs.
- */
- WARN_ON(!rpf->entity.pipe);
- rpf->entity.pipe = NULL;
- list_del(&rpf->entity.list_pipe);
- pipe->inputs[i] = NULL;
+ if (!rpf)
+ continue;
- brx->inputs[rpf->brx_input].rpf = NULL;
- }
+ /*
+ * Remove the RPF from the pipe and the list of BRx
+ * inputs.
+ */
+ WARN_ON(!rpf->entity.pipe);
+ rpf->entity.pipe = NULL;
+ list_del(&rpf->entity.list_pipe);
+ pipe->inputs[i] = NULL;
- drm_pipe->du_complete = NULL;
- pipe->num_inputs = 0;
+ brx->inputs[rpf->brx_input].rpf = NULL;
+ }
- dev_dbg(vsp1->dev, "%s: pipe %u: releasing %s\n",
- __func__, pipe->lif->index,
- BRX_NAME(pipe->brx));
+ drm_pipe->du_complete = NULL;
+ pipe->num_inputs = 0;
- list_del(&pipe->brx->list_pipe);
- pipe->brx->pipe = NULL;
- pipe->brx = NULL;
+ dev_dbg(vsp1->dev, "%s: pipe %u: releasing %s\n",
+ __func__, pipe->lif->index,
+ BRX_NAME(pipe->brx));
- mutex_unlock(&vsp1->drm->lock);
+ list_del(&pipe->brx->list_pipe);
+ pipe->brx->pipe = NULL;
+ pipe->brx = NULL;
+ }
vsp1_dlm_reset(pipe->output->dlm);
vsp1_device_put(vsp1);
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_entity.c b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
index 1a1dafe5331e..50aae8ee724f 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_entity.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_entity.c
@@ -216,10 +216,10 @@ int vsp1_subdev_enum_mbus_code(struct v4l2_subdev *subdev,
if (!state)
return -EINVAL;
- mutex_lock(&entity->lock);
- format = v4l2_subdev_state_get_format(state, 0);
- code->code = format->code;
- mutex_unlock(&entity->lock);
+ scoped_guard(mutex, &entity->lock) {
+ format = v4l2_subdev_state_get_format(state, 0);
+ code->code = format->code;
+ }
}
return 0;
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_hgo.c b/drivers/media/platform/renesas/vsp1/vsp1_hgo.c
index 2c8ce7175a4e..0ef512e3a94b 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_hgo.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_hgo.c
@@ -153,11 +153,11 @@ static void hgo_configure_stream(struct vsp1_entity *entity,
(crop->width << VI6_HGO_SIZE_HSIZE_SHIFT) |
(crop->height << VI6_HGO_SIZE_VSIZE_SHIFT));
- mutex_lock(hgo->ctrls.handler.lock);
- hgo->max_rgb = hgo->ctrls.max_rgb->cur.val;
- if (hgo->ctrls.num_bins)
- hgo->num_bins = hgo_num_bins[hgo->ctrls.num_bins->cur.val];
- mutex_unlock(hgo->ctrls.handler.lock);
+ scoped_guard(mutex, hgo->ctrls.handler.lock) {
+ hgo->max_rgb = hgo->ctrls.max_rgb->cur.val;
+ if (hgo->ctrls.num_bins)
+ hgo->num_bins = hgo_num_bins[hgo->ctrls.num_bins->cur.val];
+ }
hratio = crop->width * 2 / compose->width / 3;
vratio = crop->height * 2 / compose->height / 3;
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_hgt.c b/drivers/media/platform/renesas/vsp1/vsp1_hgt.c
index 858f330d44fa..78b5a9201c70 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_hgt.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_hgt.c
@@ -152,15 +152,15 @@ static void hgt_configure_stream(struct vsp1_entity *entity,
(crop->width << VI6_HGT_SIZE_HSIZE_SHIFT) |
(crop->height << VI6_HGT_SIZE_VSIZE_SHIFT));
- mutex_lock(hgt->ctrls.lock);
- for (i = 0; i < HGT_NUM_HUE_AREAS; ++i) {
- lower = hgt->hue_areas[i*2 + 0];
- upper = hgt->hue_areas[i*2 + 1];
- vsp1_hgt_write(hgt, dlb, VI6_HGT_HUE_AREA(i),
- (lower << VI6_HGT_HUE_AREA_LOWER_SHIFT) |
- (upper << VI6_HGT_HUE_AREA_UPPER_SHIFT));
+ scoped_guard(mutex, hgt->ctrls.lock) {
+ for (i = 0; i < HGT_NUM_HUE_AREAS; ++i) {
+ lower = hgt->hue_areas[i*2 + 0];
+ upper = hgt->hue_areas[i*2 + 1];
+ vsp1_hgt_write(hgt, dlb, VI6_HGT_HUE_AREA(i),
+ (lower << VI6_HGT_HUE_AREA_LOWER_SHIFT) |
+ (upper << VI6_HGT_HUE_AREA_UPPER_SHIFT));
+ }
}
- mutex_unlock(hgt->ctrls.lock);
hratio = crop->width * 2 / compose->width / 3;
vratio = crop->height * 2 / compose->height / 3;
diff --git a/drivers/media/platform/renesas/vsp1/vsp1_video.c b/drivers/media/platform/renesas/vsp1/vsp1_video.c
index a9ed6bc87b00..b110f0309b26 100644
--- a/drivers/media/platform/renesas/vsp1/vsp1_video.c
+++ b/drivers/media/platform/renesas/vsp1/vsp1_video.c
@@ -815,22 +815,21 @@ static int vsp1_video_start_streaming(struct vb2_queue *vq, unsigned int count)
unsigned long flags;
int ret;
- mutex_lock(&pipe->lock);
- if (pipe->stream_count == pipe->num_inputs) {
- ret = vsp1_video_setup_pipeline(pipe);
- if (ret < 0) {
- vsp1_video_release_buffers(video);
- vsp1_video_cleanup_pipeline(pipe);
- mutex_unlock(&pipe->lock);
- return ret;
+ scoped_guard(mutex, &pipe->lock) {
+ if (pipe->stream_count == pipe->num_inputs) {
+ ret = vsp1_video_setup_pipeline(pipe);
+ if (ret < 0) {
+ vsp1_video_release_buffers(video);
+ vsp1_video_cleanup_pipeline(pipe);
+ return ret;
+ }
+
+ start_pipeline = true;
}
- start_pipeline = true;
+ pipe->stream_count++;
}
- pipe->stream_count++;
- mutex_unlock(&pipe->lock);
-
/*
* vsp1_pipeline_ready() is not sufficient to establish that all streams
* are prepared and the pipeline is configured, as multiple streams
@@ -864,16 +863,17 @@ static void vsp1_video_stop_streaming(struct vb2_queue *vq)
pipe->buffers_ready &= ~(1 << video->pipe_index);
spin_unlock_irqrestore(&video->irqlock, flags);
- mutex_lock(&pipe->lock);
- if (--pipe->stream_count == pipe->num_inputs) {
- /* Stop the pipeline. */
- ret = vsp1_pipeline_stop(pipe);
- if (ret == -ETIMEDOUT)
- dev_err(video->vsp1->dev, "pipeline stop timeout\n");
+ scoped_guard(mutex, &pipe->lock) {
+ if (--pipe->stream_count == pipe->num_inputs) {
+ /* Stop the pipeline. */
+ ret = vsp1_pipeline_stop(pipe);
+ if (ret == -ETIMEDOUT)
+ dev_err(video->vsp1->dev,
+ "pipeline stop timeout\n");
- vsp1_video_cleanup_pipeline(pipe);
+ vsp1_video_cleanup_pipeline(pipe);
+ }
}
- mutex_unlock(&pipe->lock);
video_device_pipeline_stop(&video->video);
vsp1_video_release_buffers(video);
@@ -1000,22 +1000,16 @@ vsp1_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type)
* touching an entity in the pipeline can be activated or deactivated
* once streaming is started.
*/
- mutex_lock(&mdev->graph_mutex);
-
- pipe = vsp1_video_pipeline_get(video);
- if (IS_ERR(pipe)) {
- mutex_unlock(&mdev->graph_mutex);
- return PTR_ERR(pipe);
- }
+ scoped_guard(mutex, &mdev->graph_mutex) {
+ pipe = vsp1_video_pipeline_get(video);
+ if (IS_ERR(pipe))
+ return PTR_ERR(pipe);
- ret = __video_device_pipeline_start(&video->video, &pipe->pipe);
- if (ret < 0) {
- mutex_unlock(&mdev->graph_mutex);
- goto err_pipe;
+ ret = __video_device_pipeline_start(&video->video, &pipe->pipe);
+ if (ret < 0)
+ goto err_pipe;
}
- mutex_unlock(&mdev->graph_mutex);
-
/*
* Verify that the configured format matches the output of the connected
* subdev.