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: Vijendar Mukunda <Vijendar.Mukunda@amd.com> Signed-off-by: Akshu Agrawal <akshu.agrawal@amd.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
bbdb7012b0
commit
662fb3efe7
2 changed files with 19 additions and 13 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue