Commit 662fb3ef authored by Mukunda, Vijendar's avatar Mukunda, Vijendar Committed by Mark Brown

ASoC: AMD: Modified DMA pointer for capture

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: default avatarVijendar Mukunda <Vijendar.Mukunda@amd.com>
Signed-off-by: default avatarAkshu Agrawal <akshu.agrawal@amd.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent bbdb7012
...@@ -922,10 +922,7 @@ static int acp_dma_hw_params(struct snd_pcm_substream *substream, ...@@ -922,10 +922,7 @@ static int acp_dma_hw_params(struct snd_pcm_substream *substream,
rtd->destination = FROM_BLUETOOTH; rtd->destination = FROM_BLUETOOTH;
rtd->dma_dscr_idx_1 = CAPTURE_START_DMA_DESCR_CH10; rtd->dma_dscr_idx_1 = CAPTURE_START_DMA_DESCR_CH10;
rtd->dma_dscr_idx_2 = CAPTURE_START_DMA_DESCR_CH11; rtd->dma_dscr_idx_2 = CAPTURE_START_DMA_DESCR_CH11;
rtd->byte_cnt_high_reg_offset = rtd->dma_curr_dscr = mmACP_DMA_CUR_DSCR_11;
mmACP_I2S_BT_RECEIVE_BYTE_CNT_HIGH;
rtd->byte_cnt_low_reg_offset =
mmACP_I2S_BT_RECEIVE_BYTE_CNT_LOW;
adata->capture_i2sbt_stream = substream; adata->capture_i2sbt_stream = substream;
break; break;
case I2S_SP_INSTANCE: case I2S_SP_INSTANCE:
...@@ -945,10 +942,7 @@ static int acp_dma_hw_params(struct snd_pcm_substream *substream, ...@@ -945,10 +942,7 @@ static int acp_dma_hw_params(struct snd_pcm_substream *substream,
rtd->destination = FROM_ACP_I2S_1; rtd->destination = FROM_ACP_I2S_1;
rtd->dma_dscr_idx_1 = CAPTURE_START_DMA_DESCR_CH14; rtd->dma_dscr_idx_1 = CAPTURE_START_DMA_DESCR_CH14;
rtd->dma_dscr_idx_2 = CAPTURE_START_DMA_DESCR_CH15; rtd->dma_dscr_idx_2 = CAPTURE_START_DMA_DESCR_CH15;
rtd->byte_cnt_high_reg_offset = rtd->dma_curr_dscr = mmACP_DMA_CUR_DSCR_15;
mmACP_I2S_RECEIVED_BYTE_CNT_HIGH;
rtd->byte_cnt_low_reg_offset =
mmACP_I2S_RECEIVED_BYTE_CNT_LOW;
adata->capture_i2ssp_stream = substream; adata->capture_i2ssp_stream = substream;
} }
} }
...@@ -1002,6 +996,8 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream) ...@@ -1002,6 +996,8 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream)
u32 buffersize; u32 buffersize;
u32 pos = 0; u32 pos = 0;
u64 bytescount = 0; u64 bytescount = 0;
u16 dscr;
u32 period_bytes;
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
struct audio_substream_data *rtd = runtime->private_data; 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) ...@@ -1009,11 +1005,20 @@ static snd_pcm_uframes_t acp_dma_pointer(struct snd_pcm_substream *substream)
if (!rtd) if (!rtd)
return -EINVAL; return -EINVAL;
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); buffersize = frames_to_bytes(runtime, runtime->buffer_size);
bytescount = acp_get_byte_count(rtd); bytescount = acp_get_byte_count(rtd);
if (bytescount > rtd->bytescount)
bytescount -= rtd->bytescount; bytescount -= rtd->bytescount;
pos = do_div(bytescount, buffersize); pos = do_div(bytescount, buffersize);
}
return bytes_to_frames(runtime, pos); return bytes_to_frames(runtime, pos);
} }
......
...@@ -138,6 +138,7 @@ struct audio_substream_data { ...@@ -138,6 +138,7 @@ struct audio_substream_data {
u32 sram_bank; u32 sram_bank;
u32 byte_cnt_high_reg_offset; u32 byte_cnt_high_reg_offset;
u32 byte_cnt_low_reg_offset; u32 byte_cnt_low_reg_offset;
u32 dma_curr_dscr;
uint64_t size; uint64_t size;
u64 bytescount; u64 bytescount;
void __iomem *acp_mmio; void __iomem *acp_mmio;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment