|
@@ -162,12 +162,14 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
|
|
|
{
|
|
|
struct drm_device *dev = connector->dev;
|
|
|
struct drm_connector *conflict;
|
|
|
+ struct radeon_connector *radeon_conflict;
|
|
|
int i;
|
|
|
|
|
|
list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
|
|
|
if (conflict == connector)
|
|
|
continue;
|
|
|
|
|
|
+ radeon_conflict = to_radeon_connector(conflict);
|
|
|
for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
|
|
|
if (conflict->encoder_ids[i] == 0)
|
|
|
break;
|
|
@@ -177,6 +179,9 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
|
|
|
if (conflict->status != connector_status_connected)
|
|
|
continue;
|
|
|
|
|
|
+ if (radeon_conflict->use_digital)
|
|
|
+ continue;
|
|
|
+
|
|
|
if (priority == true) {
|
|
|
DRM_INFO("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict));
|
|
|
DRM_INFO("in favor of %s\n", drm_get_connector_name(connector));
|
|
@@ -287,6 +292,7 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr
|
|
|
|
|
|
if (property == rdev->mode_info.coherent_mode_property) {
|
|
|
struct radeon_encoder_atom_dig *dig;
|
|
|
+ bool new_coherent_mode;
|
|
|
|
|
|
/* need to find digital encoder on connector */
|
|
|
encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
|
|
@@ -299,8 +305,11 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr
|
|
|
return 0;
|
|
|
|
|
|
dig = radeon_encoder->enc_priv;
|
|
|
- dig->coherent_mode = val ? true : false;
|
|
|
- radeon_property_change_mode(&radeon_encoder->base);
|
|
|
+ new_coherent_mode = val ? true : false;
|
|
|
+ if (dig->coherent_mode != new_coherent_mode) {
|
|
|
+ dig->coherent_mode = new_coherent_mode;
|
|
|
+ radeon_property_change_mode(&radeon_encoder->base);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (property == rdev->mode_info.tv_std_property) {
|