Re: [PATCH 3/3] adv7604: Correct G/S_EDID behaviour

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

2014-11-07 13:34 GMT+01:00 Hans Verkuil <hverkuil@xxxxxxxxx>:
> From: Hans Verkuil <hans.verkuil@xxxxxxxxx>
>
> In order to have v4l2-compliance tool pass the G/S_EDID some modifications
> where needed in the driver.
> In particular, the edid.reserved zone must be blanked.
>
> Based on a patch from Jean-Michel Hautbois <jean-michel.hautbois@xxxxxxxxxxx>,
> but reworked it a bit. It should use edid.present instead of edid.blocks as the
> check whether edid data is present.

I may have missed it, but you did not implement it using edid.present
in the code below... ?

> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx>
> ---
>  drivers/media/i2c/adv7604.c | 37 ++++++++++++++++++-------------------
>  1 file changed, 18 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c
> index 47795ff..d64fbd9 100644
> --- a/drivers/media/i2c/adv7604.c
> +++ b/drivers/media/i2c/adv7604.c
> @@ -1997,19 +1997,7 @@ static int adv7604_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
>         struct adv7604_state *state = to_state(sd);
>         u8 *data = NULL;
>
> -       if (edid->pad > ADV7604_PAD_HDMI_PORT_D)
> -               return -EINVAL;
> -       if (edid->blocks == 0)
> -               return -EINVAL;
> -       if (edid->blocks > 2)
> -               return -EINVAL;
> -       if (edid->start_block > 1)
> -               return -EINVAL;
> -       if (edid->start_block == 1)
> -               edid->blocks = 1;
> -
> -       if (edid->blocks > state->edid.blocks)
> -               edid->blocks = state->edid.blocks;
> +       memset(edid->reserved, 0, sizeof(edid->reserved));
>
>         switch (edid->pad) {
>         case ADV7604_PAD_HDMI_PORT_A:
> @@ -2021,14 +2009,24 @@ static int adv7604_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
>                 break;
>         default:
>                 return -EINVAL;
> -               break;
>         }
> -       if (!data)
> +
> +       if (edid->start_block == 0 && edid->blocks == 0) {
> +               edid->blocks = state->edid.blocks;
> +               return 0;
> +       }
> +
> +       if (data == NULL)
>                 return -ENODATA;
>
> -       memcpy(edid->edid,
> -              data + edid->start_block * 128,
> -              edid->blocks * 128);
> +       if (edid->start_block >= state->edid.blocks)
> +               return -EINVAL;
> +
> +       if (edid->start_block + edid->blocks > state->edid.blocks)
> +               edid->blocks = state->edid.blocks - edid->start_block;
> +
> +       memcpy(edid->edid, data + edid->start_block * 128, edid->blocks * 128);
> +
>         return 0;
>  }
>
> @@ -2068,6 +2066,8 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
>         int err;
>         int i;
>
> +       memset(edid->reserved, 0, sizeof(edid->reserved));
> +
>         if (edid->pad > ADV7604_PAD_HDMI_PORT_D)
>                 return -EINVAL;
>         if (edid->start_block != 0)
> @@ -2164,7 +2164,6 @@ static int adv7604_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid)
>                 return -EIO;
>         }
>
> -
>         /* enable hotplug after 100 ms */
>         queue_delayed_work(state->work_queues,
>                         &state->delayed_work_enable_hotplug, HZ / 10);
> --
> 2.1.1
>
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux