dmaengine: fsldma: set BWC, DAHTS and SAHTS values correctly
authorThomas Breitung <thomas.breitung@izt-labs.de>
Mon, 19 Jun 2017 14:40:04 +0000 (16:40 +0200)
committerVinod Koul <vinod.koul@intel.com>
Thu, 22 Jun 2017 13:01:35 +0000 (18:31 +0530)
The bits of BWC, DAHTS and SAHTS in the DMA mode register must be cleared
before a new value can be or-ed in.

Signed-off-by: Thomas Breitung <thomas.breitung@izt-labs.de>
Signed-off-by: Wolfgang Ocker <weo@reccoware.de>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/fsldma.c
drivers/dma/fsldma.h

index 51c75bf..3b8b752 100644 (file)
@@ -269,6 +269,7 @@ static void fsl_chan_set_src_loop_size(struct fsldma_chan *chan, int size)
        case 2:
        case 4:
        case 8:
+               mode &= ~FSL_DMA_MR_SAHTS_MASK;
                mode |= FSL_DMA_MR_SAHE | (__ilog2(size) << 14);
                break;
        }
@@ -301,6 +302,7 @@ static void fsl_chan_set_dst_loop_size(struct fsldma_chan *chan, int size)
        case 2:
        case 4:
        case 8:
+               mode &= ~FSL_DMA_MR_DAHTS_MASK;
                mode |= FSL_DMA_MR_DAHE | (__ilog2(size) << 16);
                break;
        }
@@ -327,7 +329,8 @@ static void fsl_chan_set_request_count(struct fsldma_chan *chan, int size)
        BUG_ON(size > 1024);
 
        mode = get_mr(chan);
-       mode |= (__ilog2(size) << 24) & 0x0f000000;
+       mode &= ~FSL_DMA_MR_BWC_MASK;
+       mode |= (__ilog2(size) << 24) & FSL_DMA_MR_BWC_MASK;
 
        set_mr(chan, mode);
 }
index 31bffcc..4787d48 100644 (file)
 #define FSL_DMA_MR_DAHE                0x00002000
 #define FSL_DMA_MR_SAHE                0x00001000
 
+#define FSL_DMA_MR_SAHTS_MASK  0x0000C000
+#define FSL_DMA_MR_DAHTS_MASK  0x00030000
+#define FSL_DMA_MR_BWC_MASK    0x0f000000
+
 /*
  * Bandwidth/pause control determines how many bytes a given
  * channel is allowed to transfer before the DMA engine pauses