summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra3_i2s.c
diff options
context:
space:
mode:
authorRavindra Lokhande <rlokhande@nvidia.com>2011-04-19 21:14:10 +0530
committerVarun Colbert <vcolbert@nvidia.com>2011-05-03 01:26:25 -0700
commite4053f8cd89cd522b2e111f9501ca1a2ebe91688 (patch)
tree7ec4693f5432621dcef175e71ef37e3e6c52ec0d /arch/arm/mach-tegra/tegra3_i2s.c
parent66d8ee30496eaab51c8514d52760a8e2e3f90628 (diff)
tegra alsa: Audio BT SCO support
added support for audio BT sco usecase. For BT sco, i2s is programmed in pcm mode. Change-Id: Iffcfb707cd2c025b78b82e70ba35f89d47a21263 Reviewed-on: http://git-master/r/30042 Reviewed-by: Ravindra Lokhande <rlokhande@nvidia.com> Tested-by: Ravindra Lokhande <rlokhande@nvidia.com> Reviewed-by: Vinod Gopalakrishnakurup <vinodg@nvidia.com> Reviewed-by: Scott Peterson <speterson@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/tegra3_i2s.c')
-rw-r--r--arch/arm/mach-tegra/tegra3_i2s.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/arch/arm/mach-tegra/tegra3_i2s.c b/arch/arm/mach-tegra/tegra3_i2s.c
index 70ecb15571fe..68c52ccadf5b 100644
--- a/arch/arm/mach-tegra/tegra3_i2s.c
+++ b/arch/arm/mach-tegra/tegra3_i2s.c
@@ -309,6 +309,11 @@ int i2s_set_bit_format(int ifc, unsigned fmt)
val |= I2S_CTRL_FRAME_FORMAT_LRCK;
} else { /*Dsp,Pcm,Tdm,Nw*/
val |= I2S_CTRL_FRAME_FORMAT_FSYNC;
+
+ i2s_set_fsync_width(ifc, 0);
+ i2s_set_edge_control(ifc, 1);
+ i2s_set_slot_control(ifc, AUDIO_TX_MODE, 0, 0x1);
+ i2s_set_slot_control(ifc, AUDIO_RX_MODE, 0, 0x1);
}
i2s_writel(ifc, val, I2S_CTRL_0);
@@ -389,6 +394,14 @@ int i2s_set_samplerate(int ifc, int samplerate)
return 0;
}
+int i2s_set_channels(int ifc, int channels)
+{
+ struct i2s_controller_info *info = &i2s_cont_info[ifc];
+
+ info->i2sprop.channels = channels;
+
+ return 0;
+}
/*
* I2s data offset
*/
@@ -728,14 +741,15 @@ static struct audio_cif audiocif;
int i2s_set_acif(int ifc, int fifo_mode, struct audio_cif *cifInfo)
{
struct audio_cif *tx_audio_cif = &audiocif;
+ struct i2s_controller_info *info = &i2s_cont_info[ifc];
/* set i2s audiocif */
/* setting base value for acif */
memset(tx_audio_cif, 0 , sizeof(struct audio_cif));
- tx_audio_cif->audio_channels = AUDIO_CHANNEL_2;
- tx_audio_cif->client_channels = AUDIO_CHANNEL_2;
- tx_audio_cif->audio_bits = AUDIO_BIT_SIZE_16;
- tx_audio_cif->client_bits = AUDIO_BIT_SIZE_16;
+ tx_audio_cif->audio_channels = info->i2sprop.channels;
+ tx_audio_cif->client_channels = info->i2sprop.channels;
+ tx_audio_cif->audio_bits = info->i2sprop.bit_size;
+ tx_audio_cif->client_bits = info->i2sprop.bit_size;
if (fifo_mode == AUDIO_TX_MODE)
audio_switch_set_acif((unsigned int)i2s_base[ifc] +
@@ -744,6 +758,9 @@ int i2s_set_acif(int ifc, int fifo_mode, struct audio_cif *cifInfo)
audio_switch_set_acif((unsigned int)i2s_base[ifc] +
I2S_AUDIOCIF_I2SRX_CTRL_0, tx_audio_cif);
+ apbif_set_pack_mode(i2s_get_apbif_channel(ifc, fifo_mode),
+ fifo_mode, info->i2sprop.fifo_fmt);
+
audio_apbif_set_acif(i2s_get_apbif_channel(ifc, fifo_mode),
fifo_mode, tx_audio_cif);