ASoC: tegra-alt: vcm30t124: Fix audio noise
Songhee Baek [Thu, 12 Dec 2013 18:20:49 +0000 (10:20 -0800)]
To suuport various sampling rate correctly, machine driver needs
to update hw_param from runtime parameter for dai link, so codec
drivers can set proper params in runtime.

Bug 1409761

Change-Id: Ic4e3326abba58e79c88bd96adac6e06b475f07ee
Signed-off-by: Songhee Baek <sbaek@nvidia.com>
Reviewed-on: http://git-master/r/344895
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Scott Peterson <speterson@nvidia.com>
Reviewed-by: Arun Shamanna Lakshmi <aruns@nvidia.com>
Reviewed-by: Gajanan Bhat <gbhat@nvidia.com>

sound/soc/tegra-alt/tegra_vcm30t124_alt.c

index 0201ef8..04293a2 100644 (file)
@@ -89,6 +89,8 @@ static int tegra_vcm30t124_x_hw_params(struct snd_pcm_substream *substream,
        struct snd_soc_codec *codec = codec_dai->codec;
        struct snd_soc_card *card = codec->card;
        struct tegra_vcm30t124 *machine = snd_soc_card_get_drvdata(card);
+       struct snd_soc_pcm_stream *dai_params =
+               (struct snd_soc_pcm_stream *)card->rtd[10].dai_link->params;
        int srate, mclk, clk_out_rate;
        int err;
 
@@ -122,6 +124,9 @@ static int tegra_vcm30t124_x_hw_params(struct snd_pcm_substream *substream,
                break;
        }
 
+       /* update link_param to update hw_param for DAPM */
+       dai_params->rate_min = srate;
+
        err = tegra_alt_asoc_utils_set_rate(&machine->audio_clock,
                                        srate, mclk, clk_out_rate);
        if (err < 0) {
@@ -129,7 +134,6 @@ static int tegra_vcm30t124_x_hw_params(struct snd_pcm_substream *substream,
                return err;
        }
 
-
        err = snd_soc_dai_set_sysclk(card->rtd[10].codec_dai,
                        WM8731_SYSCLK_MCLK, clk_out_rate, SND_SOC_CLOCK_IN);
        if (err < 0) {
@@ -155,6 +159,8 @@ static int tegra_vcm30t124_y_hw_params(struct snd_pcm_substream *substream,
        struct snd_soc_codec *codec = codec_dai->codec;
        struct snd_soc_card *card = codec->card;
        struct tegra_vcm30t124 *machine = snd_soc_card_get_drvdata(card);
+       struct snd_soc_pcm_stream *dai_params =
+               (struct snd_soc_pcm_stream *)card->rtd[12].dai_link->params;
        unsigned int fmt = card->rtd[12].dai_link->dai_fmt;
        int srate, mclk, clk_out_rate, val;
        int err;
@@ -171,6 +177,9 @@ static int tegra_vcm30t124_y_hw_params(struct snd_pcm_substream *substream,
                break;
        }
 
+       /* update link_param to update hw_param for DAPM */
+       dai_params->rate_min = srate;
+
        mclk = clk_out_rate * 2;
 
        set_max9485_clk(machine->max9485_client, mclk);
@@ -267,6 +276,8 @@ static int tegra_vcm30t124_wm8731_init(struct snd_soc_pcm_runtime *rtd)
        struct tegra_vcm30t124 *machine = snd_soc_card_get_drvdata(card);
        struct snd_soc_dai *wm8731_dai = card->rtd[10].codec_dai;
        struct snd_soc_dai *i2s_dai = card->rtd[10].cpu_dai;
+       struct snd_soc_pcm_stream *dai_params =
+               (struct snd_soc_pcm_stream *)card->rtd[10].dai_link->params;
        unsigned int clk_out, mclk, srate;
        int err;
 
@@ -274,6 +285,9 @@ static int tegra_vcm30t124_wm8731_init(struct snd_soc_pcm_runtime *rtd)
        clk_out = srate * 256;
        mclk = clk_out * 2;
 
+       /* update link_param to update hw_param for DAPM */
+       dai_params->rate_min = srate;
+
        tegra_alt_asoc_utils_set_parent(&machine->audio_clock, true);
 
        /* wm8731 needs mclk from tegra */
@@ -308,6 +322,8 @@ static int tegra_vcm30t124_ad1937_init(struct snd_soc_pcm_runtime *rtd)
        struct tegra_vcm30t124 *machine = snd_soc_card_get_drvdata(card);
        struct snd_soc_dai *ad1937_dai = card->rtd[12].codec_dai;
        struct snd_soc_dai *i2s_dai = card->rtd[12].cpu_dai;
+       struct snd_soc_pcm_stream *dai_params =
+               (struct snd_soc_pcm_stream *)card->rtd[12].dai_link->params;
        unsigned int fmt = card->rtd[12].dai_link->dai_fmt;
        unsigned int mclk, srate;
        int err;
@@ -315,6 +331,9 @@ static int tegra_vcm30t124_ad1937_init(struct snd_soc_pcm_runtime *rtd)
        srate = 48000;
        mclk = srate * 512;
 
+       /* update link_param to update hw_param for DAPM */
+       dai_params->rate_min = srate;
+
        if ((fmt & SND_SOC_DAIFMT_MASTER_MASK) == SND_SOC_DAIFMT_CBM_CFM) {
                /* direct MCLK mode in AD1937, mclk needs to be srate * 512 */
                set_max9485_clk(machine->max9485_client, mclk);