Skip to content
Snippets Groups Projects
Commit 69f7345c authored by Marek Vasut's avatar Marek Vasut Committed by Anatolij Gustschin
Browse files

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: default avatarMarek 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>
parent a78dac79
No related branches found
No related tags found
No related merge requests found
...@@ -161,4 +161,6 @@ void mxs_dma_init(void); ...@@ -161,4 +161,6 @@ void mxs_dma_init(void);
int mxs_dma_init_channel(int chan); int mxs_dma_init_channel(int chan);
int mxs_dma_release(int chan); int mxs_dma_release(int chan);
void mxs_dma_circ_start(int chan, struct mxs_dma_desc *pdesc);
#endif /* __DMA_H__ */ #endif /* __DMA_H__ */
...@@ -544,6 +544,28 @@ int mxs_dma_go(int chan) ...@@ -544,6 +544,28 @@ int mxs_dma_go(int chan)
return ret; return ret;
} }
/*
* 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 * Initialize the DMA hardware
*/ */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment