[media] adv7842: support g_edid ioctl
authorMartin Bugge <marbugge@cisco.com>
Thu, 5 Dec 2013 15:14:02 +0000 (12:14 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 7 Jan 2014 08:36:03 +0000 (06:36 -0200)
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>
drivers/media/i2c/adv7842.c

index ae7252c1cd0c3269c0f9f0995292331761ee5014..2920e6b4536def16ae9e39150ff77922533b6914 100644 (file)
@@ -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,
 };