]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Add cache flush operation for dma descriptor
authorLothar Waßmann <LW@KARO-electronics.de>
Fri, 9 Mar 2012 07:21:47 +0000 (08:21 +0100)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 9 Mar 2012 07:21:47 +0000 (08:21 +0100)
drivers/dma/apbh_dma.c

index e85f5fe6d215b891cca7ed13e9a3269334b53ddb..3148dfcb2831a8fd3c76f88e876bd2dbc01e21a6 100644 (file)
@@ -352,6 +352,24 @@ void mxs_dma_desc_free(struct mxs_dma_desc *pdesc)
        free(pdesc);
 }
 
+static void mxs_dma_flush_desc(struct mxs_dma_desc *desc)
+{
+       size_t len = (desc->cmd.data & MXS_DMA_DESC_BYTES_MASK) >>
+               MXS_DMA_DESC_BYTES_OFFSET;
+
+       if (len) {
+               if (desc->cmd.data & MXS_DMA_DESC_COMMAND_DMA_READ) {
+                       flush_dcache_range(desc->cmd.address,
+                                       desc->cmd.address + len);
+               } else if (desc->cmd.data & MXS_DMA_DESC_COMMAND_DMA_WRITE) {
+                       invalidate_dcache_range(desc->cmd.address,
+                                               desc->cmd.address + len);
+               }
+       }
+       flush_dcache_range((unsigned long)&desc->cmd,
+                       (unsigned long)&desc->cmd + sizeof(desc->cmd));
+}
+
 /*
  * Add a DMA descriptor to a channel.
  *
@@ -421,6 +439,7 @@ int mxs_dma_desc_append(int channel, struct mxs_dma_desc *pdesc)
                pchan->pending_num++;
        list_add_tail(&pdesc->node, &pchan->active);
 
+       mxs_dma_flush_desc(pdesc);
        return ret;
 }