diff options
author | ScottPeterson <speterson@nvidia.com> | 2012-11-01 18:28:17 -0700 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-11-23 02:59:57 -0800 |
commit | f13a50a46208127db487346826a635450f5898c6 (patch) | |
tree | 034e5555b95254b98728292f8760b2050f20d6a6 /sound | |
parent | 32b2d33e41df0ea50de47597cf85ef86ee3776ac (diff) |
asoc: tegra: Voice call with cs42l73 ASP+VSP support
Using cs42l73 VSP audio port for voice call in pluto
Bug 1056501
Change-Id: I58697b1a08f5e2d1199da5255d1ff086367ad23c
Signed-off-by: ScottPeterson <speterson@nvidia.com>
Signed-off-by: Rahul Mittal <rmittal@nvidia.com>
Reviewed-on: http://git-master/r/162574
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/tegra/tegra30_i2s.c | 193 | ||||
-rw-r--r-- | sound/soc/tegra/tegra30_i2s.h | 7 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_aic326x.c | 4 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_cs42l73.c | 35 | ||||
-rw-r--r-- | sound/soc/tegra/tegra_max98088.c | 4 |
5 files changed, 148 insertions, 95 deletions
diff --git a/sound/soc/tegra/tegra30_i2s.c b/sound/soc/tegra/tegra30_i2s.c index e4defa280914..cf11d9e861a8 100644 --- a/sound/soc/tegra/tegra30_i2s.c +++ b/sound/soc/tegra/tegra30_i2s.c @@ -184,6 +184,7 @@ int tegra30_i2s_startup(struct snd_pcm_substream *substream, TEGRA30_AHUB_RXCIF_I2S0_RX0 + i2s->id, i2s->txcif); } else { + i2s->capture_ref_count++; ret = tegra30_ahub_allocate_rx_fifo(&i2s->rxcif, &i2s->capture_dma_data.addr, &i2s->capture_dma_data.req_sel); @@ -216,8 +217,10 @@ void tegra30_i2s_shutdown(struct snd_pcm_substream *substream, /* decrement the playback ref count */ i2s->playback_ref_count--; } else { - tegra30_ahub_unset_rx_cif_source(i2s->rxcif); + if (i2s->capture_ref_count == 1) + tegra30_ahub_unset_rx_cif_source(i2s->rxcif); tegra30_ahub_free_rx_fifo(i2s->rxcif); + i2s->capture_ref_count--; } tegra30_i2s_disable_clocks(i2s); @@ -279,7 +282,6 @@ static int tegra30_i2s_set_fmt(struct snd_soc_dai *dai, default: return -EINVAL; } - return 0; } @@ -738,7 +740,6 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, break; } } - switch (i2s->daifmt) { case SND_SOC_DAIFMT_RIGHT_J: val = 0; @@ -756,7 +757,6 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, default: return -EINVAL; } - val = (val << TEGRA30_I2S_OFFSET_RX_DATA_OFFSET_SHIFT) | (val << TEGRA30_I2S_OFFSET_TX_DATA_OFFSET_SHIFT); tegra30_i2s_write(i2s, TEGRA30_I2S_OFFSET, val); @@ -781,7 +781,6 @@ static int tegra30_i2s_hw_params(struct snd_pcm_substream *substream, tegra30_i2s_write(i2s, TEGRA30_I2S_SLOT_CTRL, val); tegra30_i2s_disable_clocks(i2s); - return 0; } @@ -811,7 +810,7 @@ static void tegra30_i2s_stop_playback(struct tegra30_i2s *i2s) static void tegra30_i2s_start_capture(struct tegra30_i2s *i2s) { tegra30_ahub_enable_rx_fifo(i2s->rxcif); - if (!i2s->is_call_mode_rec) { + if (!i2s->is_call_mode_rec && (i2s->capture_ref_count == 1)) { i2s->reg_ctrl |= TEGRA30_I2S_CTRL_XFER_EN_RX; tegra30_i2s_write(i2s, TEGRA30_I2S_CTRL, i2s->reg_ctrl); } @@ -820,13 +819,14 @@ static void tegra30_i2s_start_capture(struct tegra30_i2s *i2s) static void tegra30_i2s_stop_capture(struct tegra30_i2s *i2s) { int dcnt = 10; - tegra30_ahub_disable_rx_fifo(i2s->rxcif); - if (!i2s->is_call_mode_rec) { + if (!i2s->is_call_mode_rec && (i2s->capture_ref_count == 1)) { + tegra30_ahub_disable_rx_fifo(i2s->rxcif); i2s->reg_ctrl &= ~TEGRA30_I2S_CTRL_XFER_EN_RX; tegra30_i2s_write(i2s, TEGRA30_I2S_CTRL, i2s->reg_ctrl); + while (tegra30_ahub_rx_fifo_is_enabled(i2s->id) && dcnt--) + udelay(100); } - while (tegra30_ahub_rx_fifo_is_enabled(i2s->id) && dcnt--) - udelay(100); + } static int tegra30_i2s_trigger(struct snd_pcm_substream *substream, int cmd, @@ -1119,11 +1119,15 @@ static int configure_dam(struct tegra30_i2s *i2s, int out_channel, #endif #ifndef CONFIG_ARCH_TEGRA_3x_SOC - tegra30_dam_write_coeff_ram(i2s->dam_ifc, in_rate, out_rate); - tegra30_dam_set_farrow_param(i2s->dam_ifc, in_rate, out_rate); - tegra30_dam_set_biquad_fixed_coef(i2s->dam_ifc); - tegra30_dam_enable_coeff_ram(i2s->dam_ifc); - tegra30_dam_set_filter_stages(i2s->dam_ifc, in_rate, out_rate); + if (in_rate != out_rate) { + tegra30_dam_write_coeff_ram(i2s->dam_ifc, in_rate, out_rate); + tegra30_dam_set_farrow_param(i2s->dam_ifc, in_rate, out_rate); + tegra30_dam_set_biquad_fixed_coef(i2s->dam_ifc); + tegra30_dam_enable_coeff_ram(i2s->dam_ifc); + tegra30_dam_set_filter_stages(i2s->dam_ifc, in_rate, out_rate); + } else { + tegra30_dam_enable_stereo_mixing(i2s->dam_ifc); + } #endif return 0; @@ -1131,7 +1135,8 @@ static int configure_dam(struct tegra30_i2s *i2s, int out_channel, int tegra30_make_voice_call_connections(struct codec_config *codec_info, - struct codec_config *bb_info) + struct codec_config *bb_info, + int uses_voice_codec) { struct tegra30_i2s *codec_i2s; struct tegra30_i2s *bb_i2s; @@ -1142,6 +1147,8 @@ int tegra30_make_voice_call_connections(struct codec_config *codec_info, /* increment the codec i2s playback ref count */ codec_i2s->playback_ref_count++; bb_i2s->playback_ref_count++; + codec_i2s->capture_ref_count++; + bb_i2s->capture_ref_count++; /*Configure codec i2s*/ configure_baseband_i2s(codec_i2s, codec_info->is_i2smaster, @@ -1153,41 +1160,55 @@ int tegra30_make_voice_call_connections(struct codec_config *codec_info, bb_info->is_format_dsp, bb_info->channels, bb_info->rate, bb_info->bitsize); - /*configure codec dam*/ - configure_dam(codec_i2s, codec_info->channels, - codec_info->rate, codec_info->bitsize, bb_info->channels, - bb_info->rate, bb_info->bitsize); + if (uses_voice_codec) { + /* The following two lines are a hack */ + tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_APBIF_RX0); + tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0+1); - /*configure bb dam*/ - configure_dam(bb_i2s, bb_info->channels, - bb_info->rate, bb_info->bitsize, codec_info->channels, - codec_info->rate, codec_info->bitsize); + tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 + + bb_info->i2s_id, TEGRA30_AHUB_TXCIF_I2S0_TX0 + + codec_info->i2s_id); + tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 + + codec_info->i2s_id, TEGRA30_AHUB_TXCIF_I2S0_TX0 + + bb_info->i2s_id); + } else { - /*make ahub connections*/ + /*configure codec dam*/ + configure_dam(codec_i2s, codec_info->channels, + codec_info->rate, codec_info->bitsize, bb_info->channels, + bb_info->rate, bb_info->bitsize); + + /*configure bb dam*/ + configure_dam(bb_i2s, bb_info->channels, + bb_info->rate, bb_info->bitsize, codec_info->channels, + codec_info->rate, codec_info->bitsize); + + /*make ahub connections*/ + + /*if this is the only user of i2s tx, make i2s rx connection*/ + if (codec_i2s->playback_ref_count == 1) { + tegra30_ahub_set_rx_cif_source( + TEGRA30_AHUB_RXCIF_I2S0_RX0 + codec_info->i2s_id, + TEGRA30_AHUB_TXCIF_DAM0_TX0 + codec_i2s->dam_ifc); + } - /* if this is the only user of i2s tx then make ahub i2s rx connection*/ - if (codec_i2s->playback_ref_count == 1) { tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 + - codec_info->i2s_id, TEGRA30_AHUB_TXCIF_DAM0_TX0 + - codec_i2s->dam_ifc); + bb_info->i2s_id, TEGRA30_AHUB_TXCIF_DAM0_TX0 + + bb_i2s->dam_ifc); + tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 + + (codec_i2s->dam_ifc*2), TEGRA30_AHUB_TXCIF_I2S0_TX0 + + bb_info->i2s_id); + tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 + + (bb_i2s->dam_ifc*2), TEGRA30_AHUB_TXCIF_I2S0_TX0 + + codec_info->i2s_id); + + /*enable dam and i2s*/ + tegra30_dam_enable(codec_i2s->dam_ifc, TEGRA30_DAM_ENABLE, + TEGRA30_DAM_CHIN0_SRC); + tegra30_dam_enable(bb_i2s->dam_ifc, TEGRA30_DAM_ENABLE, + TEGRA30_DAM_CHIN0_SRC); } - tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 + - bb_info->i2s_id, TEGRA30_AHUB_TXCIF_DAM0_TX0 + - bb_i2s->dam_ifc); - tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 + - (codec_i2s->dam_ifc*2), TEGRA30_AHUB_TXCIF_I2S0_TX0 + - bb_info->i2s_id); - tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 + - (bb_i2s->dam_ifc*2), TEGRA30_AHUB_TXCIF_I2S0_TX0 + - codec_info->i2s_id); - - /*enable dam and i2s*/ - tegra30_dam_enable(codec_i2s->dam_ifc, TEGRA30_DAM_ENABLE, - TEGRA30_DAM_CHIN0_SRC); - tegra30_dam_enable(bb_i2s->dam_ifc, TEGRA30_DAM_ENABLE, - TEGRA30_DAM_CHIN0_SRC); - codec_i2s->reg_ctrl |= TEGRA30_I2S_CTRL_XFER_EN_TX; codec_i2s->reg_ctrl |= TEGRA30_I2S_CTRL_XFER_EN_RX; tegra30_i2s_write(codec_i2s, TEGRA30_I2S_CTRL, @@ -1202,7 +1223,8 @@ int tegra30_make_voice_call_connections(struct codec_config *codec_info, } int tegra30_break_voice_call_connections(struct codec_config *codec_info, - struct codec_config *bb_info) + struct codec_config *bb_info, + int uses_voice_codec) { struct tegra30_i2s *codec_i2s; struct tegra30_i2s *bb_i2s; @@ -1212,7 +1234,9 @@ int tegra30_break_voice_call_connections(struct codec_config *codec_info, bb_i2s = &i2scont[bb_info->i2s_id]; /*Disable Codec I2S RX (TX to ahub)*/ - codec_i2s->reg_ctrl &= ~TEGRA30_I2S_CTRL_XFER_EN_RX; + if (codec_i2s->capture_ref_count == 1) + codec_i2s->reg_ctrl &= ~TEGRA30_I2S_CTRL_XFER_EN_RX; + tegra30_i2s_write(codec_i2s, TEGRA30_I2S_CTRL, codec_i2s->reg_ctrl); while (tegra30_ahub_rx_fifo_is_enabled(codec_i2s->id) && dcnt--) @@ -1220,14 +1244,6 @@ int tegra30_break_voice_call_connections(struct codec_config *codec_info, dcnt = 10; - /*Disable baseband DAM*/ - tegra30_dam_enable(bb_i2s->dam_ifc, TEGRA30_DAM_DISABLE, - TEGRA30_DAM_CHIN0_SRC); - tegra30_dam_free_channel(bb_i2s->dam_ifc, TEGRA30_DAM_CHIN0_SRC); - bb_i2s->dam_ch_refcount--; - if (!bb_i2s->dam_ch_refcount) - tegra30_dam_free_controller(bb_i2s->dam_ifc); - /*Disable baseband I2S TX (RX from ahub)*/ bb_i2s->reg_ctrl &= ~TEGRA30_I2S_CTRL_XFER_EN_TX; tegra30_i2s_write(bb_i2s, TEGRA30_I2S_CTRL, bb_i2s->reg_ctrl); @@ -1246,15 +1262,6 @@ int tegra30_break_voice_call_connections(struct codec_config *codec_info, dcnt = 10; - /*Disable Codec DAM*/ - tegra30_dam_enable(codec_i2s->dam_ifc, - TEGRA30_DAM_DISABLE, TEGRA30_DAM_CHIN0_SRC); - tegra30_dam_free_channel(codec_i2s->dam_ifc, - TEGRA30_DAM_CHIN0_SRC); - codec_i2s->dam_ch_refcount--; - if (!codec_i2s->dam_ch_refcount) - tegra30_dam_free_controller(codec_i2s->dam_ifc); - /*Disable Codec I2S TX (RX from ahub)*/ if (codec_i2s->playback_ref_count == 1) codec_i2s->reg_ctrl &= ~TEGRA30_I2S_CTRL_XFER_EN_TX; @@ -1266,30 +1273,58 @@ int tegra30_break_voice_call_connections(struct codec_config *codec_info, dcnt = 10; - /* Disconnect the ahub connections */ - /* If this is the only user of i2s tx then break ahub - i2s rx connection */ - if (codec_i2s->playback_ref_count == 1) - tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 - + codec_info->i2s_id); + if (uses_voice_codec) { + tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 + + bb_info->i2s_id); + tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 + + codec_info->i2s_id); + } else { + + /*Disable baseband DAM*/ + tegra30_dam_enable(bb_i2s->dam_ifc, TEGRA30_DAM_DISABLE, + TEGRA30_DAM_CHIN0_SRC); + tegra30_dam_free_channel(bb_i2s->dam_ifc, + TEGRA30_DAM_CHIN0_SRC); + bb_i2s->dam_ch_refcount--; + if (!bb_i2s->dam_ch_refcount) + tegra30_dam_free_controller(bb_i2s->dam_ifc); + + /*Disable Codec DAM*/ + tegra30_dam_enable(codec_i2s->dam_ifc, + TEGRA30_DAM_DISABLE, TEGRA30_DAM_CHIN0_SRC); + tegra30_dam_free_channel(codec_i2s->dam_ifc, + TEGRA30_DAM_CHIN0_SRC); + codec_i2s->dam_ch_refcount--; + if (!codec_i2s->dam_ch_refcount) + tegra30_dam_free_controller(codec_i2s->dam_ifc); + + /* Disconnect the ahub connections */ + /* If this is the only user of i2s tx then break ahub + i2s rx connection */ + if (codec_i2s->playback_ref_count == 1) + tegra30_ahub_unset_rx_cif_source( + TEGRA30_AHUB_RXCIF_I2S0_RX0 + codec_info->i2s_id); - tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 - + bb_info->i2s_id); - tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 - + (codec_i2s->dam_ifc*2)); - tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 - + (bb_i2s->dam_ifc*2)); + tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 + + bb_info->i2s_id); + tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 + + (codec_i2s->dam_ifc*2)); + tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 + + (bb_i2s->dam_ifc*2)); + + tegra30_dam_disable_clock(codec_i2s->dam_ifc); + tegra30_dam_disable_clock(bb_i2s->dam_ifc); + } /* Decrement the codec and bb i2s playback ref count */ codec_i2s->playback_ref_count--; bb_i2s->playback_ref_count--; + codec_i2s->capture_ref_count--; + bb_i2s->capture_ref_count--; /* Disable the clocks */ tegra30_i2s_disable_clocks(codec_i2s); tegra30_i2s_disable_clocks(bb_i2s); - tegra30_dam_disable_clock(codec_i2s->dam_ifc); - tegra30_dam_disable_clock(bb_i2s->dam_ifc); - return 0; } diff --git a/sound/soc/tegra/tegra30_i2s.h b/sound/soc/tegra/tegra30_i2s.h index 1163cd5b8c74..10fadc86ab29 100644 --- a/sound/soc/tegra/tegra30_i2s.h +++ b/sound/soc/tegra/tegra30_i2s.h @@ -266,6 +266,7 @@ struct tegra30_i2s { int dam_ifc; int dam_ch_refcount; int playback_ref_count; + int capture_ref_count; int daifmt; bool is_dam_used; #ifdef CONFIG_PM @@ -291,9 +292,11 @@ struct codec_config { }; int tegra30_make_voice_call_connections(struct codec_config *codec_info, - struct codec_config *bb_info); + struct codec_config *bb_info, + int uses_voice_codec); int tegra30_break_voice_call_connections(struct codec_config *codec_info, - struct codec_config *bb_info); + struct codec_config *bb_info, + int uses_voice_codec); #endif diff --git a/sound/soc/tegra/tegra_aic326x.c b/sound/soc/tegra/tegra_aic326x.c index 412066496827..568db228e8ca 100644 --- a/sound/soc/tegra/tegra_aic326x.c +++ b/sound/soc/tegra/tegra_aic326x.c @@ -168,7 +168,7 @@ static int tegra_aic326x_call_mode_put(struct snd_kcontrol *kcontrol, tegra30_make_voice_call_connections( &machine->codec_info[codec_index], - &machine->codec_info[BASEBAND]); + &machine->codec_info[BASEBAND], 0); #endif } else { #ifdef CONFIG_ARCH_TEGRA_2x_SOC @@ -183,7 +183,7 @@ static int tegra_aic326x_call_mode_put(struct snd_kcontrol *kcontrol, #else /*assumes tegra3*/ tegra30_break_voice_call_connections( &machine->codec_info[codec_index], - &machine->codec_info[BASEBAND]); + &machine->codec_info[BASEBAND], 0); for (i = 0; i < machine->pcard->num_links; i++) machine->pcard->dai_link[i].ignore_suspend = 0; diff --git a/sound/soc/tegra/tegra_cs42l73.c b/sound/soc/tegra/tegra_cs42l73.c index f239a9e76784..2cd901ca6d89 100644 --- a/sound/soc/tegra/tegra_cs42l73.c +++ b/sound/soc/tegra/tegra_cs42l73.c @@ -145,11 +145,11 @@ static int tegra_call_mode_put(struct snd_kcontrol *kcontrol, tegra30_make_voice_call_connections( &machine->codec_info[codec_index], - &machine->codec_info[BASEBAND]); + &machine->codec_info[BASEBAND], 1); } else { tegra30_break_voice_call_connections( &machine->codec_info[codec_index], - &machine->codec_info[BASEBAND]); + &machine->codec_info[BASEBAND], 1); for (i = 0; i < machine->pcard->num_links; i++) machine->pcard->dai_link[i].ignore_suspend = 0; @@ -307,9 +307,11 @@ static int tegra_cs42l73_hw_params(struct snd_pcm_substream *substream, } #ifndef CONFIG_ARCH_TEGRA_2x_SOC - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - tegra_cs42l73_set_dam_cif(i2s->dam_ifc, srate, - params_channels(params), sample_size, 0, 0, 0, 0); + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + if (i2s->dam_ifc) + tegra_cs42l73_set_dam_cif(i2s->dam_ifc, srate, + params_channels(params), sample_size, 0, 0, 0, 0); + } #endif return 0; @@ -448,9 +450,10 @@ static int tegra_bt_hw_params(struct snd_pcm_substream *substream, } #ifndef CONFIG_ARCH_TEGRA_2x_SOC - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) && + i2s->dam_ifc) tegra_cs42l73_set_dam_cif(i2s->dam_ifc, params_rate(params), - params_channels(params), sample_size, 0, 0, 0, 0); + params_channels(params), sample_size, 0, 0, 0, 0); #endif return 0; @@ -475,6 +478,7 @@ static int tegra_cs42l73_startup(struct snd_pcm_substream *substream) struct tegra_cs42l73 *machine = snd_soc_card_get_drvdata(rtd->card); struct codec_config *codec_info; struct codec_config *bb_info; + struct codec_config *hifi_info; int codec_index; if (!i2s->is_dam_used) @@ -505,7 +509,6 @@ static int tegra_cs42l73_startup(struct snd_pcm_substream *substream) tegra30_dam_enable(i2s->dam_ifc, TEGRA30_DAM_ENABLE, TEGRA30_DAM_CHIN1); } else { - i2s->is_call_mode_rec = machine->is_call_mode; if (!i2s->is_call_mode_rec) @@ -518,6 +521,7 @@ static int tegra_cs42l73_startup(struct snd_pcm_substream *substream) codec_info = &machine->codec_info[codec_index]; bb_info = &machine->codec_info[BASEBAND]; + hifi_info = &machine->codec_info[HIFI_CODEC]; /* allocate a dam for voice call recording */ @@ -535,7 +539,6 @@ static int tegra_cs42l73_startup(struct snd_pcm_substream *substream) bb_info->channels, bb_info->bitsize); /* setup the connections for voice call record */ - tegra30_ahub_unset_rx_cif_source(i2s->rxcif); tegra30_ahub_set_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 + (i2s->call_record_dam_ifc*2), @@ -582,7 +585,6 @@ static void tegra_cs42l73_shutdown(struct snd_pcm_substream *substream) if (!i2s->dam_ch_refcount) tegra30_dam_free_controller(i2s->dam_ifc); } else { - if (!i2s->is_call_mode_rec) return; @@ -619,6 +621,7 @@ static int tegra_voice_call_hw_params(struct snd_pcm_substream *substream, { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai *codec_dai = rtd->codec_dai; + 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_cs42l73 *machine = snd_soc_card_get_drvdata(card); @@ -697,6 +700,12 @@ static int tegra_voice_call_hw_params(struct snd_pcm_substream *substream, return err; } + err = snd_soc_dai_set_fmt(cpu_dai, i2s_daifmt); + if (err < 0) { + dev_err(card->dev, "cpu_dai fmt not set\n"); + return err; + } + err = snd_soc_dai_set_sysclk(codec_dai, 0, rate, SND_SOC_CLOCK_IN); if (err < 0) { dev_err(card->dev, "codec_dai clock not set\n"); @@ -1019,8 +1028,11 @@ static int tegra_cs42l73_init(struct snd_soc_pcm_runtime *rtd) int ret; #ifndef CONFIG_ARCH_TEGRA_2x_SOC + if (machine->codec_info[BASEBAND].i2s_id != -1) i2s->is_dam_used = true; + + i2s->is_dam_used = false; #endif if (machine->init_done) @@ -1309,6 +1321,9 @@ static __devinit int tegra_cs42l73_driver_probe(struct platform_device *pdev) tegra_cs42l73_dai[DAI_LINK_BTSCO].cpu_dai_name = tegra_cs42l73_i2s_dai_name[machine->codec_info[BT_SCO].i2s_id]; + + tegra_cs42l73_dai[DAI_LINK_VOICE_CALL].cpu_dai_name = + tegra_cs42l73_i2s_dai_name[machine->codec_info[VOICE_CODEC].i2s_id]; #endif card->dapm.idle_bias_off = 1; ret = snd_soc_register_card(card); diff --git a/sound/soc/tegra/tegra_max98088.c b/sound/soc/tegra/tegra_max98088.c index 500687dfb389..a704160ddd0a 100644 --- a/sound/soc/tegra/tegra_max98088.c +++ b/sound/soc/tegra/tegra_max98088.c @@ -142,13 +142,13 @@ static int tegra_call_mode_put(struct snd_kcontrol *kcontrol, tegra30_make_voice_call_connections( &machine->codec_info[codec_index], - &machine->codec_info[BASEBAND]); + &machine->codec_info[BASEBAND], 0); #endif } else { #ifndef CONFIG_ARCH_TEGRA_2x_SOC tegra30_break_voice_call_connections( &machine->codec_info[codec_index], - &machine->codec_info[BASEBAND]); + &machine->codec_info[BASEBAND], 0); for (i = 0; i < machine->pcard->num_links; i++) machine->pcard->dai_link[i].ignore_suspend = 0; |