]> rtime.felk.cvut.cz Git - hercules2020/nv-tegra/linux-4.4.git/commitdiff
tegra-alt:rt565x/rt5639: add compr_ops for machine
authorViswanath L <viswanathl@nvidia.com>
Wed, 19 Aug 2015 11:54:05 +0000 (17:24 +0530)
committerRavindra Lokhande <rlokhande@nvidia.com>
Tue, 24 May 2016 06:58:26 +0000 (12:28 +0530)
ALSA compress does not call hw_params. Add compr_ops so that
set_params gets called to configure hw params.

Also fix in es755 machine driver to set ops for both PCM devices.

Bug 200132890
Bug 200127533

Change-Id: Ifcfc6b5c4673961afd2d5e00318c97f8f2d0df18
Signed-off-by: Viswanath L <viswanathl@nvidia.com>
Reviewed-on: http://git-master/r/785936
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Viraj Karandikar <vkarandikar@nvidia.com>
Reviewed-by: Sumit Bhattacharya <sumitb@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Ravindra Lokhande <rlokhande@nvidia.com>
sound/soc/tegra-alt/tegra_t210ref_mobile_alt.c
sound/soc/tegra-alt/tegra_t210ref_mobile_es755_alt.c
sound/soc/tegra-alt/tegra_t210ref_mobile_rt565x_alt.c

index 84493b808d954daa03c77cef6fc4591f9a778197..b5a74652b9fe1762d08895b0e645bb2228e83075 100644 (file)
@@ -226,13 +226,16 @@ static int tegra_t210ref_dai_init(struct snd_soc_pcm_runtime *rtd,
        err = tegra_alt_asoc_utils_set_rate(&machine->audio_clock,
                                clk_rate, mclk, clk_out_rate);
        if (err < 0) {
-               dev_err(card->dev, "Can't configure clocks\n");
+               dev_err(card->dev,
+               "Can't configure clocks clk_rate %dHz pll_a %dHz clk_out %dHz\n",
+               clk_rate, mclk, clk_out_rate);
                return err;
        }
 
        err = tegra210_xbar_set_clock(mclk);
        if (err < 0) {
-               dev_err(card->dev, "Can't configure xbar clock = %d Hz\n", mclk);
+               dev_err(card->dev,
+                       "Can't configure xbar clock = %d Hz\n", mclk);
                return err;
        }
 
@@ -327,6 +330,37 @@ static void tegra_t210ref_shutdown(struct snd_pcm_substream *substream)
        return;
 }
 
