[media] adv7842: log-status for Audio Video Info frames (AVI)
authorMartin Bugge <marbugge@cisco.com>
Fri, 24 Jan 2014 13:50:05 +0000 (10:50 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 4 Feb 2014 11:57:18 +0000 (09:57 -0200)
Clear any pending AVI checksum-errors.
To be able to display last received AVI.

Signed-off-by: Martin Bugge <marbugge@cisco.com>
Cc: Mats Randgaard <matrandg@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 3aa1a7c..209b175 100644 (file)
@@ -2191,7 +2191,8 @@ static void print_avi_infoframe(struct v4l2_subdev *sd)
 {
        int i;
        uint8_t buf[14];
-       uint8_t avi_inf_len;
+       u8 avi_len;
+       u8 avi_ver;
        struct avi_info_frame avi;
 
        if (!(hdmi_read(sd, 0x05) & 0x80)) {
@@ -2204,18 +2205,20 @@ static void print_avi_infoframe(struct v4l2_subdev *sd)
        }
 
        if (io_read(sd, 0x88) & 0x10) {
-               /* Note: the ADV7842 calculated incorrect checksums for InfoFrames
-                  with a length of 14 or 15. See the ADV7842 Register Settings
-                  Recommendations document for more details. */
-               v4l2_info(sd, "AVI infoframe checksum error\n");
-               return;
+               v4l2_info(sd, "AVI infoframe checksum error has occurred earlier\n");
+               io_write(sd, 0x8a, 0x10); /* clear AVI_INF_CKS_ERR_RAW */
+               if (io_read(sd, 0x88) & 0x10) {
+                       v4l2_info(sd, "AVI infoframe checksum error still present\n");
+                       io_write(sd, 0x8a, 0x10); /* clear AVI_INF_CKS_ERR_RAW */
+               }
        }
 
-       avi_inf_len = infoframe_read(sd, 0xe2);
+       avi_len = infoframe_read(sd, 0xe2);
+       avi_ver = infoframe_read(sd, 0xe1);
        v4l2_info(sd, "AVI infoframe version %d (%d byte)\n",
-                 infoframe_read(sd, 0xe1), avi_inf_len);
+                 avi_ver, avi_len);
 
-       if (infoframe_read(sd, 0xe1) != 0x02)
+       if (avi_ver != 0x02)
                return;
 
        for (i = 0; i < 14; i++)