[ALSA] Don't set gpio mask register in snd_ice1712_gpio_write_bits()
authorKarsten Wiese <fzu@wemgehoertderstaat.de>
Tue, 22 Apr 2008 10:52:45 +0000 (12:52 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 24 Apr 2008 10:00:39 +0000 (12:00 +0200)
Some calls to snd_ice1712_gpio_write() go wrong, if
snd_ice1712_gpio_write_bits() ran before and changed the gpio mask register.
Read the actual gpio value and combine it with the to be set bits in the cpu
instead.

Signed-off-by: Karsten Wiese <fzu@wemgehoertderstaat.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/ice1712/ice1712.h

index a3bea2247c7f7d0adaebbe7972833c7fd00c3ed4..3208901c740e075166f95bc1b8d51406ab88ba56 100644 (file)
@@ -438,10 +438,14 @@ int snd_ice1712_gpio_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu
 static inline void snd_ice1712_gpio_write_bits(struct snd_ice1712 *ice,
                                               unsigned int mask, unsigned int bits)
 {
+       unsigned val;
+
        ice->gpio.direction |= mask;
        snd_ice1712_gpio_set_dir(ice, ice->gpio.direction);
-       snd_ice1712_gpio_set_mask(ice, ~mask);
-       snd_ice1712_gpio_write(ice, mask & bits);
+       val = snd_ice1712_gpio_read(ice);
+       val &= ~mask;
+       val |= mask & bits;
+       snd_ice1712_gpio_write(ice, val);
 }
 
 static inline int snd_ice1712_gpio_read_bits(struct snd_ice1712 *ice,