Message ID | 546B84C6.3090809@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, 18 Nov 2014 17:41:26 +0000 Andrew Jackson <Andrew.Jackson@arm.com> wrote: > Fetching the EDID from a connected monitor is an automated thing > with NXP TDA19988. But on some boards the fetching fails for the > first time silently without any indication that an error has occured. > More than that, subsequent fetches of the EDID succeed until the > monitor(s) are unplugged. > > Add a function to validate the read EDID and retry if the block > retrieved is not valid. > > Signed-off-by: Andrew Jackson <Andrew.Jackson@arm.com> > Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com> It seems that your patch is deprecated by Laurent Pinchart's [PATCH] drm: tda998x: Use drm_do_get_edid() http://lists.freedesktop.org/archives/dri-devel/2014-November/072906.html
On 11/28/14 08:19, Jean-Francois Moine wrote: > On Tue, 18 Nov 2014 17:41:26 +0000 > Andrew Jackson <Andrew.Jackson@arm.com> wrote: > >> Fetching the EDID from a connected monitor is an automated thing >> with NXP TDA19988. But on some boards the fetching fails for the >> first time silently without any indication that an error has occured. >> More than that, subsequent fetches of the EDID succeed until the >> monitor(s) are unplugged. >> >> Add a function to validate the read EDID and retry if the block >> retrieved is not valid. >> >> Signed-off-by: Andrew Jackson <Andrew.Jackson@arm.com> >> Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com> > > It seems that your patch is deprecated by Laurent Pinchart's > [PATCH] drm: tda998x: Use drm_do_get_edid() > http://lists.freedesktop.org/archives/dri-devel/2014-November/072906.html > Thank you for the heads-up, I'd not seen that. I'll consider how my patch might be modified to suit the new infrastructure. Andrew
On Fri, 28 Nov 2014 09:02:39 +0000 Andrew Jackson <Andrew.Jackson@arm.com> wrote: > > It seems that your patch is deprecated by Laurent Pinchart's > > [PATCH] drm: tda998x: Use drm_do_get_edid() > > http://lists.freedesktop.org/archives/dri-devel/2014-November/072906.html > > > > Thank you for the heads-up, I'd not seen that. I'll consider how my patch might be modified to suit the new infrastructure. You don't need any patch: drm_do_get_edid() already loops on reading the EDID.
On 11/29/14 10:41, Jean-Francois Moine wrote: > On Fri, 28 Nov 2014 09:02:39 +0000 > Andrew Jackson <Andrew.Jackson@arm.com> wrote: > >>> It seems that your patch is deprecated by Laurent Pinchart's >>> [PATCH] drm: tda998x: Use drm_do_get_edid() >>> http://lists.freedesktop.org/archives/dri-devel/2014-November/072906.html >>> >> >> Thank you for the heads-up, I'd not seen that. I'll consider how my patch might be modified to suit the new infrastructure. > > You don't need any patch: drm_do_get_edid() already loops on reading > the EDID. > Thank you again: that saves me work! Andrew
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c index d476279..025adc0 100644 --- a/drivers/gpu/drm/i2c/tda998x_drv.c +++ b/drivers/gpu/drm/i2c/tda998x_drv.c @@ -1066,11 +1066,36 @@ static int read_edid_block(struct tda998x_priv *priv, uint8_t *buf, int blk) return 0; } +static int +read_validate_edid_block(struct tda998x_priv *priv, uint8_t *buf, int blk) +{ + bool print_bad_edid = drm_debug & DRM_UT_KMS; + int ret; + int retries = 1; + + do + { + bool print_bad = print_bad_edid && (retries == 0); + + ret = read_edid_block(priv, buf, blk); + /* Fail on I2C error */ + if (ret) + break; + + /* But retry checksum errored blocks */ + if (drm_edid_block_valid(buf, blk, print_bad)) + break; + else + ret = -EINVAL; + } while (retries-- > 0); + + return ret; +} + static uint8_t *do_get_edid(struct tda998x_priv *priv) { int j, valid_extensions = 0; uint8_t *block, *new; - bool print_bad_edid = drm_debug & DRM_UT_KMS; if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL) return NULL; @@ -1079,10 +1104,7 @@ static uint8_t *do_get_edid(struct tda998x_priv *priv) reg_clear(priv, REG_TX4, TX4_PD_RAM); /* base block fetch */ - if (read_edid_block(priv, block, 0)) - goto fail; - - if (!drm_edid_block_valid(block, 0, print_bad_edid)) + if (read_validate_edid_block(priv, block, 0)) goto fail; /* if there's no extensions, we're done */ @@ -1096,10 +1118,8 @@ static uint8_t *do_get_edid(struct tda998x_priv *priv) for (j = 1; j <= block[0x7e]; j++) { uint8_t *ext_block = block + (valid_extensions + 1) * EDID_LENGTH; - if (read_edid_block(priv, ext_block, j)) - goto fail; - if (!drm_edid_block_valid(ext_block, j, print_bad_edid)) + if (read_validate_edid_block(priv, ext_block, j)) goto fail; valid_extensions++;