ASoC: AMD: Modified DMA pointer for capture
authorMukunda, Vijendar <Vijendar.Mukunda@amd.com>
Mon, 6 Aug 2018 07:27:15 +0000 (12:57 +0530)
committerMark Brown <broonie@kernel.org>
Mon, 6 Aug 2018 16:02:09 +0000 (17:02 +0100)
Give position on ACP->SYSMEM DMA channel for
the number of bytes that have been transferred on
the basis of current descriptor under service.

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Signed-off-by: Akshu Agrawal <akshu.agrawal@amd.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/acp-pcm-dma.c
sound/soc/amd/acp.h

index 816abd65a6ed3c86f365dffec1b979420b909b01..32f27c5e4d93104b2956866cc13a8e11ae9734d9 100644 (file)
@@ -922,10 +922,7 @@ 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;
                case I2S_SP_INSTANCE:
@@ -945,10 +942,7 @@ 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;
                }
        }
@@ -1002,6 +996,8 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream)
        u32 buffersize;
        u32 pos = 0;
        u64 bytescount = 0;
+       u16 dscr;
+       u32 period_bytes;
 
        struct snd_pcm_runtime *runtime = substream->runtime;
        struct audio_substream_data *rtd = runtime->private_data;
@@ -1009,11 +1005,20 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream)
        if (!rtd)
                return -EINVAL;
 
-       buffersize = frames_to_bytes(runtime, runtime->buffer_size);
-       bytescount = acp_get_byte_count(rtd);
-
-       bytescount -= rtd->bytescount;
-       pos = do_div(bytescount, buffersize);
+       if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
+               period_bytes = frames_to_bytes(runtime, runtime->period_size);
+               dscr = acp_reg_read(rtd->acp_mmio, rtd->dma_curr_dscr);
+               if (dscr == rtd->dma_dscr_idx_1)
+                       pos = period_bytes;
+               else
+                       pos = 0;
+       } else {
+               buffersize = frames_to_bytes(runtime, runtime->buffer_size);
+               bytescount = acp_get_byte_count(rtd);
+               if (bytescount > rtd->bytescount)
+                       bytescount -= rtd->bytescount;
+               pos = do_div(bytescount, buffersize);
+       }
        return bytes_to_frames(runtime, pos);
 }
 
index 0a2240bff62e14fe93292ded2dea3c2925303bcd..be3963e8f4fac527c2f048f595575c5b88397517 100644 (file)
@@ -138,6 +138,7 @@ struct audio_substream_data {
        u32 sram_bank;
        u32 byte_cnt_high_reg_offset;
        u32 byte_cnt_low_reg_offset;
+       u32 dma_curr_dscr;
        uint64_t size;
        u64 bytescount;
        void __iomem *acp_mmio;