summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorVijay Mali <vmali@nvidia.com>2014-03-06 18:45:30 +0530
committerHarry Hong <hhong@nvidia.com>2014-03-10 17:35:26 -0700
commiteaaaeab92c01c127d0b98992ae0f3a5204d82d87 (patch)
tree5efab138f2a36c641d80cf94c70226fe7a13d609 /sound
parentb58564b21a0e1ce3972bc7c3e47522f5ed15b47d (diff)
Asoc: tegra: Fix audio mixing issue
There is hardware issue in t114 & t124 DAM. It does not handle mixing and down sampling simultaneously. This a work around to use 2 DAM for doing SRC and mixing separately. Bug 1472784 Change-Id: I67f04682b1807243800e757b548481928dd2720a Signed-off-by: Vijay Mali <vmali@nvidia.com> Reviewed-on: http://git-master/r/378389 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Lei Fan <leif@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Sumit Bhattacharya <sumitb@nvidia.com> Reviewed-by: Ravindra Lokhande <rlokhande@nvidia.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/tegra/tegra30_i2s.c73
1 files changed, 51 insertions, 22 deletions
diff --git a/sound/soc/tegra/tegra30_i2s.c b/sound/soc/tegra/tegra30_i2s.c
index ae9383ec8eb0..1e7bf00bf3cd 100644
--- a/sound/soc/tegra/tegra30_i2s.c
+++ b/sound/soc/tegra/tegra30_i2s.c
@@ -1883,44 +1883,62 @@ int tegra30_make_voice_call_connections(struct codec_config *codec_info,
return ret;
}
- ret = tegra30_dam_allocate_channel(codec_i2s->dam_ifc,
+ /*configure codec dam*/
+ ret = configure_dam(bb_i2s,
+ bb_info->channels,
+ bb_info->rate,
+ bb_info->bitsize,
+ codec_info->channels,
+ codec_info->rate,
+ codec_info->bitsize);
+
+ if (ret) {
+ pr_info("%s:Failed to configure dam\n", __func__);
+ return ret;
+ }
+
+ ret = tegra30_dam_allocate_channel(bb_i2s->dam_ifc,
TEGRA30_DAM_CHIN1);
if (ret)
pr_info("%s:Failed to allocate dam\n", __func__);
- tegra30_dam_set_gain(codec_i2s->dam_ifc,
+ tegra30_dam_set_gain(bb_i2s->dam_ifc,
TEGRA30_DAM_CHIN1, 0x1000);
- tegra30_dam_set_acif(codec_i2s->dam_ifc, TEGRA30_DAM_CHIN1, 1,
+ tegra30_dam_set_acif(bb_i2s->dam_ifc, TEGRA30_DAM_CHIN1, 1,
bb_info->bitsize, 1, 32);
- tegra30_dam_set_acif(codec_i2s->dam_ifc, TEGRA30_DAM_CHOUT,
+ tegra30_dam_set_acif(bb_i2s->dam_ifc, TEGRA30_DAM_CHOUT,
2, codec_info->bitsize, 1, 32);
- tegra30_dam_ch0_set_datasync(codec_i2s->dam_ifc, 2);
- tegra30_dam_ch1_set_datasync(codec_i2s->dam_ifc, 0);
+ tegra30_dam_ch0_set_datasync(bb_i2s->dam_ifc, 2);
+ tegra30_dam_ch1_set_datasync(bb_i2s->dam_ifc, 0);
/* do routing in ahub */
tegra30_ahub_set_rx_cif_source(
- TEGRA30_AHUB_RXCIF_DAM0_RX1 + (codec_i2s->dam_ifc*2),
- TEGRA30_AHUB_RXCIF_I2S0_RX0 + bb_info->i2s_id);
-
- tegra30_ahub_set_rx_cif_source(
TEGRA30_AHUB_RXCIF_DAM0_RX0 + (codec_i2s->dam_ifc*2),
codec_i2s->txcif);
tegra30_ahub_set_rx_cif_source(
- TEGRA30_AHUB_RXCIF_I2S0_RX0 + codec_info->i2s_id,
+ TEGRA30_AHUB_RXCIF_DAM0_RX0 + (bb_i2s->dam_ifc*2),
TEGRA30_AHUB_TXCIF_DAM0_TX0 + codec_i2s->dam_ifc);
tegra30_ahub_set_rx_cif_source(
+ TEGRA30_AHUB_RXCIF_DAM0_RX1 + (bb_i2s->dam_ifc*2),
+ TEGRA30_AHUB_TXCIF_I2S0_TX0 + bb_info->i2s_id);
+
+ tegra30_ahub_set_rx_cif_source(
+ TEGRA30_AHUB_RXCIF_I2S0_RX0 + codec_info->i2s_id,
+ TEGRA30_AHUB_TXCIF_DAM0_TX0 + bb_i2s->dam_ifc);
+
+ tegra30_ahub_set_rx_cif_source(
TEGRA30_AHUB_RXCIF_I2S0_RX0 + bb_info->i2s_id,
TEGRA30_AHUB_TXCIF_I2S0_TX0 + codec_info->i2s_id);
/* enable the dam*/
- tegra30_dam_enable(codec_i2s->dam_ifc, TEGRA30_DAM_ENABLE,
+ tegra30_dam_enable(bb_i2s->dam_ifc, TEGRA30_DAM_ENABLE,
TEGRA30_DAM_CHIN0_SRC);
-
+ tegra30_dam_enable(bb_i2s->dam_ifc, TEGRA30_DAM_ENABLE,
+ TEGRA30_DAM_CHIN1);
tegra30_dam_enable(codec_i2s->dam_ifc, TEGRA30_DAM_ENABLE,
- TEGRA30_DAM_CHIN1);
-
+ TEGRA30_DAM_CHIN0_SRC);
}
#ifndef CONFIG_ARCH_TEGRA_3x_SOC
tegra30_i2s_write(codec_i2s, TEGRA30_I2S_FLOWCTL, 0);
@@ -2033,17 +2051,27 @@ int tegra30_break_voice_call_connections(struct codec_config *codec_info,
} else {
/* Disable DAM in DL path */
- tegra30_dam_enable(codec_i2s->dam_ifc,
+ tegra30_dam_enable(bb_i2s->dam_ifc,
TEGRA30_DAM_DISABLE, TEGRA30_DAM_CHIN0_SRC);
- tegra30_dam_free_channel(codec_i2s->dam_ifc,
+ tegra30_dam_free_channel(bb_i2s->dam_ifc,
TEGRA30_DAM_CHIN0_SRC);
- tegra30_dam_enable(codec_i2s->dam_ifc,
+ tegra30_dam_enable(bb_i2s->dam_ifc,
TEGRA30_DAM_DISABLE, TEGRA30_DAM_CHIN1);
- tegra30_dam_free_channel(codec_i2s->dam_ifc,
+ tegra30_dam_free_channel(bb_i2s->dam_ifc,
TEGRA30_DAM_CHIN1);
+ 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);
+
+ bb_i2s->dam_ch_refcount--;
codec_i2s->dam_ch_refcount--;
+
+ if (!bb_i2s->dam_ch_refcount)
+ tegra30_dam_free_controller(bb_i2s->dam_ifc);
+
if (!codec_i2s->dam_ch_refcount)
tegra30_dam_free_controller(codec_i2s->dam_ifc);
@@ -2052,7 +2080,7 @@ int tegra30_break_voice_call_connections(struct codec_config *codec_info,
bb_info->i2s_id);
tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX1 +
- (codec_i2s->dam_ifc*2));
+ (bb_i2s->dam_ifc*2));
tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_DAM0_RX0 +
(codec_i2s->dam_ifc*2));
@@ -2060,9 +2088,10 @@ int tegra30_break_voice_call_connections(struct codec_config *codec_info,
tegra30_ahub_unset_rx_cif_source(TEGRA30_AHUB_RXCIF_I2S0_RX0 +
codec_info->i2s_id);
- tegra30_dam_ch0_set_datasync(codec_i2s->dam_ifc, 0);
- tegra30_dam_ch1_set_datasync(codec_i2s->dam_ifc, 0);
+ tegra30_dam_ch0_set_datasync(bb_i2s->dam_ifc, 0);
+ tegra30_dam_ch1_set_datasync(bb_i2s->dam_ifc, 0);
+ tegra30_dam_disable_clock(bb_i2s->dam_ifc);
tegra30_dam_disable_clock(codec_i2s->dam_ifc);
}