Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 158e2a53 authored by Jacopo Mondi's avatar Jacopo Mondi Committed by Mauro Carvalho Chehab
Browse files

media: rcar-vin: Cache the mbus configuration flags



Media bus configuration flags and media bus type were so far a property
of each VIN instance, as the subdevice they were connected to was
immutable during the whole system life time.

With the forth-coming introduction of parallel input devices support,
a VIN instance can have the subdevice it is connected to switched at
runtime, from a CSI-2 subdevice to a parallel one and viceversa, through
the modification of links between media entities in the media controller
graph. To avoid discarding the per-subdevice configuration flags retrieved by
v4l2_fwnode parsing facilities, cache them in the 'rvin_graph_entity'
member of each VIN instance, opportunely renamed to 'rvin_parallel_entity'.

Also modify the register configuration function to take mbus flags into
account when running on a bus type that supports them.

The media bus type currently in use will be updated in a follow-up patch
to the link state change notification function.

Signed-off-by: default avatarJacopo Mondi <jacopo+renesas@jmondi.org>
Acked-by: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 9863bc86
Loading
Loading
Loading
Loading
+8 −13
Original line number Diff line number Diff line
@@ -524,30 +524,29 @@ static int rvin_parallel_parse_v4l2(struct device *dev,
				    struct v4l2_async_subdev *asd)
{
	struct rvin_dev *vin = dev_get_drvdata(dev);
	struct rvin_graph_entity *rvge =
		container_of(asd, struct rvin_graph_entity, asd);
	struct rvin_parallel_entity *rvpe =
		container_of(asd, struct rvin_parallel_entity, asd);

	if (vep->base.port || vep->base.id)
		return -ENOTCONN;

	vin->mbus_cfg.type = vep->bus_type;
	vin->parallel = rvpe;
	vin->parallel->mbus_type = vep->bus_type;

	switch (vin->mbus_cfg.type) {
	switch (vin->parallel->mbus_type) {
	case V4L2_MBUS_PARALLEL:
		vin_dbg(vin, "Found PARALLEL media bus\n");
		vin->mbus_cfg.flags = vep->bus.parallel.flags;
		vin->parallel->mbus_flags = vep->bus.parallel.flags;
		break;
	case V4L2_MBUS_BT656:
		vin_dbg(vin, "Found BT656 media bus\n");
		vin->mbus_cfg.flags = 0;
		vin->parallel->mbus_flags = 0;
		break;
	default:
		vin_err(vin, "Unknown media bus type\n");
		return -EINVAL;
	}

	vin->parallel = rvge;

	return 0;
}

@@ -557,7 +556,7 @@ static int rvin_parallel_graph_init(struct rvin_dev *vin)

	ret = v4l2_async_notifier_parse_fwnode_endpoints(
		vin->dev, &vin->notifier,
		sizeof(struct rvin_graph_entity), rvin_parallel_parse_v4l2);
		sizeof(struct rvin_parallel_entity), rvin_parallel_parse_v4l2);
	if (ret)
		return ret;

