[PATCH 07/14] ASoC: amd: add acp3x pdm driver dma ops
Pierre-Louis Bossart
pierre-louis.bossart at linux.intel.com
Tue May 5 23:59:18 CEST 2020
On 5/5/20 3:53 PM, Alex Deucher wrote:
> From: Vijendar Mukunda <Vijendar.Mukunda at amd.com>
>
> This patch adds PDM driver DMA operations.
>
> Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda at amd.com>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> sound/soc/amd/renoir/acp3x-pdm-dma.c | 199 +++++++++++++++++++++++++++
> sound/soc/amd/renoir/rn_acp3x.h | 29 ++++
> 2 files changed, 228 insertions(+)
>
> diff --git a/sound/soc/amd/renoir/acp3x-pdm-dma.c b/sound/soc/amd/renoir/acp3x-pdm-dma.c
> index 4ee47a85e37e..0b5dc49f42c3 100644
> --- a/sound/soc/amd/renoir/acp3x-pdm-dma.c
> +++ b/sound/soc/amd/renoir/acp3x-pdm-dma.c
> @@ -16,6 +16,25 @@
>
> #define DRV_NAME "acp_rn_pdm_dma"
>
> +static const struct snd_pcm_hardware acp_pdm_hardware_capture = {
> + .info = SNDRV_PCM_INFO_INTERLEAVED |
> + SNDRV_PCM_INFO_BLOCK_TRANSFER |
> + SNDRV_PCM_INFO_BATCH | SNDRV_PCM_INFO_MMAP |
> + SNDRV_PCM_INFO_MMAP_VALID |
> + SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME,
Can you actually resume from the same position? this seems odd when
combined with INFO_BATCH which means the position is only precise at
period boundaries.
> + .formats = SNDRV_PCM_FMTBIT_S32_LE,
> + .channels_min = 2,
> + .channels_max = 2,
> + .rates = SNDRV_PCM_RATE_48000,
> + .rate_min = 48000,
> + .rate_max = 48000,
> + .buffer_bytes_max = CAPTURE_MAX_NUM_PERIODS * CAPTURE_MAX_PERIOD_SIZE,
> + .period_bytes_min = CAPTURE_MIN_PERIOD_SIZE,
> + .period_bytes_max = CAPTURE_MAX_PERIOD_SIZE,
> + .periods_min = CAPTURE_MIN_NUM_PERIODS,
> + .periods_max = CAPTURE_MAX_NUM_PERIODS,
> +};
> +
[...]
> +static snd_pcm_uframes_t acp_pdm_dma_pointer(struct snd_soc_component *comp,
> + struct snd_pcm_substream *stream)
> +{
> + struct pdm_stream_instance *rtd;
> + u32 pos, buffersize;
> + u64 bytescount;
> +
> + rtd = stream->runtime->private_data;
> + pos = 0;
> + buffersize = 0;
> + bytescount = 0;
these 3 inits seem unnecessary?
> +
> + buffersize = frames_to_bytes(stream->runtime,
> + stream->runtime->buffer_size);
> + bytescount = acp_pdm_get_byte_count(rtd, stream->stream);
> + if (bytescount > rtd->bytescount)
> + bytescount -= rtd->bytescount;
> + pos = do_div(bytescount, buffersize);
> + return bytes_to_frames(stream->runtime, pos);
> +}
> +
More information about the Alsa-devel
mailing list