Commit 624e8b62 authored by Niklas Söderlund's avatar Niklas Söderlund Committed by Hans Verkuil
Browse files

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: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Tested-by: default avatarJacopo Mondi <jacopo+renesas@jmondi.org>
Reviewed-by: default avatarJacopo Mondi <jacopo+renesas@jmondi.org>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent 344cadc5
Loading
Loading
Loading
Loading
+19 −20
Original line number Diff line number Diff line
@@ -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,24 +943,10 @@ 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);

	return ret;