ASoC: rsnd: add rsnd_mod_next() for for_each_rsnd_mod_xxx()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 19 Oct 2016 03:56:46 +0000 (03:56 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 24 Oct 2016 17:23:29 +0000 (18:23 +0100)
Current rsnd driver is using too complex macro for for-loop of each mod.
In order to simplify this issue, this patch adds new rsnd_mod_next()
which is non-macro.

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

index 209e7363bfdd893bcfa227256f4f5dea4a8a299c..c0196f81e0829f4aac5ef5f9c3fa99d8c6961785 100644 (file)
@@ -348,6 +348,29 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
 /*
  *     rsnd_dai functions
  */
+struct rsnd_mod *rsnd_mod_next(int *iterator,
+                              struct rsnd_dai_stream *io,
+                              enum rsnd_mod_type *array,
+                              int array_size)
+{
+       struct rsnd_mod *mod;
+       enum rsnd_mod_type type;
+       int max = array ? array_size : RSND_MOD_MAX;
+
+       for (; *iterator < max; (*iterator)++) {
+               type = (array) ? array[*iterator] : *iterator;
+               mod = io->mod[type];
+               if (!mod)
+                       continue;
+
+               (*iterator)++;
+
+               return mod;
+       }
+
+       return NULL;
+}
+
 #define rsnd_mod_call(idx, io, func, param...)                 \
 ({                                                             \
        struct rsnd_priv *priv = rsnd_mod_to_priv(mod);         \
index 901095cb5139415abd0715590d3b9992d0536303..d8f81a4e09e32cedf3c288b10e5701242abf93ad 100644 (file)
@@ -346,6 +346,18 @@ void rsnd_mod_interrupt(struct rsnd_mod *mod,
 u32 *rsnd_mod_get_status(struct rsnd_dai_stream *io,
                         struct rsnd_mod *mod,
                         enum rsnd_mod_type type);
+struct rsnd_mod *rsnd_mod_next(int *iterator,
+                              struct rsnd_dai_stream *io,
+                              enum rsnd_mod_type *array,
+                              int array_size);
+#define for_each_rsnd_mod(iterator, pos, io)                           \
+       for (iterator = 0;                                              \
+            (pos = rsnd_mod_next(&iterator, io, NULL, 0));)
+#define for_each_rsnd_mod_arrays(iterator, pos, io, array, size)       \
+       for (iterator = 0;                                              \
+            (pos = rsnd_mod_next(&iterator, io, array, size));)
+#define for_each_rsnd_mod_array(iterator, pos, io, array)              \
+       for_each_rsnd_mod_arrays(iterator, pos, io, array, ARRAY_SIZE(array))
 
 void rsnd_parse_connect_common(struct rsnd_dai *rdai,
                struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),