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

Commit 8a2192be authored by Ulrich Hecht's avatar Ulrich Hecht Committed by Mauro Carvalho Chehab
Browse files

[media] rcar-vin: implement EDID control ioctls

parent 474cde66
Loading
Loading
Loading
Loading
+48 −0
Original line number Original line Diff line number Diff line
@@ -613,6 +613,44 @@ static int rvin_dv_timings_cap(struct file *file, void *priv_fh,
	return ret;
	return ret;
}
}


static int rvin_g_edid(struct file *file, void *fh, struct v4l2_edid *edid)
{
	struct rvin_dev *vin = video_drvdata(file);
	struct v4l2_subdev *sd = vin_to_source(vin);
	int input, ret;

	if (edid->pad)
		return -EINVAL;

	input = edid->pad;
	edid->pad = vin->sink_pad_idx;

	ret = v4l2_subdev_call(sd, pad, get_edid, edid);

	edid->pad = input;

	return ret;
}

static int rvin_s_edid(struct file *file, void *fh, struct v4l2_edid *edid)
{
	struct rvin_dev *vin = video_drvdata(file);
	struct v4l2_subdev *sd = vin_to_source(vin);
	int input, ret;

	if (edid->pad)
		return -EINVAL;

	input = edid->pad;
	edid->pad = vin->sink_pad_idx;

	ret = v4l2_subdev_call(sd, pad, set_edid, edid);

	edid->pad = input;

	return ret;
}

static const struct v4l2_ioctl_ops rvin_ioctl_ops = {
static const struct v4l2_ioctl_ops rvin_ioctl_ops = {
	.vidioc_querycap		= rvin_querycap,
	.vidioc_querycap		= rvin_querycap,
	.vidioc_try_fmt_vid_cap		= rvin_try_fmt_vid_cap,
	.vidioc_try_fmt_vid_cap		= rvin_try_fmt_vid_cap,
@@ -635,6 +673,9 @@ static const struct v4l2_ioctl_ops rvin_ioctl_ops = {
	.vidioc_s_dv_timings		= rvin_s_dv_timings,
	.vidioc_s_dv_timings		= rvin_s_dv_timings,
	.vidioc_query_dv_timings	= rvin_query_dv_timings,
	.vidioc_query_dv_timings	= rvin_query_dv_timings,


	.vidioc_g_edid			= rvin_g_edid,
	.vidioc_s_edid			= rvin_s_edid,

	.vidioc_querystd		= rvin_querystd,
	.vidioc_querystd		= rvin_querystd,
	.vidioc_g_std			= rvin_g_std,
	.vidioc_g_std			= rvin_g_std,
	.vidioc_s_std			= rvin_s_std,
	.vidioc_s_std			= rvin_s_std,
@@ -883,6 +924,13 @@ int rvin_v4l2_probe(struct rvin_dev *vin)


	vin->src_pad_idx = pad_idx;
	vin->src_pad_idx = pad_idx;


	vin->sink_pad_idx = 0;
	for (pad_idx = 0; pad_idx < sd->entity.num_pads; pad_idx++)
		if (sd->entity.pads[pad_idx].flags == MEDIA_PAD_FL_SINK) {
			vin->sink_pad_idx = pad_idx;
			break;
		}

	vin->format.pixelformat	= RVIN_DEFAULT_FORMAT;
	vin->format.pixelformat	= RVIN_DEFAULT_FORMAT;
	rvin_reset_format(vin);
	rvin_reset_format(vin);


+2 −0
Original line number Original line Diff line number Diff line
@@ -92,6 +92,7 @@ struct rvin_graph_entity {
 * @vdev:		V4L2 video device associated with VIN
 * @vdev:		V4L2 video device associated with VIN
 * @v4l2_dev:		V4L2 device
 * @v4l2_dev:		V4L2 device
 * @src_pad_idx:	source pad index for media controller drivers
 * @src_pad_idx:	source pad index for media controller drivers
 * @sink_pad_idx:	sink pad index for media controller drivers
 * @ctrl_handler:	V4L2 control handler
 * @ctrl_handler:	V4L2 control handler
 * @notifier:		V4L2 asynchronous subdevs notifier
 * @notifier:		V4L2 asynchronous subdevs notifier
 * @digital:		entity in the DT for local digital subdevice
 * @digital:		entity in the DT for local digital subdevice
@@ -121,6 +122,7 @@ struct rvin_dev {
	struct video_device vdev;
	struct video_device vdev;
	struct v4l2_device v4l2_dev;
	struct v4l2_device v4l2_dev;
	int src_pad_idx;
	int src_pad_idx;
	int sink_pad_idx;
	struct v4l2_ctrl_handler ctrl_handler;
	struct v4l2_ctrl_handler ctrl_handler;
	struct v4l2_async_notifier notifier;
	struct v4l2_async_notifier notifier;
	struct rvin_graph_entity digital;
	struct rvin_graph_entity digital;