| From 3140aafb22edeab0cc41f15f53b12a118c0ac215 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Mon, 15 Jul 2019 23:14:53 +0200 |
| Subject: ALSA: hda/hdmi - Fix i915 reverse port/pin mapping |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| 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 | 24 +++++++++++++++++++----- |
| 1 file changed, 19 insertions(+), 5 deletions(-) |
| |
| --- a/sound/pci/hda/patch_hdmi.c |
| +++ b/sound/pci/hda/patch_hdmi.c |
| @@ -2525,18 +2525,32 @@ static int intel_pin2port(void *audio_pt |
| 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 |
| */ |