Always disable and clear interrupts at probe time to ensure that the
TDA998x is in a sane state.  This ensures that the interrupt line,
which is also the CEC clock calibration signal, is always deasserted.

Signed-off-by: Russell King <rmk+ker...@armlinux.org.uk>
---
 drivers/gpu/drm/i2c/tda998x_drv.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c 
b/drivers/gpu/drm/i2c/tda998x_drv.c
index 661cb8915f2f..e294f5b50236 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -1547,6 +1547,15 @@ static int tda998x_create(struct i2c_client *client, 
struct tda998x_priv *priv)
        cec_write(priv, REG_CEC_FRO_IM_CLK_CTRL,
                        CEC_FRO_IM_CLK_CTRL_GHOST_DIS | 
CEC_FRO_IM_CLK_CTRL_IMCLK_SEL);
 
+       /* ensure interrupts are disabled */
+       cec_write(priv, REG_CEC_RXSHPDINTENA, 0);
+
+       /* clear pending interrupts */
+       cec_read(priv, REG_CEC_RXSHPDINT);
+       reg_read(priv, REG_INT_FLAGS_0);
+       reg_read(priv, REG_INT_FLAGS_1);
+       reg_read(priv, REG_INT_FLAGS_2);
+
        /* initialize the optional IRQ */
        priv->cec = i2c_new_dummy(client->adapter, priv->cec_addr);
        if (!priv->cec)
@@ -1558,11 +1567,6 @@ static int tda998x_create(struct i2c_client *client, 
struct tda998x_priv *priv)
                /* init read EDID waitqueue and HDP work */
                init_waitqueue_head(&priv->wq_edid);
 
-               /* clear pending interrupts */
-               reg_read(priv, REG_INT_FLAGS_0);
-               reg_read(priv, REG_INT_FLAGS_1);
-               reg_read(priv, REG_INT_FLAGS_2);
-
                irq_flags =
                        irqd_get_trigger_type(irq_get_irq_data(client->irq));
                irq_flags |= IRQF_SHARED | IRQF_ONESHOT;
-- 
2.7.4

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

Reply via email to