diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_legacy_encoders.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_encoders.c | 33 | 
1 files changed, 20 insertions, 13 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 5a13b3eeef1..bad77f40a9d 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c @@ -928,16 +928,14 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,  	if (ASIC_IS_R300(rdev)) {  		gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1;  		disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); -	} - -	if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev)) -		disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL); -	else +	} else if (rdev->family != CHIP_R200)  		disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); - -	if (rdev->family == CHIP_R200) +	else if (rdev->family == CHIP_R200)  		fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); +	if (rdev->family >= CHIP_R200) +		disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL); +  	if (is_tv) {  		uint32_t dac_cntl; @@ -1002,15 +1000,13 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,  	if (ASIC_IS_R300(rdev)) {  		WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1);  		WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); -	} +	} else if (rdev->family != CHIP_R200) +		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); +	else if (rdev->family == CHIP_R200) +		WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);  	if (rdev->family >= CHIP_R200)  		WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl); -	else -		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); - -	if (rdev->family == CHIP_R200) -		WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl);  	if (is_tv)  		radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode); @@ -1168,6 +1164,17 @@ static enum drm_connector_status radeon_legacy_tv_dac_detect(struct drm_encoder  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);  	struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;  	bool color = true; +	struct drm_crtc *crtc; + +	/* find out if crtc2 is in use or if this encoder is using it */ +	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { +		struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); +		if ((radeon_crtc->crtc_id == 1) && crtc->enabled) { +			if (encoder->crtc != crtc) { +				return connector_status_disconnected; +			} +		} +	}  	if (connector->connector_type == DRM_MODE_CONNECTOR_SVIDEO ||  	    connector->connector_type == DRM_MODE_CONNECTOR_Composite ||  |