From 0fff598a54120b7de5096166681529c5873187c6 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Mon, 10 May 2021 14:36:40 +0200 Subject: [PATCH] dmic: don't decrement active FIFO count below 0 In case of a spurious DMIC interrupt flood the active FIFO count will decrement below 0. Prevent it by checking the current DAI state. Signed-off-by: Guennadi Liakhovetski --- src/drivers/intel/dmic.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/drivers/intel/dmic.c b/src/drivers/intel/dmic.c index b08e2bf4b745..2cee2e25fa1a 100644 --- a/src/drivers/intel/dmic.c +++ b/src/drivers/intel/dmic.c @@ -1402,7 +1402,7 @@ static void dmic_start(struct dai *dai) } /* stop the DMIC for capture */ -static void dmic_stop(struct dai *dai) +static void dmic_stop(struct dai *dai, bool in_active) { struct dmic_pdata *dmic = dai_get_drvdata(dai); int i; @@ -1452,7 +1452,7 @@ static void dmic_stop(struct dai *dai) } } - if (dmic->state == COMP_STATE_PREPARE) + if (in_active) dmic_active_fifos--; schedule_task_cancel(&dmic->dmicwork); @@ -1503,11 +1503,11 @@ static int dmic_trigger(struct dai *dai, int cmd, int direction) break; case COMP_TRIGGER_STOP: dmic->state = COMP_STATE_PREPARE; - dmic_stop(dai); + dmic_stop(dai, true); break; case COMP_TRIGGER_PAUSE: dmic->state = COMP_STATE_PAUSED; - dmic_stop(dai); + dmic_stop(dai, true); break; case COMP_TRIGGER_RESUME: dmic_context_restore(dai); @@ -1542,15 +1542,15 @@ static void dmic_irq_handler(void *data) if (val0 & OUTSTAT0_ROR_BIT) { dai_err(dai, "dmic_irq_handler(): full fifo A or PDM overrun"); dai_write(dai, OUTSTAT0, val0); + dmic_stop(dai, dmic->state == COMP_STATE_ACTIVE); dmic->state = COMP_STATE_PREPARE; - dmic_stop(dai); } if (val1 & OUTSTAT1_ROR_BIT) { dai_err(dai, "dmic_irq_handler(): full fifo B or PDM overrun"); dai_write(dai, OUTSTAT1, val1); + dmic_stop(dai, dmic->state == COMP_STATE_ACTIVE); dmic->state = COMP_STATE_PREPARE; - dmic_stop(dai); } }