| From 20608731f479d48be6bcb88e727f360ddf98ddaf Mon Sep 17 00:00:00 2001 |
| From: Anssi Hannula <anssi.hannula@iki.fi> |
| Date: Sun, 3 Feb 2013 17:55:45 +0200 |
| Subject: ALSA: hda - Fix default multichannel HDMI mapping regression |
| |
| From: Anssi Hannula <anssi.hannula@iki.fi> |
| |
| commit 20608731f479d48be6bcb88e727f360ddf98ddaf upstream. |
| |
| Commit d45e6889ee69456a4d5b1bbb32252f460cd48fa9 ("ALSA: hda - Provide |
| the proper channel mapping for generic HDMI driver") added support for |
| custom channel maps in the HDA HDMI driver. Due to a mistake in an |
| 'if' condition the custom map is always used even when no such map has |
| been set. This causes incorrect channel mapping for multichannel audio |
| by default. |
| |
| Pass per_pin->chmap_set to hdmi_setup_channel_mapping() as a parameter |
| so that it can use it for detecting if a custom map has been set instead |
| of checking if map is NULL (which is never the case). |
| |
| Reported-by: Staffan Lindberg <pike@xbmc.org> |
| Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi> |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/pci/hda/patch_hdmi.c | 11 +++++++---- |
| 1 file changed, 7 insertions(+), 4 deletions(-) |
| |
| --- a/sound/pci/hda/patch_hdmi.c |
| +++ b/sound/pci/hda/patch_hdmi.c |
| @@ -714,9 +714,10 @@ static void hdmi_setup_fake_chmap(unsign |
| |
| static void hdmi_setup_channel_mapping(struct hda_codec *codec, |
| hda_nid_t pin_nid, bool non_pcm, int ca, |
| - int channels, unsigned char *map) |
| + int channels, unsigned char *map, |
| + bool chmap_set) |
| { |
| - if (!non_pcm && map) { |
| + if (!non_pcm && chmap_set) { |
| hdmi_manual_setup_channel_mapping(codec, pin_nid, |
| channels, map); |
| } else { |
| @@ -905,7 +906,8 @@ static void hdmi_setup_audio_infoframe(s |
| pin_nid, |
| channels); |
| hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca, |
| - channels, per_pin->chmap); |
| + channels, per_pin->chmap, |
| + per_pin->chmap_set); |
| hdmi_stop_infoframe_trans(codec, pin_nid); |
| hdmi_fill_audio_infoframe(codec, pin_nid, |
| ai.bytes, sizeof(ai)); |
| @@ -915,7 +917,8 @@ static void hdmi_setup_audio_infoframe(s |
| * accordingly */ |
| if (per_pin->non_pcm != non_pcm) |
| hdmi_setup_channel_mapping(codec, pin_nid, non_pcm, ca, |
| - channels, per_pin->chmap); |
| + channels, per_pin->chmap, |
| + per_pin->chmap_set); |
| } |
| |
| per_pin->non_pcm = non_pcm; |