summaryrefslogtreecommitdiff
path: root/sound/soc/tegra/tegra_soc_wm8903.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/tegra/tegra_soc_wm8903.c')
-rw-r--r--sound/soc/tegra/tegra_soc_wm8903.c57
1 files changed, 30 insertions, 27 deletions
diff --git a/sound/soc/tegra/tegra_soc_wm8903.c b/sound/soc/tegra/tegra_soc_wm8903.c
index 883941c119c0..b7ab17e37d66 100644
--- a/sound/soc/tegra/tegra_soc_wm8903.c
+++ b/sound/soc/tegra/tegra_soc_wm8903.c
@@ -75,12 +75,12 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
struct snd_soc_codec *codec = codec_dai->codec;
- struct tegra_audio_data* audio_data = rtd->socdev->codec_data;
- enum dac_dap_data_format data_fmt;
int dai_flag = 0, sys_clk;
int err;
#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+ enum dac_dap_data_format data_fmt;
+
if (tegra_das_is_port_master(tegra_audio_codec_type_hifi))
dai_flag |= SND_SOC_DAIFMT_CBM_CFM;
else
@@ -109,7 +109,9 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream,
return err;
}
- sys_clk = clk_get_rate(audio_data->dap_mclk);
+ /*FIXME: not sure this is the right way.
+ This should be samplerate times 256 or 128 based on codec need*/
+ sys_clk = tegra_das_get_mclk_rate();
err = snd_soc_dai_set_sysclk(codec_dai, 0, sys_clk, SND_SOC_CLOCK_IN);
if (err < 0) {
pr_err("codec_dai clock not set\n");
@@ -198,7 +200,6 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream,
/* Enable ADC Digital volumes */
VolumeCtrlReg = ADC_DIGITAL_VOL_9DB;
- // voulme for single ended mic
snd_soc_write(codec, WM8903_ADC_DIGITAL_VOLUME_LEFT,
VolumeCtrlReg);
snd_soc_write(codec, WM8903_ADC_DIGITAL_VOLUME_RIGHT,
@@ -219,12 +220,12 @@ static int tegra_voice_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
- struct tegra_audio_data* audio_data = rtd->socdev->codec_data;
- enum dac_dap_data_format data_fmt;
int dai_flag = 0, sys_clk;
int err;
#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+ enum dac_dap_data_format data_fmt;
+
if (tegra_das_is_port_master(tegra_audio_codec_type_bluetooth))
dai_flag |= SND_SOC_DAIFMT_CBM_CFM;
else
@@ -253,7 +254,7 @@ static int tegra_voice_hw_params(struct snd_pcm_substream *substream,
return err;
}
- sys_clk = clk_get_rate(audio_data->dap_mclk);
+ sys_clk = tegra_das_get_mclk_rate();
err = snd_soc_dai_set_sysclk(codec_dai, 0, sys_clk, SND_SOC_CLOCK_IN);
if (err < 0) {
pr_err("cpu_dai clock not set\n");
@@ -294,20 +295,14 @@ int tegra_soc_suspend_pre(struct platform_device *pdev, pm_message_t state)
int tegra_soc_suspend_post(struct platform_device *pdev, pm_message_t state)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct tegra_audio_data* audio_data = socdev->codec_data;
-
- clk_disable(audio_data->dap_mclk);
+ tegra_das_disable_mclk();
return 0;
}
int tegra_soc_resume_pre(struct platform_device *pdev)
{
- struct snd_soc_device *socdev = platform_get_drvdata(pdev);
- struct tegra_audio_data* audio_data = socdev->codec_data;
-
- clk_enable(audio_data->dap_mclk);
+ tegra_das_enable_mclk();
return 0;
}
@@ -482,15 +477,20 @@ static int tegra_codec_init(struct snd_soc_codec *codec)
int err = 0;
if (!audio_data->init_done) {
-#ifdef CONFIG_ARCH_TEGRA_2x_SOC
- audio_data->dap_mclk = tegra_das_get_dap_mclk();
- if (!audio_data->dap_mclk) {
- pr_err("Failed to get dap mclk \n");
+
+ err = tegra_das_open();
+ if (err) {
+ pr_err(" Failed get dap mclk \n");
err = -ENODEV;
- return err;
+ goto wm8903_init_fail;
+ }
+
+ err = tegra_das_enable_mclk();
+ if (err) {
+ pr_err(" Failed to enable dap mclk \n");
+ err = -ENODEV;
+ goto wm8903_init_fail;
}
- clk_enable(audio_data->dap_mclk);
-#endif
/* Add tegra specific widgets */
snd_soc_dapm_new_controls(codec, tegra_dapm_widgets,
@@ -504,7 +504,7 @@ static int tegra_codec_init(struct snd_soc_codec *codec)
err = tegra_jack_init(codec);
if (err < 0) {
pr_err("Failed in jack init \n");
- return err;
+ goto wm8903_init_fail;
}
/* Default to OFF */
@@ -513,7 +513,7 @@ static int tegra_codec_init(struct snd_soc_codec *codec)
err = tegra_controls_init(codec);
if (err < 0) {
pr_err("Failed in controls init \n");
- return err;
+ goto wm8903_init_fail;
}
audio_data->codec = codec;
@@ -521,6 +521,12 @@ static int tegra_codec_init(struct snd_soc_codec *codec)
}
return err;
+
+wm8903_init_fail:
+
+ tegra_das_disable_mclk();
+ tegra_das_close();
+ return err;
}
@@ -548,9 +554,6 @@ static struct snd_soc_dai_link tegra_soc_dai[] = {
TEGRA_CREATE_SOC_DAI_LINK("Tegra-generic", "Tegra Generic Voice",
&tegra_i2s_dai[1], &tegra_generic_codec_dai[1],
&tegra_voice_ops),
- TEGRA_CREATE_SOC_DAI_LINK("Tegra-spdif", "Tegra Spdif",
- &tegra_spdif_dai, &tegra_generic_codec_dai[1],
- &tegra_spdif_ops),
#else
/* FIXME: enabled once these device are enumerated
TEGRA_CREATE_SOC_DAI_LINK("Tegra-generic-0", "Tegra BB Voice",