|
@@ -372,3 +372,76 @@ void omap_enable_lcd_dma(void)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(omap_enable_lcd_dma);
|
|
EXPORT_SYMBOL(omap_enable_lcd_dma);
|
|
|
|
|
|
|
|
+void omap_setup_lcd_dma(void)
|
|
|
|
+{
|
|
|
|
+ BUG_ON(lcd_dma.active);
|
|
|
|
+ if (!cpu_is_omap15xx()) {
|
|
|
|
+ /* Set some reasonable defaults */
|
|
|
|
+ omap_writew(0x5440, OMAP1610_DMA_LCD_CCR);
|
|
|
|
+ omap_writew(0x9102, OMAP1610_DMA_LCD_CSDP);
|
|
|
|
+ omap_writew(0x0004, OMAP1610_DMA_LCD_LCH_CTRL);
|
|
|
|
+ }
|
|
|
|
+ set_b1_regs();
|
|
|
|
+ if (!cpu_is_omap15xx()) {
|
|
|
|
+ u16 w;
|
|
|
|
+
|
|
|
|
+ w = omap_readw(OMAP1610_DMA_LCD_CCR);
|
|
|
|
+ /*
|
|
|
|
+ * If DMA was already active set the end_prog bit to have
|
|
|
|
+ * the programmed register set loaded into the active
|
|
|
|
+ * register set.
|
|
|
|
+ */
|
|
|
|
+ w |= 1 << 11; /* End_prog */
|
|
|
|
+ if (!lcd_dma.single_transfer)
|
|
|
|
+ w |= (3 << 8); /* Auto_init, repeat */
|
|
|
|
+ omap_writew(w, OMAP1610_DMA_LCD_CCR);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(omap_setup_lcd_dma);
|
|
|
|
+
|
|
|
|
+void omap_stop_lcd_dma(void)
|
|
|
|
+{
|
|
|
|
+ u16 w;
|
|
|
|
+
|
|
|
|
+ lcd_dma.active = 0;
|
|
|
|
+ if (cpu_is_omap15xx() || !lcd_dma.ext_ctrl)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ w = omap_readw(OMAP1610_DMA_LCD_CCR);
|
|
|
|
+ w &= ~(1 << 7);
|
|
|
|
+ omap_writew(w, OMAP1610_DMA_LCD_CCR);
|
|
|
|
+
|
|
|
|
+ w = omap_readw(OMAP1610_DMA_LCD_CTRL);
|
|
|
|
+ w &= ~(1 << 8);
|
|
|
|
+ omap_writew(w, OMAP1610_DMA_LCD_CTRL);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(omap_stop_lcd_dma);
|
|
|
|
+
|
|
|
|
+static int __init omap_init_lcd_dma(void)
|
|
|
|
+{
|
|
|
|
+ int r;
|
|
|
|
+
|
|
|
|
+ if (!cpu_class_is_omap1())
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
|
|
+ if (cpu_is_omap16xx()) {
|
|
|
|
+ u16 w;
|
|
|
|
+
|
|
|
|
+ /* this would prevent OMAP sleep */
|
|
|
|
+ w = omap_readw(OMAP1610_DMA_LCD_CTRL);
|
|
|
|
+ w &= ~(1 << 8);
|
|
|
|
+ omap_writew(w, OMAP1610_DMA_LCD_CTRL);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ spin_lock_init(&lcd_dma.lock);
|
|
|
|
+
|
|
|
|
+ r = request_irq(INT_DMA_LCD, lcd_dma_irq_handler, 0,
|
|
|
|
+ "LCD DMA", NULL);
|
|
|
|
+ if (r != 0)
|
|
|
|
+ pr_err("unable to request IRQ for LCD DMA (error %d)\n", r);
|
|
|
|
+
|
|
|
|
+ return r;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+arch_initcall(omap_init_lcd_dma);
|
|
|
|
+
|