ACP->SYSMEM DMA happens at every I2S->SYSMEM period
completion. Thus, there is delay of x frames till
I2S->SYSMEM reaches a period length. This delay is
communicated to user space.

Signed-off-by: Akshu Agrawal <akshu.agra...@amd.com>
---
v2: moved reading of bytes transfered from I2S->ACP to get
more accurate delay information.
 sound/soc/amd/acp-pcm-dma.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/sound/soc/amd/acp-pcm-dma.c b/sound/soc/amd/acp-pcm-dma.c
index 32f27c5..e359938 100644
--- a/sound/soc/amd/acp-pcm-dma.c
+++ b/sound/soc/amd/acp-pcm-dma.c
@@ -922,6 +922,10 @@ static int acp_dma_hw_params(struct snd_pcm_substream 
*substream,
                        rtd->destination = FROM_BLUETOOTH;
                        rtd->dma_dscr_idx_1 = CAPTURE_START_DMA_DESCR_CH10;
                        rtd->dma_dscr_idx_2 = CAPTURE_START_DMA_DESCR_CH11;
+                       rtd->byte_cnt_high_reg_offset =
+                                       mmACP_I2S_BT_RECEIVE_BYTE_CNT_HIGH;
+                       rtd->byte_cnt_low_reg_offset =
+                                       mmACP_I2S_BT_RECEIVE_BYTE_CNT_LOW;
                        rtd->dma_curr_dscr = mmACP_DMA_CUR_DSCR_11;
                        adata->capture_i2sbt_stream = substream;
                        break;
@@ -942,6 +946,10 @@ static int acp_dma_hw_params(struct snd_pcm_substream 
*substream,
                        rtd->destination = FROM_ACP_I2S_1;
                        rtd->dma_dscr_idx_1 = CAPTURE_START_DMA_DESCR_CH14;
                        rtd->dma_dscr_idx_2 = CAPTURE_START_DMA_DESCR_CH15;
+                       rtd->byte_cnt_high_reg_offset =
+                                       mmACP_I2S_RECEIVED_BYTE_CNT_HIGH;
+                       rtd->byte_cnt_low_reg_offset =
+                                       mmACP_I2S_RECEIVED_BYTE_CNT_LOW;
                        rtd->dma_curr_dscr = mmACP_DMA_CUR_DSCR_15;
                        adata->capture_i2ssp_stream = substream;
                }
@@ -997,7 +1005,7 @@ static snd_pcm_uframes_t acp_dma_pointer(struct 
snd_pcm_substream *substream)
        u32 pos = 0;
        u64 bytescount = 0;
        u16 dscr;
-       u32 period_bytes;
+       u32 period_bytes, delay;
 
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct audio_substream_data *rtd = runtime->private_data;
@@ -1012,6 +1020,11 @@ static snd_pcm_uframes_t acp_dma_pointer(struct 
snd_pcm_substream *substream)
                        pos = period_bytes;
                else
                        pos = 0;
+               bytescount = acp_get_byte_count(rtd);
+               if (bytescount > rtd->bytescount)
+                       bytescount -= rtd->bytescount;
+               delay = do_div(bytescount, period_bytes);
+               runtime->delay = bytes_to_frames(runtime, delay);
        } else {
                buffersize = frames_to_bytes(runtime, runtime->buffer_size);
                bytescount = acp_get_byte_count(rtd);
-- 
1.9.1

Reply via email to