From: Lothar Waßmann Date: Fri, 9 Mar 2012 07:21:47 +0000 (+0100) Subject: Add cache flush operation for dma descriptor X-Git-Tag: v1.2~12 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=15a62b376a1ae79b55e51834ac3f3ddf8db837a6;p=karo-tx-uboot.git Add cache flush operation for dma descriptor --- diff --git a/drivers/dma/apbh_dma.c b/drivers/dma/apbh_dma.c index e85f5fe6d2..3148dfcb28 100644 --- a/drivers/dma/apbh_dma.c +++ b/drivers/dma/apbh_dma.c @@ -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; }