+static int tegra_t210ref_compr_set_params(struct snd_compr_stream *cstream)
+{
+       struct snd_soc_pcm_runtime *rtd = cstream->private_data;
+       struct snd_soc_card *card = rtd->card;
+       struct snd_soc_platform *platform = rtd->platform;
+       struct snd_codec codec_params;
+       int err;
+
+       if (platform->driver->compr_ops &&
+               platform->driver->compr_ops->get_params) {
+               err = platform->driver->compr_ops->get_params(cstream,
+                       &codec_params);
+               if (err < 0) {
+                       dev_err(card->dev, "Failed to get compr params\n");
+                       return err;
+               }
+       } else {
+               dev_err(card->dev, "compr ops not set\n");
+               return -EINVAL;
+       }
+
+       err = tegra_t210ref_dai_init(rtd, codec_params.sample_rate,
+                       codec_params.ch_out, SNDRV_PCM_FMTBIT_S16_LE);
+       if (err < 0) {
+               dev_err(card->dev, "Failed dai init\n");
+               return err;
+       }
+
+       return 0;
+}
+
 static int tegra_t210ref_init(struct snd_soc_pcm_runtime *rtd)
 {
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
@@ -482,6 +516,10 @@ static struct snd_soc_ops tegra_t210ref_ops = {
        .shutdown = tegra_t210ref_shutdown,
 };
 
+static struct snd_soc_compr_ops tegra_t210ref_compr_ops = {
+       .set_params = tegra_t210ref_compr_set_params,
+};
+
 static const struct snd_soc_dapm_widget tegra_t210ref_dapm_widgets[] = {
        SND_SOC_DAPM_HP("x Headphone Jack", tegra_rt5639_event_hp),
        SND_SOC_DAPM_SPK("x Int Spk", tegra_rt5639_event_int_spk),
@@ -697,13 +735,20 @@ static int tegra_t210ref_driver_probe(struct platform_device *pdev)
        tegra_machine_set_dai_init(TEGRA210_DAI_LINK_SFC1_RX,
                &tegra_t210ref_sfc_init);
 
-       /* set ADSP PCM/COMPR */
+       /* set ADSP PCM */
        for (i = TEGRA210_DAI_LINK_ADSP_PCM1;
-               i <= TEGRA210_DAI_LINK_ADSP_COMPR2; i++) {
+               i <= TEGRA210_DAI_LINK_ADSP_PCM2; i++) {
                tegra_machine_set_dai_ops(i,
                        &tegra_t210ref_ops);
        }
 
+       /* set ADSP COMPR */
+       for (i = TEGRA210_DAI_LINK_ADSP_COMPR1;
+               i <= TEGRA210_DAI_LINK_ADSP_COMPR2; i++) {
+               tegra_machine_set_dai_compr_ops(i,
+                       &tegra_t210ref_compr_ops);
+       }
+
        /* append t210ref specific dai_links */
        card->num_links =
                tegra_machine_append_dai_link(tegra_t210ref_codec_links,
index ba6721e1c094ff795b2be986b6e1e0a5c2d12a97..fed76f84df69cfb6f13a3749029af389fc277cfa 100644 (file)
@@ -781,8 +781,11 @@ static int tegra_t210ref_driver_probe(struct platform_device *pdev)
                tegra_machine_set_dai_ops(i, &tegra_t210ref_ops);
 
        /* set ADSP PCM */
-       tegra_machine_set_dai_ops(TEGRA210_DAI_LINK_ADSP_PCM1,
+       for (i = TEGRA210_DAI_LINK_ADSP_PCM1;
+               i <= TEGRA210_DAI_LINK_ADSP_PCM2; i++) {
+               tegra_machine_set_dai_ops(i,
                        &tegra_t210ref_ops);
+       }
 
        /* set ADSP COMPR */
        for (i = TEGRA210_DAI_LINK_ADSP_COMPR1;
index 1c471d0bd390c33b2dcf33f4bf34d70b849f4174..5b05bed685d330449142a26d625a715936253927 100644 (file)
@@ -237,8 +237,8 @@ static int tegra_t210ref_dai_init(struct snd_soc_pcm_runtime *rtd,
                                clk_rate, mclk, clk_out_rate);
        if (err < 0) {
                dev_err(card->dev,
-               "Can't configure clocks pll_a = %d Hz clk_out = %d Hz\n",
-               mclk, clk_out_rate);
+               "Can't configure clocks clk_rate %dHz pll_a %dHz clk_out %dHz\n",
+               clk_rate, mclk, clk_out_rate);
                return err;
        }
 
@@ -333,6 +333,37 @@ static int tegra_t210ref_hw_params(struct snd_pcm_substream *substream,
        return 0;
 }
 
+static int tegra_t210ref_compr_set_params(struct snd_compr_stream *cstream)
+{
+       struct snd_soc_pcm_runtime *rtd = cstream->private_data;
+       struct snd_soc_card *card = rtd->card;
+       struct snd_soc_platform *platform = rtd->platform;
+       struct snd_codec codec_params;
+       int err;
+
+       if (platform->driver->compr_ops &&
+               platform->driver->compr_ops->get_params) {
+               err = platform->driver->compr_ops->get_params(cstream,
+                       &codec_params);
+               if (err < 0) {
+                       dev_err(card->dev, "Failed to get compr params\n");
+                       return err;
+               }
+       } else {
+               dev_err(card->dev, "compr ops not set\n");
+               return -EINVAL;
+       }
+
+       err = tegra_t210ref_dai_init(rtd, codec_params.sample_rate,
+                       codec_params.ch_out, SNDRV_PCM_FMTBIT_S16_LE);
+       if (err < 0) {
+               dev_err(card->dev, "Failed dai init\n");
+               return err;
+       }
+
+       return 0;
+}
+
 static int tegra_t210ref_init(struct snd_soc_pcm_runtime *rtd)
 {
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
@@ -486,6 +517,10 @@ static struct snd_soc_ops tegra_t210ref_ops = {
        .shutdown = tegra_t210ref_shutdown,
 };
 
+static struct snd_soc_compr_ops tegra_t210ref_compr_ops = {
+       .set_params = tegra_t210ref_compr_set_params,
+};
+
 static const struct snd_soc_dapm_widget tegra_t210ref_dapm_widgets[] = {
        SND_SOC_DAPM_HP("x Headphone Jack", tegra_rt565x_event_hp),
        SND_SOC_DAPM_SPK("x Int Spk", tegra_rt565x_event_int_spk),
@@ -720,13 +755,20 @@ static void dai_link_setup(struct platform_device *pdev, int dummy)
        tegra_machine_set_dai_init(TEGRA210_DAI_LINK_SFC1_RX,
                &tegra_t210ref_sfc_init);
 
-       /* set ADSP PCM/COMPR */
+       /* set ADSP PCM */
        for (i = TEGRA210_DAI_LINK_ADSP_PCM1;
-               i <= TEGRA210_DAI_LINK_ADSP_COMPR2; i++) {
+               i <= TEGRA210_DAI_LINK_ADSP_PCM2; i++) {
                tegra_machine_set_dai_ops(i,
                        &tegra_t210ref_ops);
        }
 
+       /* set ADSP COMPR */
+       for (i = TEGRA210_DAI_LINK_ADSP_COMPR1;
+               i <= TEGRA210_DAI_LINK_ADSP_COMPR2; i++) {
+               tegra_machine_set_dai_compr_ops(i,
+                       &tegra_t210ref_compr_ops);
+       }
+
        /* append t210ref specific dai_links */
        card->num_links =
                tegra_machine_append_dai_link(tegra_t210ref_codec_links,