|
@@ -3258,6 +3258,13 @@ static int wm_adsp_buffer_populate(struct wm_adsp_compr_buf *buf)
|
|
|
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)
|
|
|
{
|
|
|
struct wm_adsp_compr_buf *buf;
|
|
@@ -3268,8 +3275,8 @@ static int wm_adsp_buffer_init(struct wm_adsp *dsp)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
buf->dsp = dsp;
|
|
|
- buf->read_index = -1;
|
|
|
- buf->irq_count = 0xFFFFFFFF;
|
|
|
+
|
|
|
+ wm_adsp_buffer_clear(buf);
|
|
|
|
|
|
ret = wm_adsp_buffer_locate(buf);
|
|
|
if (ret < 0) {
|
|
@@ -3327,16 +3334,17 @@ int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd)
|
|
|
|
|
|
switch (cmd) {
|
|
|
case SNDRV_PCM_TRIGGER_START:
|
|
|
- if (wm_adsp_compr_attached(compr))
|
|
|
- break;
|
|
|
-
|
|
|
- ret = wm_adsp_compr_attach(compr);
|
|
|
- if (ret < 0) {
|
|
|
- adsp_err(dsp, "Failed to link buffer and stream: %d\n",
|
|
|
- ret);
|
|
|
- break;
|
|
|
+ if (!wm_adsp_compr_attached(compr)) {
|
|
|
+ ret = wm_adsp_compr_attach(compr);
|
|
|
+ if (ret < 0) {
|
|
|
+ adsp_err(dsp, "Failed to link buffer and stream: %d\n",
|
|
|
+ ret);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ wm_adsp_buffer_clear(compr->buf);
|
|
|
+
|
|
|
/* Trigger the IRQ at one fragment of data */
|
|
|
ret = wm_adsp_buffer_write(compr->buf,
|
|
|
HOST_BUFFER_FIELD(high_water_mark),
|