diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_sdvo.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_sdvo.c | 47 | 
1 files changed, 34 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_sdvo.c b/drivers/gpu/drm/i915/display/intel_sdvo.c index 329b9d9af667..e12ba458636c 100644 --- a/drivers/gpu/drm/i915/display/intel_sdvo.c +++ b/drivers/gpu/drm/i915/display/intel_sdvo.c @@ -39,6 +39,7 @@  #include "i915_drv.h"  #include "i915_reg.h"  #include "intel_atomic.h" +#include "intel_audio.h"  #include "intel_connector.h"  #include "intel_crtc.h"  #include "intel_de.h" @@ -1068,7 +1069,8 @@ static ssize_t intel_sdvo_read_infoframe(struct intel_sdvo *intel_sdvo,  				  &tx_rate, 1))  		return -ENXIO; -	if (tx_rate == SDVO_HBUF_TX_DISABLED) +	/* TX_DISABLED doesn't mean disabled for ELD */ +	if (if_index != SDVO_HBUF_INDEX_ELD && tx_rate == SDVO_HBUF_TX_DISABLED)  		return 0;  	if (!intel_sdvo_get_hbuf_size(intel_sdvo, &hbuf_size)) @@ -1185,6 +1187,28 @@ static void intel_sdvo_get_avi_infoframe(struct intel_sdvo *intel_sdvo,  			      frame->any.type, HDMI_INFOFRAME_TYPE_AVI);  } +static void intel_sdvo_get_eld(struct intel_sdvo *intel_sdvo, +			       struct intel_crtc_state *crtc_state) +{ +	struct drm_i915_private *i915 = to_i915(intel_sdvo->base.base.dev); +	ssize_t len; +	u8 val; + +	if (!crtc_state->has_audio) +		return; + +	if (!intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_AUDIO_STAT, &val, 1)) +		return; + +	if ((val & SDVO_AUDIO_ELD_VALID) == 0) +		return; + +	len = intel_sdvo_read_infoframe(intel_sdvo, SDVO_HBUF_INDEX_ELD, +					crtc_state->eld, sizeof(crtc_state->eld)); +	if (len < 0) +		drm_dbg_kms(&i915->drm, "failed to read ELD\n"); +} +  static bool intel_sdvo_set_tv_format(struct intel_sdvo *intel_sdvo,  				     const struct drm_connector_state *conn_state)  { @@ -1378,7 +1402,9 @@ static int intel_sdvo_compute_config(struct intel_encoder *encoder,  	pipe_config->has_hdmi_sink = intel_has_hdmi_sink(intel_sdvo, conn_state); -	pipe_config->has_audio = intel_sdvo_has_audio(encoder, pipe_config, conn_state); +	pipe_config->has_audio = +		intel_sdvo_has_audio(encoder, pipe_config, conn_state) && +		intel_audio_compute_config(encoder, pipe_config, conn_state);  	pipe_config->limited_color_range =  		intel_sdvo_limited_color_range(encoder, pipe_config, @@ -1729,9 +1755,7 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,  	if (intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_AUDIO_STAT,  				 &val, 1)) { -		u8 mask = SDVO_AUDIO_ELD_VALID | SDVO_AUDIO_PRESENCE_DETECT; - -		if ((val & mask) == mask) +		if (val & SDVO_AUDIO_PRESENCE_DETECT)  			pipe_config->has_audio = true;  	} @@ -1742,6 +1766,8 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,  	}  	intel_sdvo_get_avi_infoframe(intel_sdvo, pipe_config); + +	intel_sdvo_get_eld(intel_sdvo, pipe_config);  }  static void intel_sdvo_disable_audio(struct intel_sdvo *intel_sdvo) @@ -1753,12 +1779,7 @@ static void intel_sdvo_enable_audio(struct intel_sdvo *intel_sdvo,  				    const struct intel_crtc_state *crtc_state,  				    const struct drm_connector_state *conn_state)  { -	const struct drm_display_mode *adjusted_mode = -		&crtc_state->hw.adjusted_mode; -	struct drm_connector *connector = conn_state->connector; -	u8 *eld = connector->eld; - -	eld[6] = drm_av_sync_delay(connector, adjusted_mode) / 2; +	const u8 *eld = crtc_state->eld;  	intel_sdvo_set_audio_state(intel_sdvo, 0); @@ -2886,7 +2907,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, u16 type)  	if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))  		goto err; -	intel_bios_init_panel(i915, &intel_connector->panel, NULL, NULL); +	intel_bios_init_panel_late(i915, &intel_connector->panel, NULL, NULL);  	/*  	 * Fetch modes from VBT. For SDVO prefer the VBT mode since some @@ -2903,7 +2924,7 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, u16 type)  		mutex_unlock(&i915->drm.mode_config.mutex);  	} -	intel_panel_init(intel_connector); +	intel_panel_init(intel_connector, NULL);  	if (!intel_panel_preferred_fixed_mode(intel_connector))  		goto err;  |