aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2022-10-26 20:01:48 +0300
committerVille Syrjälä <ville.syrjala@linux.intel.com>2022-10-27 20:19:35 +0300
commitcbbda2ffbb6533fba01b9c40b12c8532a115da46 (patch)
tree4a8d411cce3a673c2be7abaccce02c2959f0062e
parent7c8d74e8131217e928fb92904cac5362e348744f (diff)
drm/i915/audio: Split "ELD valid" vs. audio PD on hsw+
On the older platforms the audio presence detect bit is in the port register, so it gets written outside audio codec hooks and is this separate from the ELD valid toggling. Split the operations into two steps on hsw+ to be more consistent with both the other platforms and the spec. Also according to the spec we might need some vblank waits between the two which definitely needs them done separately. Cc: Chaitanya Kumar Borah <chaitanya.kumar.borah@intel.com> Cc: Kai Vehmanen <kai.vehmanen@linux.intel.com> Cc: Takashi Iwai <tiwai@suse.de> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20221026170150.2654-14-ville.syrjala@linux.intel.com
-rw-r--r--drivers/gpu/drm/i915/display/intel_audio.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_audio.c b/drivers/gpu/drm/i915/display/intel_audio.c
index 9ba1351f2c6d..cbc5615f43bf 100644
--- a/drivers/gpu/drm/i915/display/intel_audio.c
+++ b/drivers/gpu/drm/i915/display/intel_audio.c
@@ -481,9 +481,12 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder,
(intel_crtc_has_dp_encoder(old_crtc_state) ?
AUD_CONFIG_N_VALUE_INDEX : 0));
- /* Disable audio presence detect, invalidate ELD */
+ /* Invalidate ELD */
+ intel_de_rmw(i915, HSW_AUD_PIN_ELD_CP_VLD,
+ AUDIO_ELD_VALID(cpu_transcoder), 0);
+
+ /* Disable audio presence detect */
intel_de_rmw(i915, HSW_AUD_PIN_ELD_CP_VLD,
- AUDIO_ELD_VALID(cpu_transcoder) |
AUDIO_OUTPUT_ENABLE(cpu_transcoder), 0);
mutex_unlock(&i915->display.audio.mutex);
@@ -614,10 +617,13 @@ static void hsw_audio_codec_enable(struct intel_encoder *encoder,
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP))
enable_audio_dsc_wa(encoder, crtc_state);
- /* Enable audio presence detect, invalidate ELD */
+ /* Enable audio presence detect */
+ intel_de_rmw(i915, HSW_AUD_PIN_ELD_CP_VLD,
+ 0, AUDIO_OUTPUT_ENABLE(cpu_transcoder));
+
+ /* Invalidate ELD */
intel_de_rmw(i915, HSW_AUD_PIN_ELD_CP_VLD,
- AUDIO_ELD_VALID(cpu_transcoder),
- AUDIO_OUTPUT_ENABLE(cpu_transcoder));
+ AUDIO_ELD_VALID(cpu_transcoder), 0);
/*
* FIXME: We're supposed to wait for vblank here, but we have vblanks