| From e4fb7b5800c227f74efa2d7ab040857e56898758 Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Wed, 19 Oct 2016 03:56:46 +0000 |
| Subject: [PATCH 062/299] ASoC: rsnd: add rsnd_mod_next() for |
| for_each_rsnd_mod_xxx() |
| |
| 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> |
| (cherry picked from commit b3ca3fbeb229890e8de569d1b34cd46fcb95826c) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| sound/soc/sh/rcar/core.c | 23 +++++++++++++++++++++++ |
| sound/soc/sh/rcar/rsnd.h | 12 ++++++++++++ |
| 2 files changed, 35 insertions(+) |
| |
| --- a/sound/soc/sh/rcar/core.c |
| +++ b/sound/soc/sh/rcar/core.c |
| @@ -348,6 +348,29 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod |
| /* |
| * 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); \ |
| --- a/sound/soc/sh/rcar/rsnd.h |
| +++ b/sound/soc/sh/rcar/rsnd.h |
| @@ -346,6 +346,18 @@ void rsnd_mod_interrupt(struct rsnd_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), |