Rev 2997 | Rev 3764 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2997 | Rev 3120 | ||
---|---|---|---|
Line 939... | Line 939... | ||
939 | struct drm_encoder *encoder = NULL; |
939 | struct drm_encoder *encoder = NULL; |
940 | struct drm_encoder_helper_funcs *encoder_funcs; |
940 | struct drm_encoder_helper_funcs *encoder_funcs; |
941 | struct drm_mode_object *obj; |
941 | struct drm_mode_object *obj; |
942 | int i; |
942 | int i; |
943 | enum drm_connector_status ret = connector_status_disconnected; |
943 | enum drm_connector_status ret = connector_status_disconnected; |
944 | bool dret = false; |
944 | bool dret = false, broken_edid = false; |
- | 945 | ||
Line 945... | Line 946... | ||
945 | 946 | ||
946 | if (!force && radeon_check_hpd_status_unchanged(connector)) |
947 | if (!force && radeon_check_hpd_status_unchanged(connector)) |
Line 947... | Line 948... | ||
947 | return connector->status; |
948 | return connector->status; |
Line 963... | Line 964... | ||
963 | * return a block of 0's. If we see this just stop polling on this output */ |
964 | * return a block of 0's. If we see this just stop polling on this output */ |
964 | if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) { |
965 | if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) { |
965 | ret = connector_status_disconnected; |
966 | ret = connector_status_disconnected; |
966 | DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector)); |
967 | DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector)); |
967 | radeon_connector->ddc_bus = NULL; |
968 | radeon_connector->ddc_bus = NULL; |
- | 969 | } else { |
|
- | 970 | ret = connector_status_connected; |
|
- | 971 | broken_edid = true; /* defer use_digital to later */ |
|
968 | } |
972 | } |
969 | } else { |
973 | } else { |
970 | radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); |
974 | radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); |
Line 971... | Line 975... | ||
971 | 975 | ||
Line 1045... | Line 1049... | ||
1045 | encoder->encoder_type != DRM_MODE_ENCODER_TVDAC) |
1049 | encoder->encoder_type != DRM_MODE_ENCODER_TVDAC) |
1046 | continue; |
1050 | continue; |
Line 1047... | Line 1051... | ||
1047 | 1051 | ||
1048 | encoder_funcs = encoder->helper_private; |
1052 | encoder_funcs = encoder->helper_private; |
- | 1053 | if (encoder_funcs->detect) { |
|
1049 | if (encoder_funcs->detect) { |
1054 | if (!broken_edid) { |
- | 1055 | if (ret != connector_status_connected) { |
|
1050 | if (ret != connector_status_connected) { |
1056 | /* deal with analog monitors without DDC */ |
1051 | ret = encoder_funcs->detect(encoder, connector); |
1057 | ret = encoder_funcs->detect(encoder, connector); |
1052 | if (ret == connector_status_connected) { |
1058 | if (ret == connector_status_connected) { |
1053 | radeon_connector->use_digital = false; |
1059 | radeon_connector->use_digital = false; |
1054 | } |
1060 | } |
1055 | if (ret != connector_status_disconnected) |
1061 | if (ret != connector_status_disconnected) |
1056 | radeon_connector->detected_by_load = true; |
1062 | radeon_connector->detected_by_load = true; |
- | 1063 | } |
|
- | 1064 | } else { |
|
- | 1065 | enum drm_connector_status lret; |
|
- | 1066 | /* assume digital unless load detected otherwise */ |
|
- | 1067 | radeon_connector->use_digital = true; |
|
- | 1068 | lret = encoder_funcs->detect(encoder, connector); |
|
- | 1069 | DRM_DEBUG_KMS("load_detect %x returned: %x\n",encoder->encoder_type,lret); |
|
- | 1070 | if (lret == connector_status_connected) |
|
- | 1071 | radeon_connector->use_digital = false; |
|
1057 | } |
1072 | } |
1058 | break; |
1073 | break; |
1059 | } |
1074 | } |
1060 | } |
1075 | } |