drm/ast: Don't assume DVO enabled means SIL164 on uninitialized chips
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 4 Sep 2014 07:50:21 +0000 (17:50 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 15 Sep 2014 01:37:45 +0000 (11:37 +1000)
It looks like the AST2400 comes up with the DVO enable bit set,
which causes us to incorrectly assume we have a SIL164 regardless
of the value of the scratch registers setup by the BMC firmware.

So let's limit that test to the case where the chip has already
been setup by a BIOS.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/ast/ast_main.c

index 556d065590cc49bf12d495ea9d115dce15813b45..48998b2102a5cdc60bf3ada7144371e6054dd949 100644 (file)
@@ -158,16 +158,22 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post)
        /*
         * VGACRA3 Enhanced Color Mode Register, check if DVO is already
         * enabled, in that case, assume we have a SIL164 TMDS transmitter
+        *
+        * Don't make that assumption if we the chip wasn't enabled and
+        * is at power-on reset, otherwise we'll incorrectly "detect" a
+        * SIL164 when there is none.
         */
-       jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xff);
-       if (jreg & 0x80)
-               ast->tx_chip_type = AST_TX_SIL164;
+       if (!*need_post) {
+               jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xff);
+               if (jreg & 0x80)
+                       ast->tx_chip_type = AST_TX_SIL164;
+       }
 
        if ((ast->chip == AST2300) || (ast->chip == AST2400)) {
                /*
                 * On AST2300 and 2400, look the configuration set by the SoC in
                 * the SOC scratch register #1 bits 11:8 (interestingly marked
-                * as "reserved" in the spec
+                * as "reserved" in the spec)
                 */
                jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff);
                switch (jreg) {