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],
> 

Reply via email to