diff --git a/packages/linux/patches/3.7.5/linux-990.02-hda-Fix-default-multichannel-HDMI-mapping-regre.patch b/packages/linux/patches/3.7.5/linux-990.02-hda-Fix-default-multichannel-HDMI-mapping-regre.patch new file mode 100644 index 0000000000..b62de2e517 --- /dev/null +++ b/packages/linux/patches/3.7.5/linux-990.02-hda-Fix-default-multichannel-HDMI-mapping-regre.patch @@ -0,0 +1,66 @@ +From b3ed803a1f4012a5067087674b8b1efad22d2bb0 Mon Sep 17 00:00:00 2001 +From: Anssi Hannula +Date: Sun, 3 Feb 2013 17:28:34 +0200 +Subject: [PATCH] ALSA: hda - Fix default multichannel HDMI mapping regression + +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 +Signed-off-by: Anssi Hannula +Cc: stable@vger.kernel.org +--- + +This also affects stable 3.7, but not earlier versions. + + sound/pci/hda/patch_hdmi.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c +index 807a2aa..e85959f 100644 +--- a/sound/pci/hda/patch_hdmi.c ++++ b/sound/pci/hda/patch_hdmi.c +@@ -714,9 +714,10 @@ static void hdmi_setup_fake_chmap(unsigned char *map, int ca) + + 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(struct hda_codec *codec, int pin_idx, + 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(struct hda_codec *codec, int pin_idx, + * 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; +-- +1.7.10 +