[media] adv7604: add vic detect
authorHans Verkuil <hans.verkuil@cisco.com>
Thu, 14 Jul 2016 14:53:47 +0000 (11:53 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Wed, 16 Nov 2016 17:20:59 +0000 (15:20 -0200)
Obtain the correct timings based on the VIC code from the AVI InfoFrame.

It does a sanity check to see if at least the measured width and height
are in line with what the VIC code reports. If not, then use the timings
instead of the VIC code (as per the CEA-861 spec).

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/i2c/adv7604.c

index fa7046ef09b274272e82afbb5fbaca2e3caf23b6..5630eb22daaa98c7e31a517d34619b59db07cb43 100644 (file)
@@ -1566,10 +1566,24 @@ static int adv76xx_query_dv_timings(struct v4l2_subdev *sd,
                V4L2_DV_INTERLACED : V4L2_DV_PROGRESSIVE;
 
        if (is_digital_input(sd)) {
+               bool hdmi_signal = hdmi_read(sd, 0x05) & 0x80;
+               u8 vic = 0;
+               u32 w, h;
+
+               w = hdmi_read16(sd, 0x07, info->linewidth_mask);
+               h = hdmi_read16(sd, 0x09, info->field0_height_mask);
+
+               if (hdmi_signal && (io_read(sd, 0x60) & 1))
+                       vic = infoframe_read(sd, 0x04);
+
+               if (vic && v4l2_find_dv_timings_cea861_vic(timings, vic) &&
+                   bt->width == w && bt->height == h)
+                       goto found;
+
                timings->type = V4L2_DV_BT_656_1120;
 
-               bt->width = hdmi_read16(sd, 0x07, info->linewidth_mask);
-               bt->height = hdmi_read16(sd, 0x09, info->field0_height_mask);
+               bt->width = w;
+               bt->height = h;
                bt->pixelclock = info->read_hdmi_pixelclock(sd);
                bt->hfrontporch = hdmi_read16(sd, 0x20, info->hfrontporch_mask);
                bt->hsync = hdmi_read16(sd, 0x22, info->hsync_mask);