diff options
author | Martin Bugge <marbugge@cisco.com> | 2013-12-05 19:14:02 +0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-01-07 12:36:03 +0400 |
commit | 245b2b678c6fc65f0265c55f7a4fa0155ad6b235 (patch) | |
tree | 596730407cc00ddd4a3caf10907512a72dc7bf91 /drivers/media/i2c | |
parent | 6e9071f26864d83be6855f570a5ccc847b66028a (diff) | |
download | linux-245b2b678c6fc65f0265c55f7a4fa0155ad6b235.tar.xz |
[media] adv7842: support g_edid ioctl
Signed-off-by: Martin Bugge <marbugge@cisco.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media/i2c')
-rw-r--r-- | drivers/media/i2c/adv7842.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c index ae7252c1cd0c..2920e6b4536d 100644 --- a/drivers/media/i2c/adv7842.c +++ b/drivers/media/i2c/adv7842.c @@ -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, }; |