diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2023-02-01 03:00:32 +0100 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2023-02-01 12:43:51 +0100 |
commit | efaab61588c4a85814ebf1fe983710bceb662d58 (patch) | |
tree | 9e2c91727ad08e67b53d9f8afd493320b1a5f1e0 /sound/soc/sh/rcar/adg.c | |
parent | ASoC: rsnd: moves clkout_name to top of the file (diff) | |
download | linux-efaab61588c4a85814ebf1fe983710bceb662d58.tar.xz linux-efaab61588c4a85814ebf1fe983710bceb662d58.zip |
ASoC: rsnd: use clkin/out_size
Current adg.c is assuming number of clkin/clkout are fixed, but it is
not correct on Gen4. This patch uses clkin/out_size to handling it.
This is prepare for R-Car Gen4 support.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://lore.kernel.org/r/87v8km5em7.wl-kuninori.morimoto.gx@renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/sh/rcar/adg.c')
-rw-r--r-- | sound/soc/sh/rcar/adg.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c index f937cd4fe09e..ff8e8318edb0 100644 --- a/sound/soc/sh/rcar/adg.c +++ b/sound/soc/sh/rcar/adg.c @@ -32,6 +32,8 @@ struct rsnd_adg { struct clk_onecell_data onecell; struct rsnd_mod mod; int clkin_rate[CLKINMAX]; + int clkin_size; + int clkout_size; u32 ckr; u32 rbga; u32 rbgb; @@ -42,24 +44,24 @@ struct rsnd_adg { #define for_each_rsnd_clkin(pos, adg, i) \ for (i = 0; \ - (i < CLKINMAX) && \ + (i < adg->clkin_size) && \ ((pos) = adg->clkin[i]); \ i++) #define for_each_rsnd_clkout(pos, adg, i) \ for (i = 0; \ - (i < CLKOUTMAX) && \ + (i < adg->clkout_size) && \ ((pos) = adg->clkout[i]); \ i++) #define rsnd_priv_to_adg(priv) ((struct rsnd_adg *)(priv)->adg) -static const char * const clkin_name[] = { +static const char * const clkin_name_gen2[] = { [CLKA] = "clk_a", [CLKB] = "clk_b", [CLKC] = "clk_c", [CLKI] = "clk_i", }; -static const char * const clkout_name[] = { +static const char * const clkout_name_gen2[] = { [CLKOUT] = "audio_clkout", [CLKOUT1] = "audio_clkout1", [CLKOUT2] = "audio_clkout2", @@ -424,9 +426,14 @@ static int rsnd_adg_get_clkin(struct rsnd_priv *priv) struct rsnd_adg *adg = priv->adg; struct device *dev = rsnd_priv_to_dev(priv); struct clk *clk; + const char * const *clkin_name; + int clkin_size; int i; - for (i = 0; i < CLKINMAX; i++) { + clkin_name = clkin_name_gen2; + clkin_size = ARRAY_SIZE(clkin_name_gen2); + + for (i = 0; i < clkin_size; i++) { clk = devm_clk_get(dev, clkin_name[i]); if (IS_ERR_OR_NULL(clk)) @@ -437,6 +444,8 @@ static int rsnd_adg_get_clkin(struct rsnd_priv *priv) adg->clkin[i] = clk; } + adg->clkin_size = clkin_size; + return 0; err: @@ -470,8 +479,10 @@ static int rsnd_adg_get_clkout(struct rsnd_priv *priv) u32 req_rate[REQ_SIZE] = {}; uint32_t count = 0; unsigned long req_48kHz_rate, req_441kHz_rate; + int clkout_size; int i, req_size; const char *parent_clk_name = NULL; + const char * const *clkout_name; int brg_table[] = { [CLKA] = 0x0, [CLKB] = 0x1, @@ -555,6 +566,9 @@ static int rsnd_adg_get_clkout(struct rsnd_priv *priv) } } + clkout_name = clkout_name_gen2; + clkout_size = ARRAY_SIZE(clkout_name_gen2); + /* * ADG supports BRRA/BRRB output only. * this means all clkout0/1/2/3 will be * same rate @@ -571,13 +585,14 @@ static int rsnd_adg_get_clkout(struct rsnd_priv *priv) goto err; adg->clkout[CLKOUT] = clk; + adg->clkout_size = 1; of_clk_add_provider(np, of_clk_src_simple_get, clk); } /* * for clkout0/1/2/3 */ else { - for (i = 0; i < CLKOUTMAX; i++) { + for (i = 0; i < clkout_size; i++) { clk = clk_register_fixed_rate(dev, clkout_name[i], parent_clk_name, 0, req_rate[0]); @@ -587,7 +602,8 @@ static int rsnd_adg_get_clkout(struct rsnd_priv *priv) adg->clkout[i] = clk; } adg->onecell.clks = adg->clkout; - adg->onecell.clk_num = CLKOUTMAX; + adg->onecell.clk_num = clkout_size; + adg->clkout_size = clkout_size; of_clk_add_provider(np, of_clk_src_onecell_get, &adg->onecell); } |