| 
					
				 | 
			
			
				@@ -0,0 +1,121 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * linux/arch/arm/mach-omap1/lcd_dma.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Extracted from arch/arm/plat-omap/dma.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (C) 2003 - 2008 Nokia Corporation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Author: Juha Yrjölä <juha.yrjola@nokia.com> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * DMA channel linking for 1610 by Samuel Ortiz <samuel.ortiz@nokia.com> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Graphics DMA and LCD DMA graphics tranformations 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * by Imre Deak <imre.deak@nokia.com> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * OMAP2/3 support Copyright (C) 2004-2007 Texas Instruments, Inc. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Merged to support both OMAP1 and OMAP2 by Tony Lindgren <tony@atomide.com> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Some functions based on earlier dma-omap.c Copyright (C) 2001 RidgeRun, Inc. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (C) 2009 Texas Instruments 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Support functions for the OMAP internal DMA channels. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * This program is free software; you can redistribute it and/or modify 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * it under the terms of the GNU General Public License version 2 as 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * published by the Free Software Foundation. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/module.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/spinlock.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/interrupt.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/io.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/omap-dma.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <mach/hardware.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <mach/lcdc.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "dma.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int omap_lcd_dma_running(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * On OMAP1510, internal LCD controller will start the transfer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * when it gets enabled, so assume DMA running if LCD enabled. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (cpu_is_omap15xx()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (omap_readw(OMAP_LCDC_CONTROL) & OMAP_LCDC_CTRL_LCD_EN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* Check if LCD DMA is running */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (cpu_is_omap16xx()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (omap_readw(OMAP1610_DMA_LCD_CCR) & OMAP_DMA_CCR_EN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static struct lcd_dma_info { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	spinlock_t lock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int reserved; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	void (*callback)(u16 status, void *data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	void *cb_data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int active; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	unsigned long addr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int rotate, data_type, xres, yres; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int vxres; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int mirror; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int xscale, yscale; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int ext_ctrl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int src_port; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int single_transfer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} lcd_dma; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void omap_set_lcd_dma_b1(unsigned long addr, u16 fb_xres, u16 fb_yres, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			 int data_type) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.addr = addr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.data_type = data_type; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.xres = fb_xres; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.yres = fb_yres; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+EXPORT_SYMBOL(omap_set_lcd_dma_b1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void omap_set_lcd_dma_ext_controller(int external) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.ext_ctrl = external; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+EXPORT_SYMBOL(omap_set_lcd_dma_ext_controller); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void omap_set_lcd_dma_single_transfer(int single) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.single_transfer = single; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+EXPORT_SYMBOL(omap_set_lcd_dma_single_transfer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void omap_set_lcd_dma_b1_rotation(int rotate) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (cpu_is_omap15xx()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printk(KERN_ERR "DMA rotation is not supported in 1510 mode\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BUG(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.rotate = rotate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+EXPORT_SYMBOL(omap_set_lcd_dma_b1_rotation); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void omap_set_lcd_dma_b1_mirror(int mirror) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (cpu_is_omap15xx()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		printk(KERN_ERR "DMA mirror is not supported in 1510 mode\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BUG(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.mirror = mirror; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void omap_set_lcd_dma_b1_vxres(unsigned long vxres) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (cpu_is_omap15xx()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pr_err("DMA virtual resolution is not supported in 1510 mode\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BUG(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	lcd_dma.vxres = vxres; 
			 |