diff options
author | Margarita Olaya Cabrera <magi.olaya@ti.com> | 2010-06-10 07:17:39 -0500 |
---|---|---|
committer | Jorge Eduardo Candelaria <jorge.candelaria@ti.com> | 2010-07-08 13:00:52 -0500 |
commit | 3b7bc663fb00777b19091d918b82e0bc9197992e (patch) | |
tree | 8fb5673b2ef61c73d5d7a633f0c1b8b0569684c9 /sound | |
parent | ff7fa7abd66efa54286f4bf6b7440f7cc297a0c1 (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.c | 58 |
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; |