diff options
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 93f6a970b51d..ec2f3ffc42c1 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -735,6 +735,39 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect | |||
735 | ret = connector_status_disconnected; | 735 | ret = connector_status_disconnected; |
736 | } else | 736 | } else |
737 | ret = connector_status_connected; | 737 | ret = connector_status_connected; |
738 | |||
739 | /* multiple connectors on the same encoder with the same ddc line | ||
740 | * This tends to be HDMI and DVI on the same encoder with the | ||
741 | * same ddc line. If the edid says HDMI, consider the HDMI port | ||
742 | * connected and the DVI port disconnected. If the edid doesn't | ||
743 | * say HDMI, vice versa. | ||
744 | */ | ||
745 | if (radeon_connector->shared_ddc && connector_status_connected) { | ||
746 | struct drm_device *dev = connector->dev; | ||
747 | struct drm_connector *list_connector; | ||
748 | struct radeon_connector *list_radeon_connector; | ||
749 | list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { | ||
750 | if (connector == list_connector) | ||
751 | continue; | ||
752 | list_radeon_connector = to_radeon_connector(list_connector); | ||
753 | if (radeon_connector->devices == list_radeon_connector->devices) { | ||
754 | if (drm_detect_hdmi_monitor(radeon_connector->edid)) { | ||
755 | if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) { | ||
756 | kfree(radeon_connector->edid); | ||
757 | radeon_connector->edid = NULL; | ||
758 | ret = connector_status_disconnected; | ||
759 | } | ||
760 | } else { | ||
761 | if ((connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) || | ||
762 | (connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) { | ||
763 | kfree(radeon_connector->edid); | ||
764 | radeon_connector->edid = NULL; | ||
765 | ret = connector_status_disconnected; | ||
766 | } | ||
767 | } | ||
768 | } | ||
769 | } | ||
770 | } | ||
738 | } | 771 | } |
739 | } | 772 | } |
740 | 773 | ||