summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimofei V. Bondarenko <tim@ipi.ac.ru>2006-12-20 19:20:07 +0100
committerJaroslav Kysela <perex@suse.cz>2007-01-09 09:06:18 +0100
commit8c670714223d58086695d007b76b3e3ead54e4f5 (patch)
treed2a1010beb44676e193db7718ac3fbd08d1b7b21
parent6afeb11de5b28e47adea1459c35e598bb98424d6 (diff)
[ALSA] _snd_cmipci_uswitch_put doesn't set zero flags
Playing with spdif output on cmipci i've noticed the SPDO5V option does not change appropriate bits the register. The _snd_cmipci_uswitch_put checks the change in flags in wrong way. If 'active' state of an option corresponds to a _zero_ bits in a hw register then function fails. The SPDO5V is the sample. In the most cases 'active' state of option is set through an non-zerio bits in a register. This case works fine. The fix attached. Unfortunately i was unable to change spdif output voltage anyway. Although the register changes right at least. From: Timofei V. Bondarenko <tim@ipi.ac.ru> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r--sound/pci/cmipci.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c
index 71c58df4af28..70face7e1048 100644
--- a/sound/pci/cmipci.c
+++ b/sound/pci/cmipci.c
@@ -2198,7 +2198,8 @@ static int _snd_cmipci_uswitch_put(struct snd_kcontrol *kcontrol,
val = inb(cm->iobase + args->reg);
else
val = snd_cmipci_read(cm, args->reg);
- change = (val & args->mask) != (ucontrol->value.integer.value[0] ? args->mask : 0);
+ change = (val & args->mask) != (ucontrol->value.integer.value[0] ?
+ args->mask_on : (args->mask & ~args->mask_on));
if (change) {
val &= ~args->mask;
if (ucontrol->value.integer.value[0])