On 15/08/18 15:40, Hans Verkuil wrote: > From: Hans Verkuil <hans.verkuil@xxxxxxxxx> > > 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@xxxxxxxxx> > --- > drivers/media/i2c/adv7842.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/media/i2c/adv7842.c b/drivers/media/i2c/adv7842.c > index 4f8fbdd00e35..999d621f5667 100644 > --- a/drivers/media/i2c/adv7842.c > +++ b/drivers/media/i2c/adv7842.c > @@ -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 = (bt->pixelclock / 1001) * 1000; bt->pixelclock needs to be cast to u32 to avoid a 64 bit division. > + u32 delta_freq = abs(freq - reduced_freq); > + > + if (delta_freq < (bt->pixelclock - reduced_freq) / 2) Ditto. (kbuild robot complained about this.) Hans > + timings->bt.flags |= V4L2_DV_FL_REDUCED_FPS; > + } > } else { > /* find format > * Since LCVS values are inaccurate [REF_03, p. 339-340], >