Commit c91fd7b7 authored by Sakari Ailus's avatar Sakari Ailus Committed by Mauro Carvalho Chehab
Browse files

media: v4l: async: Obtain async connection based on sub-device



Add v4l2_async_connection_unique() function for obtaining a struct
v4l2_async_connection, typically allocated by drivers together with their
own information on an external sub-device.

The relation between connections and sub-devices still remains 1:1 but
this code becomes more complex when the relation soon changes.

Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de> # imx6qp
Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> # rcar + adv746x
Tested-by: Aishwarya Kothari <aishwarya.kothari@toradex.com> # Apalis i.MX6Q with TC358743
Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> # Renesas RZ/G2L SMARC
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 9bf19fbf
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -381,6 +381,7 @@ static int rkisp1_csi_s_stream(struct v4l2_subdev *sd, int enable)
	struct rkisp1_csi *csi = to_rkisp1_csi(sd);
	struct rkisp1_device *rkisp1 = csi->rkisp1;
	struct rkisp1_sensor_async *source_asd;
	struct v4l2_async_connection *asc;
	struct media_pad *source_pad;
	struct v4l2_subdev *source;
	int ret;
@@ -406,7 +407,11 @@ static int rkisp1_csi_s_stream(struct v4l2_subdev *sd, int enable)
		return -EPIPE;
	}

	source_asd = container_of(source->asd, struct rkisp1_sensor_async, asd);
	asc = v4l2_async_connection_unique(source);
	if (!asc)
		return -EPIPE;

	source_asd = container_of(asc, struct rkisp1_sensor_async, asd);
	if (source_asd->mbus_type != V4L2_MBUS_CSI2_DPHY)
		return -EINVAL;

+6 −2
Original line number Diff line number Diff line
@@ -868,9 +868,13 @@ static int rkisp1_isp_s_stream(struct v4l2_subdev *sd, int enable)
		mbus_flags = 0;
	} else {
		const struct rkisp1_sensor_async *asd;
		struct v4l2_async_connection *asc;

		asd = container_of(rkisp1->source->asd,
				   struct rkisp1_sensor_async, asd);
		asc = v4l2_async_connection_unique(rkisp1->source);
		if (!asc)
			return -EPIPE;

		asd = container_of(asc, struct rkisp1_sensor_async, asd);

		mbus_type = asd->mbus_type;
		mbus_flags = asd->mbus_flags;
+11 −2
Original line number Diff line number Diff line
@@ -224,8 +224,17 @@ struct isp_async_subdev {
	struct isp_bus_cfg bus;
};

#define v4l2_subdev_to_bus_cfg(sd) \
	(&container_of((sd)->asd, struct isp_async_subdev, asd)->bus)
static inline struct isp_bus_cfg *
v4l2_subdev_to_bus_cfg(struct v4l2_subdev *sd)
{
	struct v4l2_async_connection *asc;

	asc = v4l2_async_connection_unique(sd);
	if (!asc)
		return NULL;

	return &container_of(asc, struct isp_async_subdev, asd)->bus;
}

#define v4l2_dev_to_isp_device(dev) \
	container_of(dev, struct isp_device, v4l2_dev)
+11 −2
Original line number Diff line number Diff line
@@ -1140,8 +1140,13 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
	if (ccdc->input == CCDC_INPUT_PARALLEL) {
		struct v4l2_subdev *sd =
			to_isp_pipeline(&ccdc->subdev.entity)->external;
		struct isp_bus_cfg *bus_cfg;

		parcfg = &v4l2_subdev_to_bus_cfg(sd)->bus.parallel;
		bus_cfg = v4l2_subdev_to_bus_cfg(sd);
		if (WARN_ON(!bus_cfg))
			return;

		parcfg = &bus_cfg->bus.parallel;
		ccdc->bt656 = parcfg->bt656;
	}

@@ -2436,7 +2441,11 @@ static int ccdc_link_validate(struct v4l2_subdev *sd,
	if (ccdc->input == CCDC_INPUT_PARALLEL) {
		struct v4l2_subdev *sd =
			media_entity_to_v4l2_subdev(link->source->entity);
		struct isp_bus_cfg *bus_cfg = v4l2_subdev_to_bus_cfg(sd);
		struct isp_bus_cfg *bus_cfg;

		bus_cfg = v4l2_subdev_to_bus_cfg(sd);
		if (WARN_ON(!bus_cfg))
			return -EPIPE;

		parallel_shift = bus_cfg->bus.parallel.data_lane_shift;
	} else {
+2 −0
Original line number Diff line number Diff line
@@ -360,6 +360,8 @@ static int ccp2_if_configure(struct isp_ccp2_device *ccp2)
	pad = media_pad_remote_pad_first(&ccp2->pads[CCP2_PAD_SINK]);
	sensor = media_entity_to_v4l2_subdev(pad->entity);
	buscfg = v4l2_subdev_to_bus_cfg(pipe->external);
	if (WARN_ON(!buscfg))
		return -EPIPE;

	ret = ccp2_phyif_config(ccp2, &buscfg->bus.ccp2);
	if (ret < 0)
Loading