ASoC: rsnd: add rsnd_set_slot() / rsnd_get_slot_num()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 17 Dec 2015 02:57:47 +0000 (02:57 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 18 Dec 2015 12:10:56 +0000 (12:10 +0000)
TDM will use 6 or 8 slots on 1 SSI, and Multi channel will use
6 or 8 slots on few SSI (each SSI uses 2 slots).
Thus, this adds new slot control functions which can be prepare
for Multi channel support.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/rsnd.h

index 76af41633f9fd3c6f71c0f0f059807cbc10df970..528041eff704b779a50ea998dbb6561c28aac120 100644 (file)
@@ -191,6 +191,13 @@ int rsnd_io_is_working(struct rsnd_dai_stream *io)
        return !!io->substream;
 }
 
+void rsnd_set_slot(struct rsnd_dai *rdai,
+                  int slots, int num)
+{
+       rdai->slots     = slots;
+       rdai->slots_num = num;
+}
+
 int rsnd_get_slot(struct rsnd_dai_stream *io)
 {
        struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
@@ -198,10 +205,17 @@ int rsnd_get_slot(struct rsnd_dai_stream *io)
        return rdai->slots;
 }
 
+int rsnd_get_slot_num(struct rsnd_dai_stream *io)
+{
+       struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
+
+       return rdai->slots_num;
+}
+
 int rsnd_get_slot_width(struct rsnd_dai_stream *io)
 {
        struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
-       int chan = runtime->channels;
+       int chan = runtime->channels / rsnd_get_slot_num(io);
 
        /* TDM Extend Mode needs 8ch */
        if (chan == 6)
@@ -579,7 +593,7 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
        switch (slots) {
        case 6:
                /* TDM Extend Mode */
-               rdai->slots = slots;
+               rsnd_set_slot(rdai, slots, 1);
                break;
        default:
                dev_err(dev, "unsupported TDM slots (%d)\n", slots);
@@ -660,7 +674,7 @@ static int rsnd_dai_probe(struct rsnd_priv *priv)
 
                rdai->playback.rdai             = rdai;
                rdai->capture.rdai              = rdai;
-               rdai->slots                     = 2; /* default */
+               rsnd_set_slot(rdai, 2, 1); /* default */
 
 #define mod_parse(name)                                                        \
 node = rsnd_##name##_of_node(priv);                                    \
index 804f2f5622e08d474e540b570e6895be3c6a45a9..c9aef234d002a2aa1496343306ce908c23a3aa49 100644 (file)
@@ -293,8 +293,11 @@ void rsnd_mod_interrupt(struct rsnd_mod *mod,
                        void (*callback)(struct rsnd_mod *mod,
                                         struct rsnd_dai_stream *io));
 
+void rsnd_set_slot(struct rsnd_dai *rdai,
+                  int slots, int slots_total);
 int rsnd_get_slot(struct rsnd_dai_stream *io);
 int rsnd_get_slot_width(struct rsnd_dai_stream *io);
+int rsnd_get_slot_num(struct rsnd_dai_stream *io);
 
 /*
  *     R-Car sound DAI
@@ -334,6 +337,7 @@ struct rsnd_dai {
        struct rsnd_priv *priv;
 
        int slots;
+       int slots_num;
 
        unsigned int clk_master:1;
        unsigned int bit_clk_inv:1;