]> www.infradead.org Git - linux.git/commitdiff
media: video-mux: update driver to active state
authorPhilipp Zabel <p.zabel@pengutronix.de>
Wed, 24 May 2023 13:29:25 +0000 (14:29 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 26 May 2023 09:58:18 +0000 (10:58 +0100)
Drop the open coded pad format array, use subdev active state instead.

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/video-mux.c

index 4fe31386afc7b8345701c879ac909fe6efd2fe91..6d273abfe16cf5d3fd0c13f55e927add202091d0 100644 (file)
@@ -24,7 +24,6 @@ struct video_mux {
        struct v4l2_subdev subdev;
        struct v4l2_async_notifier notifier;
        struct media_pad *pads;
-       struct v4l2_mbus_framefmt *format_mbus;
        struct mux_control *mux;
        struct mutex lock;
        int active;
@@ -71,6 +70,9 @@ static int video_mux_link_setup(struct media_entity *entity,
        mutex_lock(&vmux->lock);
 
        if (flags & MEDIA_LNK_FL_ENABLED) {
+               struct v4l2_subdev_state *sd_state;
+               struct v4l2_mbus_framefmt *source_mbusformat;
+
                if (vmux->active == local->index)
                        goto out;
 
@@ -86,7 +88,12 @@ static int video_mux_link_setup(struct media_entity *entity,
                vmux->active = local->index;
 
                /* Propagate the active format to the source */
-               vmux->format_mbus[source_pad] = vmux->format_mbus[vmux->active];
+               sd_state = v4l2_subdev_lock_and_get_active_state(sd);
+               source_mbusformat = v4l2_subdev_get_pad_format(sd, sd_state,
+                                                              source_pad);
+               *source_mbusformat = *v4l2_subdev_get_pad_format(sd, sd_state,
+                                                                vmux->active);
+               v4l2_subdev_unlock_state(sd_state);
        } else {
                if (vmux->active != local->index)
                        goto out;
@@ -138,40 +145,6 @@ static const struct v4l2_subdev_video_ops video_mux_subdev_video_ops = {
        .s_stream = video_mux_s_stream,
 };
 
-static struct v4l2_mbus_framefmt *
-__video_mux_get_pad_format(struct v4l2_subdev *sd,
-                          struct v4l2_subdev_state *sd_state,
-                          unsigned int pad, u32 which)
-{
-       struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
-
-       switch (which) {
-       case V4L2_SUBDEV_FORMAT_TRY:
-               return v4l2_subdev_get_try_format(sd, sd_state, pad);
-       case V4L2_SUBDEV_FORMAT_ACTIVE:
-               return &vmux->format_mbus[pad];
-       default:
-               return NULL;
-       }
-}
-
-static int video_mux_get_format(struct v4l2_subdev *sd,
-                           struct v4l2_subdev_state *sd_state,
-                           struct v4l2_subdev_format *sdformat)
-{
-       struct video_mux *vmux = v4l2_subdev_to_video_mux(sd);
-
-       mutex_lock(&vmux->lock);
-
-       sdformat->format = *__video_mux_get_pad_format(sd, sd_state,
-                                                      sdformat->pad,
-                                                      sdformat->which);
-
-       mutex_unlock(&vmux->lock);
-
-       return 0;
-}
-
 static int video_mux_set_format(struct v4l2_subdev *sd,
                            struct v4l2_subdev_state *sd_state,
                            struct v4l2_subdev_format *sdformat)
@@ -181,14 +154,11 @@ static int video_mux_set_format(struct v4l2_subdev *sd,
        struct media_pad *pad = &vmux->pads[sdformat->pad];
        u16 source_pad = sd->entity.num_pads - 1;
 
-       mbusformat = __video_mux_get_pad_format(sd, sd_state, sdformat->pad,
-                                               sdformat->which);
+       mbusformat = v4l2_subdev_get_pad_format(sd, sd_state, sdformat->pad);
        if (!mbusformat)
                return -EINVAL;
 
-       source_mbusformat = __video_mux_get_pad_format(sd, sd_state,
-                                                      source_pad,
-                                                      sdformat->which);
+       source_mbusformat = v4l2_subdev_get_pad_format(sd, sd_state, source_pad);
        if (!source_mbusformat)
                return -EINVAL;
 
@@ -298,7 +268,8 @@ static int video_mux_set_format(struct v4l2_subdev *sd,
 
        /* Source pad mirrors active sink pad, no limitations on sink pads */
        if ((pad->flags & MEDIA_PAD_FL_SOURCE) && vmux->active >= 0)
-               sdformat->format = vmux->format_mbus[vmux->active];
+               sdformat->format = *v4l2_subdev_get_pad_format(sd, sd_state,
+                                                              vmux->active);
 
        *mbusformat = sdformat->format;
 
@@ -321,7 +292,7 @@ static int video_mux_init_cfg(struct v4l2_subdev *sd,
        mutex_lock(&vmux->lock);
 
        for (i = 0; i < sd->entity.num_pads; i++) {
-               mbusformat = v4l2_subdev_get_try_format(sd, sd_state, i);
+               mbusformat = v4l2_subdev_get_pad_format(sd, sd_state, i);
                *mbusformat = video_mux_format_mbus_default;
        }
 
@@ -332,7 +303,7 @@ static int video_mux_init_cfg(struct v4l2_subdev *sd,
 
 static const struct v4l2_subdev_pad_ops video_mux_pad_ops = {
        .init_cfg = video_mux_init_cfg,
-       .get_fmt = video_mux_get_format,
+       .get_fmt = v4l2_subdev_get_fmt,
        .set_fmt = video_mux_set_format,
 };
 
@@ -462,17 +433,9 @@ static int video_mux_probe(struct platform_device *pdev)
        if (!vmux->pads)
                return -ENOMEM;
 
-       vmux->format_mbus = devm_kcalloc(dev, num_pads,
-                                        sizeof(*vmux->format_mbus),
-                                        GFP_KERNEL);
-       if (!vmux->format_mbus)
-               return -ENOMEM;
-
-       for (i = 0; i < num_pads; i++) {
+       for (i = 0; i < num_pads; i++)
                vmux->pads[i].flags = (i < num_pads - 1) ? MEDIA_PAD_FL_SINK
                                                         : MEDIA_PAD_FL_SOURCE;
-               vmux->format_mbus[i] = video_mux_format_mbus_default;
-       }
 
        vmux->subdev.entity.function = MEDIA_ENT_F_VID_MUX;
        ret = media_entity_pads_init(&vmux->subdev.entity, num_pads,
@@ -482,12 +445,18 @@ static int video_mux_probe(struct platform_device *pdev)
 
        vmux->subdev.entity.ops = &video_mux_ops;
 
+       ret = v4l2_subdev_init_finalize(&vmux->subdev);
+       if (ret < 0)
+               goto err_entity_cleanup;
+
        ret = video_mux_async_register(vmux, num_pads - 1);
        if (ret)
-               goto err_entity_cleanup;
+               goto err_subdev_cleanup;
 
        return 0;
 
+err_subdev_cleanup:
+       v4l2_subdev_cleanup(&vmux->subdev);
 err_entity_cleanup:
        media_entity_cleanup(&vmux->subdev.entity);
        return ret;
@@ -501,6 +470,7 @@ static void video_mux_remove(struct platform_device *pdev)
        v4l2_async_nf_unregister(&vmux->notifier);
        v4l2_async_nf_cleanup(&vmux->notifier);
        v4l2_async_unregister_subdev(sd);
+       v4l2_subdev_cleanup(sd);
        media_entity_cleanup(&sd->entity);
 }