When setting the PCM mixer (unuting), the main Headphone mixer setting gets set back to mute. At this time it appears this is occuring in hardware.
Signed-off-by: John Bonesio bones@secretlab.ca --- sound/soc/codecs/wm9712.c | 21 +++++++++++++++++++-- 1 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index b57c817..6f8d164 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c @@ -28,6 +28,7 @@ static unsigned int ac97_read(struct snd_soc_codec *codec, unsigned int reg); static int ac97_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int val); +static int ac97_flush(struct snd_soc_codec *codec, unsigned int reg);
/* * WM9712 register cache @@ -177,9 +178,14 @@ static int mixer_event(struct snd_soc_dapm_widget *w, else ac97_write(w->codec, AC97_VIDEO, mic | 0x8000);
- if (l & 0x2 || r & 0x2) + if (l & 0x2 || r & 0x2) { ac97_write(w->codec, AC97_PCM, pcm & 0x7fff); - else + /* + * Workaround an apparent bug where the headphone mute setting + * is modified when the PCM mute setting is enabled. + */ + ac97_flush(w->codec, AC97_HEADPHONE); + } else ac97_write(w->codec, AC97_PCM, pcm | 0x8000);
if (l & 0x4 || r & 0x4) @@ -472,6 +478,17 @@ static int ac97_write(struct snd_soc_codec *codec, unsigned int reg, return 0; }
+static int ac97_flush(struct snd_soc_codec *codec, unsigned int reg) +{ + unsigned int val; + u16 *cache = codec->reg_cache; + + if ((reg >> 1) < (ARRAY_SIZE(wm9712_reg))) { + val = cache[reg >> 1]; + soc_ac97_ops.write(codec->ac97, reg, val); + } +} + static int ac97_prepare(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) {