diff options
author | Sumit Bhattacharya <sumitb@nvidia.com> | 2011-08-17 20:42:04 +0530 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-08-17 16:31:41 -0700 |
commit | 5dad69f4ba09335773d42cd2d0b6c182dfd7cbf3 (patch) | |
tree | 36e668cf66e412a19ab7178341a1e55af6b1a065 /sound | |
parent | 9acc3efef732e9bb8c2bb835bba4d988073ff17f (diff) |
ASoC: tegra: Fix WM8753 soc code
Hardcode I2s bit clock to 2.8224 MHz for HIFI playback/capture
and to 512 kHz for Voice codec playback/capture to prevent
playback audio noise issue.
Fix the headphone detection reporting code.
Add all dai link connections supported by whistler in WM8753
dai link table.
Bug 864892
Change-Id: I4e3ed93c4f100aa7c7703ee6f505c51016a4e26b
Reviewed-on: http://git-master/r/47564
Tested-by: Sumit Bhattacharya <sumitb@nvidia.com>
Reviewed-by: Nikesh Oswal <noswal@nvidia.com>
Reviewed-by: Scott Peterson <speterson@nvidia.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/tegra/tegra_soc_wm8753.c | 70 |
1 files changed, 54 insertions, 16 deletions
diff --git a/sound/soc/tegra/tegra_soc_wm8753.c b/sound/soc/tegra/tegra_soc_wm8753.c index 3f341a92da46..137ef948f32b 100644 --- a/sound/soc/tegra/tegra_soc_wm8753.c +++ b/sound/soc/tegra/tegra_soc_wm8753.c @@ -129,6 +129,16 @@ /* Board Specific GPIO configuration for Whistler */ #define TEGRA_GPIO_PW3 179 +#define I2S_HIFI_SYS_CLK 2822400 +#define I2S_VOICE_SYS_CLK 512000 + +/* These values are copied from WiredAccessoryObserver */ +enum headset_state { + BIT_NO_HEADSET = 0, + BIT_HEADSET = (1 << 0), + BIT_HEADSET_NO_MIC = (1 << 1), +}; + static struct wm8753_headphone_jack { struct snd_jack *jack; @@ -167,10 +177,10 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream, data_fmt = tegra_das_get_codec_data_fmt(tegra_audio_codec_type_hifi); /* We are supporting DSP and I2s format for now */ - if (data_fmt & dac_dap_data_format_dsp) - dai_flag |= SND_SOC_DAIFMT_DSP_A; - else + if (data_fmt & dac_dap_data_format_i2s) dai_flag |= SND_SOC_DAIFMT_I2S; + else + dai_flag |= SND_SOC_DAIFMT_DSP_A; err = snd_soc_dai_set_fmt(codec_dai, dai_flag); if (err < 0) { @@ -192,7 +202,8 @@ static int tegra_hifi_hw_params(struct snd_pcm_substream *substream, return err; } - err = snd_soc_dai_set_sysclk(cpu_dai, 0, sys_clk, SND_SOC_CLOCK_IN); + err = snd_soc_dai_set_sysclk(cpu_dai, 0, + I2S_HIFI_SYS_CLK, SND_SOC_CLOCK_IN); if (err < 0) { pr_err("cpu_dai clock not set\n"); return err; @@ -322,13 +333,33 @@ static int tegra_voice_hw_params(struct snd_pcm_substream *substream, enum dac_dap_data_format data_fmt; struct audio_dev_property dev_prop; - if (tegra_das_is_port_master(tegra_audio_codec_type_bluetooth)) - dai_flag |= SND_SOC_DAIFMT_CBM_CFM; - else - dai_flag |= SND_SOC_DAIFMT_CBS_CFS; - - data_fmt = tegra_das_get_codec_data_fmt(tegra_audio_codec_type_bluetooth); + if (!strcmp(rtd->dai->stream_name, "Tegra BT Voice Call")) { + if (tegra_das_is_port_master(tegra_audio_codec_type_bluetooth)) + dai_flag |= SND_SOC_DAIFMT_CBM_CFM; + else + dai_flag |= SND_SOC_DAIFMT_CBS_CFS; + data_fmt = tegra_das_get_codec_data_fmt + (tegra_audio_codec_type_bluetooth); + } + else if (!strcmp(rtd->dai->stream_name, "Tegra Voice Call")) { + if (tegra_das_is_port_master(tegra_audio_codec_type_voice)) + dai_flag |= SND_SOC_DAIFMT_CBM_CFM; + else + dai_flag |= SND_SOC_DAIFMT_CBS_CFS; + + data_fmt = tegra_das_get_codec_data_fmt + (tegra_audio_codec_type_baseband); + } + else {/* Tegra BT-SCO Voice */ + if (tegra_das_is_port_master(tegra_audio_codec_type_bluetooth)) + dai_flag |= SND_SOC_DAIFMT_CBM_CFM; + else + dai_flag |= SND_SOC_DAIFMT_CBS_CFS; + + data_fmt = tegra_das_get_codec_data_fmt + (tegra_audio_codec_type_bluetooth); + } /* We are supporting DSP and I2s format for now */ if (data_fmt & dac_dap_data_format_i2s) dai_flag |= SND_SOC_DAIFMT_I2S; @@ -354,7 +385,8 @@ static int tegra_voice_hw_params(struct snd_pcm_substream *substream, return err; } - err = snd_soc_dai_set_sysclk(cpu_dai, 0, sys_clk, SND_SOC_CLOCK_IN); + err = snd_soc_dai_set_sysclk(cpu_dai, 0, + I2S_VOICE_SYS_CLK, SND_SOC_CLOCK_IN); if (err < 0) { pr_err("cpu_dai clock not set\n"); return err; @@ -546,12 +578,12 @@ static void wm8753_intr_work(struct work_struct *work) value = snd_soc_read(wm8753_jack->pcodec, WM8753_INTPOL); value &= WM8753_INTPOL_GPIO4IPOL; if ((value) & ((WM8753_INTPOL_GPIO4IPOL))) { - tegra_switch_set_state(SND_JACK_HEADPHONE); + tegra_switch_set_state(BIT_HEADSET_NO_MIC); snd_jack_report(wm8753_jack->jack, SND_JACK_HEADPHONE); value &= ~(WM8753_INTPOL_GPIO4IPOL); } else { - tegra_switch_set_state(0); + tegra_switch_set_state(BIT_NO_HEADSET); snd_jack_report(wm8753_jack->jack, 0); value |= (WM8753_INTPOL_GPIO4IPOL); } @@ -716,11 +748,17 @@ static struct snd_soc_dai_link tegra_soc_dai[] = { TEGRA_CREATE_SOC_DAI_LINK("WM8753", "WM8753 HiFi", &tegra_i2s_dai[0], &wm8753_dai[WM8753_DAI_HIFI], &tegra_hifi_ops), + TEGRA_CREATE_SOC_DAI_LINK("Tegra-Voice", "Tegra BT-SCO Voice", + &tegra_i2s_dai[1], &tegra_generic_codec_dai[2], + &tegra_voice_ops), TEGRA_CREATE_SOC_DAI_LINK("Tegra-spdif", "Tegra Spdif", &tegra_spdif_dai, &tegra_generic_codec_dai[0], - &tegra_spdif_ops), - TEGRA_CREATE_SOC_DAI_LINK("Tegra-generic", "Tegra Generic Voice", - &tegra_i2s_dai[1], &tegra_generic_codec_dai[2], + &tegra_voice_ops), + TEGRA_CREATE_SOC_DAI_LINK("Tegra-voice-call", "Tegra Voice Call", + &tegra_generic_codec_dai[1], &wm8753_dai[WM8753_DAI_VOICE], + &tegra_voice_ops), + TEGRA_CREATE_SOC_DAI_LINK("Tegra-bt-voice-call", "Tegra BT Voice Call", + &tegra_generic_codec_dai[1], &tegra_generic_codec_dai[2], &tegra_voice_ops), #endif }; |