diff options
Diffstat (limited to 'sound/soc/tegra/tegra_soc_wm8903.c')
-rw-r--r-- | sound/soc/tegra/tegra_soc_wm8903.c | 57 |
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", |