mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-19 17:37:10 +07:00
ASoC: wm_adsp: Support streams which can start/stop with DSP active
Clear the buffer data structure on each trigger start such that the buffer is in a sensible state even if the DSP itself didn't restart. This is necessary to support voice control streams which can trigger multiple times without reloading the firmware. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
e21a5acfab
commit
61fc060c40
@ -3258,6 +3258,13 @@ static int wm_adsp_buffer_populate(struct wm_adsp_compr_buf *buf)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void wm_adsp_buffer_clear(struct wm_adsp_compr_buf *buf)
|
||||||
|
{
|
||||||
|
buf->irq_count = 0xFFFFFFFF;
|
||||||
|
buf->read_index = -1;
|
||||||
|
buf->avail = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int wm_adsp_buffer_init(struct wm_adsp *dsp)
|
static int wm_adsp_buffer_init(struct wm_adsp *dsp)
|
||||||
{
|
{
|
||||||
struct wm_adsp_compr_buf *buf;
|
struct wm_adsp_compr_buf *buf;
|
||||||
@ -3268,8 +3275,8 @@ static int wm_adsp_buffer_init(struct wm_adsp *dsp)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
buf->dsp = dsp;
|
buf->dsp = dsp;
|
||||||
buf->read_index = -1;
|
|
||||||
buf->irq_count = 0xFFFFFFFF;
|
wm_adsp_buffer_clear(buf);
|
||||||
|
|
||||||
ret = wm_adsp_buffer_locate(buf);
|
ret = wm_adsp_buffer_locate(buf);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@ -3327,15 +3334,16 @@ int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd)
|
|||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_START:
|
case SNDRV_PCM_TRIGGER_START:
|
||||||
if (wm_adsp_compr_attached(compr))
|
if (!wm_adsp_compr_attached(compr)) {
|
||||||
break;
|
|
||||||
|
|
||||||
ret = wm_adsp_compr_attach(compr);
|
ret = wm_adsp_compr_attach(compr);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
adsp_err(dsp, "Failed to link buffer and stream: %d\n",
|
adsp_err(dsp, "Failed to link buffer and stream: %d\n",
|
||||||
ret);
|
ret);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wm_adsp_buffer_clear(compr->buf);
|
||||||
|
|
||||||
/* Trigger the IRQ at one fragment of data */
|
/* Trigger the IRQ at one fragment of data */
|
||||||
ret = wm_adsp_buffer_write(compr->buf,
|
ret = wm_adsp_buffer_write(compr->buf,
|
||||||
|
Loading…
Reference in New Issue
Block a user