Skip to content

Commit

Permalink
ASoC: soc-pcm: add option to start DMA after DAI
Browse files Browse the repository at this point in the history
Add option to start DMA component after DAI trigger. This is done
by filling the new struct snd_soc_component_driver::start_dma_last.

Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Link: https://lore.kernel.org/r/20230228110145.3770525-2-claudiu.beznea@microchip.com
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
Claudiu Beznea authored and Mark Brown committed Feb 28, 2023
1 parent fb1847c commit 54fc4b7
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 5 deletions.
2 changes: 2 additions & 0 deletions include/sound/soc-component.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,8 @@ struct snd_soc_component_driver {
bool use_dai_pcm_id; /* use DAI link PCM ID as PCM device number */
int be_pcm_base; /* base device ID for all BE PCMs */

unsigned int start_dma_last;

#ifdef CONFIG_DEBUG_FS
const char *debugfs_prefix;
#endif
Expand Down
27 changes: 22 additions & 5 deletions sound/soc/soc-pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -1088,22 +1088,39 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
{
struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
int ret = -EINVAL, _ret = 0;
struct snd_soc_component *component;
int ret = -EINVAL, _ret = 0, start_dma_last = 0, i;
int rollback = 0;

switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
/* Do we need to start dma last? */
for_each_rtd_components(rtd, i, component) {
if (component->driver->start_dma_last) {
start_dma_last = 1;
break;
}
}

ret = snd_soc_link_trigger(substream, cmd, 0);
if (ret < 0)
goto start_err;

ret = snd_soc_pcm_component_trigger(substream, cmd, 0);
if (ret < 0)
goto start_err;
if (start_dma_last) {
ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
if (ret < 0)
goto start_err;

ret = snd_soc_pcm_component_trigger(substream, cmd, 0);
} else {
ret = snd_soc_pcm_component_trigger(substream, cmd, 0);
if (ret < 0)
goto start_err;

ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
}
start_err:
if (ret < 0)
rollback = 1;
Expand Down

0 comments on commit 54fc4b7

Please sign in to comment.