diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sdvo.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 49 | 
1 files changed, 31 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 26975df4e593..812fe7b06f87 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c @@ -1340,6 +1340,7 @@ static void intel_sdvo_pre_enable(struct intel_encoder *intel_encoder,  	switch (crtc_state->pixel_multiplier) {  	default:  		WARN(1, "unknown pixel multiplier specified\n"); +		/* fall through */  	case 1: rate = SDVO_CLOCK_RATE_MULT_1X; break;  	case 2: rate = SDVO_CLOCK_RATE_MULT_2X; break;  	case 4: rate = SDVO_CLOCK_RATE_MULT_4X; break; @@ -1400,33 +1401,40 @@ static bool intel_sdvo_connector_get_hw_state(struct intel_connector *connector)  	intel_sdvo_get_active_outputs(intel_sdvo, &active_outputs); -	if (active_outputs & intel_sdvo_connector->output_flag) -		return true; +	return active_outputs & intel_sdvo_connector->output_flag; +} + +bool intel_sdvo_port_enabled(struct drm_i915_private *dev_priv, +			     i915_reg_t sdvo_reg, enum pipe *pipe) +{ +	u32 val; + +	val = I915_READ(sdvo_reg); + +	/* asserts want to know the pipe even if the port is disabled */ +	if (HAS_PCH_CPT(dev_priv)) +		*pipe = (val & SDVO_PIPE_SEL_MASK_CPT) >> SDVO_PIPE_SEL_SHIFT_CPT; +	else if (IS_CHERRYVIEW(dev_priv)) +		*pipe = (val & SDVO_PIPE_SEL_MASK_CHV) >> SDVO_PIPE_SEL_SHIFT_CHV;  	else -		return false; +		*pipe = (val & SDVO_PIPE_SEL_MASK) >> SDVO_PIPE_SEL_SHIFT; + +	return val & SDVO_ENABLE;  }  static bool intel_sdvo_get_hw_state(struct intel_encoder *encoder,  				    enum pipe *pipe)  { -	struct drm_device *dev = encoder->base.dev; -	struct drm_i915_private *dev_priv = to_i915(dev); +	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	struct intel_sdvo *intel_sdvo = to_sdvo(encoder);  	u16 active_outputs = 0; -	u32 tmp; +	bool ret; -	tmp = I915_READ(intel_sdvo->sdvo_reg);  	intel_sdvo_get_active_outputs(intel_sdvo, &active_outputs); -	if (!(tmp & SDVO_ENABLE) && (active_outputs == 0)) -		return false; +	ret = intel_sdvo_port_enabled(dev_priv, intel_sdvo->sdvo_reg, pipe); -	if (HAS_PCH_CPT(dev_priv)) -		*pipe = PORT_TO_PIPE_CPT(tmp); -	else -		*pipe = PORT_TO_PIPE(tmp); - -	return true; +	return ret || active_outputs;  }  static void intel_sdvo_get_config(struct intel_encoder *encoder, @@ -1553,8 +1561,8 @@ static void intel_disable_sdvo(struct intel_encoder *encoder,  		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);  		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false); -		temp &= ~SDVO_PIPE_B_SELECT; -		temp |= SDVO_ENABLE; +		temp &= ~SDVO_PIPE_SEL_MASK; +		temp |= SDVO_ENABLE | SDVO_PIPE_SEL(PIPE_A);  		intel_sdvo_write_sdvox(intel_sdvo, temp);  		temp &= ~SDVO_ENABLE; @@ -1903,7 +1911,7 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector)  	if (edid != NULL) {  		if (intel_sdvo_connector_matches_edid(to_intel_sdvo_connector(connector),  						      edid)) { -			drm_mode_connector_update_edid_property(connector, edid); +			drm_connector_update_edid_property(connector, edid);  			drm_add_edid_modes(connector, edid);  		} @@ -2306,14 +2314,19 @@ intel_sdvo_guess_ddc_bus(struct intel_sdvo *sdvo)  	switch (sdvo->controlled_output) {  	case SDVO_OUTPUT_LVDS1:  		mask |= SDVO_OUTPUT_LVDS1; +		/* fall through */  	case SDVO_OUTPUT_LVDS0:  		mask |= SDVO_OUTPUT_LVDS0; +		/* fall through */  	case SDVO_OUTPUT_TMDS1:  		mask |= SDVO_OUTPUT_TMDS1; +		/* fall through */  	case SDVO_OUTPUT_TMDS0:  		mask |= SDVO_OUTPUT_TMDS0; +		/* fall through */  	case SDVO_OUTPUT_RGB1:  		mask |= SDVO_OUTPUT_RGB1; +		/* fall through */  	case SDVO_OUTPUT_RGB0:  		mask |= SDVO_OUTPUT_RGB0;  		break;  |