@@ -785,10 +784,6 @@ static int rvin_mc_init(struct rvin_dev *vin)
{
	int ret;

	/* All our sources are CSI-2 */
	vin->mbus_cfg.type = V4L2_MBUS_CSI2;
	vin->mbus_cfg.flags = 0;

	vin->pad.flags = MEDIA_PAD_FL_SINK;
	ret = media_entity_pads_init(&vin->vdev.entity, 1, &vin->pad);
	if (ret)
+21 −11
Original line number Diff line number Diff line
@@ -659,8 +659,12 @@ static int rvin_setup(struct rvin_dev *vin)
		break;
	case MEDIA_BUS_FMT_UYVY8_2X8:
		/* BT.656 8bit YCbCr422 or BT.601 8bit YCbCr422 */
		vnmc |= vin->mbus_cfg.type == V4L2_MBUS_BT656 ?
			VNMC_INF_YUV8_BT656 : VNMC_INF_YUV8_BT601;
		if (!vin->is_csi &&
		    vin->parallel->mbus_type == V4L2_MBUS_BT656)
			vnmc |= VNMC_INF_YUV8_BT656;
		else
			vnmc |= VNMC_INF_YUV8_BT601;

		input_is_yuv = true;
		break;
	case MEDIA_BUS_FMT_RGB888_1X24:
@@ -668,8 +672,12 @@ static int rvin_setup(struct rvin_dev *vin)
		break;
	case MEDIA_BUS_FMT_UYVY10_2X10:
		/* BT.656 10bit YCbCr422 or BT.601 10bit YCbCr422 */
		vnmc |= vin->mbus_cfg.type == V4L2_MBUS_BT656 ?
			VNMC_INF_YUV10_BT656 : VNMC_INF_YUV10_BT601;
		if (!vin->is_csi &&
		    vin->parallel->mbus_type == V4L2_MBUS_BT656)
			vnmc |= VNMC_INF_YUV10_BT656;
		else
			vnmc |= VNMC_INF_YUV10_BT601;

		input_is_yuv = true;
		break;
	default:
@@ -682,13 +690,15 @@ static int rvin_setup(struct rvin_dev *vin)
	else
		dmr2 = VNDMR2_FTEV | VNDMR2_VLV(1);

	if (!vin->is_csi) {
		/* Hsync Signal Polarity Select */
	if (!(vin->mbus_cfg.flags & V4L2_MBUS_HSYNC_ACTIVE_LOW))
		if (!(vin->parallel->mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW))
			dmr2 |= VNDMR2_HPS;

		/* Vsync Signal Polarity Select */
	if (!(vin->mbus_cfg.flags & V4L2_MBUS_VSYNC_ACTIVE_LOW))
		if (!(vin->parallel->mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW))
			dmr2 |= VNDMR2_VPS;
	}

	/*
	 * Output format
@@ -734,7 +744,7 @@ static int rvin_setup(struct rvin_dev *vin)

	if (vin->info->model == RCAR_GEN3) {
		/* Select between CSI-2 and parallel input */
		if (vin->mbus_cfg.type == V4L2_MBUS_CSI2)
		if (vin->is_csi)
			vnmc &= ~VNMC_DPINE;
		else
			vnmc |= VNMC_DPINE;
+16 −6
Original line number Diff line number Diff line
@@ -75,16 +75,22 @@ struct rvin_video_format {
};

/**
 * struct rvin_graph_entity - Video endpoint from async framework
 * struct rvin_parallel_entity - Parallel video input endpoint descriptor
 * @asd:	sub-device descriptor for async framework
 * @subdev:	subdevice matched using async framework
 * @mbus_type:	media bus type
 * @mbus_flags:	media bus configuration flags
 * @source_pad:	source pad of remote subdevice
 * @sink_pad:	sink pad of remote subdevice
 *
 */
struct rvin_graph_entity {
struct rvin_parallel_entity {
	struct v4l2_async_subdev asd;
	struct v4l2_subdev *subdev;

	enum v4l2_mbus_type mbus_type;
	unsigned int mbus_flags;

	unsigned int source_pad;
	unsigned int sink_pad;
};
@@ -148,7 +154,8 @@ struct rvin_info {
 * @v4l2_dev:		V4L2 device
 * @ctrl_handler:	V4L2 control handler
 * @notifier:		V4L2 asynchronous subdevs notifier
 * @parallel:		entity in the DT for local parallel subdevice
 *
 * @parallel:		parallel input subdevice descriptor
 *
 * @group:		Gen3 CSI group
 * @id:			Gen3 group id for this VIN
@@ -166,7 +173,8 @@ struct rvin_info {
 * @sequence:		V4L2 buffers sequence number
 * @state:		keeps track of operation state
 *
 * @mbus_cfg:		media bus configuration from DT
 * @is_csi:		flag to mark the VIN as using a CSI-2 subdevice
 *
 * @mbus_code:		media bus format code
 * @format:		active V4L2 pixel format
 *
@@ -184,7 +192,8 @@ struct rvin_dev {
	struct v4l2_device v4l2_dev;
	struct v4l2_ctrl_handler ctrl_handler;
	struct v4l2_async_notifier notifier;
	struct rvin_graph_entity *parallel;

	struct rvin_parallel_entity *parallel;

	struct rvin_group *group;
	unsigned int id;
@@ -201,7 +210,8 @@ struct rvin_dev {
	unsigned int sequence;
	enum rvin_dma_state state;

	struct v4l2_mbus_config mbus_cfg;
	bool is_csi;

	u32 mbus_code;
	struct v4l2_pix_format format;