From 15a62b376a1ae79b55e51834ac3f3ddf8db837a6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lothar=20Wa=C3=9Fmann?= Date: Fri, 9 Mar 2012 08:21:47 +0100 Subject: [PATCH] Add cache flush operation for dma descriptor --- drivers/dma/apbh_dma.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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; } -- 2.39.2