aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
Diffstat (limited to 'sound')
-rw-r--r--sound/pci/hda/patch_hdmi.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index a97db5fc8a15..932292ce5ce7 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -37,6 +37,8 @@
37#include <sound/jack.h> 37#include <sound/jack.h>
38#include <sound/asoundef.h> 38#include <sound/asoundef.h>
39#include <sound/tlv.h> 39#include <sound/tlv.h>
40#include <sound/hdaudio.h>
41#include <sound/hda_i915.h>
40#include "hda_codec.h" 42#include "hda_codec.h"
41#include "hda_local.h" 43#include "hda_local.h"
42#include "hda_jack.h" 44#include "hda_jack.h"
@@ -144,6 +146,9 @@ struct hdmi_spec {
144 */ 146 */
145 struct hda_multi_out multiout; 147 struct hda_multi_out multiout;
146 struct hda_pcm_stream pcm_playback; 148 struct hda_pcm_stream pcm_playback;
149
150 /* i915/powerwell (Haswell+/Valleyview+) specific */
151 struct i915_audio_component_audio_ops i915_audio_ops;
147}; 152};
148 153
149 154
@@ -2191,6 +2196,9 @@ static void generic_hdmi_free(struct hda_codec *codec)
2191 struct hdmi_spec *spec = codec->spec; 2196 struct hdmi_spec *spec = codec->spec;
2192 int pin_idx; 2197 int pin_idx;
2193 2198
2199 if (is_haswell_plus(codec) || is_valleyview_plus(codec))
2200 snd_hdac_i915_register_notifier(NULL);
2201
2194 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { 2202 for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) {
2195 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); 2203 struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx);
2196 2204
@@ -2316,6 +2324,14 @@ static void haswell_set_power_state(struct hda_codec *codec, hda_nid_t fg,
2316 snd_hda_codec_set_power_to_all(codec, fg, power_state); 2324 snd_hda_codec_set_power_to_all(codec, fg, power_state);
2317} 2325}
2318 2326
2327static void intel_pin_eld_notify(void *audio_ptr, int port, int port_mst_index)
2328{
2329 struct hda_codec *codec = audio_ptr;
2330 int pin_nid = port + 0x04;
2331
2332 check_presence_and_report(codec, pin_nid);
2333}
2334
2319static int patch_generic_hdmi(struct hda_codec *codec) 2335static int patch_generic_hdmi(struct hda_codec *codec)
2320{ 2336{
2321 struct hdmi_spec *spec; 2337 struct hdmi_spec *spec;
@@ -2342,8 +2358,12 @@ static int patch_generic_hdmi(struct hda_codec *codec)
2342 if (is_valleyview_plus(codec) || is_skylake(codec)) 2358 if (is_valleyview_plus(codec) || is_skylake(codec))
2343 codec->core.link_power_control = 1; 2359 codec->core.link_power_control = 1;
2344 2360
2345 if (is_haswell_plus(codec) || is_valleyview_plus(codec)) 2361 if (is_haswell_plus(codec) || is_valleyview_plus(codec)) {
2346 codec->depop_delay = 0; 2362 codec->depop_delay = 0;
2363 spec->i915_audio_ops.audio_ptr = codec;
2364 spec->i915_audio_ops.pin_eld_notify = intel_pin_eld_notify;
2365 snd_hdac_i915_register_notifier(&spec->i915_audio_ops);
2366 }
2347 2367
2348 if (hdmi_parse_codec(codec) < 0) { 2368 if (hdmi_parse_codec(codec) < 0) {
2349 codec->spec = NULL; 2369 codec->spec = NULL;