dmaengine: qcom_bam_dma: Make driver work for BE
authorAndy Gross <andy.gross@linaro.org>
Mon, 29 Feb 2016 23:15:19 +0000 (17:15 -0600)
committerVinod Koul <vinod.koul@intel.com>
Thu, 3 Mar 2016 15:49:01 +0000 (21:19 +0530)
This patch fixes the Qualcomm BAM dmaenging driver to work with big
endian kernels.

Signed-off-by: Andy Gross <andy.gross@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/qcom_bam_dma.c

index 5a250cdc83769f0d4aaff65530c76b705a474e25..37f7aeca7fe16b7c077d1707bb9257633f0d7362 100644 (file)
@@ -53,9 +53,9 @@
 #include "virt-dma.h"
 
 struct bam_desc_hw {
-       u32 addr;               /* Buffer physical address */
-       u16 size;               /* Buffer size in bytes */
-       u16 flags;
+       __le32 addr;            /* Buffer physical address */
+       __le16 size;            /* Buffer size in bytes */
+       __le16 flags;
 };
 
 #define DESC_FLAG_INT BIT(15)
@@ -632,14 +632,15 @@ static struct dma_async_tx_descriptor *bam_prep_slave_sg(struct dma_chan *chan,
                unsigned int curr_offset = 0;
 
                do {
-                       desc->addr = sg_dma_address(sg) + curr_offset;
+                       desc->addr = cpu_to_le32(sg_dma_address(sg) +
+                                                curr_offset);
 
                        if (remainder > BAM_MAX_DATA_SIZE) {
-                               desc->size = BAM_MAX_DATA_SIZE;
+                               desc->size = cpu_to_le16(BAM_MAX_DATA_SIZE);
                                remainder -= BAM_MAX_DATA_SIZE;
                                curr_offset += BAM_MAX_DATA_SIZE;
                        } else {
-                               desc->size = remainder;
+                               desc->size = cpu_to_le16(remainder);
                                remainder = 0;
                        }
 
@@ -915,9 +916,11 @@ static void bam_start_dma(struct bam_chan *bchan)
 
        /* set any special flags on the last descriptor */
        if (async_desc->num_desc == async_desc->xfer_len)
-               desc[async_desc->xfer_len - 1].flags = async_desc->flags;
+               desc[async_desc->xfer_len - 1].flags =
+                                       cpu_to_le16(async_desc->flags);
        else
-               desc[async_desc->xfer_len - 1].flags |= DESC_FLAG_INT;
+               desc[async_desc->xfer_len - 1].flags |=
+                                       cpu_to_le16(DESC_FLAG_INT);
 
        if (bchan->tail + async_desc->xfer_len > MAX_DESCRIPTORS) {
                u32 partial = MAX_DESCRIPTORS - bchan->tail;