All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm: tda998x: Protect the page register
  2014-11-29  8:12 [PATCH 0/2] drm: tda998x: Fix a couple of problems Jean-Francois Moine
@ 2014-11-29  7:30 ` Jean-Francois Moine
  2014-11-29  7:57 ` [PATCH 2/2] drm: tda998x: Fix EDID read timeout on HDMI connect Jean-Francois Moine
  2014-12-01 10:49 ` [PATCH 0/2] drm: tda998x: Fix a couple of problems Russell King - ARM Linux
  2 siblings, 0 replies; 4+ messages in thread
From: Jean-Francois Moine @ 2014-11-29  7:30 UTC (permalink / raw)
  To: Russell King, dri-devel

As the HDMI registers of the TDA998x chips are accessed by pages,
the page register must be protected.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
---
 drivers/gpu/drm/i2c/tda998x_drv.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
index d476279..6795f09 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -32,6 +32,7 @@
 struct tda998x_priv {
 	struct i2c_client *cec;
 	struct i2c_client *hdmi;
+	struct mutex mutex;
 	uint16_t rev;
 	uint8_t current_page;
 	int dpms;
@@ -402,9 +403,10 @@ reg_read_range(struct tda998x_priv *priv, uint16_t reg, char *buf, int cnt)
 	uint8_t addr = REG2ADDR(reg);
 	int ret;
 
+	mutex_lock(&priv->mutex);
 	ret = set_page(priv, reg);
 	if (ret < 0)
-		return ret;
+		goto out;
 
 	ret = i2c_master_send(client, &addr, sizeof(addr));
 	if (ret < 0)
@@ -414,10 +416,12 @@ reg_read_range(struct tda998x_priv *priv, uint16_t reg, char *buf, int cnt)
 	if (ret < 0)
 		goto fail;
 
-	return ret;
+	goto out;
 
 fail:
 	dev_err(&client->dev, "Error %d reading from 0x%x\n", ret, reg);
+out:
+	mutex_unlock(&priv->mutex);
 	return ret;
 }
 
@@ -431,13 +435,16 @@ reg_write_range(struct tda998x_priv *priv, uint16_t reg, uint8_t *p, int cnt)
 	buf[0] = REG2ADDR(reg);
 	memcpy(&buf[1], p, cnt);
 
+	mutex_lock(&priv->mutex);
 	ret = set_page(priv, reg);
 	if (ret < 0)
-		return;
+		goto out;
 
 	ret = i2c_master_send(client, buf, cnt + 1);
 	if (ret < 0)
 		dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg);
+out:
+	mutex_unlock(&priv->mutex);
 }
 
 static int
@@ -459,13 +466,16 @@ reg_write(struct tda998x_priv *priv, uint16_t reg, uint8_t val)
 	uint8_t buf[] = {REG2ADDR(reg), val};
 	int ret;
 
+	mutex_lock(&priv->mutex);
 	ret = set_page(priv, reg);
 	if (ret < 0)
-		return;
+		goto out;
 
 	ret = i2c_master_send(client, buf, sizeof(buf));
 	if (ret < 0)
 		dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg);
+out:
+	mutex_unlock(&priv->mutex);
 }
 
 static void
@@ -475,13 +485,16 @@ reg_write16(struct tda998x_priv *priv, uint16_t reg, uint16_t val)
 	uint8_t buf[] = {REG2ADDR(reg), val >> 8, val};
 	int ret;
 
+	mutex_lock(&priv->mutex);
 	ret = set_page(priv, reg);
 	if (ret < 0)
-		return;
+		goto out;
 
 	ret = i2c_master_send(client, buf, sizeof(buf));
 	if (ret < 0)
 		dev_err(&client->dev, "Error %d writing to 0x%x\n", ret, reg);
+out:
+	mutex_unlock(&priv->mutex);
 }
 
 static void
@@ -1268,6 +1281,8 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
 
 	priv->dpms = DRM_MODE_DPMS_OFF;
 
+	mutex_init(&priv->mutex);	/* protect the page access */
+
 	/* wake up the device: */
 	cec_write(priv, REG_CEC_ENAMODS,
 			CEC_ENAMODS_EN_RXSENS | CEC_ENAMODS_EN_HDMI);
-- 
2.1.3

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH 2/2] drm: tda998x: Fix EDID read timeout on HDMI connect
  2014-11-29  8:12 [PATCH 0/2] drm: tda998x: Fix a couple of problems Jean-Francois Moine
  2014-11-29  7:30 ` [PATCH 1/2] drm: tda998x: Protect the page register Jean-Francois Moine
@ 2014-11-29  7:57 ` Jean-Francois Moine
  2014-12-01 10:49 ` [PATCH 0/2] drm: tda998x: Fix a couple of problems Russell King - ARM Linux
  2 siblings, 0 replies; 4+ messages in thread
From: Jean-Francois Moine @ 2014-11-29  7:57 UTC (permalink / raw)
  To: Russell King, dri-devel

When the HDMI cable is disconnected and reconnected, EDID reading
is called too early raising a EDID read timeout.
This patch uses the system work queue to delay the notification
of the HDMI connect/disconnect event.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
---
 drivers/gpu/drm/i2c/tda998x_drv.c | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
