[PATCH] ASoC: WM9712 Codec: Workaround an unmute problem
John Bonesio
bones at secretlab.ca
Sat Aug 1 01:01:33 CEST 2009
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 at 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)
{
--
1.6.0.4
--=-3OuCfmlE7wntN9J+RSz+--
More information about the Alsa-devel
mailing list