diff options
-rw-r--r-- | src/radeon_output.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/radeon_output.c b/src/radeon_output.c index edf59cdc..6b6ba708 100644 --- a/src/radeon_output.c +++ b/src/radeon_output.c @@ -236,10 +236,40 @@ radeon_ddc_connected(xf86OutputPtr output) case CONNECTOR_HDMI_TYPE_A: case CONNECTOR_HDMI_TYPE_B: if (radeon_output->shared_ddc) { + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn); + int i; + if (MonInfo->rawData[0x14] & 0x80) /* if it's digital and DVI/HDMI/etc. */ MonType = MT_DFP; else MonType = MT_NONE; + + for (i = 0; i < config->num_output; i++) { + if (output != config->output[i]) { + RADEONOutputPrivatePtr other_radeon_output = + config->output[i]->driver_private; + if (radeon_output->devices & other_radeon_output->devices) { +#ifndef EDID_COMPLETE_RAWDATA + if (radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) { + MonType = MT_NONE; + break; + } +#else + if (xf86MonitorIsHDMI(MonInfo)) { + if (radeon_output->ConnectorType == CONNECTOR_DVI_D) { + MonType = MT_NONE; + break; + } + } else { + if (radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) { + MonType = MT_NONE; + break; + } + } +#endif + } + } + } } else MonType = MT_DFP; break; @@ -334,6 +364,22 @@ radeon_dpms(xf86OutputPtr output, int mode) if ((mode == DPMSModeOn) && radeon_output->enabled) return; + if ((mode != DPMSModeOn) && radeon_output->shared_ddc) { + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn); + int i; + + for (i = 0; i < config->num_output; i++) { + if (output != config->output[i]) { + RADEONOutputPrivatePtr other_radeon_output = + config->output[i]->driver_private; + if (radeon_output->devices & other_radeon_output->devices) { + if (output->status == XF86OutputStatusDisconnected) + return; + } + } + } + } + if (IS_AVIVO_VARIANT || info->r4xx_atom) { atombios_output_dpms(output, mode); } else { |