]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ALSA: hda/hdmi - Fix i915 reverse port/pin mapping
authorTakashi Iwai <tiwai@suse.de>
Mon, 15 Jul 2019 21:14:53 +0000 (23:14 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2019 07:12:59 +0000 (09:12 +0200)
commit 3140aafb22edeab0cc41f15f53b12a118c0ac215 upstream.

The recent fix for Icelake HDMI codec introduced the mapping from pin
NID to the i915 gfx port number.  However, it forgot the reverse
mapping from the port number to the pin NID that is used in the ELD
notifier callback.  As a result, it's processed to a wrong widget and
gives a warning like
  snd_hda_codec_hdmi hdaudioC0D2: HDMI: pin nid 5 not registered

This patch corrects it with a proper reverse mapping function.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=204133
Fixes: b0d8bc50b9f2 ("ALSA: hda: hdmi - add Icelake support")
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
sound/pci/hda/patch_hdmi.c

index 584ebb8b88541aa2a951635c542807ee818eaf6a..b2f17da292a4b10286600b7aa984c72106aa7e23 100644 (file)
@@ -2538,18 +2538,32 @@ static int intel_pin2port(void *audio_ptr, int pin_nid)
        return -1;
 }
 
+static int intel_port2pin(struct hda_codec *codec, int port)
+{
+       struct hdmi_spec *spec = codec->spec;
+
+       if (!spec->port_num) {
+               /* we assume only from port-B to port-D */
+               if (port < 1 || port > 3)
+                       return 0;
+               /* intel port is 1-based */
+               return port + intel_base_nid(codec) - 1;
+       }
+
+       if (port < 1 || port > spec->port_num)
+               return 0;
+       return spec->port_map[port - 1];
+}
+
 static void intel_pin_eld_notify(void *audio_ptr, int port, int pipe)
 {
        struct hda_codec *codec = audio_ptr;
        int pin_nid;
        int dev_id = pipe;
 
-       /* we assume only from port-B to port-D */
-       if (port < 1 || port > 3)
+       pin_nid = intel_port2pin(codec, port);
+       if (!pin_nid)
                return;
-
-       pin_nid = port + intel_base_nid(codec) - 1; /* intel port is 1-based */
-
        /* skip notification during system suspend (but not in runtime PM);
         * the state will be updated at resume
         */