From: chrisw@osdl.org Date: Tue, 15 Mar 2005 23:08:48 +0000 (-0800) Subject: [PATCH] add alsa-surround-stereo.patch (left the comment addition in the patch X-Git-Tag: v2.6.11.9~46 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=88f50e5c6b9ab907254eee79025124e698cbeaa8;p=thirdparty%2Fkernel%2Fstable-queue.git [PATCH] add alsa-surround-stereo.patch (left the comment addition in the patch --- diff --git a/queue/alsa-surround-stereo.patch b/queue/alsa-surround-stereo.patch new file mode 100644 index 00000000000..bda50b29463 --- /dev/null +++ b/queue/alsa-surround-stereo.patch @@ -0,0 +1,82 @@ +Date: Mon, 14 Mar 2005 16:59:15 +0000 +From: Daniel Drake +To: stable@kernel.org +Subject: [PATCH][ALSA] Fix stereo mutes on Surround volume control + +As of 2.6.11, I have no output out of the rear right speaker of my 4.1 +surround sound setup. I am using snd-intel8x0 based on a Realtek ALC650F chip +on an nvidia motherboard. + +A gentoo user with completely different hardware also ran into this: +http://bugs.gentoo.org/84276 + +2.6.11-mm3 fixes this problem and I've identified the specific fix, which is +already in the ALSA development tree. An ALSA developer asked me to submit the +fix for 2.6.11.x when I'd found it, so here it is :) + +-- +AC97 Codec +Fix stereo mutes on Surround volume control. + +Signed-off-by: Takashi Iwai +Signed-off-by: Chris Wright + +diff -Naru a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c +--- a/sound/pci/ac97/ac97_codec.c 2005-03-14 08:24:04 -08:00 ++++ b/sound/pci/ac97/ac97_codec.c 2005-03-14 08:24:04 -08:00 +@@ -1184,7 +1184,7 @@ + /* + * create mute switch(es) for normal stereo controls + */ +-static int snd_ac97_cmute_new(snd_card_t *card, char *name, int reg, ac97_t *ac97) ++static int snd_ac97_cmute_new_stereo(snd_card_t *card, char *name, int reg, int check_stereo, ac97_t *ac97) + { + snd_kcontrol_t *kctl; + int err; +@@ -1195,7 +1195,7 @@ + + mute_mask = 0x8000; + val = snd_ac97_read(ac97, reg); +- if (ac97->flags & AC97_STEREO_MUTES) { ++ if (check_stereo || (ac97->flags & AC97_STEREO_MUTES)) { + /* check whether both mute bits work */ + val1 = val | 0x8080; + snd_ac97_write(ac97, reg, val1); +@@ -1253,7 +1253,7 @@ + /* + * create a mute-switch and a volume for normal stereo/mono controls + */ +-static int snd_ac97_cmix_new(snd_card_t *card, const char *pfx, int reg, ac97_t *ac97) ++static int snd_ac97_cmix_new_stereo(snd_card_t *card, const char *pfx, int reg, int check_stereo, ac97_t *ac97) + { + int err; + char name[44]; +@@ -1264,7 +1264,7 @@ + + if (snd_ac97_try_bit(ac97, reg, 15)) { + sprintf(name, "%s Switch", pfx); +- if ((err = snd_ac97_cmute_new(card, name, reg, ac97)) < 0) ++ if ((err = snd_ac97_cmute_new_stereo(card, name, reg, check_stereo, ac97)) < 0) + return err; + } + check_volume_resolution(ac97, reg, &lo_max, &hi_max); +@@ -1276,6 +1276,8 @@ + return 0; + } + ++#define snd_ac97_cmix_new(card, pfx, reg, ac97) snd_ac97_cmix_new_stereo(card, pfx, reg, 0, ac97) ++#define snd_ac97_cmute_new(card, name, reg, ac97) snd_ac97_cmute_new_stereo(card, name, reg, 0, ac97) + + static unsigned int snd_ac97_determine_spdif_rates(ac97_t *ac97); + +@@ -1326,7 +1328,8 @@ + + /* build surround controls */ + if (snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER)) { +- if ((err = snd_ac97_cmix_new(card, "Surround Playback", AC97_SURROUND_MASTER, ac97)) < 0) ++ /* Surround Master (0x38) is with stereo mutes */ ++ if ((err = snd_ac97_cmix_new_stereo(card, "Surround Playback", AC97_SURROUND_MASTER, 1, ac97)) < 0) + return err; + } + +