Hi Vaibhav, Hi Daniel.
Daniel, thaks for comments, Vaibhav thanks for review! Please On Tuesday, March 05, 2013 17:01:59 Daniel Mack wrote:
I'll let Michal comment on the rest, as it's his work. Note though that v3 of this patch has already been applied to Mark's tree, but we can easily fix the details you mentioned with another patch.
This is part for me, so:
.rates = DAVINCI_MCASP_RATES, .formats = DAVINCI_MCASP_PCM_FMTS,
}, .capture = { .channels_min = 2,
.channels_max = 2,
.channels_max = 8,
Same here.
.rates = DAVINCI_MCASP_RATES, .formats = DAVINCI_MCASP_PCM_FMTS,
},
diff --git a/sound/soc/davinci/davinci-pcm.c b/sound/soc/davinci/davinci-pcm.c index bb57552..3af8b50 100644 --- a/sound/soc/davinci/davinci-pcm.c +++ b/sound/soc/davinci/davinci-pcm.c @@ -182,6 +182,7 @@ static void davinci_pcm_enqueue_dma(struct snd_pcm_substream *substream)>> unsigned short acnt; unsigned int count; unsigned int fifo_level;
- unsigned char serializers = prtd->params->active_serializers;
Can you please describe what DMA configuration you want? I think you can get rid of the active_serializers configuration by making use of tx_num_evt.>
period_size = snd_pcm_lib_period_bytes(substream); dma_offset = prtd->period * period_size;
@@ -195,14 +196,14 @@ static void davinci_pcm_enqueue_dma(struct snd_pcm_substream *substream)>> data_type = prtd->params->data_type; count = period_size / data_type; if (fifo_level)
count /= fifo_level;
count /= fifo_level * serializers;
I think there's a problem is the way in which tx_num_evt is interpreted in the current code. Instead of setting to fifo_level to tx_num_evt, if you set it to tx_num_evt * num_serializers you can get rid of the additional code to take care of the number of serializers.>
Yes, threre is misleading with tx_num_evt in DT. This misleading is discussed in [alsa-devel] davici-mcasp: "tx-num-evt" confusion with number of serializers. thread.
Also this code misleads fifo_level usage, so maybe that code can be upgraded.
In davinci-mcasp code, there is fifo_level defined as txnum if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) fifo_level = dev->txnumevt; else fifo_level = dev->rxnumevt;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
src = dma_pos; dst = prtd->params->dma_addr; src_bidx = data_type;
dst_bidx = 0;
src_cidx = data_type * fifo_level;
dst_bidx = 4;
Err.. this will most likely break other audio configurations. You should look at how to avoid this change by making use of the mask and rotation operations in the McASP code.>
McAsp FIFO and McASP data port reg. is 32 bit wide, each new sample is copied to McASP after McAsp send DMA event. McASP also do data rotations and masking. When more serializers are enabled, each new sample for new serializer should be placed to new data room at +4 address. After that new DMA event is generated. I tested it with TDM slots = 2 and also 6 with one serializer and also two serializer enabled. Why do you think that brokes other audio configurations?
src_cidx = data_type * fifo_level * serializers;
dst_cidx = 0;
} else {
src = prtd->params->dma_addr;
@@ -210,7 +211,7 @@ static void davinci_pcm_enqueue_dma(struct snd_pcm_substream *substream)>> src_bidx = 0; dst_bidx = data_type; src_cidx = 0;
dst_cidx = data_type * fifo_level;
dst_cidx = data_type * fifo_level * serializers;
With the change in fifo_level as described above, this won't be necessary.
Described upper and also in Re: [alsa-devel] davici-mcasp: "tx-num-evt" confusion with number of serializers thread
Best Michal.