diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_connectors.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 19 | 
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index ee0083f982d..4559a53d5e5 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c @@ -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) { @@ -315,7 +324,7 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr  		radeon_encoder = to_radeon_encoder(encoder);  		if (!radeon_encoder->enc_priv)  			return 0; -		if (rdev->is_atom_bios) { +		if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) {  			struct radeon_encoder_atom_dac *dac_int;  			dac_int = radeon_encoder->enc_priv;  			dac_int->tv_std = val; @@ -940,7 +949,7 @@ static void radeon_dp_connector_destroy(struct drm_connector *connector)  	if (radeon_connector->edid)  		kfree(radeon_connector->edid);  	if (radeon_dig_connector->dp_i2c_bus) -		radeon_i2c_destroy_dp(radeon_dig_connector->dp_i2c_bus); +		radeon_i2c_destroy(radeon_dig_connector->dp_i2c_bus);  	kfree(radeon_connector->con_priv);  	drm_sysfs_connector_remove(connector);  	drm_connector_cleanup(connector); @@ -1307,6 +1316,8 @@ radeon_add_legacy_connector(struct drm_device *dev,  			radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");  			if (!radeon_connector->ddc_bus)  				goto failed; +		} +		if (connector_type == DRM_MODE_CONNECTOR_DVII) {  			radeon_connector->dac_load_detect = true;  			drm_connector_attach_property(&radeon_connector->base,  						      rdev->mode_info.load_detect_property,  |