From: Jiada Wang <jiada_w...@mentor.com>

Currently ssi driver only request dma channel for SSI_0,
which is used to transfer data to/from busif0.

But in GEN3 busif1 to busif7 also maybe used, dedicated dma channels
are requested for data transfer through these busif.

Signed-off-by: Jiada Wang <jiada_w...@mentor.com>
---
 sound/soc/sh/rcar/ssi.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 3adcc4f778f7..992aeac09e76 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -76,6 +76,8 @@
 
 #define SSI_NAME "ssi"
 
+#define SSI_DMA_NAME_SIZE      10
+
 struct rsnd_ssi {
        struct rsnd_mod mod;
 
@@ -938,12 +940,28 @@ static struct dma_chan *rsnd_ssi_dma_req(struct 
rsnd_dai_stream *io,
 {
        struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
        int is_play = rsnd_io_is_play(io);
-       char *name;
+       char name[SSI_DMA_NAME_SIZE];
 
-       if (rsnd_ssi_use_busif(io))
-               name = is_play ? "rxu" : "txu";
-       else
-               name = is_play ? "rx" : "tx";
+       if (rsnd_ssi_use_busif(io)) {
+               if (is_play)
+                       snprintf(name, SSI_DMA_NAME_SIZE, "rxu");
+               else
+                       snprintf(name, SSI_DMA_NAME_SIZE, "txu");
+
+               if (rsnd_is_gen3(priv)) {
+                       /*
+                        * Gen3 supports to use all available BUSIF
+                        */
+                       int busif = rsnd_ssi_get_busif(io);
+
+                       snprintf(name, SSI_DMA_NAME_SIZE, "%s%d", name, busif);
+               }
+       } else {
+               if (is_play)
+                       snprintf(name, SSI_DMA_NAME_SIZE, "rx");
+               else
+                       snprintf(name, SSI_DMA_NAME_SIZE, "tx");
+       }
 
        return rsnd_dma_request_channel(rsnd_ssi_of_node(priv),
                                        mod, name);
-- 
2.17.0

Reply via email to