media: adv7842: enable reduced fps detection
authorHans Verkuil <hans.verkuil@cisco.com>
Wed, 15 Aug 2018 12:54:43 +0000 (08:54 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 31 Aug 2018 14:03:51 +0000 (10:03 -0400)
The pixelclock detection of the adv7842 is precise enough to detect
if the framerate is 60 Hz or 59.94 Hz (aka "reduced fps").

Implement this detection.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/i2c/adv7842.c

index 4f8fbdd00e35eb01d5f3ec3d4fb92820249e5f18..f1c168bfaaa45763958469842e41b251e93b54db 100644 (file)
@@ -1525,6 +1525,7 @@ static void adv7842_fill_optional_dv_timings_fields(struct v4l2_subdev *sd,
        v4l2_find_dv_timings_cap(timings, adv7842_get_dv_timings_cap(sd),
                        is_digital_input(sd) ? 250000 : 1000000,
                        adv7842_check_dv_timings, NULL);
+       timings->bt.flags |= V4L2_DV_FL_CAN_DETECT_REDUCED_FPS;
 }
 
 static int adv7842_query_dv_timings(struct v4l2_subdev *sd,
@@ -1596,6 +1597,14 @@ static int adv7842_query_dv_timings(struct v4l2_subdev *sd,
                        bt->il_vbackporch = 0;
                }
                adv7842_fill_optional_dv_timings_fields(sd, timings);
+               if ((timings->bt.flags & V4L2_DV_FL_CAN_REDUCE_FPS) &&
+                   freq < bt->pixelclock) {
+                       u32 reduced_freq = ((u32)bt->pixelclock / 1001) * 1000;
+                       u32 delta_freq = abs(freq - reduced_freq);
+
+                       if (delta_freq < ((u32)bt->pixelclock - reduced_freq) / 2)
+                               timings->bt.flags |= V4L2_DV_FL_REDUCED_FPS;
+               }
        } else {
                /* find format
                 * Since LCVS values are inaccurate [REF_03, p. 339-340],