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