ASoC: rsnd: add rsnd_src_get_in/out_rate()
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Mon, 7 Mar 2016 05:08:33 +0000 (05:08 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 7 Mar 2016 07:41:54 +0000 (14:41 +0700)
SRC will convert rate, and then, CMD and SSI want to know its
rate (= SRC.in / SRC.out) for each purpose.
Current driver is supporting only Playback, but SRC+Capture support
needs more flexibility.
This patch adds rsnd_src_get_in/out_rate() for it.

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

index ff53f96e500606cff6c72fe063b634464b9bd073..4b77f33358fb346c8d55e9a2cc75a6c634751818 100644 (file)
@@ -627,9 +627,13 @@ void rsnd_ssiu_remove(struct rsnd_priv *priv);
 int rsnd_src_probe(struct rsnd_priv *priv);
 void rsnd_src_remove(struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
-unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
-                                  struct rsnd_dai_stream *io,
-                                  struct snd_pcm_runtime *runtime);
+
+#define rsnd_src_get_in_rate(priv, io) rsnd_src_get_rate(priv, io, 1)
+#define rsnd_src_get_out_rate(priv, io) rsnd_src_get_rate(priv, io, 0)
+unsigned int rsnd_src_get_rate(struct rsnd_priv *priv,
+                              struct rsnd_dai_stream *io,
+                              int is_in);
+
 #define rsnd_src_of_node(priv)                                         \
        of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,src")
 #define rsnd_parse_connect_src(rdai, playback, capture)                        \
index 1d5aedb50213075d7905572c7ea72223218637e2..d1a8741cc446477472a0b1e7e98103422d73d279 100644 (file)
@@ -116,12 +116,26 @@ static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io,
        return convert_rate;
 }
 
-unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
-                                  struct rsnd_dai_stream *io,
-                                  struct snd_pcm_runtime *runtime)
+unsigned int rsnd_src_get_rate(struct rsnd_priv *priv,
+                              struct rsnd_dai_stream *io,
+                              int is_in)
 {
        struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
+       struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
        unsigned int rate = 0;
+       int is_play = rsnd_io_is_play(io);
+
+       /*
+        *
+        * Playback
+        * runtime_rate -> [SRC] -> convert_rate
+        *
+        * Capture
+        * convert_rate -> [SRC] -> runtime_rate
+        */
+
+       if (is_play == is_in)
+               return runtime->rate;
 
        /*
         * return convert rate if SRC is used,
index 5404897553673450b5af201633f87ff24b89c71a..5f848f0547457338e122f5309914f3036c308836 100644 (file)
@@ -190,7 +190,6 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
                                     struct rsnd_dai_stream *io)
 {
        struct rsnd_priv *priv = rsnd_io_to_priv(io);
-       struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
        struct device *dev = rsnd_priv_to_dev(priv);
        struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
@@ -201,7 +200,9 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
                1, 2, 4, 8, 16, 6, 12,
        };
        unsigned int main_rate;
-       unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
+       unsigned int rate = rsnd_io_is_play(io) ?
+               rsnd_src_get_out_rate(priv, io) :
+               rsnd_src_get_in_rate(priv, io);
 
        if (!rsnd_rdai_is_clk_master(rdai))
                return 0;