|
@@ -15,11 +15,14 @@
|
|
|
#include <asm/errno.h>
|
|
|
#include <asm/io.h>
|
|
|
|
|
|
+#include <asm/imx-common/dma.h>
|
|
|
+
|
|
|
#include "videomodes.h"
|
|
|
|
|
|
#define PS2KHZ(ps) (1000000000UL / (ps))
|
|
|
|
|
|
static GraphicDevice panel;
|
|
|
+struct mxs_dma_desc desc;
|
|
|
|
|
|
/**
|
|
|
* mxsfb_system_setup() - Fine-tune LCDIF configuration
|
|
@@ -194,5 +197,28 @@ void *video_hw_init(void)
|
|
|
/* Start framebuffer */
|
|
|
mxs_lcd_init(&panel, &mode, bpp);
|
|
|
|
|
|
+#ifdef CONFIG_VIDEO_MXS_MODE_SYSTEM
|
|
|
+ /*
|
|
|
+ * If the LCD runs in system mode, the LCD refresh has to be triggered
|
|
|
+ * manually by setting the RUN bit in HW_LCDIF_CTRL register. To avoid
|
|
|
+ * having to set this bit manually after every single change in the
|
|
|
+ * framebuffer memory, we set up specially crafted circular DMA, which
|
|
|
+ * sets the RUN bit, then waits until it gets cleared and repeats this
|
|
|
+ * infinitelly. This way, we get smooth continuous updates of the LCD.
|
|
|
+ */
|
|
|
+ struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)MXS_LCDIF_BASE;
|
|
|
+
|
|
|
+ memset(&desc, 0, sizeof(struct mxs_dma_desc));
|
|
|
+ desc.address = (dma_addr_t)&desc;
|
|
|
+ desc.cmd.data = MXS_DMA_DESC_COMMAND_NO_DMAXFER | MXS_DMA_DESC_CHAIN |
|
|
|
+ MXS_DMA_DESC_WAIT4END |
|
|
|
+ (1 << MXS_DMA_DESC_PIO_WORDS_OFFSET);
|
|
|
+ desc.cmd.pio_words[0] = readl(®s->hw_lcdif_ctrl) | LCDIF_CTRL_RUN;
|
|
|
+ desc.cmd.next = (uint32_t)&desc.cmd;
|
|
|
+
|
|
|
+ /* Execute the DMA chain. */
|
|
|
+ mxs_dma_circ_start(MXS_DMA_CHANNEL_AHB_APBH_LCDIF, &desc);
|
|
|
+#endif
|
|
|
+
|
|
|
return (void *)&panel;
|
|
|
}
|