Commit 775c199e authored by Karsten Wiese's avatar Karsten Wiese Committed by Takashi Iwai

[ALSA] Don't set gpio mask register in snd_ice1712_gpio_write_bits()

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: default avatarKarsten Wiese <fzu@wemgehoertderstaat.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 988f0664
...@@ -438,10 +438,14 @@ int snd_ice1712_gpio_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_valu ...@@ -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, static inline void snd_ice1712_gpio_write_bits(struct snd_ice1712 *ice,
unsigned int mask, unsigned int bits) unsigned int mask, unsigned int bits)
{ {
unsigned val;
ice->gpio.direction |= mask; ice->gpio.direction |= mask;
snd_ice1712_gpio_set_dir(ice, ice->gpio.direction); snd_ice1712_gpio_set_dir(ice, ice->gpio.direction);
snd_ice1712_gpio_set_mask(ice, ~mask); val = snd_ice1712_gpio_read(ice);
snd_ice1712_gpio_write(ice, mask & bits); val &= ~mask;
val |= mask & bits;
snd_ice1712_gpio_write(ice, val);
} }
static inline int snd_ice1712_gpio_read_bits(struct snd_ice1712 *ice, static inline int snd_ice1712_gpio_read_bits(struct snd_ice1712 *ice,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment