From 6a0cf6740f705e216a3d132c8b05b84d2f8d0bad Mon Sep 17 00:00:00 2001 From: Bartosz Kokoszko Date: Fri, 8 Nov 2019 11:09:51 +0100 Subject: [PATCH] dmic: change spin_lock to spin_try_lock in dmic_work() In order to avoid dead locks in dmic_work I've replaced spin_lock() with spin_try_lock(). In case when spin_try_lock() fails we reschedule dmic work. Signed-off-by: Bartosz Kokoszko --- src/drivers/intel/cavs/dmic.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/drivers/intel/cavs/dmic.c b/src/drivers/intel/cavs/dmic.c index 14597d510..efea76756 100644 --- a/src/drivers/intel/cavs/dmic.c +++ b/src/drivers/intel/cavs/dmic.c @@ -159,9 +159,16 @@ static enum task_state dmic_work(void *data) int32_t gval; uint32_t val; int i; + int ret; tracev_dmic("dmic_work()"); - spin_lock(dai->lock); + + spin_try_lock(dai->lock, ret); + if (!ret) { + tracev_dmic("dmic_work(): spin_try_lock(dai->lock, ret)" + "failed: RESCHEDULE"); + return SOF_TASK_STATE_RESCHEDULE; + } /* Increment gain with logarithmic step. * Gain is Q2.30 and gain modifier is Q12.20.