aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-06-26 10:23:20 -0400
committerMark Brown <broonie@linaro.org>2014-06-28 08:18:46 -0400
commit920ec4e595faf89f7db022a068a4729a4d2c48ae (patch)
treef82ac9e0ac61eac897e602779cad88c90a41b0f9
parenta622251c01b628cbbd1b02a877a6469303ec2b58 (diff)
ASoC: kirkwood: implement NO_PERIOD_WAKEUP support
Permit ALSA to run without hardware interrupts from the audio interface. Instead, ALSA will use a kernel timer to decide when to check the buffer state, resulting in a lighter workload for the CPU. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Tested-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--sound/soc/kirkwood/kirkwood-dma.c11
-rw-r--r--sound/soc/kirkwood/kirkwood-i2s.c9
2 files changed, 12 insertions, 8 deletions
diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c
index aac22fccdcdc..4cf2245950d7 100644
--- a/sound/soc/kirkwood/kirkwood-dma.c
+++ b/sound/soc/kirkwood/kirkwood-dma.c
@@ -28,11 +28,12 @@ static struct kirkwood_dma_data *kirkwood_priv(struct snd_pcm_substream *subs)
28} 28}
29 29
30static struct snd_pcm_hardware kirkwood_dma_snd_hw = { 30static struct snd_pcm_hardware kirkwood_dma_snd_hw = {
31 .info = (SNDRV_PCM_INFO_INTERLEAVED | 31 .info = SNDRV_PCM_INFO_INTERLEAVED |
32 SNDRV_PCM_INFO_MMAP | 32 SNDRV_PCM_INFO_MMAP |
33 SNDRV_PCM_INFO_MMAP_VALID | 33 SNDRV_PCM_INFO_MMAP_VALID |
34 SNDRV_PCM_INFO_BLOCK_TRANSFER | 34 SNDRV_PCM_INFO_BLOCK_TRANSFER |
35 SNDRV_PCM_INFO_PAUSE), 35 SNDRV_PCM_INFO_PAUSE |
36 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
36 .buffer_bytes_max = KIRKWOOD_SND_MAX_BUFFER_BYTES, 37 .buffer_bytes_max = KIRKWOOD_SND_MAX_BUFFER_BYTES,
37 .period_bytes_min = KIRKWOOD_SND_MIN_PERIOD_BYTES, 38 .period_bytes_min = KIRKWOOD_SND_MIN_PERIOD_BYTES,
38 .period_bytes_max = KIRKWOOD_SND_MAX_PERIOD_BYTES, 39 .period_bytes_max = KIRKWOOD_SND_MAX_PERIOD_BYTES,
diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c
index e98650c01eba..0704cd6d2314 100644
--- a/sound/soc/kirkwood/kirkwood-i2s.c
+++ b/sound/soc/kirkwood/kirkwood-i2s.c
@@ -234,6 +234,7 @@ static unsigned kirkwood_i2s_play_mute(unsigned ctl)
234static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream, 234static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,
235 int cmd, struct snd_soc_dai *dai) 235 int cmd, struct snd_soc_dai *dai)
236{ 236{
237 struct snd_pcm_runtime *runtime = substream->runtime;
237 struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); 238 struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai);
238 uint32_t ctl, value; 239 uint32_t ctl, value;
239 240
@@ -271,9 +272,11 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream,
271 writel(value, priv->io + KIRKWOOD_PLAYCTL); 272 writel(value, priv->io + KIRKWOOD_PLAYCTL);
272 273
273 /* enable interrupts */ 274 /* enable interrupts */
274 value = readl(priv->io + KIRKWOOD_INT_MASK); 275 if (!runtime->no_period_wakeup) {
275 value |= KIRKWOOD_INT_CAUSE_PLAY_BYTES; 276 value = readl(priv->io + KIRKWOOD_INT_MASK);
276 writel(value, priv->io + KIRKWOOD_INT_MASK); 277 value |= KIRKWOOD_INT_CAUSE_PLAY_BYTES;
278 writel(value, priv->io + KIRKWOOD_INT_MASK);
279 }
277 280
278 /* enable playback */ 281 /* enable playback */
279 writel(ctl, priv->io + KIRKWOOD_PLAYCTL); 282 writel(ctl, priv->io + KIRKWOOD_PLAYCTL);