]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
dw_dmac: fix a regression in dwc_prep_dma_memcpy
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 1 Oct 2012 10:06:25 +0000 (13:06 +0300)
committerVinod Koul <vinod.koul@linux.intel.com>
Tue, 2 Oct 2012 07:48:00 +0000 (13:18 +0530)
Sometimes memory-to-memory test is failed, that's why we need to choose minimum
data portion between source and destination limits together.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com>
drivers/dma/dw_dmac.c

index 9ca9ca41b83eb998a7ebaff7979fddba0c668ef6..c4b0eb3cde819977fbf2ac45cfb1b588ccc04f37 100644 (file)
@@ -716,6 +716,7 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
        size_t                  offset;
        unsigned int            src_width;
        unsigned int            dst_width;
+       unsigned int            data_width;
        u32                     ctllo;
 
        dev_vdbg(chan2dev(chan),
@@ -728,11 +729,11 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
                return NULL;
        }
 
-       src_width = min_t(unsigned int, dwc->dw->data_width[dwc_get_sms(dws)],
-                         dwc_fast_fls(src | len));
+       data_width = min_t(unsigned int, dwc->dw->data_width[dwc_get_sms(dws)],
+                                        dwc->dw->data_width[dwc_get_dms(dws)]);
 
-       dst_width = min_t(unsigned int, dwc->dw->data_width[dwc_get_dms(dws)],
-                         dwc_fast_fls(dest | len));
+       src_width = dst_width = min_t(unsigned int, data_width,
+                                     dwc_fast_fls(src | dest | len));
 
        ctllo = DWC_DEFAULT_CTLLO(chan)
                        | DWC_CTLL_DST_WIDTH(dst_width)