diff --git a/src/drivers/dw/dma.c b/src/drivers/dw/dma.c index f98450a828f4..eb1e1b92cd2c 100644 --- a/src/drivers/dw/dma.c +++ b/src/drivers/dw/dma.c @@ -888,8 +888,10 @@ static int dw_dma_copy(struct dma_chan_data *channel, int bytes, DW_DMA_CHAN_EN, DW_CHAN(channel->index), 0, DW_DMA_TIMEOUT); - if (ret < 0) + if (ret < 0) { + tr_dbg(&dwdma_tr, "dw_dma_copy(): poll_for_register_delay timeout"); return ret; + } } dw_dma_verify_transfer(channel, &next); diff --git a/src/drivers/imx/sai.c b/src/drivers/imx/sai.c index c4622b04a11e..05f0f4fcb6c1 100644 --- a/src/drivers/imx/sai.c +++ b/src/drivers/imx/sai.c @@ -102,6 +102,7 @@ static void sai_stop(struct dai *dai, int direction) dai_info(dai, "SAI: sai_stop"); uint32_t xcsr = 0U; + int ret = 0; /* Disable DMA request */ dai_update_bits(dai, REG_SAI_XCSR(direction), @@ -119,24 +120,31 @@ static void sai_stop(struct dai *dai, int direction) /* Disable transmitter/receiver */ if (direction == DAI_DIR_CAPTURE) { dai_update_bits(dai, REG_SAI_XCSR(DAI_DIR_CAPTURE), REG_SAI_CSR_TERE, 0); - poll_for_register_delay(dai_base(dai) + REG_SAI_XCSR(DAI_DIR_CAPTURE), - REG_SAI_CSR_TERE, 0, 100); + ret = poll_for_register_delay(dai_base(dai) + + REG_SAI_XCSR(DAI_DIR_CAPTURE), + REG_SAI_CSR_TERE, 0, 100); + /* Check if the opposite direction is also disabled */ xcsr = dai_read(dai, REG_SAI_XCSR(DAI_DIR_PLAYBACK)); if (!(xcsr & REG_SAI_CSR_FRDE)) { dai_update_bits(dai, REG_SAI_XCSR(DAI_DIR_PLAYBACK), REG_SAI_CSR_TERE, 0); - poll_for_register_delay(dai_base(dai) + REG_SAI_XCSR(DAI_DIR_PLAYBACK), - REG_SAI_CSR_TERE, 0, 100); + ret = poll_for_register_delay(dai_base(dai) + + REG_SAI_XCSR(DAI_DIR_PLAYBACK), + REG_SAI_CSR_TERE, 0, 100); } } else { /* Check if the opposite direction is also disabled */ xcsr = dai_read(dai, REG_SAI_XCSR(DAI_DIR_CAPTURE)); if (!(xcsr & REG_SAI_CSR_FRDE)) { dai_update_bits(dai, REG_SAI_XCSR(DAI_DIR_PLAYBACK), REG_SAI_CSR_TERE, 0); - poll_for_register_delay(dai_base(dai) + REG_SAI_XCSR(DAI_DIR_PLAYBACK), - REG_SAI_CSR_TERE, 0, 100); + ret = poll_for_register_delay(dai_base(dai) + + REG_SAI_XCSR(DAI_DIR_PLAYBACK), + REG_SAI_CSR_TERE, 0, 100); } } + + if (ret < 0) + dai_warn(dai, "sai: poll for register delay failed"); } static int sai_context_store(struct dai *dai) diff --git a/src/lib/wait.c b/src/lib/wait.c index d73e7e8405ca..196e46782771 100644 --- a/src/lib/wait.c +++ b/src/lib/wait.c @@ -43,7 +43,8 @@ int poll_for_register_delay(uint32_t reg, uint32_t mask, while ((io_reg_read(reg) & mask) != val) { if (!tries--) { - tr_err(&wait_tr, "ewt"); + tr_err(&wait_tr, "poll timeout reg %u mask %u val %u us %u", + reg, mask, val, (uint32_t)us); return -EIO; } wait_delay(delta);