From b8b9de67cb9bef7cf83d9e8d8f92ea60c3ec8147 Mon Sep 17 00:00:00 2001 From: Seokju Yoon Date: Mon, 15 Jun 2015 17:07:34 +0900 Subject: [PATCH] dma: pl330: add getposition() API This patch adds a getposition() API to provide the current DMA buffer position. Change-Id: I8627e4c0d494701fe272fda55ac3e64792065074 Signed-off-by: Soohyun Kim Signed-off-by: Seokju Yoon --- drivers/dma/pl330.c | 20 ++++++++++++++++++++ include/linux/amba/pl330.h | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 include/linux/amba/pl330.h diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index f122c2a7b9f0..719abf671257 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -2759,6 +2759,26 @@ static irqreturn_t pl330_irq_handler(int irq, void *data) return IRQ_NONE; } +int pl330_dma_getposition(struct dma_chan *chan, + dma_addr_t *src, dma_addr_t *dst) +{ + struct dma_pl330_chan *pch = to_pchan(chan); + void __iomem *regs; + struct pl330_thread *thrd; + + if (unlikely(!pch)) + return -EINVAL; + + thrd = pch->thread; + regs = pch->dmac->base; + + *src = readl(regs + SA(thrd->id)); + *dst = readl(regs + DA(thrd->id)); + + return 0; +} +EXPORT_SYMBOL(pl330_dma_getposition); + #define PL330_DMA_BUSWIDTHS \ BIT(DMA_SLAVE_BUSWIDTH_UNDEFINED) | \ BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \ diff --git a/include/linux/amba/pl330.h b/include/linux/amba/pl330.h new file mode 100644 index 000000000000..c95df58e0e7a --- /dev/null +++ b/include/linux/amba/pl330.h @@ -0,0 +1,37 @@ +/* linux/include/linux/amba/pl330.h + * + * Copyright (C) 2010 Samsung Electronics Co. Ltd. + * Jaswinder Singh + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef __AMBA_PL330_H_ +#define __AMBA_PL330_H_ + +#include + +struct dma_pl330_platdata { + /* + * Number of valid peripherals connected to DMAC. + * This may be different from the value read from + * CR0, as the PL330 implementation might have 'holes' + * in the peri list or the peri could also be reached + * from another DMAC which the platform prefers. + */ + u8 nr_valid_peri; + /* Array of valid peripherals */ + u8 *peri_id; + /* Operational capabilities */ + dma_cap_mask_t cap_mask; + /* Bytes to allocate for MC buffer */ + unsigned mcbuf_sz; +}; + +extern bool pl330_filter(struct dma_chan *chan, void *param); +extern int pl330_dma_getposition(struct dma_chan *chan, + dma_addr_t *src, dma_addr_t *dst); +#endif /* __AMBA_PL330_H_ */ -- 2.20.1