media: rcar-vin: Breakout media link creation

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>
This commit is contained in:
Niklas Söderlund 2022-01-24 13:48:57 +01:00 committed by Hans Verkuil
parent 344cadc5a2
commit 624e8b6208
1 changed files with 19 additions and 20 deletions

View 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);