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>
This commit is contained in:

committed by
Mark Brown

parent
0af5c01a79
commit
b3ca3fbeb2
@@ -348,6 +348,29 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
|
|||||||
/*
|
/*
|
||||||
* rsnd_dai functions
|
* 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...) \
|
#define rsnd_mod_call(idx, io, func, param...) \
|
||||||
({ \
|
({ \
|
||||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \
|
struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \
|
||||||
|
@@ -346,6 +346,18 @@ void rsnd_mod_interrupt(struct rsnd_mod *mod,
|
|||||||
u32 *rsnd_mod_get_status(struct rsnd_dai_stream *io,
|
u32 *rsnd_mod_get_status(struct rsnd_dai_stream *io,
|
||||||
struct rsnd_mod *mod,
|
struct rsnd_mod *mod,
|
||||||
enum rsnd_mod_type type);
|
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,
|
void rsnd_parse_connect_common(struct rsnd_dai *rdai,
|
||||||
struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
|
struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
|
||||||
|
Reference in New Issue
Block a user