summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorMargarita Olaya Cabrera <magi.olaya@ti.com>2010-06-10 07:17:39 -0500
committerJorge Eduardo Candelaria <jorge.candelaria@ti.com>2010-07-08 13:00:52 -0500
commit3b7bc663fb00777b19091d918b82e0bc9197992e (patch)
tree8fb5673b2ef61c73d5d7a633f0c1b8b0569684c9 /sound
parentff7fa7abd66efa54286f4bf6b7440f7cc297a0c1 (diff)
ASoC: ABE: Support for pause resume
Audio will stop dma transfers and mute the abe in the pause resume sequence. This implementation avoid pop at pause/resume. This is a temporal solution as the complete sequence of mute abe ports, stop atc and stop mcpdm transfer shall be implemented. Signed-off-by: Margarita Olaya Cabrera <magi.olaya@ti.com> Signed-off-by: Jorge Eduardo Candelaria <jorge.candelaria@ti.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/abe-twl6040.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/sound/soc/codecs/abe-twl6040.c b/sound/soc/codecs/abe-twl6040.c
index 92c02c096630..c5bf9c9b23dd 100644
--- a/sound/soc/codecs/abe-twl6040.c
+++ b/sound/soc/codecs/abe-twl6040.c
@@ -1292,6 +1292,9 @@ static int abe_mm_trigger(struct snd_pcm_substream *substream,
struct snd_soc_device *socdev = rtd->socdev;
struct snd_soc_codec *codec = socdev->card->codec;
struct twl6040_data *priv = codec->private_data;
+ unsigned int snd_reg_shadow;
+
+ snd_reg_shadow = twl6040_read_reg_cache(codec, TWL6040_REG_SHADOW);
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
@@ -1306,9 +1309,24 @@ static int abe_mm_trigger(struct snd_pcm_substream *substream,
return -EPERM;
}
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+ if (!substream->stream){
+ if ((snd_reg_shadow & 0x08) == 0x08)
+ abe_write_mixer(MIXDL1, GAIN_M6dB, RAMP_0MS, MIX_DL1_INPUT_MM_DL);
+
+ if ((snd_reg_shadow & 0x80) == 0x80)
+ abe_write_mixer(MIXDL2, GAIN_M6dB, RAMP_0MS, MIX_DL2_INPUT_MM_DL);
+ }
break;
+
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+ if (!substream->stream){
+ if ((snd_reg_shadow & 0x08) == 0x08)
+ abe_write_mixer(MIXDL1, MUTE_GAIN, RAMP_0MS, MIX_DL1_INPUT_MM_DL);
+
+ if ((snd_reg_shadow & 0x80) == 0x80)
+ abe_write_mixer(MIXDL2, MUTE_GAIN, RAMP_0MS, MIX_DL2_INPUT_MM_DL);
+ }
break;
default:
break;
@@ -1421,6 +1439,9 @@ static int abe_tones_trigger(struct snd_pcm_substream *substream,
struct snd_soc_device *socdev = rtd->socdev;
struct snd_soc_codec *codec = socdev->card->codec;
struct twl6040_data *priv = codec->private_data;
+ unsigned int snd_reg_shadow;
+
+ snd_reg_shadow = twl6040_read_reg_cache(codec, TWL6040_REG_SHADOW);
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
@@ -1434,8 +1455,25 @@ static int abe_tones_trigger(struct snd_pcm_substream *substream,
priv->sysclk);
return -EPERM;
}
+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+ if (!substream->stream){
+ if ((snd_reg_shadow & 0x01) == 0x01)
+ abe_write_mixer(MIXDL1, GAIN_M6dB, RAMP_0MS, MIX_DL1_INPUT_TONES);
+
+ if ((snd_reg_shadow & 0x10) == 0x10)
+ abe_write_mixer(MIXDL2, GAIN_M6dB, RAMP_0MS, MIX_DL2_INPUT_TONES);
+ }
break;
+
case SNDRV_PCM_TRIGGER_STOP:
+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+ if (!substream->stream){
+ if ((snd_reg_shadow & 0x01) == 0x01)
+ abe_write_mixer(MIXDL1, MUTE_GAIN, RAMP_0MS, MIX_DL1_INPUT_TONES);
+
+ if ((snd_reg_shadow & 0x10) == 0x10)
+ abe_write_mixer(MIXDL2, MUTE_GAIN, RAMP_0MS, MIX_DL2_INPUT_TONES);
+ }
break;
default:
break;
@@ -1626,6 +1664,9 @@ static int abe_voice_trigger(struct snd_pcm_substream *substream,
struct snd_soc_device *socdev = rtd->socdev;
struct snd_soc_codec *codec = socdev->card->codec;
struct twl6040_data *priv = codec->private_data;
+ unsigned int snd_reg_shadow;
+
+ snd_reg_shadow = twl6040_read_reg_cache(codec, TWL6040_REG_SHADOW);
switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
@@ -1639,8 +1680,25 @@ static int abe_voice_trigger(struct snd_pcm_substream *substream,
priv->sysclk);
return -EPERM;
}
+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+ if (!substream->stream){
+ if ((snd_reg_shadow & 0x02) == 0x02)
+ abe_write_mixer(MIXDL1, GAIN_M6dB, RAMP_0MS, MIX_DL1_INPUT_VX_DL);
+
+ if ((snd_reg_shadow & 0x20) == 0x20)
+ abe_write_mixer(MIXDL1, GAIN_M6dB, RAMP_0MS, MIX_DL2_INPUT_VX_DL);
+ }
break;
+
case SNDRV_PCM_TRIGGER_STOP:
+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+ if (!substream->stream){
+ if ((snd_reg_shadow & 0x02) == 0x02)
+ abe_write_mixer(MIXDL1, MUTE_GAIN, RAMP_0MS, MIX_DL1_INPUT_VX_DL);
+
+ if ((snd_reg_shadow & 0x20) == 0x20)
+ abe_write_mixer(MIXDL2, MUTE_GAIN, RAMP_0MS, MIX_DL2_INPUT_VX_DL);
+ }
break;
default:
break;