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

Commit 245b2b67 authored by Martin Bugge's avatar Martin Bugge Committed by Mauro Carvalho Chehab
Browse files

[media] adv7842: support g_edid ioctl

parent 6e9071f2
Loading
Loading
Loading
Loading
+41 −0
Original line number Diff line number Diff line
@@ -1910,6 +1910,46 @@ static int adv7842_isr(struct v4l2_subdev *sd, u32 status, bool *handled)
	return 0;
}

static int adv7842_get_edid(struct v4l2_subdev *sd, struct v4l2_subdev_edid *edid)
{
	struct adv7842_state *state = to_state(sd);
	u8 *data = NULL;

	if (edid->pad > ADV7842_EDID_PORT_VGA)
		return -EINVAL;
	if (edid->blocks == 0)
		return -EINVAL;
	if (edid->blocks > 2)
		return -EINVAL;
	if (edid->start_block > 1)
		return -EINVAL;
	if (edid->start_block == 1)
		edid->blocks = 1;
	if (!edid->edid)
		return -EINVAL;

	switch (edid->pad) {
	case ADV7842_EDID_PORT_A:
	case ADV7842_EDID_PORT_B:
		if (state->hdmi_edid.present & (0x04 << edid->pad))
			data = state->hdmi_edid.edid;
		break;
	case ADV7842_EDID_PORT_VGA:
		if (state->vga_edid.present)
			data = state->vga_edid.edid;
		break;
	default:
		return -EINVAL;
	}
	if (!data)
		return -ENODATA;

	memcpy(edid->edid,
	       data + edid->start_block * 128,
	       edid->blocks * 128);
	return 0;
}

static int adv7842_set_edid(struct v4l2_subdev *sd, struct v4l2_subdev_edid *e)
{
	struct adv7842_state *state = to_state(sd);
@@ -2722,6 +2762,7 @@ static const struct v4l2_subdev_video_ops adv7842_video_ops = {
};

static const struct v4l2_subdev_pad_ops adv7842_pad_ops = {
	.get_edid = adv7842_get_edid,
	.set_edid = adv7842_set_edid,
};