]> git.karo-electronics.de Git - linux-beck.git/commitdiff
drm/i2c: tda998x: fix EDID reading on TDA19988 devices
authorRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 14 Aug 2013 19:43:26 +0000 (21:43 +0200)
committerDave Airlie <airlied@redhat.com>
Sun, 18 Aug 2013 23:10:00 +0000 (09:10 +1000)
TDA19988 devices need their RAM enabled in order to read EDID
information.  Add support for this.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Rob Clark <robdclark@gmail.com>
Tested-by: Darren Etheridge <detheridge@ti.com>
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Tested-by: Russell King <rmk_kernel@arm.linux.org.uk>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/i2c/tda998x_drv.c

index e68b58a1aaf9d20ad76cfe4c5b70ed06d2744fd5..d71c408916e437aaf7d8193f09b95db77cb94d96 100644 (file)
@@ -229,6 +229,8 @@ struct tda998x_priv {
 
 /* Page 12h: HDCP and OTP */
 #define REG_TX3                   REG(0x12, 0x9a)     /* read/write */
+#define REG_TX4                   REG(0x12, 0x9b)     /* read/write */
+# define TX4_PD_RAM               (1 << 1)
 #define REG_TX33                  REG(0x12, 0xb8)     /* read/write */
 # define TX33_HDMI                (1 << 1)
 
@@ -673,6 +675,7 @@ read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk)
 static uint8_t *
 do_get_edid(struct drm_encoder *encoder)
 {
+       struct tda998x_priv *priv = to_tda998x_priv(encoder);
        int j = 0, valid_extensions = 0;
        uint8_t *block, *new;
        bool print_bad_edid = drm_debug & DRM_UT_KMS;
@@ -680,6 +683,9 @@ do_get_edid(struct drm_encoder *encoder)
        if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL)
                return NULL;
 
+       if (priv->rev == TDA19988)
+               reg_clear(encoder, REG_TX4, TX4_PD_RAM);
+
        /* base block fetch */
        if (read_edid_block(encoder, block, 0))
                goto fail;
@@ -689,7 +695,7 @@ do_get_edid(struct drm_encoder *encoder)
 
        /* if there's no extensions, we're done */
        if (block[0x7e] == 0)
-               return block;
+               goto done;
 
        new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL);
        if (!new)
@@ -716,9 +722,15 @@ do_get_edid(struct drm_encoder *encoder)
                block = new;
        }
 
+done:
+       if (priv->rev == TDA19988)
+               reg_set(encoder, REG_TX4, TX4_PD_RAM);
+
        return block;
 
 fail:
+       if (priv->rev == TDA19988)
+               reg_set(encoder, REG_TX4, TX4_PD_RAM);
        dev_warn(encoder->dev->dev, "failed to read EDID\n");
        kfree(block);
        return NULL;