Skip to content

Commit

Permalink
ALSA: oxygen, virtuoso: fix exchanged L/R volumes of aux and CD inputs
Browse files Browse the repository at this point in the history
The driver accidentally exchanged the left/right fields for stereo AC'97
mixer registers.  This affected only the aux and CD inputs because the
line input bypasses the AC'97 codec and the mic input is mono; cards
without AC'97 (Xonar DS/DG/HDAV Slim, HG2PCI, HiFier) were not affected.

Reported-and-tested-by: Abby Cedar <abbycedar@yahoo.com.au>
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Cc: 2.6.31+ <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Clemens Ladisch authored and Takashi Iwai committed Feb 8, 2012
1 parent 927c942 commit 2492250
Showing 1 changed file with 14 additions and 11 deletions.
25 changes: 14 additions & 11 deletions sound/pci/oxygen/oxygen_mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -618,9 +618,12 @@ static int ac97_volume_get(struct snd_kcontrol *ctl,
mutex_lock(&chip->mutex);
reg = oxygen_read_ac97(chip, codec, index);
mutex_unlock(&chip->mutex);
value->value.integer.value[0] = 31 - (reg & 0x1f);
if (stereo)
value->value.integer.value[1] = 31 - ((reg >> 8) & 0x1f);
if (!stereo) {
value->value.integer.value[0] = 31 - (reg & 0x1f);
} else {
value->value.integer.value[0] = 31 - ((reg >> 8) & 0x1f);
value->value.integer.value[1] = 31 - (reg & 0x1f);
}
return 0;
}

Expand All @@ -636,14 +639,14 @@ static int ac97_volume_put(struct snd_kcontrol *ctl,

mutex_lock(&chip->mutex);
oldreg = oxygen_read_ac97(chip, codec, index);
newreg = oldreg;
newreg = (newreg & ~0x1f) |
(31 - (value->value.integer.value[0] & 0x1f));
if (stereo)
newreg = (newreg & ~0x1f00) |
((31 - (value->value.integer.value[1] & 0x1f)) << 8);
else
newreg = (newreg & ~0x1f00) | ((newreg & 0x1f) << 8);
if (!stereo) {
newreg = oldreg & ~0x1f;
newreg |= 31 - (value->value.integer.value[0] & 0x1f);
} else {
newreg = oldreg & ~0x1f1f;
newreg |= (31 - (value->value.integer.value[0] & 0x1f)) << 8;
newreg |= 31 - (value->value.integer.value[1] & 0x1f);
}
change = newreg != oldreg;
if (change)
oxygen_write_ac97(chip, codec, index, newreg);
Expand Down

0 comments on commit 2492250

Please sign in to comment.