ASoC: rsnd: add common interrupt handler for SSI/SRC/DMA
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 15 Jun 2015 06:25:48 +0000 (06:25 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 16 Jun 2015 11:34:03 +0000 (12:34 +0100)
Each Renesas sound mod (= SSI/SRC/DVC) might be called from many paths
if it supports MIXer. In such case, mod <-> io is no longer 1:1
relationship. Then, interrupt handler can't use rsnd_mod_to_io().
This patch adds SSI/SRC/DMA common interrupt handler frame

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tested-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/rsnd.h

index 54297d74ea1ff6df14249299f394c02792fc8f91..424d1a31c471e2a5bfdc45f652b2fdd265f43462 100644 (file)
@@ -172,6 +172,29 @@ void rsnd_mod_quit(struct rsnd_mod *mod)
                clk_unprepare(mod->clk);
 }
 
+void rsnd_mod_interrupt(struct rsnd_mod *mod,
+                       void (*callback)(struct rsnd_mod *mod,
+                                        struct rsnd_dai_stream *io))
+{
+       struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+       struct rsnd_dai_stream *io;
+       struct rsnd_dai *rdai;
+       int i, j;
+
+       for_each_rsnd_dai(rdai, priv, j) {
+
+               for (i = 0; i < RSND_MOD_MAX; i++) {
+                       io = &rdai->playback;
+                       if (mod == io->mod[i])
+                               callback(mod, io);
+
+                       io = &rdai->capture;
+                       if (mod == io->mod[i])
+                               callback(mod, io);
+               }
+       }
+}
+
 int rsnd_mod_is_working(struct rsnd_mod *mod)
 {
        struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
index fd93a6a257492f3e4f80396e53898d9eda17ac08..e6aad5e05fad303d58c747aec4637e25b6468388 100644 (file)
@@ -327,6 +327,9 @@ void rsnd_mod_quit(struct rsnd_mod *mod);
 char *rsnd_mod_name(struct rsnd_mod *mod);
 int rsnd_mod_is_working(struct rsnd_mod *mod);
 struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod);
+void rsnd_mod_interrupt(struct rsnd_mod *mod,
+                       void (*callback)(struct rsnd_mod *mod,
+                                        struct rsnd_dai_stream *io));
 
 /*
  *     R-Car sound DAI