Mark,
On 09/03/2014 05:17 PM, Peter Ujfalusi wrote:
We need to take into account the slot size as well when calculating the RROT for received data. This patch will fix S24_3LE audio capture.
Can you wait a bit, I need to test something with this patch...
Signed-off-by: Peter Ujfalusi peter.ujfalusi@ti.com
sound/soc/davinci/davinci-mcasp.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 6a6b2ff7d7d7..267cd4937c7c 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c @@ -463,11 +463,11 @@ static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id, }
static int davinci_config_channel_size(struct davinci_mcasp *mcasp,
int word_length)
int slot_size, int word_length)
{ u32 fmt; u32 tx_rotate = (word_length / 4) & 0x7;
- u32 rx_rotate = (32 - word_length) / 4;
u32 rx_rotate = (slot_size - word_length) / 4; u32 mask = (1ULL << word_length) - 1;
/*
@@ -726,7 +726,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(cpu_dai); struct davinci_pcm_dma_params *dma_params = &mcasp->dma_params[substream->stream];
- int word_length;
- int word_length, slot_size; int channels = params_channels(params); int period_size = params_period_size(params); int ret;
@@ -766,31 +766,32 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, case SNDRV_PCM_FORMAT_U8: case SNDRV_PCM_FORMAT_S8: dma_params->data_type = 1;
word_length = 8;
slot_size = word_length = 8;
break;
case SNDRV_PCM_FORMAT_U16_LE: case SNDRV_PCM_FORMAT_S16_LE: dma_params->data_type = 2;
word_length = 16;
slot_size = word_length = 16;
break;
case SNDRV_PCM_FORMAT_U24_3LE: case SNDRV_PCM_FORMAT_S24_3LE: dma_params->data_type = 3;
word_length = 24;
slot_size = word_length = 24;
break;
case SNDRV_PCM_FORMAT_U24_LE: case SNDRV_PCM_FORMAT_S24_LE: dma_params->data_type = 4; word_length = 24;
slot_size = 32;
break;
case SNDRV_PCM_FORMAT_U32_LE: case SNDRV_PCM_FORMAT_S32_LE: dma_params->data_type = 4;
word_length = 32;
slot_size = word_length = 32;
break;
default:
@@ -803,7 +804,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream, else dma_params->acnt = dma_params->data_type;
- davinci_config_channel_size(mcasp, word_length);
davinci_config_channel_size(mcasp, slot_size, word_length);
return 0;
}