ASoC: simple card: Add mclk-fs property in dai-link
authorArnaud Pouliquen <arnaud.pouliquen@st.com>
Fri, 5 Jun 2015 08:19:05 +0000 (10:19 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 12 Jun 2015 11:35:54 +0000 (12:35 +0100)
Add mclk-fs ratio property per dai-link sub node. This will
allow to manage several codecs with different ratio.

Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@st.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Documentation/devicetree/bindings/sound/simple-card.txt
sound/soc/generic/simple-card.c

index 73bf314f7240483514db27980ef6aa63dd0298f2..cf3979eb357809052b187cc27364eefd877e968b 100644 (file)
@@ -16,7 +16,8 @@ Optional properties:
                                          connection's sink, the second being the connection's
                                          source.
 - simple-audio-card,mclk-fs             : Multiplication factor between stream rate and codec
-                                         mclk.
+                                         mclk. When defined, mclk-fs property defined in
+                                         dai-link sub nodes are ignored.
 - simple-audio-card,hp-det-gpio                : Reference to GPIO that signals when
                                          headphones are attached.
 - simple-audio-card,mic-det-gpio       : Reference to GPIO that signals when
@@ -55,6 +56,9 @@ Optional dai-link subnode properties:
                                          dai-link uses bit clock inversion.
 - frame-inversion                      : bool property. Add this if the
                                          dai-link uses frame clock inversion.
+- mclk-fs                              : Multiplication factor between stream
+                                         rate and codec mclk, applied only for
+                                         the dai-link.
 
 For backward compatibility the frame-master and bitclock-master
 properties can be used as booleans in codec subnode to indicate if the
index c87e58504a623409017866cc0e473e95fa7a7bca..d5554939146e8c310e35b175217ac8c6a04c2551 100644 (file)
@@ -26,6 +26,7 @@ struct simple_card_data {
        struct simple_dai_props {
                struct asoc_simple_dai cpu_dai;
                struct asoc_simple_dai codec_dai;
+               unsigned int mclk_fs;
        } *dai_props;
        unsigned int mclk_fs;
        int gpio_hp_det;
@@ -76,11 +77,18 @@ static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
-       unsigned int mclk;
+       struct simple_dai_props *dai_props =
+               &priv->dai_props[rtd - rtd->card->rtd];
+       unsigned int mclk, mclk_fs = 0;
        int ret = 0;
 
-       if (priv->mclk_fs) {
-               mclk = params_rate(params) * priv->mclk_fs;
+       if (priv->mclk_fs)
+               mclk_fs = priv->mclk_fs;
+       else if (dai_props->mclk_fs)
+               mclk_fs = dai_props->mclk_fs;
+
+       if (mclk_fs) {
+               mclk = params_rate(params) * mclk_fs;
                ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
                                             SND_SOC_CLOCK_IN);
        }
@@ -313,6 +321,7 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
        char prop[128];
        char *prefix = "";
        int ret, cpu_args;
+       u32 val;
 
        /* For single DAI link & old style of DT node */
        if (is_top_level_node)
@@ -338,6 +347,9 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
        if (ret < 0)
                goto dai_link_of_err;
 
+       if (!of_property_read_u32(node, "mclk-fs", &val))
+               dai_props->mclk_fs = val;
+
        ret = asoc_simple_card_sub_parse_of(cpu, &dai_props->cpu_dai,
                                            &dai_link->cpu_of_node,
                                            &dai_link->cpu_dai_name,