ALSA: hda - Really restrict i915 notifier to HSW+
authorTakashi Iwai <tiwai@suse.de>
Fri, 18 Mar 2016 14:10:08 +0000 (15:10 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 18 Mar 2016 14:19:35 +0000 (15:19 +0100)
The commit [b62232d429fa: ALSA: hda - Limit i915 HDMI binding only for
HSW and later] tried to limit the usage of i915 audio notifier to the
recent Intel models and switch to the old method on pre-Haswell
models.  However, it assumed that the i915 component binding hasn't
been done on such models, and the assumption was wrong: namely,
Baytrail had already the i915 component binding due to powerwell
control.  Thus, the workaround wasn't applied to Baytrail.

For fixing this properly, this patch introduces a new flag indicating
the usage of audio notifier and codec_has_acomp() refers to this flag
instead of checking the existence of audio component.

Reported-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: <stable@vger.kernel.org> # v4.5
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_hdmi.c

index 49ee4e5..8cdb804 100644 (file)
@@ -152,6 +152,7 @@ struct hdmi_spec {
        struct hda_pcm_stream pcm_playback;
 
        /* i915/powerwell (Haswell+/Valleyview+) specific */
+       bool use_acomp_notifier; /* use i915 eld_notify callback for hotplug */
        struct i915_audio_component_audio_ops i915_audio_ops;
        bool i915_bound; /* was i915 bound in this driver? */
 
@@ -159,8 +160,11 @@ struct hdmi_spec {
 };
 
 #ifdef CONFIG_SND_HDA_I915
-#define codec_has_acomp(codec) \
-       ((codec)->bus->core.audio_component != NULL)
+static inline bool codec_has_acomp(struct hda_codec *codec)
+{
+       struct hdmi_spec *spec = codec->spec;
+       return spec->use_acomp_notifier;
+}
 #else
 #define codec_has_acomp(codec) false
 #endif
@@ -2248,12 +2252,18 @@ static int patch_generic_hdmi(struct hda_codec *codec)
        codec->spec = spec;
        hdmi_array_init(spec, 4);
 
+#ifdef CONFIG_SND_HDA_I915
        /* Try to bind with i915 for Intel HSW+ codecs (if not done yet) */
-       if (!codec_has_acomp(codec) &&
-           (codec->core.vendor_id >> 16) == 0x8086 &&
-           is_haswell_plus(codec))
-               if (!snd_hdac_i915_init(&codec->bus->core))
-                       spec->i915_bound = true;
+       if ((codec->core.vendor_id >> 16) == 0x8086 &&
+           is_haswell_plus(codec)) {
+               if (!codec->bus->core.audio_component)
+                       if (!snd_hdac_i915_init(&codec->bus->core))
+                               spec->i915_bound = true;
+               /* use i915 audio component notifier for hotplug */
+               if (codec->bus->core.audio_component)
+                       spec->use_acomp_notifier = true;
+       }
+#endif
 
        if (is_haswell_plus(codec)) {
                intel_haswell_enable_all_pins(codec, true);