diff options
author | Sumit Bhattacharya <sumitb@nvidia.com> | 2011-11-05 03:33:32 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:50:11 -0800 |
commit | 135988d13cd15ad9ab710999f10e5f129dd8eafa (patch) | |
tree | 2a64eaee03979ca376e029ea425e410f6bc7e81f /sound/soc/tegra/tegra_wm8753.c | |
parent | 0090dc29d03826cf7783df07970ccee0feaf1c45 (diff) |
ASoC: tegra wm8753 machine: Add suppport for Tegra20 BT SCO
Add a new dai-link interface to wm8753 machine driver which can be
used for BT SCO playback and record on Tegra20. Also add code to
program Tegra20 DAS controller depending on active dai-link.
Bug 872652
Change-Id: I777b0c4806c05217c3ce89591e5d14ff2b4dcd7c
Signed-off-by: Sumit Bhattacharya <sumitb@nvidia.com>
Reviewed-on: http://git-master/r/64439
Tested-by: Gerrit_Virtual_Submit
Reviewed-by: Scott Peterson <speterson@nvidia.com>
Rebase-Id: R08f0e7c075a874481cd97727d7b27011eba684c5
Diffstat (limited to 'sound/soc/tegra/tegra_wm8753.c')
-rw-r--r-- | sound/soc/tegra/tegra_wm8753.c | 108 |
1 files changed, 107 insertions, 1 deletions
diff --git a/sound/soc/tegra/tegra_wm8753.c b/sound/soc/tegra/tegra_wm8753.c index 468566576276..6997220794b4 100644 --- a/sound/soc/tegra/tegra_wm8753.c +++ b/sound/soc/tegra/tegra_wm8753.c @@ -49,6 +49,10 @@ #include "tegra_pcm.h" #include "tegra_asoc_utils.h" +#ifdef CONFIG_ARCH_TEGRA_2x_SOC +#include "tegra20_das.h" +#endif + #define DRV_NAME "tegra-snd-wm8753" #define GPIO_SPKR_EN BIT(0) @@ -137,6 +141,92 @@ static int tegra_wm8753_hw_params(struct snd_pcm_substream *substream, return err; } +#ifdef CONFIG_ARCH_TEGRA_2x_SOC + err = tegra20_das_connect_dac_to_dap(TEGRA20_DAS_DAP_SEL_DAC1, + TEGRA20_DAS_DAP_ID_1); + if (err < 0) { + dev_err(card->dev, "failed to set dap-dac path\n"); + return err; + } + + err = tegra20_das_connect_dap_to_dac(TEGRA20_DAS_DAP_ID_1, + TEGRA20_DAS_DAP_SEL_DAC1); + if (err < 0) { + dev_err(card->dev, "failed to set dac-dap path\n"); + return err; + } +#endif + return 0; +} + +static int tegra_bt_sco_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct snd_soc_codec *codec = rtd->codec; + struct snd_soc_card *card = codec->card; + struct tegra_wm8753 *machine = snd_soc_card_get_drvdata(card); + int srate, mclk, min_mclk; + int err; + + srate = params_rate(params); + switch (srate) { + case 11025: + case 22050: + case 44100: + case 88200: + mclk = 11289600; + break; + case 8000: + case 16000: + case 32000: + case 48000: + case 64000: + case 96000: + mclk = 12288000; + break; + default: + return -EINVAL; + } + min_mclk = 64 * srate; + + err = tegra_asoc_utils_set_rate(&machine->util_data, srate, mclk); + if (err < 0) { + if (!(machine->util_data.set_mclk % min_mclk)) + mclk = machine->util_data.set_mclk; + else { + dev_err(card->dev, "Can't configure clocks\n"); + return err; + } + } + + tegra_asoc_utils_lock_clk_rate(&machine->util_data, 1); + + err = snd_soc_dai_set_fmt(cpu_dai, + SND_SOC_DAIFMT_DSP_A | + SND_SOC_DAIFMT_NB_NF | + SND_SOC_DAIFMT_CBS_CFS); + if (err < 0) { + dev_err(card->dev, "cpu_dai fmt not set\n"); + return err; + } + +#ifdef CONFIG_ARCH_TEGRA_2x_SOC + err = tegra20_das_connect_dac_to_dap(TEGRA20_DAS_DAP_SEL_DAC2, + TEGRA20_DAS_DAP_ID_4); + if (err < 0) { + dev_err(card->dev, "failed to set dac-dap path\n"); + return err; + } + + err = tegra20_das_connect_dap_to_dac(TEGRA20_DAS_DAP_ID_4, + TEGRA20_DAS_DAP_SEL_DAC2); + if (err < 0) { + dev_err(card->dev, "failed to set dac-dap path\n"); + return err; + } +#endif return 0; } @@ -200,6 +290,11 @@ static struct snd_soc_ops tegra_wm8753_ops = { .hw_free = tegra_hw_free, }; +static struct snd_soc_ops tegra_bt_sco_ops = { + .hw_params = tegra_bt_sco_hw_params, + .hw_free = tegra_hw_free, +}; + static struct snd_soc_ops tegra_spdif_ops = { .hw_params = tegra_spdif_hw_params, .hw_free = tegra_hw_free, @@ -407,7 +502,18 @@ static struct snd_soc_dai_link tegra_wm8753_dai[] = { .cpu_dai_name = "tegra20-spdif", .codec_dai_name = "dit-hifi", .ops = &tegra_spdif_ops, - } + }, +#ifdef CONFIG_ARCH_TEGRA_2x_SOC + { + .name = "BT-SCO", + .stream_name = "BT SCO PCM", + .codec_name = "spdif-dit.1", + .platform_name = "tegra-pcm-audio", + .cpu_dai_name = "tegra20-i2s.1", + .codec_dai_name = "dit-hifi", + .ops = &tegra_bt_sco_ops, + }, +#endif }; static struct snd_soc_card snd_soc_tegra_wm8753 = { |