Commit b76e218a authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown

ASoC: rsnd: add rsnd_mod_get() macro and use it

Renesas sound driver has SSI/SRC/DVC/CTU/MIX, and these are controlled
as modules. And these module are member of each modules's private data.
It used own method to get module pointer, but Let's use common method
Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent ac37a45b
...@@ -66,7 +66,7 @@ struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id) ...@@ -66,7 +66,7 @@ struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id)
if (WARN_ON(id < 0 || id >= rsnd_ctu_nr(priv))) if (WARN_ON(id < 0 || id >= rsnd_ctu_nr(priv)))
id = 0; id = 0;
return &((struct rsnd_ctu *)(priv->ctu) + id)->mod; return rsnd_mod_get((struct rsnd_ctu *)(priv->ctu) + id);
} }
static void rsnd_of_parse_ctu(struct platform_device *pdev, static void rsnd_of_parse_ctu(struct platform_device *pdev,
...@@ -150,7 +150,7 @@ int rsnd_ctu_probe(struct platform_device *pdev, ...@@ -150,7 +150,7 @@ int rsnd_ctu_probe(struct platform_device *pdev,
ctu->info = &info->ctu_info[i]; ctu->info = &info->ctu_info[i];
ret = rsnd_mod_init(priv, &ctu->mod, &rsnd_ctu_ops, ret = rsnd_mod_init(priv, rsnd_mod_get(ctu), &rsnd_ctu_ops,
clk, RSND_MOD_CTU, i); clk, RSND_MOD_CTU, i);
if (ret) if (ret)
return ret; return ret;
...@@ -166,6 +166,6 @@ void rsnd_ctu_remove(struct platform_device *pdev, ...@@ -166,6 +166,6 @@ void rsnd_ctu_remove(struct platform_device *pdev,
int i; int i;
for_each_rsnd_ctu(ctu, priv, i) { for_each_rsnd_ctu(ctu, priv, i) {
rsnd_mod_quit(&ctu->mod); rsnd_mod_quit(rsnd_mod_get(ctu));
} }
} }
...@@ -282,7 +282,7 @@ struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id) ...@@ -282,7 +282,7 @@ struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id)
if (WARN_ON(id < 0 || id >= rsnd_dvc_nr(priv))) if (WARN_ON(id < 0 || id >= rsnd_dvc_nr(priv)))
id = 0; id = 0;
return &((struct rsnd_dvc *)(priv->dvc) + id)->mod; return rsnd_mod_get((struct rsnd_dvc *)(priv->dvc) + id);
} }
static void rsnd_of_parse_dvc(struct platform_device *pdev, static void rsnd_of_parse_dvc(struct platform_device *pdev,
...@@ -361,7 +361,7 @@ int rsnd_dvc_probe(struct platform_device *pdev, ...@@ -361,7 +361,7 @@ int rsnd_dvc_probe(struct platform_device *pdev,
dvc->info = &info->dvc_info[i]; dvc->info = &info->dvc_info[i];
ret = rsnd_mod_init(priv, &dvc->mod, &rsnd_dvc_ops, ret = rsnd_mod_init(priv, rsnd_mod_get(dvc), &rsnd_dvc_ops,
clk, RSND_MOD_DVC, i); clk, RSND_MOD_DVC, i);
if (ret) if (ret)
return ret; return ret;
...@@ -377,6 +377,6 @@ void rsnd_dvc_remove(struct platform_device *pdev, ...@@ -377,6 +377,6 @@ void rsnd_dvc_remove(struct platform_device *pdev,
int i; int i;
for_each_rsnd_dvc(dvc, priv, i) { for_each_rsnd_dvc(dvc, priv, i) {
rsnd_mod_quit(&dvc->mod); rsnd_mod_quit(rsnd_mod_get(dvc));
} }
} }
...@@ -99,7 +99,7 @@ struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id) ...@@ -99,7 +99,7 @@ struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id)
if (WARN_ON(id < 0 || id >= rsnd_mix_nr(priv))) if (WARN_ON(id < 0 || id >= rsnd_mix_nr(priv)))
id = 0; id = 0;
return &((struct rsnd_mix *)(priv->mix) + id)->mod; return rsnd_mod_get((struct rsnd_mix *)(priv->mix) + id);
} }
static void rsnd_of_parse_mix(struct platform_device *pdev, static void rsnd_of_parse_mix(struct platform_device *pdev,
...@@ -179,7 +179,7 @@ int rsnd_mix_probe(struct platform_device *pdev, ...@@ -179,7 +179,7 @@ int rsnd_mix_probe(struct platform_device *pdev,
mix->info = &info->mix_info[i]; mix->info = &info->mix_info[i];
ret = rsnd_mod_init(priv, &mix->mod, &rsnd_mix_ops, ret = rsnd_mod_init(priv, rsnd_mod_get(mix), &rsnd_mix_ops,
clk, RSND_MOD_MIX, i); clk, RSND_MOD_MIX, i);
if (ret) if (ret)
return ret; return ret;
...@@ -195,6 +195,6 @@ void rsnd_mix_remove(struct platform_device *pdev, ...@@ -195,6 +195,6 @@ void rsnd_mix_remove(struct platform_device *pdev,
int i; int i;
for_each_rsnd_mix(mix, priv, i) { for_each_rsnd_mix(mix, priv, i) {
rsnd_mod_quit(&mix->mod); rsnd_mod_quit(rsnd_mod_get(mix));
} }
} }
...@@ -331,6 +331,7 @@ struct rsnd_mod { ...@@ -331,6 +331,7 @@ struct rsnd_mod {
#define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1) #define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1)
#define rsnd_mod_hw_start(mod) clk_enable((mod)->clk) #define rsnd_mod_hw_start(mod) clk_enable((mod)->clk)
#define rsnd_mod_hw_stop(mod) clk_disable((mod)->clk) #define rsnd_mod_hw_stop(mod) clk_disable((mod)->clk)
#define rsnd_mod_get(ip) (&(ip)->mod)
int rsnd_mod_init(struct rsnd_priv *priv, int rsnd_mod_init(struct rsnd_priv *priv,
struct rsnd_mod *mod, struct rsnd_mod *mod,
......
...@@ -976,7 +976,7 @@ struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id) ...@@ -976,7 +976,7 @@ struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
if (WARN_ON(id < 0 || id >= rsnd_src_nr(priv))) if (WARN_ON(id < 0 || id >= rsnd_src_nr(priv)))
id = 0; id = 0;
return &((struct rsnd_src *)(priv->src) + id)->mod; return rsnd_mod_get((struct rsnd_src *)(priv->src) + id);
} }
static void rsnd_of_parse_src(struct platform_device *pdev, static void rsnd_of_parse_src(struct platform_device *pdev,
...@@ -1071,7 +1071,7 @@ int rsnd_src_probe(struct platform_device *pdev, ...@@ -1071,7 +1071,7 @@ int rsnd_src_probe(struct platform_device *pdev,
src->info = &info->src_info[i]; src->info = &info->src_info[i];
ret = rsnd_mod_init(priv, &src->mod, ops, clk, RSND_MOD_SRC, i); ret = rsnd_mod_init(priv, rsnd_mod_get(src), ops, clk, RSND_MOD_SRC, i);
if (ret) if (ret)
return ret; return ret;
} }
...@@ -1086,6 +1086,6 @@ void rsnd_src_remove(struct platform_device *pdev, ...@@ -1086,6 +1086,6 @@ void rsnd_src_remove(struct platform_device *pdev,
int i; int i;
for_each_rsnd_src(src, priv, i) { for_each_rsnd_src(src, priv, i) {
rsnd_mod_quit(&src->mod); rsnd_mod_quit(rsnd_mod_get(src));
} }
} }
...@@ -128,6 +128,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi, ...@@ -128,6 +128,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
struct rsnd_priv *priv = rsnd_io_to_priv(io); struct rsnd_priv *priv = rsnd_io_to_priv(io);
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
struct device *dev = rsnd_priv_to_dev(priv); struct device *dev = rsnd_priv_to_dev(priv);
struct rsnd_mod *mod = rsnd_mod_get(ssi);
int i, j, ret; int i, j, ret;
int adg_clk_div_table[] = { int adg_clk_div_table[] = {
1, 6, /* see adg.c */ 1, 6, /* see adg.c */
...@@ -152,14 +153,14 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi, ...@@ -152,14 +153,14 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
main_rate = rate / adg_clk_div_table[i] main_rate = rate / adg_clk_div_table[i]
* 32 * 2 * ssi_clk_mul_table[j]; * 32 * 2 * ssi_clk_mul_table[j];
ret = rsnd_adg_ssi_clk_try_start(&ssi->mod, main_rate); ret = rsnd_adg_ssi_clk_try_start(mod, main_rate);
if (0 == ret) { if (0 == ret) {
ssi->cr_clk = FORCE | SWL_32 | ssi->cr_clk = FORCE | SWL_32 |
SCKD | SWSD | CKDV(j); SCKD | SWSD | CKDV(j);
dev_dbg(dev, "%s[%d] outputs %u Hz\n", dev_dbg(dev, "%s[%d] outputs %u Hz\n",
rsnd_mod_name(&ssi->mod), rsnd_mod_name(mod),
rsnd_mod_id(&ssi->mod), rate); rsnd_mod_id(mod), rate);
return 0; return 0;
} }
...@@ -172,8 +173,10 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi, ...@@ -172,8 +173,10 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi) static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi)
{ {
struct rsnd_mod *mod = rsnd_mod_get(ssi);
ssi->cr_clk = 0; ssi->cr_clk = 0;
rsnd_adg_ssi_clk_stop(&ssi->mod); rsnd_adg_ssi_clk_stop(mod);
} }
static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi, static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
...@@ -182,11 +185,12 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi, ...@@ -182,11 +185,12 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
struct rsnd_priv *priv = rsnd_io_to_priv(io); struct rsnd_priv *priv = rsnd_io_to_priv(io);
struct rsnd_dai *rdai = rsnd_io_to_rdai(io); struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
struct device *dev = rsnd_priv_to_dev(priv); struct device *dev = rsnd_priv_to_dev(priv);
struct rsnd_mod *mod = rsnd_mod_get(ssi);
u32 cr_mode; u32 cr_mode;
u32 cr; u32 cr;
if (0 == ssi->usrcnt) { if (0 == ssi->usrcnt) {
rsnd_mod_hw_start(&ssi->mod); rsnd_mod_hw_start(mod);
if (rsnd_rdai_is_clk_master(rdai)) { if (rsnd_rdai_is_clk_master(rdai)) {
struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi); struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
...@@ -198,7 +202,7 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi, ...@@ -198,7 +202,7 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
} }
} }
if (rsnd_ssi_is_dma_mode(&ssi->mod)) { if (rsnd_ssi_is_dma_mode(mod)) {
cr_mode = UIEN | OIEN | /* over/under run */ cr_mode = UIEN | OIEN | /* over/under run */
DMEN; /* DMA : enable DMA */ DMEN; /* DMA : enable DMA */
} else { } else {
...@@ -210,24 +214,25 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi, ...@@ -210,24 +214,25 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
cr_mode | cr_mode |
EN; EN;
rsnd_mod_write(&ssi->mod, SSICR, cr); rsnd_mod_write(mod, SSICR, cr);
/* enable WS continue */ /* enable WS continue */
if (rsnd_rdai_is_clk_master(rdai)) if (rsnd_rdai_is_clk_master(rdai))
rsnd_mod_write(&ssi->mod, SSIWSR, CONT); rsnd_mod_write(mod, SSIWSR, CONT);
/* clear error status */ /* clear error status */
rsnd_mod_write(&ssi->mod, SSISR, 0); rsnd_mod_write(mod, SSISR, 0);
ssi->usrcnt++; ssi->usrcnt++;
dev_dbg(dev, "%s[%d] hw started\n", dev_dbg(dev, "%s[%d] hw started\n",
rsnd_mod_name(&ssi->mod), rsnd_mod_id(&ssi->mod)); rsnd_mod_name(mod), rsnd_mod_id(mod));
} }
static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi) static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi)
{ {
struct rsnd_priv *priv = rsnd_mod_to_priv(&ssi->mod); struct rsnd_mod *mod = rsnd_mod_get(ssi);
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
struct rsnd_dai *rdai = rsnd_io_to_rdai(io); struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
struct device *dev = rsnd_priv_to_dev(priv); struct device *dev = rsnd_priv_to_dev(priv);
u32 cr; u32 cr;
...@@ -247,15 +252,15 @@ static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi) ...@@ -247,15 +252,15 @@ static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi)
cr = ssi->cr_own | cr = ssi->cr_own |
ssi->cr_clk; ssi->cr_clk;
rsnd_mod_write(&ssi->mod, SSICR, cr | EN); rsnd_mod_write(mod, SSICR, cr | EN);
rsnd_ssi_status_check(&ssi->mod, DIRQ); rsnd_ssi_status_check(mod, DIRQ);
/* /*
* disable SSI, * disable SSI,
* and, wait idle state * and, wait idle state
*/ */
rsnd_mod_write(&ssi->mod, SSICR, cr); /* disabled all */ rsnd_mod_write(mod, SSICR, cr); /* disabled all */
rsnd_ssi_status_check(&ssi->mod, IIRQ); rsnd_ssi_status_check(mod, IIRQ);
if (rsnd_rdai_is_clk_master(rdai)) { if (rsnd_rdai_is_clk_master(rdai)) {
struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi); struct rsnd_ssi *ssi_parent = rsnd_ssi_parent(ssi);
...@@ -266,13 +271,13 @@ static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi) ...@@ -266,13 +271,13 @@ static void rsnd_ssi_hw_stop(struct rsnd_dai_stream *io, struct rsnd_ssi *ssi)
rsnd_ssi_master_clk_stop(ssi); rsnd_ssi_master_clk_stop(ssi);
} }
rsnd_mod_hw_stop(&ssi->mod); rsnd_mod_hw_stop(mod);
ssi->chan = 0; ssi->chan = 0;
} }
dev_dbg(dev, "%s[%d] hw stopped\n", dev_dbg(dev, "%s[%d] hw stopped\n",
rsnd_mod_name(&ssi->mod), rsnd_mod_id(&ssi->mod)); rsnd_mod_name(mod), rsnd_mod_id(mod));
} }
/* /*
...@@ -371,7 +376,7 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod, ...@@ -371,7 +376,7 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
/* It will be removed on rsnd_ssi_hw_stop */ /* It will be removed on rsnd_ssi_hw_stop */
ssi->chan = chan; ssi->chan = chan;
if (ssi_parent) if (ssi_parent)
return rsnd_ssi_hw_params(&ssi_parent->mod, io, return rsnd_ssi_hw_params(rsnd_mod_get(ssi_parent), io,
substream, params); substream, params);
return 0; return 0;
...@@ -379,12 +384,14 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod, ...@@ -379,12 +384,14 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status) static void rsnd_ssi_record_error(struct rsnd_ssi *ssi, u32 status)
{ {
struct rsnd_mod *mod = rsnd_mod_get(ssi);
/* under/over flow error */ /* under/over flow error */
if (status & (UIRQ | OIRQ)) { if (status & (UIRQ | OIRQ)) {
ssi->err++; ssi->err++;
/* clear error status */ /* clear error status */
rsnd_mod_write(&ssi->mod, SSISR, 0); rsnd_mod_write(mod, SSISR, 0);
} }
} }
...@@ -656,7 +663,7 @@ struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id) ...@@ -656,7 +663,7 @@ struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv))) if (WARN_ON(id < 0 || id >= rsnd_ssi_nr(priv)))
id = 0; id = 0;
return &((struct rsnd_ssi *)(priv->ssi) + id)->mod; return rsnd_mod_get((struct rsnd_ssi *)(priv->ssi) + id);
} }
int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod) int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
...@@ -668,10 +675,12 @@ int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod) ...@@ -668,10 +675,12 @@ int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
static void rsnd_ssi_parent_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi) static void rsnd_ssi_parent_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi)
{ {
if (!rsnd_ssi_is_pin_sharing(&ssi->mod)) struct rsnd_mod *mod = rsnd_mod_get(ssi);
if (!rsnd_ssi_is_pin_sharing(mod))
return; return;
switch (rsnd_mod_id(&ssi->mod)) { switch (rsnd_mod_id(mod)) {
case 1: case 1:
case 2: case 2:
ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 0)); ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 0));
...@@ -794,7 +803,8 @@ int rsnd_ssi_probe(struct platform_device *pdev, ...@@ -794,7 +803,8 @@ int rsnd_ssi_probe(struct platform_device *pdev,
else if (rsnd_ssi_pio_available(ssi)) else if (rsnd_ssi_pio_available(ssi))
ops = &rsnd_ssi_pio_ops; ops = &rsnd_ssi_pio_ops;
ret = rsnd_mod_init(priv, &ssi->mod, ops, clk, RSND_MOD_SSI, i); ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
RSND_MOD_SSI, i);
if (ret) if (ret)
return ret; return ret;
...@@ -811,6 +821,6 @@ void rsnd_ssi_remove(struct platform_device *pdev, ...@@ -811,6 +821,6 @@ void rsnd_ssi_remove(struct platform_device *pdev,
int i; int i;
for_each_rsnd_ssi(ssi, priv, i) { for_each_rsnd_ssi(ssi, priv, i) {
rsnd_mod_quit(&ssi->mod); rsnd_mod_quit(rsnd_mod_get(ssi));
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment