| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * The setup file for USB related hardware on PMC-Sierra MSP processors. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  |  * Copyright 2006 PMC-Sierra, Inc. | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED | 
					
						
							|  |  |  |  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF | 
					
						
							|  |  |  |  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN | 
					
						
							|  |  |  |  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT, | 
					
						
							|  |  |  |  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
					
						
							|  |  |  |  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF | 
					
						
							|  |  |  |  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | 
					
						
							|  |  |  |  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT | 
					
						
							|  |  |  |  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 
					
						
							|  |  |  |  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  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., | 
					
						
							|  |  |  |  *  675 Mass Ave, Cambridge, MA 02139, USA. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_GADGET)
 | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <linux/init.h>
 | 
					
						
							|  |  |  | #include <linux/ioport.h>
 | 
					
						
							|  |  |  | #include <linux/platform_device.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/mipsregs.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <msp_regs.h>
 | 
					
						
							|  |  |  | #include <msp_int.h>
 | 
					
						
							|  |  |  | #include <msp_prom.h>
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | #include <msp_usb.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if defined(CONFIG_USB_EHCI_HCD)
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | static struct resource msp_usbhost0_resources[] = { | 
					
						
							|  |  |  | 	[0] = { /* EHCI-HS operational and capabilities registers */ | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | 		.start	= MSP_USB0_HS_START, | 
					
						
							|  |  |  | 		.end	= MSP_USB0_HS_END, | 
					
						
							|  |  |  | 		.flags	= IORESOURCE_MEM, | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	}, | 
					
						
							|  |  |  | 	[1] = { | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | 		.start	= MSP_INT_USB, | 
					
						
							|  |  |  | 		.end	= MSP_INT_USB, | 
					
						
							|  |  |  | 		.flags	= IORESOURCE_IRQ, | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	}, | 
					
						
							|  |  |  | 	[2] = { /* MSBus-to-AMBA bridge register space */ | 
					
						
							|  |  |  | 		.start	= MSP_USB0_MAB_START, | 
					
						
							|  |  |  | 		.end	= MSP_USB0_MAB_END, | 
					
						
							|  |  |  | 		.flags	= IORESOURCE_MEM, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[3] = { /* Identification and general hardware parameters */ | 
					
						
							|  |  |  | 		.start	= MSP_USB0_ID_START, | 
					
						
							|  |  |  | 		.end	= MSP_USB0_ID_END, | 
					
						
							|  |  |  | 		.flags	= IORESOURCE_MEM, | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | static u64 msp_usbhost0_dma_mask = 0xffffffffUL; | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | static struct mspusb_device msp_usbhost0_device = { | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	.dev	= { | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 		.name	= "pmcmsp-ehci", | 
					
						
							|  |  |  | 		.id	= 0, | 
					
						
							|  |  |  | 		.dev	= { | 
					
						
							|  |  |  | 			.dma_mask = &msp_usbhost0_dma_mask, | 
					
						
							|  |  |  | 			.coherent_dma_mask = 0xffffffffUL, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | 		.num_resources	= ARRAY_SIZE(msp_usbhost0_resources), | 
					
						
							|  |  |  | 		.resource	= msp_usbhost0_resources, | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | #endif /* CONFIG_USB_EHCI_HCD */
 | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | #if defined(CONFIG_USB_GADGET)
 | 
					
						
							|  |  |  | static struct resource msp_usbdev0_resources[] = { | 
					
						
							|  |  |  | 	[0] = { /* EHCI-HS operational and capabilities registers */ | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | 		.start	= MSP_USB0_HS_START, | 
					
						
							|  |  |  | 		.end	= MSP_USB0_HS_END, | 
					
						
							|  |  |  | 		.flags	= IORESOURCE_MEM, | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	}, | 
					
						
							|  |  |  | 	[1] = { | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | 		.start	= MSP_INT_USB, | 
					
						
							|  |  |  | 		.end	= MSP_INT_USB, | 
					
						
							|  |  |  | 		.flags	= IORESOURCE_IRQ, | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	}, | 
					
						
							|  |  |  | 	[2] = { /* MSBus-to-AMBA bridge register space */ | 
					
						
							|  |  |  | 		.start	= MSP_USB0_MAB_START, | 
					
						
							|  |  |  | 		.end	= MSP_USB0_MAB_END, | 
					
						
							|  |  |  | 		.flags	= IORESOURCE_MEM, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[3] = { /* Identification and general hardware parameters */ | 
					
						
							|  |  |  | 		.start	= MSP_USB0_ID_START, | 
					
						
							|  |  |  | 		.end	= MSP_USB0_ID_END, | 
					
						
							|  |  |  | 		.flags	= IORESOURCE_MEM, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | static u64 msp_usbdev_dma_mask = 0xffffffffUL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* This may need to be converted to a mspusb_device, too. */ | 
					
						
							|  |  |  | static struct mspusb_device msp_usbdev0_device = { | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	.dev	= { | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 		.name	= "msp71xx_udc", | 
					
						
							|  |  |  | 		.id	= 0, | 
					
						
							|  |  |  | 		.dev	= { | 
					
						
							|  |  |  | 			.dma_mask = &msp_usbdev_dma_mask, | 
					
						
							|  |  |  | 			.coherent_dma_mask = 0xffffffffUL, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | 		.num_resources	= ARRAY_SIZE(msp_usbdev0_resources), | 
					
						
							|  |  |  | 		.resource	= msp_usbdev0_resources, | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | #endif /* CONFIG_USB_GADGET */
 | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | static int __init msp_usb_setup(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	char		*strp; | 
					
						
							|  |  |  | 	char		envstr[32]; | 
					
						
							|  |  |  | 	struct platform_device *msp_devs[NUM_USB_DEVS]; | 
					
						
							|  |  |  | 	unsigned int val; | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	/* construct environment name usbmode */ | 
					
						
							|  |  |  | 	/* set usbmode <host/device> as pmon environment var */ | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	 * Could this perhaps be integrated into the "features" env var? | 
					
						
							|  |  |  | 	 * Use the features key "U", and follow with "H" for host-mode, | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | 	 * "D" for device-mode.	 If it works for Ethernet, why not USB... | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	 *  -- hammtrev, 2007/03/22 | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	snprintf((char *)&envstr[0], sizeof(envstr), "usbmode"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	/* set default host mode */ | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	val = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* get environment string */ | 
					
						
							|  |  |  | 	strp = prom_getenv((char *)&envstr[0]); | 
					
						
							|  |  |  | 	if (strp) { | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 		/* compare string */ | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 		if (!strcmp(strp, "device")) | 
					
						
							|  |  |  | 			val = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (val) { | 
					
						
							|  |  |  | #if defined(CONFIG_USB_EHCI_HCD)
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 		msp_devs[0] = &msp_usbhost0_device.dev; | 
					
						
							|  |  |  | 		ppfinit("platform add USB HOST done %s.\n", msp_devs[0]->name); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 		ppfinit("%s: echi_hcd not supported\n", __FILE__); | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | #endif	/* CONFIG_USB_EHCI_HCD */
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | #if defined(CONFIG_USB_GADGET)
 | 
					
						
							|  |  |  | 		/* get device mode structure */ | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 		msp_devs[0] = &msp_usbdev0_device.dev; | 
					
						
							|  |  |  | 		ppfinit("platform add USB DEVICE done %s.\n" | 
					
						
							|  |  |  | 					, msp_devs[0]->name); | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 		ppfinit("%s: usb_gadget not supported\n", __FILE__); | 
					
						
							| 
									
										
										
										
											2013-01-22 12:59:30 +01:00
										 |  |  | #endif	/* CONFIG_USB_GADGET */
 | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	/* add device */ | 
					
						
							|  |  |  | 	platform_add_devices(msp_devs, ARRAY_SIZE(msp_devs)); | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2007-06-14 15:54:47 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | subsys_initcall(msp_usb_setup); | 
					
						
							| 
									
										
										
										
											2011-01-25 13:52:05 +05:30
										 |  |  | #endif /* CONFIG_USB_EHCI_HCD || CONFIG_USB_GADGET */
 |