index 6795f09..98f3c4d 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -33,6 +33,7 @@ struct tda998x_priv {
 	struct i2c_client *cec;
 	struct i2c_client *hdmi;
 	struct mutex mutex;
+	struct delayed_work dwork;
 	uint16_t rev;
 	uint8_t current_page;
 	int dpms;
@@ -549,6 +550,17 @@ tda998x_reset(struct tda998x_priv *priv)
 	reg_write(priv, REG_MUX_VP_VIP_OUT, 0x24);
 }
 
+/* handle HDMI connect/disconnect */
+static void tda998x_hpd(struct work_struct *work)
+{
+	struct delayed_work *dwork = to_delayed_work(work);
+	struct tda998x_priv *priv =
+			container_of(dwork, struct tda998x_priv, dwork);
+
+	if (priv->encoder && priv->encoder->dev)
+		drm_kms_helper_hotplug_event(priv->encoder->dev);
+}
+
 /*
  * only 2 interrupts may occur: screen plug/unplug and EDID read
  */
@@ -572,8 +584,7 @@ static irqreturn_t tda998x_irq_thread(int irq, void *data)
 		priv->wq_edid_wait = 0;
 		wake_up(&priv->wq_edid);
 	} else if (cec != 0) {			/* HPD change */
-		if (priv->encoder && priv->encoder->dev)
-			drm_helper_hpd_irq_event(priv->encoder->dev);
+		schedule_delayed_work(&priv->dwork, HZ/10);
 	}
 	return IRQ_HANDLED;
 }
@@ -1183,8 +1194,10 @@ static void tda998x_destroy(struct tda998x_priv *priv)
 	/* disable all IRQs and free the IRQ handler */
 	cec_write(priv, REG_CEC_RXSHPDINTENA, 0);
 	reg_clear(priv, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD);
-	if (priv->hdmi->irq)
+	if (priv->hdmi->irq) {
 		free_irq(priv->hdmi->irq, priv);
+		cancel_delayed_work_sync(&priv->dwork);
+	}
 
 	i2c_unregister_device(priv->cec);
 }
@@ -1338,8 +1351,9 @@ static int tda998x_create(struct i2c_client *client, struct tda998x_priv *priv)
 	if (client->irq) {
 		int irqf_trigger;
 
-		/* init read EDID waitqueue */
+		/* init read EDID waitqueue and HDP work */
 		init_waitqueue_head(&priv->wq_edid);
+		INIT_DELAYED_WORK(&priv->dwork, tda998x_hpd);
 
 		/* clear pending interrupts */
 		reg_read(priv, REG_INT_FLAGS_0);
-- 
2.1.3

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH 0/2] drm: tda998x: Fix a couple of problems
@ 2014-11-29  8:12 Jean-Francois Moine
  2014-11-29  7:30 ` [PATCH 1/2] drm: tda998x: Protect the page register Jean-Francois Moine
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Jean-Francois Moine @ 2014-11-29  8:12 UTC (permalink / raw)
  To: Russell King, dri-devel

1)
The HDMI registers of the tda998x chips are accessed by pages.
As these HDMI registers may be accessed from different tasks
(video, irq/workqueue, and soon audio), the page register setting
must be protected.

2)
On HDMI reconnect (cable plug-in), the EDID is read too early and
this raises a EDID read timeout. Delaying a bit the connect event
fixes the problem.

Jean-Francois Moine (2):
  drm: tda998x: Protect the page register
  drm: tda998x: Fix EDID read timeout on HDMI connect

 drivers/gpu/drm/i2c/tda998x_drv.c | 47 +++++++++++++++++++++++++++++++--------
 1 file changed, 38 insertions(+), 9 deletions(-)

-- 
2.1.3

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 0/2] drm: tda998x: Fix a couple of problems
  2014-11-29  8:12 [PATCH 0/2] drm: tda998x: Fix a couple of problems Jean-Francois Moine
  2014-11-29  7:30 ` [PATCH 1/2] drm: tda998x: Protect the page register Jean-Francois Moine
  2014-11-29  7:57 ` [PATCH 2/2] drm: tda998x: Fix EDID read timeout on HDMI connect Jean-Francois Moine
@ 2014-12-01 10:49 ` Russell King - ARM Linux
  2 siblings, 0 replies; 4+ messages in thread
From: Russell King - ARM Linux @ 2014-12-01 10:49 UTC (permalink / raw)
  To: Jean-Francois Moine; +Cc: dri-devel

On Sat, Nov 29, 2014 at 09:12:51AM +0100, Jean-Francois Moine wrote:
> 1)
> The HDMI registers of the tda998x chips are accessed by pages.
> As these HDMI registers may be accessed from different tasks
> (video, irq/workqueue, and soon audio), the page register setting
> must be protected.
> 
> 2)
> On HDMI reconnect (cable plug-in), the EDID is read too early and
> this raises a EDID read timeout. Delaying a bit the connect event
> fixes the problem.

Both patches applied, thanks.

-- 
FTTC broadband for 0.8mile line: currently at 9.5Mbps down 400kbps up
according to speedtest.net.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

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

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-29  8:12 [PATCH 0/2] drm: tda998x: Fix a couple of problems Jean-Francois Moine
2014-11-29  7:30 ` [PATCH 1/2] drm: tda998x: Protect the page register Jean-Francois Moine
2014-11-29  7:57 ` [PATCH 2/2] drm: tda998x: Fix EDID read timeout on HDMI connect Jean-Francois Moine
2014-12-01 10:49 ` [PATCH 0/2] drm: tda998x: Fix a couple of problems Russell King - ARM Linux

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.