drm/radeon/kms: fix dp_detect handling for DP bridge chips
authorAlex Deucher <alexander.deucher@amd.com>
Tue, 4 Oct 2011 16:23:24 +0000 (12:23 -0400)
committerDave Airlie <airlied@redhat.com>
Wed, 5 Oct 2011 09:31:40 +0000 (10:31 +0100)
The HPD pin is not reliable for detecting whether a monitor
is connected or not.  Skip HPD and just use DDC or load
detection.

Fixes phantom VGA connected bugs.

[Michel: fixes phantom VGA bugs on his llano system.]

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Tested-by: Michel Dänzer <michel.daenzer@amd.com>
Cc: stable@kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon_connectors.c

index bce63fd329d471fc57c4794e85c7d1cfa7c0e1b1..449c3d8c68367034cfba3bc012c75bcd9a8888e2 100644 (file)
@@ -1303,23 +1303,14 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
                /* get the DPCD from the bridge */
                radeon_dp_getdpcd(radeon_connector);
 
-               if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
-                       ret = connector_status_connected;
-               else {
-                       /* need to setup ddc on the bridge */
-                       if (encoder)
-                               radeon_atom_ext_encoder_setup_ddc(encoder);
+               if (encoder) {
+                       /* setup ddc on the bridge */
+                       radeon_atom_ext_encoder_setup_ddc(encoder);
                        if (radeon_ddc_probe(radeon_connector,
-                                            radeon_connector->requires_extended_probe))
+                                            radeon_connector->requires_extended_probe)) /* try DDC */
                                ret = connector_status_connected;
-               }
-
-               if ((ret == connector_status_disconnected) &&
-                   radeon_connector->dac_load_detect) {
-                       struct drm_encoder *encoder = radeon_best_single_encoder(connector);
-                       struct drm_encoder_helper_funcs *encoder_funcs;
-                       if (encoder) {
-                               encoder_funcs = encoder->helper_private;
+                       else if (radeon_connector->dac_load_detect) { /* try load detection */
+                               struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
                                ret = encoder_funcs->detect(encoder, connector);
                        }
                }