media: rcar-vin: Breakout media link creation
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Mon, 24 Jan 2022 12:48:57 +0000 (13:48 +0100)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Tue, 22 Feb 2022 08:41:10 +0000 (09:41 +0100)
In preparation of creating more links to allow for full Virtual Channel
routing within the CSI-2 block break out the link creation logic to a
helper function as the logic will grow in future work.

There is no functional change.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Reviewed-by: Jacopo Mondi <jacopo+renesas@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/rcar-vin/rcar-core.c

index a50bf65f37db60656bff8b53cd3cec1989755f58..0fa330e02bd8437a37b0e513b21decfb31f5054e 100644 (file)
@@ -906,6 +906,23 @@ static const struct media_device_ops rvin_csi2_media_ops = {
        .link_notify = rvin_csi2_link_notify,
 };
 
+static int rvin_csi2_create_link(struct rvin_group *group,
+                                const struct rvin_group_route *route)
+
+{
+       struct media_entity *source = &group->remotes[route->csi].subdev->entity;
+       unsigned int source_idx = rvin_group_csi_channel_to_pad(route->channel);
+       struct media_entity *sink = &group->vin[route->vin]->vdev.entity;
+       struct media_pad *source_pad = &source->pads[source_idx];
+       struct media_pad *sink_pad = &sink->pads[0];
+
+       /* Skip if link already exists. */
+       if (media_entity_find_link(source_pad, sink_pad))
+               return 0;
+
+       return media_create_pad_link(source, source_idx, sink, 0, 0);
+}
+
 static int rvin_csi2_setup_links(struct rvin_dev *vin)
 {
        const struct rvin_group_route *route;
@@ -914,10 +931,6 @@ static int rvin_csi2_setup_links(struct rvin_dev *vin)
        /* Create all media device links between VINs and CSI-2's. */
        mutex_lock(&vin->group->lock);
        for (route = vin->info->routes; route->mask; route++) {
-               struct media_pad *source_pad, *sink_pad;
-               struct media_entity *source, *sink;
-               unsigned int source_idx;
-
                /* Check that VIN is part of the group. */
                if (!vin->group->vin[route->vin])
                        continue;
@@ -930,23 +943,9 @@ static int rvin_csi2_setup_links(struct rvin_dev *vin)
                if (!vin->group->remotes[route->csi].subdev)
                        continue;
 
-               source = &vin->group->remotes[route->csi].subdev->entity;
-               source_idx = rvin_group_csi_channel_to_pad(route->channel);
-               source_pad = &source->pads[source_idx];
-
-               sink = &vin->group->vin[route->vin]->vdev.entity;
-               sink_pad = &sink->pads[0];
-
-               /* Skip if link already exists. */
-               if (media_entity_find_link(source_pad, sink_pad))
-                       continue;
-
-               ret = media_create_pad_link(source, source_idx, sink, 0, 0);
-               if (ret) {
-                       vin_err(vin, "Error adding link from %s to %s\n",
-                               source->name, sink->name);
+               ret = rvin_csi2_create_link(vin->group, route);
+               if (ret)
                        break;
-               }
        }
        mutex_unlock(&vin->group->lock);