|
@@ -724,6 +724,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
|
|
|
dret = radeon_ddc_probe(radeon_connector,
|
|
|
radeon_connector->requires_extended_probe);
|
|
|
if (dret) {
|
|
|
+ radeon_connector->detected_by_load = false;
|
|
|
if (radeon_connector->edid) {
|
|
|
kfree(radeon_connector->edid);
|
|
|
radeon_connector->edid = NULL;
|
|
@@ -750,12 +751,21 @@ radeon_vga_detect(struct drm_connector *connector, bool force)
|
|
|
} else {
|
|
|
|
|
|
/* if we aren't forcing don't do destructive polling */
|
|
|
- if (!force)
|
|
|
- return connector->status;
|
|
|
+ if (!force) {
|
|
|
+ /* only return the previous status if we last
|
|
|
+ * detected a monitor via load.
|
|
|
+ */
|
|
|
+ if (radeon_connector->detected_by_load)
|
|
|
+ return connector->status;
|
|
|
+ else
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
|
|
|
if (radeon_connector->dac_load_detect && encoder) {
|
|
|
encoder_funcs = encoder->helper_private;
|
|
|
ret = encoder_funcs->detect(encoder, connector);
|
|
|
+ if (ret == connector_status_connected)
|
|
|
+ radeon_connector->detected_by_load = true;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -897,6 +907,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
|
|
|
dret = radeon_ddc_probe(radeon_connector,
|
|
|
radeon_connector->requires_extended_probe);
|
|
|
if (dret) {
|
|
|
+ radeon_connector->detected_by_load = false;
|
|
|
if (radeon_connector->edid) {
|
|
|
kfree(radeon_connector->edid);
|
|
|
radeon_connector->edid = NULL;
|
|
@@ -964,8 +975,13 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
|
|
|
(connector->connector_type == DRM_MODE_CONNECTOR_HDMIA))
|
|
|
goto out;
|
|
|
|
|
|
+ /* if we aren't forcing don't do destructive polling */
|
|
|
if (!force) {
|
|
|
- ret = connector->status;
|
|
|
+ /* only return the previous status if we last
|
|
|
+ * detected a monitor via load.
|
|
|
+ */
|
|
|
+ if (radeon_connector->detected_by_load)
|
|
|
+ ret = connector->status;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -989,6 +1005,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force)
|
|
|
ret = encoder_funcs->detect(encoder, connector);
|
|
|
if (ret == connector_status_connected) {
|
|
|
radeon_connector->use_digital = false;
|
|
|
+ radeon_connector->detected_by_load = true;
|
|
|
}
|
|
|
}
|
|
|
break;
|