| 
					
				 | 
			
			
				@@ -0,0 +1,77 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Platform level USB initialization for FS USB OTG controller on omap1 and 24xx 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Copyright (C) 2004 Texas Instruments, Inc. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * This program is free software; you can redistribute it and/or modify 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * it under the terms of the GNU General Public License as published by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * the Free Software Foundation; either version 2 of the License, or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * (at your option) any later version. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * This program is distributed in the hope that it will be useful, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * GNU General Public License for more details. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * You should have received a copy of the GNU General Public License 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * along with this program; if not, write to the Free Software 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/module.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/kernel.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/init.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/platform_device.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <linux/io.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <asm/irq.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <mach/mux.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <mach/usb.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "common.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* These routines should handle the standard chip-specific modes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * for usb0/1/2 ports, covering basic mux and transceiver setup. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Some board-*.c files will need to set up additional mux options, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * like for suspend handling, vbus sensing, GPIOs, and the D+ pullup. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* TESTED ON: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - 1611B H2 (with usb1 mini-AB) using standard Mini-B or OTG cables 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - 5912 OSK OHCI (with usb0 standard-A), standard A-to-B cables 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - 5912 OSK UDC, with *nonstandard* A-to-A cable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - 1510 Innovator UDC with bundled usb0 cable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - 1510 Innovator OHCI with bundled usb1/usb2 cable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - 1510 Innovator OHCI with custom usb0 cable, feeding 5V VBUS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - 1710 custom development board using alternate pin group 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - 1710 H3 (with usb1 mini-AB) using standard Mini-B or OTG cables 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define INT_USB_IRQ_GEN		IH2_BASE + 20 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define INT_USB_IRQ_NISO	IH2_BASE + 30 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define INT_USB_IRQ_ISO		IH2_BASE + 29 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define INT_USB_IRQ_HGEN	INT_USB_HHC_1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define INT_USB_IRQ_OTG		IH2_BASE + 8 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#ifdef	CONFIG_ARCH_OMAP_OTG 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void __init 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+omap_otg_init(struct omap_usb_config *config) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	u32		syscon; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	int		alt_pingroup = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* NOTE:  no bus or clock setup (yet?) */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	syscon = omap_readl(OTG_SYSCON_1) & 0xffff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (!(syscon & OTG_RESET_DONE)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		pr_debug("USB resets not complete?\n"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	//omap_writew(0, OTG_IRQ_EN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/* pin muxing and transceiver pinouts */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if (config->pins[0] > 2)	/* alt pingroup 2 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		alt_pingroup = 1; 
			 |