ASoC: rsrc-card: add convert channels support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 25 Feb 2016 05:51:44 +0000 (05:51 +0000)
committerMark Brown <broonie@kernel.org>
Sat, 5 Mar 2016 04:27:27 +0000 (13:27 +0900)
Renesas sound device has CTU (= Channel Transfer Unit), and
sound card needs its support.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Documentation/devicetree/bindings/sound/renesas,rsrc-card.txt
sound/soc/sh/rcar/rsrc-card.c

index 2b2caa281ce38abcb46f688318a3479efcf02cfa..5abebf7898d9d54420c5213333ac01e23ad6c3b4 100644 (file)
@@ -30,6 +30,7 @@ Optional subnode properties:
 - frame-inversion                      : bool property. Add this if the
                                          dai-link uses frame clock inversion.
 - convert-rate                         : platform specified sampling rate convert
+- convert-channels                     : platform specified channel size convert
 - audio-prefix                         : see audio-routing
 - audio-routing                                : A list of the connections between audio components.
                                          Each entry is a pair of strings, the first being the connection's sink,
index 545e94245e62c9d86005bbb6aafda4c65f14831e..1bc7ecfc42a9e18004d7726e2de45ca06f1542ca 100644 (file)
@@ -66,6 +66,7 @@ struct rsrc_card_priv {
        struct snd_soc_dai_link *dai_link;
        int dai_num;
        u32 convert_rate;
+       u32 convert_channels;
 };
 
 #define rsrc_priv_to_dev(priv) ((priv)->snd_card.dev)
@@ -144,11 +145,16 @@ static int rsrc_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
        struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
        struct snd_interval *rate = hw_param_interval(params,
                                                      SNDRV_PCM_HW_PARAM_RATE);
+       struct snd_interval *channels = hw_param_interval(params,
+                                               SNDRV_PCM_HW_PARAM_CHANNELS);
 
-       if (!priv->convert_rate)
-               return 0;
+       if (priv->convert_rate)
+               rate->min =
+               rate->max = priv->convert_rate;
 
-       rate->min = rate->max = priv->convert_rate;
+       if (priv->convert_channels)
+               channels->min =
+               channels->max = priv->convert_channels;
 
        return 0;
 }
@@ -436,9 +442,13 @@ static int rsrc_card_parse_of(struct device_node *node,
        /* sampling rate convert */
        of_property_read_u32(node, "convert-rate", &priv->convert_rate);
 
-       dev_dbg(dev, "New rsrc-audio-card: %s (%d)\n",
-               priv->snd_card.name ? priv->snd_card.name : "",
-               priv->convert_rate);
+       /* channels transfer */
+       of_property_read_u32(node, "convert-channels", &priv->convert_channels);
+
+       dev_dbg(dev, "New rsrc-audio-card: %s\n",
+               priv->snd_card.name ? priv->snd_card.name : "");
+       dev_dbg(dev, "SRC : convert_rate     %d\n", priv->convert_rate);
+       dev_dbg(dev, "CTU : convert_channels %d\n", priv->convert_channels);
 
        ret = rsrc_card_dai_link_of(node, priv);
        if (ret < 0)