aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2015-01-15 03:09:13 -0500
committerMark Brown <broonie@kernel.org>2015-01-15 06:37:48 -0500
commit765ae7c8dda7d06d7ce74b35beb4c7ec06b78643 (patch)
tree5d3091fbd45a9f28480457c15e0d363ff26057a1
parent337b0b4c5f415705f1b97df57cecfac45903449a (diff)
ASoC: rsnd: ignore DIRQ when DMA transfer
SSI interrupt handler of R-Car sound driver will be called when DIRQ (= Data read/write timing for PIO) or UIRQ / OIRQ (= under/over run error). DIRQ "interrupt" doesn't occur when DMA transfer, but then, DIRQ "status bit" might occur. we need to ignore this DIRQ operation when DMA. Otherwise, driver will push/pop as PIO. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/sh/rcar/ssi.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index d26634bde908..4b646124ab8a 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -384,13 +384,14 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
384 struct rsnd_mod *mod = &ssi->mod; 384 struct rsnd_mod *mod = &ssi->mod;
385 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 385 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
386 struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); 386 struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
387 int is_dma = rsnd_ssi_is_dma_mode(mod);
387 u32 status = rsnd_mod_read(mod, SSISR); 388 u32 status = rsnd_mod_read(mod, SSISR);
388 389
389 if (!io) 390 if (!io)
390 return IRQ_NONE; 391 return IRQ_NONE;
391 392
392 /* PIO only */ 393 /* PIO only */
393 if (status & DIRQ) { 394 if (!is_dma && (status & DIRQ)) {
394 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); 395 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
395 u32 *buf = (u32 *)(runtime->dma_area + 396 u32 *buf = (u32 *)(runtime->dma_area +
396 rsnd_dai_pointer_offset(io, 0)); 397 rsnd_dai_pointer_offset(io, 0));