Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dmaengine: xilinx_dma: Fix control reg update in vdma_channel_set_config

In vdma_channel_set_config clear the delay, frame count and master mask
before updating their new values. It avoids programming incorrect state
when input parameters are different from default.

Signed-off-by: Radhey Shyam Pandey <radhey.shyam.pandey@xilinx.com>
Acked-by: Appana Durga Kedareswara rao <appana.durga.rao@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Link: https://lore.kernel.org/r/1569495060-18117-3-git-send-email-radhey.shyam.pandey@xilinx.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Radhey Shyam Pandey and committed by
Vinod Koul
6c6de1dd 68fe2b52

+7
+7
drivers/dma/xilinx/xilinx_dma.c
··· 68 68 #define XILINX_DMA_DMACR_CIRC_EN BIT(1) 69 69 #define XILINX_DMA_DMACR_RUNSTOP BIT(0) 70 70 #define XILINX_DMA_DMACR_FSYNCSRC_MASK GENMASK(6, 5) 71 + #define XILINX_DMA_DMACR_DELAY_MASK GENMASK(31, 24) 72 + #define XILINX_DMA_DMACR_FRAME_COUNT_MASK GENMASK(23, 16) 73 + #define XILINX_DMA_DMACR_MASTER_MASK GENMASK(11, 8) 71 74 72 75 #define XILINX_DMA_REG_DMASR 0x0004 73 76 #define XILINX_DMA_DMASR_EOL_LATE_ERR BIT(15) ··· 2121 2118 chan->config.gen_lock = cfg->gen_lock; 2122 2119 chan->config.master = cfg->master; 2123 2120 2121 + dmacr &= ~XILINX_DMA_DMACR_GENLOCK_EN; 2124 2122 if (cfg->gen_lock && chan->genlock) { 2125 2123 dmacr |= XILINX_DMA_DMACR_GENLOCK_EN; 2124 + dmacr &= ~XILINX_DMA_DMACR_MASTER_MASK; 2126 2125 dmacr |= cfg->master << XILINX_DMA_DMACR_MASTER_SHIFT; 2127 2126 } 2128 2127 ··· 2140 2135 chan->config.delay = cfg->delay; 2141 2136 2142 2137 if (cfg->coalesc <= XILINX_DMA_DMACR_FRAME_COUNT_MAX) { 2138 + dmacr &= ~XILINX_DMA_DMACR_FRAME_COUNT_MASK; 2143 2139 dmacr |= cfg->coalesc << XILINX_DMA_DMACR_FRAME_COUNT_SHIFT; 2144 2140 chan->config.coalesc = cfg->coalesc; 2145 2141 } 2146 2142 2147 2143 if (cfg->delay <= XILINX_DMA_DMACR_DELAY_MAX) { 2144 + dmacr &= ~XILINX_DMA_DMACR_DELAY_MASK; 2148 2145 dmacr |= cfg->delay << XILINX_DMA_DMACR_DELAY_SHIFT; 2149 2146 chan->config.delay = cfg->delay; 2150 2147 }