From: Kuninori Morimoto <kuninori.morimoto...@renesas.com>

Current rsnd supports multi SSI (maximum 4 SSI for 8ch),
and, it should determine whether using each SSI or not in runtime.
Current judgement is vague, and had broken by
c308abe45e2("ASoC: rsnd: rsnd_ssi_is_multi_slave() macro uses
rsnd_ssi_multi_slaves()")
This patch makes clean it, and solve this issue.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto...@renesas.com>
---
 sound/soc/sh/rcar/core.c |  2 +-
 sound/soc/sh/rcar/rsnd.h |  2 +-
 sound/soc/sh/rcar/ssi.c  | 15 +++++++++++++--
 sound/soc/sh/rcar/ssiu.c |  6 +++---
 4 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index f65e93e..21e13b3 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -230,7 +230,7 @@ int rsnd_get_slot_width(struct rsnd_dai_stream *io)
        int chan = runtime->channels;
 
        /* Multi channel Mode */
-       if (rsnd_ssi_multi_slaves(io))
+       if (rsnd_ssi_multi_slaves_runtime(io))
                chan /= rsnd_get_slot_num(io);
 
        /* TDM Extend Mode needs 8ch */
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 61cb4ae..5f613eb 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -599,7 +599,7 @@ void rsnd_ssi_remove(struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
 int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod);
 int rsnd_ssi_use_busif(struct rsnd_dai_stream *io);
-u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io);
+u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io);
 
 #define rsnd_ssi_is_pin_sharing(io)    \
        __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io))
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index d46bc08..32f1f5f 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -144,7 +144,7 @@ static void rsnd_ssi_status_check(struct rsnd_mod *mod,
                 rsnd_mod_name(mod), rsnd_mod_id(mod));
 }
 
-u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
+static u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
 {
        struct rsnd_mod *mod;
        enum rsnd_mod_type types[] = {
@@ -166,6 +166,17 @@ u32 rsnd_ssi_multi_slaves(struct rsnd_dai_stream *io)
        return mask;
 }
 
+u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io)
+{
+       struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+       u32 mask = rsnd_ssi_multi_slaves(io);
+
+       if (mask && (runtime->channels >= 6))
+               return mask;
+
+       return 0;
+}
+
 static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
                                     struct rsnd_dai_stream *io)
 {
@@ -415,7 +426,7 @@ static int rsnd_ssi_start(struct rsnd_mod *mod,
         * EN will be set via SSIU :: SSI_CONTROL
         * if Multi channel mode
         */
-       if (rsnd_ssi_multi_slaves(io))
+       if (rsnd_ssi_multi_slaves_runtime(io))
                return 0;
 
        rsnd_mod_bset(mod, SSICR, EN, EN);
diff --git a/sound/soc/sh/rcar/ssiu.c b/sound/soc/sh/rcar/ssiu.c
index 11e5588..1b8ea0e 100644
--- a/sound/soc/sh/rcar/ssiu.c
+++ b/sound/soc/sh/rcar/ssiu.c
@@ -27,7 +27,7 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
                          struct rsnd_priv *priv)
 {
        struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
-       u32 multi_ssi_slaves = rsnd_ssi_multi_slaves(io);
+       u32 multi_ssi_slaves = rsnd_ssi_multi_slaves_runtime(io);
        int use_busif = rsnd_ssi_use_busif(io);
        int id = rsnd_mod_id(mod);
        u32 mask1, val1;
@@ -136,7 +136,7 @@ static int rsnd_ssiu_start_gen2(struct rsnd_mod *mod,
 
        rsnd_mod_write(mod, SSI_CTRL, 0x1);
 
-       if (rsnd_ssi_multi_slaves(io))
+       if (rsnd_ssi_multi_slaves_runtime(io))
                rsnd_mod_write(mod, SSI_CONTROL, 0x1);
 
        return 0;
@@ -151,7 +151,7 @@ static int rsnd_ssiu_stop_gen2(struct rsnd_mod *mod,
 
        rsnd_mod_write(mod, SSI_CTRL, 0);
 
-       if (rsnd_ssi_multi_slaves(io))
+       if (rsnd_ssi_multi_slaves_runtime(io))
                rsnd_mod_write(mod, SSI_CONTROL, 0);
 
        return 0;
-- 
1.9.1

Reply via email to