On 15/08/18 15:40, Hans Verkuil wrote:
> From: Hans Verkuil <[email protected]>
>
> 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 <[email protected]>
> ---
> 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],
>