dmaengine: sun6i: Set default maxburst size and bus width
authorJean-Francois Moine <moinejf@free.fr>
Thu, 28 Apr 2016 15:07:02 +0000 (17:07 +0200)
committerVinod Koul <vinod.koul@intel.com>
Mon, 2 May 2016 10:29:01 +0000 (15:59 +0530)
Some DMA clients, as audio, don't set the maxburst size and bus width
on the memory side when starting DMA transfers.
This patch prevents such transfers to be aborted by providing system
default values to the lacking ones.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/sun6i-dma.c

index b08245ef71d10276d9c3f391fc43a4f4ac3b3267..cd436c6a29a75a1fca5b5f89806ddc3b07904fbd 100644 (file)
@@ -470,10 +470,30 @@ static int set_config(struct sun6i_dma_dev *sdev,
 {
        s8 src_width, dst_width, src_burst, dst_burst;
 
-       src_burst = convert_burst(sconfig->src_maxburst);
-       src_width = convert_buswidth(sconfig->src_addr_width);
-       dst_burst = convert_burst(sconfig->dst_maxburst);
-       dst_width = convert_buswidth(sconfig->dst_addr_width);
+       switch (direction) {
+       case DMA_MEM_TO_DEV:
+               src_burst = convert_burst(sconfig->src_maxburst ?
+                                       sconfig->src_maxburst : 8);
+               src_width = convert_buswidth(sconfig->src_addr_width !=
+                                               DMA_SLAVE_BUSWIDTH_UNDEFINED ?
+                               sconfig->src_addr_width :
+                               DMA_SLAVE_BUSWIDTH_4_BYTES);
+               dst_burst = convert_burst(sconfig->dst_maxburst);
+               dst_width = convert_buswidth(sconfig->dst_addr_width);
+               break;
+       case DMA_DEV_TO_MEM:
+               src_burst = convert_burst(sconfig->src_maxburst);
+               src_width = convert_buswidth(sconfig->src_addr_width);
+               dst_burst = convert_burst(sconfig->dst_maxburst ?
+                                       sconfig->dst_maxburst : 8);
+               dst_width = convert_buswidth(sconfig->dst_addr_width !=
+                                               DMA_SLAVE_BUSWIDTH_UNDEFINED ?
+                               sconfig->dst_addr_width :
+                               DMA_SLAVE_BUSWIDTH_4_BYTES);
+               break;
+       default:
+               return -EINVAL;
+       }
 
        if (src_burst < 0)
                return src_burst;