All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-11-18 17:41 ` Andrew Jackson
  0 siblings, 0 replies; 13+ messages in thread
From: Andrew Jackson @ 2014-11-18 17:41 UTC (permalink / raw)
  To: linux-arm-kernel

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>
---
 drivers/gpu/drm/i2c/tda998x_drv.c |   36 ++++++++++++++++++++++++++++--------
 1 files changed, 28 insertions(+), 8 deletions(-)

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++;
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-11-18 17:41 ` Andrew Jackson
  0 siblings, 0 replies; 13+ messages in thread
From: Andrew Jackson @ 2014-11-18 17:41 UTC (permalink / raw)
  To: Russell King - ARM Linux, Dave Airlie,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
  Cc: Liviu Dudau, linux-arm-kernel@lists.infradead.org

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>
---
 drivers/gpu/drm/i2c/tda998x_drv.c |   36 ++++++++++++++++++++++++++++--------
 1 files changed, 28 insertions(+), 8 deletions(-)

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++;
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
  2014-11-18 17:41 ` Andrew Jackson
  (?)
@ 2014-11-28  8:19   ` Jean-Francois Moine
  -1 siblings, 0 replies; 13+ messages in thread
From: Jean-Francois Moine @ 2014-11-28  8:19 UTC (permalink / raw)
  To: linux-arm-kernel

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

-- 
Ken ar c'henta?	|	      ** Breizh ha Linux atav! **
Jef		|		http://moinejf.free.fr/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-11-28  8:19   ` Jean-Francois Moine
  0 siblings, 0 replies; 13+ messages in thread
From: Jean-Francois Moine @ 2014-11-28  8:19 UTC (permalink / raw)
  To: Andrew Jackson
  Cc: Russell King - ARM Linux, linux-kernel@vger.kernel.org,
	dri-devel@lists.freedesktop.org,
	linux-arm-kernel@lists.infradead.org

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

-- 
Ken ar c'hentañ	|	      ** Breizh ha Linux atav! **
Jef		|		http://moinejf.free.fr/
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-11-28  8:19   ` Jean-Francois Moine
  0 siblings, 0 replies; 13+ messages in thread
From: Jean-Francois Moine @ 2014-11-28  8:19 UTC (permalink / raw)
  To: Andrew Jackson
  Cc: Russell King - ARM Linux, Dave Airlie,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	Liviu Dudau, linux-arm-kernel@lists.infradead.org

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

-- 
Ken ar c'hentañ	|	      ** Breizh ha Linux atav! **
Jef		|		http://moinejf.free.fr/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
  2014-11-28  8:19   ` Jean-Francois Moine
  (?)
@ 2014-11-28  9:02     ` Andrew Jackson
  -1 siblings, 0 replies; 13+ messages in thread
From: Andrew Jackson @ 2014-11-28  9:02 UTC (permalink / raw)
  To: linux-arm-kernel

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

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-11-28  9:02     ` Andrew Jackson
  0 siblings, 0 replies; 13+ messages in thread
From: Andrew Jackson @ 2014-11-28  9:02 UTC (permalink / raw)
  To: Jean-Francois Moine
  Cc: Russell King - ARM Linux, Liviu Dudau,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	Dave Airlie, linux-arm-kernel@lists.infradead.org

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

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-11-28  9:02     ` Andrew Jackson
  0 siblings, 0 replies; 13+ messages in thread
From: Andrew Jackson @ 2014-11-28  9:02 UTC (permalink / raw)
  To: Jean-Francois Moine
  Cc: Russell King - ARM Linux, Dave Airlie,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	Liviu Dudau, linux-arm-kernel@lists.infradead.org

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


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
  2014-11-28  9:02     ` Andrew Jackson
  (?)
@ 2014-11-29 10:41       ` Jean-Francois Moine
  -1 siblings, 0 replies; 13+ messages in thread
From: Jean-Francois Moine @ 2014-11-29 10:41 UTC (permalink / raw)
  To: linux-arm-kernel

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.

-- 
Ken ar c'henta?	|	      ** Breizh ha Linux atav! **
Jef		|		http://moinejf.free.fr/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-11-29 10:41       ` Jean-Francois Moine
  0 siblings, 0 replies; 13+ messages in thread
From: Jean-Francois Moine @ 2014-11-29 10:41 UTC (permalink / raw)
  To: Andrew Jackson
  Cc: Russell King - ARM Linux, linux-kernel@vger.kernel.org,
	dri-devel@lists.freedesktop.org,
	linux-arm-kernel@lists.infradead.org

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.

-- 
Ken ar c'hentañ	|	      ** Breizh ha Linux atav! **
Jef		|		http://moinejf.free.fr/
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-11-29 10:41       ` Jean-Francois Moine
  0 siblings, 0 replies; 13+ messages in thread
From: Jean-Francois Moine @ 2014-11-29 10:41 UTC (permalink / raw)
  To: Andrew Jackson
  Cc: Russell King - ARM Linux, Dave Airlie,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	Liviu Dudau, linux-arm-kernel@lists.infradead.org

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.

-- 
Ken ar c'hentañ	|	      ** Breizh ha Linux atav! **
Jef		|		http://moinejf.free.fr/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
  2014-11-29 10:41       ` Jean-Francois Moine
@ 2014-12-01 13:19         ` Andrew Jackson
  -1 siblings, 0 replies; 13+ messages in thread
From: Andrew Jackson @ 2014-12-01 13:19 UTC (permalink / raw)
  To: linux-arm-kernel

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

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time.
@ 2014-12-01 13:19         ` Andrew Jackson
  0 siblings, 0 replies; 13+ messages in thread
From: Andrew Jackson @ 2014-12-01 13:19 UTC (permalink / raw)
  To: Jean-Francois Moine
  Cc: Russell King - ARM Linux, Dave Airlie,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	Liviu Dudau, linux-arm-kernel@lists.infradead.org

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

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2014-12-01 13:19 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-18 17:41 [PATCH] drm: i2c: tda998x: Retry fetching the EDID if it fails first time Andrew Jackson
2014-11-18 17:41 ` Andrew Jackson
2014-11-28  8:19 ` Jean-Francois Moine
2014-11-28  8:19   ` Jean-Francois Moine
2014-11-28  8:19   ` Jean-Francois Moine
2014-11-28  9:02   ` Andrew Jackson
2014-11-28  9:02     ` Andrew Jackson
2014-11-28  9:02     ` Andrew Jackson
2014-11-29 10:41     ` Jean-Francois Moine
2014-11-29 10:41       ` Jean-Francois Moine
2014-11-29 10:41       ` Jean-Francois Moine
2014-12-01 13:19       ` Andrew Jackson
2014-12-01 13:19         ` Andrew Jackson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.