summaryrefslogtreecommitdiff
path: root/drivers/dma
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2013-07-30 23:37:51 +0200
committerAnatolij Gustschin <agust@denx.de>2013-08-09 21:48:34 +0200
commit69f7345c95011cdc46d0ecf5e62c16d711e2eb2a (patch)
treee7cb55607c9ae2354a87ac8ae1f015df0464c650 /drivers/dma
parenta78dac79ede7fbb4c9e816abc879655540c3f076 (diff)
downloadu-boot-imx-69f7345c95011cdc46d0ecf5e62c16d711e2eb2a.zip
u-boot-imx-69f7345c95011cdc46d0ecf5e62c16d711e2eb2a.tar.gz
u-boot-imx-69f7345c95011cdc46d0ecf5e62c16d711e2eb2a.tar.bz2
dma: apbh: Add special circular mode for LCD
Add special function that executes a specially crafted circular DMA descriptor. The function doesn't wait for the descriptor to finish the transfer, since the descritor never finishes. This is useful when operating a SmartLCD through the LCDIF interface, as the LCDIF does not give us any means to have continuous refresh of the SmartLCD. Instead, the RUN bit in the LCDIF CTRL register must be triggered manually. This can be worked around by starting an DMA transfer which continuously sets the RUN bit. This function allows starting exactly such transfer. Signed-off-by: Marek Vasut <marex@denx.de> Cc: Anatolij Gustschin <agust@denx.de> Cc: Fabio Estevam <fabio.estevam@freescale.com> Cc: Otavio Salvador <otavio@ossystems.com.br> Cc: Stefano Babic <sbabic@denx.de>
Diffstat (limited to 'drivers/dma')
-rw-r--r--drivers/dma/apbh_dma.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/drivers/dma/apbh_dma.c b/drivers/dma/apbh_dma.c
index 96d4c9b..22defcd 100644
--- a/drivers/dma/apbh_dma.c
+++ b/drivers/dma/apbh_dma.c
@@ -545,6 +545,28 @@ int mxs_dma_go(int chan)
}
/*
+ * Execute a continuously running circular DMA descriptor.
+ * NOTE: This is not intended for general use, but rather
+ * for the LCD driver in Smart-LCD mode. It allows
+ * continuous triggering of the RUN bit there.
+ */
+void mxs_dma_circ_start(int chan, struct mxs_dma_desc *pdesc)
+{
+ struct mxs_apbh_regs *apbh_regs =
+ (struct mxs_apbh_regs *)MXS_APBH_BASE;
+
+ mxs_dma_flush_desc(pdesc);
+
+ mxs_dma_enable_irq(chan, 1);
+
+ writel(mxs_dma_cmd_address(pdesc),
+ &apbh_regs->ch[chan].hw_apbh_ch_nxtcmdar);
+ writel(1, &apbh_regs->ch[chan].hw_apbh_ch_sema);
+ writel(1 << (chan + APBH_CTRL0_CLKGATE_CHANNEL_OFFSET),
+ &apbh_regs->hw_apbh_ctrl0_clr);
+}
+
+/*
* Initialize the DMA hardware
*/
void mxs_dma_init(void)