| From e752d94624b82b5926740ed3dcf0b65aad83d521 Mon Sep 17 00:00:00 2001 |
| From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Date: Mon, 3 Mar 2014 20:50:24 -0800 |
| Subject: ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI |
| |
| Current R-Car sound driver is assuming that |
| SCU mod is used even though it is not needed. |
| Because scu.c is controlling SSIU too. |
| (it is Gen1 compatibility) |
| But, SCU mod will be really not used if new platform dai |
| feature was added. |
| Thus, rsnd_scu_ssi_mode_init() is called from SSI |
| directory by this patch. |
| |
| Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| Signed-off-by: Mark Brown <broonie@linaro.org> |
| (cherry picked from commit 221bf523e31306c1095b28932e079950108e3887) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| sound/soc/sh/rcar/rsnd.h | 3 +++ |
| sound/soc/sh/rcar/scu.c | 54 +++++++++++++++--------------------------------- |
| sound/soc/sh/rcar/ssi.c | 2 ++ |
| 3 files changed, 22 insertions(+), 37 deletions(-) |
| |
| diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h |
| index 3b71b77c4fd8..9205f96da2f4 100644 |
| --- a/sound/soc/sh/rcar/rsnd.h |
| +++ b/sound/soc/sh/rcar/rsnd.h |
| @@ -353,6 +353,9 @@ struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id); |
| unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv, |
| struct rsnd_dai_stream *io, |
| struct snd_pcm_runtime *runtime); |
| +int rsnd_scu_ssi_mode_init(struct rsnd_mod *ssi_mod, |
| + struct rsnd_dai *rdai, |
| + struct rsnd_dai_stream *io); |
| int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod, |
| struct rsnd_dai *rdai, |
| struct rsnd_dai_stream *io); |
| diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c |
| index 8ce79e855cf0..63e6aeb8c42d 100644 |
| --- a/sound/soc/sh/rcar/scu.c |
| +++ b/sound/soc/sh/rcar/scu.c |
| @@ -115,28 +115,28 @@ struct rsnd_scu { |
| /* |
| * Gen1/Gen2 common functions |
| */ |
| -static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod, |
| - struct rsnd_dai *rdai, |
| - struct rsnd_dai_stream *io) |
| +int rsnd_scu_ssi_mode_init(struct rsnd_mod *ssi_mod, |
| + struct rsnd_dai *rdai, |
| + struct rsnd_dai_stream *io) |
| { |
| - struct rsnd_priv *priv = rsnd_mod_to_priv(mod); |
| - struct rsnd_scu *scu = rsnd_mod_to_scu(mod); |
| - struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io); |
| + struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod); |
| + struct rsnd_mod *scu_mod = rsnd_io_to_mod_scu(io); |
| + struct rcar_snd_info *info = rsnd_priv_to_info(priv); |
| int ssi_id = rsnd_mod_id(ssi_mod); |
| - u32 convert_rate = rsnd_scu_convert_rate(scu); |
| - |
| - if (convert_rate && !rsnd_dai_is_clk_master(rdai)) { |
| - struct device *dev = rsnd_priv_to_dev(priv); |
| - |
| - dev_err(dev, "rsnd should be clk master when you rate convert\n"); |
| - return -EINVAL; |
| - } |
| + int has_scu = 0; |
| |
| /* |
| * SSI_MODE0 |
| */ |
| - rsnd_mod_bset(mod, SSI_MODE0, (1 << ssi_id), |
| - rsnd_scu_hpbif_is_enable(scu) ? 0 : (1 << ssi_id)); |
| + if (info->dai_info) { |
| + has_scu = !!scu_mod; |
| + } else { |
| + struct rsnd_scu *scu = rsnd_mod_to_scu(scu_mod); |
| + has_scu = rsnd_scu_hpbif_is_enable(scu); |
| + } |
| + |
| + rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id), |
| + has_scu ? 0 : (1 << ssi_id)); |
| |
| /* |
| * SSI_MODE1 |
| @@ -156,7 +156,7 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod, |
| } |
| |
| if (shift >= 0) |
| - rsnd_mod_bset(mod, SSI_MODE1, |
| + rsnd_mod_bset(ssi_mod, SSI_MODE1, |
| 0x3 << shift, |
| rsnd_dai_is_clk_master(rdai) ? |
| 0x2 << shift : 0x1 << shift); |
| @@ -253,14 +253,9 @@ static int rsnd_scu_init(struct rsnd_mod *mod, |
| struct rsnd_dai_stream *io) |
| { |
| struct rsnd_scu *scu = rsnd_mod_to_scu(mod); |
| - int ret; |
| |
| clk_enable(scu->clk); |
| |
| - ret = rsnd_scu_ssi_mode_init(mod, rdai, io); |
| - if (ret < 0) |
| - return ret; |
| - |
| return 0; |
| } |
| |
| @@ -487,11 +482,6 @@ static struct rsnd_mod_ops rsnd_scu_gen1_ops = { |
| .stop = rsnd_scu_stop_gen1, |
| }; |
| |
| -static struct rsnd_mod_ops rsnd_scu_non_gen1_ops = { |
| - .name = "non-sru (gen1)", |
| - .init = rsnd_scu_ssi_mode_init, |
| -}; |
| - |
| /* |
| * Gen2 functions |
| */ |
| @@ -592,11 +582,6 @@ static struct rsnd_mod_ops rsnd_scu_gen2_ops = { |
| .stop = rsnd_scu_stop_gen2, |
| }; |
| |
| -static struct rsnd_mod_ops rsnd_scu_non_gen2_ops = { |
| - .name = "non-scu (gen2)", |
| - .init = rsnd_scu_ssi_mode_init, |
| -}; |
| - |
| struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id) |
| { |
| if (WARN_ON(id < 0 || id >= rsnd_scu_nr(priv))) |
| @@ -665,11 +650,6 @@ int rsnd_scu_probe(struct platform_device *pdev, |
| |
| ops = &rsnd_scu_gen2_ops; |
| } |
| - } else { |
| - if (rsnd_is_gen1(priv)) |
| - ops = &rsnd_scu_non_gen1_ops; |
| - if (rsnd_is_gen2(priv)) |
| - ops = &rsnd_scu_non_gen2_ops; |
| } |
| |
| rsnd_mod_init(priv, &scu->mod, ops, RSND_MOD_SCU, i); |
| diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c |
| index a74c7a789b2b..a7df216a46da 100644 |
| --- a/sound/soc/sh/rcar/ssi.c |
| +++ b/sound/soc/sh/rcar/ssi.c |
| @@ -287,6 +287,8 @@ static int rsnd_ssi_init(struct rsnd_mod *mod, |
| ssi->cr_own = cr; |
| ssi->err = -1; /* ignore 1st error */ |
| |
| + rsnd_scu_ssi_mode_init(mod, rdai, io); |
| + |
| return 0; |
| } |
| |
| -- |
| 2.1.2 |
| |