diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_hdmi.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 59 | 
1 files changed, 27 insertions, 32 deletions
| diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 07e803a604bd..f125a62eba8c 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c @@ -30,7 +30,6 @@  #include <linux/slab.h>  #include <linux/delay.h>  #include <linux/hdmi.h> -#include <drm/drmP.h>  #include <drm/drm_atomic_helper.h>  #include <drm/drm_crtc.h>  #include <drm/drm_edid.h> @@ -479,18 +478,14 @@ static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder,  					 const struct intel_crtc_state *crtc_state,  					 const struct drm_connector_state *conn_state)  { -	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);  	const struct drm_display_mode *adjusted_mode =  		&crtc_state->base.adjusted_mode; -	struct drm_connector *connector = &intel_hdmi->attached_connector->base; -	bool is_hdmi2_sink = connector->display_info.hdmi.scdc.supported || -	   connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420;  	union hdmi_infoframe frame;  	int ret;  	ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, -						       adjusted_mode, -						       is_hdmi2_sink); +						       conn_state->connector, +						       adjusted_mode);  	if (ret < 0) {  		DRM_ERROR("couldn't fill AVI infoframe\n");  		return; @@ -503,12 +498,12 @@ static void intel_hdmi_set_avi_infoframe(struct intel_encoder *encoder,  	else  		frame.avi.colorspace = HDMI_COLORSPACE_RGB; -	drm_hdmi_avi_infoframe_quant_range(&frame.avi, adjusted_mode, +	drm_hdmi_avi_infoframe_quant_range(&frame.avi, +					   conn_state->connector, +					   adjusted_mode,  					   crtc_state->limited_color_range ?  					   HDMI_QUANTIZATION_RANGE_LIMITED : -					   HDMI_QUANTIZATION_RANGE_FULL, -					   intel_hdmi->rgb_quant_range_selectable, -					   is_hdmi2_sink); +					   HDMI_QUANTIZATION_RANGE_FULL);  	drm_hdmi_avi_infoframe_content_type(&frame.avi,  					    conn_state); @@ -1191,15 +1186,17 @@ static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base); +	intel_wakeref_t wakeref;  	bool ret; -	if (!intel_display_power_get_if_enabled(dev_priv, -						encoder->power_domain)) +	wakeref = intel_display_power_get_if_enabled(dev_priv, +						     encoder->power_domain); +	if (!wakeref)  		return false;  	ret = intel_sdvo_port_enabled(dev_priv, intel_hdmi->hdmi_reg, pipe); -	intel_display_power_put(dev_priv, encoder->power_domain); +	intel_display_power_put(dev_priv, encoder->power_domain, wakeref);  	return ret;  } @@ -1591,7 +1588,7 @@ intel_hdmi_mode_valid(struct drm_connector *connector,  	if (hdmi->has_hdmi_sink && !force_dvi) {  		/* if we can't do 8bpc we may still be able to do 12bpc */ -		if (status != MODE_OK && !HAS_GMCH_DISPLAY(dev_priv)) +		if (status != MODE_OK && !HAS_GMCH(dev_priv))  			status = hdmi_port_clock_valid(hdmi, clock * 3 / 2,  						       true, force_dvi); @@ -1616,7 +1613,7 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,  		&crtc_state->base.adjusted_mode;  	int i; -	if (HAS_GMCH_DISPLAY(dev_priv)) +	if (HAS_GMCH(dev_priv))  		return false;  	if (bpc == 10 && INTEL_GEN(dev_priv) < 11) @@ -1707,9 +1704,9 @@ intel_hdmi_ycbcr420_config(struct drm_connector *connector,  	return true;  } -bool intel_hdmi_compute_config(struct intel_encoder *encoder, -			       struct intel_crtc_state *pipe_config, -			       struct drm_connector_state *conn_state) +int intel_hdmi_compute_config(struct intel_encoder *encoder, +			      struct intel_crtc_state *pipe_config, +			      struct drm_connector_state *conn_state)  {  	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); @@ -1725,7 +1722,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,  	bool force_dvi = intel_conn_state->force_audio == HDMI_AUDIO_OFF_DVI;  	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) -		return false; +		return -EINVAL;  	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;  	pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink; @@ -1756,7 +1753,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,  						&clock_12bpc, &clock_10bpc,  						&clock_8bpc)) {  			DRM_ERROR("Can't support YCBCR420 output\n"); -			return false; +			return -EINVAL;  		}  	} @@ -1806,7 +1803,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,  	if (hdmi_port_clock_valid(intel_hdmi, pipe_config->port_clock,  				  false, force_dvi) != MODE_OK) {  		DRM_DEBUG_KMS("unsupported HDMI clock, rejecting mode\n"); -		return false; +		return -EINVAL;  	}  	/* Set user selected PAR to incoming mode's member */ @@ -1825,7 +1822,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,  		}  	} -	return true; +	return 0;  }  static void @@ -1835,7 +1832,6 @@ intel_hdmi_unset_edid(struct drm_connector *connector)  	intel_hdmi->has_hdmi_sink = false;  	intel_hdmi->has_audio = false; -	intel_hdmi->rgb_quant_range_selectable = false;  	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;  	intel_hdmi->dp_dual_mode.max_tmds_clock = 0; @@ -1896,11 +1892,12 @@ intel_hdmi_set_edid(struct drm_connector *connector)  {  	struct drm_i915_private *dev_priv = to_i915(connector->dev);  	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector); +	intel_wakeref_t wakeref;  	struct edid *edid;  	bool connected = false;  	struct i2c_adapter *i2c; -	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); +	wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);  	i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus); @@ -1915,13 +1912,10 @@ intel_hdmi_set_edid(struct drm_connector *connector)  	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL); -	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); +	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);  	to_intel_connector(connector)->detect_edid = edid;  	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) { -		intel_hdmi->rgb_quant_range_selectable = -			drm_rgb_quant_range_selectable(edid); -  		intel_hdmi->has_audio = drm_detect_monitor_audio(edid);  		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid); @@ -1940,11 +1934,12 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)  	struct drm_i915_private *dev_priv = to_i915(connector->dev);  	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);  	struct intel_encoder *encoder = &hdmi_to_dig_port(intel_hdmi)->base; +	intel_wakeref_t wakeref;  	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",  		      connector->base.id, connector->name); -	intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); +	wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);  	if (IS_ICELAKE(dev_priv) &&  	    !intel_digital_port_connected(encoder)) @@ -1956,7 +1951,7 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)  		status = connector_status_connected;  out: -	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS); +	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);  	if (status != connector_status_connected)  		cec_notifier_phys_addr_invalidate(intel_hdmi->cec_notifier); @@ -2155,7 +2150,7 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c  	drm_connector_attach_content_type_property(connector);  	connector->state->picture_aspect_ratio = HDMI_PICTURE_ASPECT_NONE; -	if (!HAS_GMCH_DISPLAY(dev_priv)) +	if (!HAS_GMCH(dev_priv))  		drm_connector_attach_max_bpc_property(connector, 8, 12);  } | 
