--- zzzz-none-000/linux-5.15.111/drivers/dma/dw/core.c 2023-05-11 14:00:40.000000000 +0000 +++ puma7-atom-6670-761/linux-5.15.111/drivers/dma/dw/core.c 2024-02-07 10:22:41.000000000 +0000 @@ -140,8 +140,10 @@ static inline void dwc_chan_disable(struct dw_dma *dw, struct dw_dma_chan *dwc) { + unsigned int count = 20; + channel_clear_bit(dw, CH_EN, dwc->mask); - while (dma_readl(dw, CH_EN) & dwc->mask) + while (dma_readl(dw, CH_EN) & dwc->mask && count--) cpu_relax(); } @@ -958,6 +960,8 @@ void do_dw_dma_off(struct dw_dma *dw) { + unsigned int count = 20; + dma_writel(dw, CFG, 0); channel_clear_bit(dw, MASK.XFER, dw->all_chan_mask); @@ -966,7 +970,7 @@ channel_clear_bit(dw, MASK.DST_TRAN, dw->all_chan_mask); channel_clear_bit(dw, MASK.ERROR, dw->all_chan_mask); - while (dma_readl(dw, CFG) & DW_CFG_DMA_EN) + while (dma_readl(dw, CFG) & DW_CFG_DMA_EN && count--) cpu_relax(); }