From 8d6c712fcf68d97a3197bfdb603fe4f0a652436d Mon Sep 17 00:00:00 2001 From: Janusz Jankowski Date: Thu, 27 Dec 2018 12:30:45 +0100 Subject: [PATCH] hda: dma preload timeout Signed-off-by: Janusz Jankowski --- src/drivers/intel/cavs/hda-dma.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/drivers/intel/cavs/hda-dma.c b/src/drivers/intel/cavs/hda-dma.c index 7250f68d9..bcaf7627b 100644 --- a/src/drivers/intel/cavs/hda-dma.c +++ b/src/drivers/intel/cavs/hda-dma.c @@ -328,12 +328,19 @@ static int hda_dma_host_preload(struct dma *dma, struct hda_chan_data *chan) int i; int period_cnt; + uint64_t deadline = platform_timer_get(platform_timer) + + clock_ms_to_ticks(PLATFORM_DEFAULT_CLOCK, 1) * + PLATFORM_HOST_DMA_TIMEOUT / 1000; + /* waiting for buffer full after start * first try is unblocking, then blocking */ while (!(host_dma_reg_read(dma, chan->index, DGCS) & DGCS_BF) && - (chan->state & HDA_STATE_BF_WAIT)) - ; /* TODO: this should timeout and not wait forever */ + (chan->state & HDA_STATE_BF_WAIT)) { + if (deadline < platform_timer_get(platform_timer)) { + return -ETIME; + } + } if (host_dma_reg_read(dma, chan->index, DGCS) & DGCS_BF) { chan->state &= ~(HDA_STATE_HOST_PRELOAD | HDA_STATE_BF_WAIT);