Path: blob/master/arch/mips/pmc-sierra/msp71xx/msp_usb.c
15118 views
/*1* The setup file for USB related hardware on PMC-Sierra MSP processors.2*3* Copyright 2006 PMC-Sierra, Inc.4*5* This program is free software; you can redistribute it and/or modify it6* under the terms of the GNU General Public License as published by the7* Free Software Foundation; either version 2 of the License, or (at your8* option) any later version.9*10* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED11* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF12* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN13* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,14* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT15* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF16* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON17* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT18* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF19* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.20*21* You should have received a copy of the GNU General Public License along22* with this program; if not, write to the Free Software Foundation, Inc.,23* 675 Mass Ave, Cambridge, MA 02139, USA.24*/25#if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_GADGET)2627#include <linux/init.h>28#include <linux/ioport.h>29#include <linux/platform_device.h>3031#include <asm/mipsregs.h>3233#include <msp_regs.h>34#include <msp_int.h>35#include <msp_prom.h>36#include <msp_usb.h>373839#if defined(CONFIG_USB_EHCI_HCD)40static struct resource msp_usbhost0_resources[] = {41[0] = { /* EHCI-HS operational and capabilities registers */42.start = MSP_USB0_HS_START,43.end = MSP_USB0_HS_END,44.flags = IORESOURCE_MEM,45},46[1] = {47.start = MSP_INT_USB,48.end = MSP_INT_USB,49.flags = IORESOURCE_IRQ,50},51[2] = { /* MSBus-to-AMBA bridge register space */52.start = MSP_USB0_MAB_START,53.end = MSP_USB0_MAB_END,54.flags = IORESOURCE_MEM,55},56[3] = { /* Identification and general hardware parameters */57.start = MSP_USB0_ID_START,58.end = MSP_USB0_ID_END,59.flags = IORESOURCE_MEM,60},61};6263static u64 msp_usbhost0_dma_mask = 0xffffffffUL;6465static struct mspusb_device msp_usbhost0_device = {66.dev = {67.name = "pmcmsp-ehci",68.id = 0,69.dev = {70.dma_mask = &msp_usbhost0_dma_mask,71.coherent_dma_mask = 0xffffffffUL,72},73.num_resources = ARRAY_SIZE(msp_usbhost0_resources),74.resource = msp_usbhost0_resources,75},76};7778/* MSP7140/MSP82XX has two USB2 hosts. */79#ifdef CONFIG_MSP_HAS_DUAL_USB80static u64 msp_usbhost1_dma_mask = 0xffffffffUL;8182static struct resource msp_usbhost1_resources[] = {83[0] = { /* EHCI-HS operational and capabilities registers */84.start = MSP_USB1_HS_START,85.end = MSP_USB1_HS_END,86.flags = IORESOURCE_MEM,87},88[1] = {89.start = MSP_INT_USB,90.end = MSP_INT_USB,91.flags = IORESOURCE_IRQ,92},93[2] = { /* MSBus-to-AMBA bridge register space */94.start = MSP_USB1_MAB_START,95.end = MSP_USB1_MAB_END,96.flags = IORESOURCE_MEM,97},98[3] = { /* Identification and general hardware parameters */99.start = MSP_USB1_ID_START,100.end = MSP_USB1_ID_END,101.flags = IORESOURCE_MEM,102},103};104105static struct mspusb_device msp_usbhost1_device = {106.dev = {107.name = "pmcmsp-ehci",108.id = 1,109.dev = {110.dma_mask = &msp_usbhost1_dma_mask,111.coherent_dma_mask = 0xffffffffUL,112},113.num_resources = ARRAY_SIZE(msp_usbhost1_resources),114.resource = msp_usbhost1_resources,115},116};117#endif /* CONFIG_MSP_HAS_DUAL_USB */118#endif /* CONFIG_USB_EHCI_HCD */119120#if defined(CONFIG_USB_GADGET)121static struct resource msp_usbdev0_resources[] = {122[0] = { /* EHCI-HS operational and capabilities registers */123.start = MSP_USB0_HS_START,124.end = MSP_USB0_HS_END,125.flags = IORESOURCE_MEM,126},127[1] = {128.start = MSP_INT_USB,129.end = MSP_INT_USB,130.flags = IORESOURCE_IRQ,131},132[2] = { /* MSBus-to-AMBA bridge register space */133.start = MSP_USB0_MAB_START,134.end = MSP_USB0_MAB_END,135.flags = IORESOURCE_MEM,136},137[3] = { /* Identification and general hardware parameters */138.start = MSP_USB0_ID_START,139.end = MSP_USB0_ID_END,140.flags = IORESOURCE_MEM,141},142};143144static u64 msp_usbdev_dma_mask = 0xffffffffUL;145146/* This may need to be converted to a mspusb_device, too. */147static struct mspusb_device msp_usbdev0_device = {148.dev = {149.name = "msp71xx_udc",150.id = 0,151.dev = {152.dma_mask = &msp_usbdev_dma_mask,153.coherent_dma_mask = 0xffffffffUL,154},155.num_resources = ARRAY_SIZE(msp_usbdev0_resources),156.resource = msp_usbdev0_resources,157},158};159160#ifdef CONFIG_MSP_HAS_DUAL_USB161static struct resource msp_usbdev1_resources[] = {162[0] = { /* EHCI-HS operational and capabilities registers */163.start = MSP_USB1_HS_START,164.end = MSP_USB1_HS_END,165.flags = IORESOURCE_MEM,166},167[1] = {168.start = MSP_INT_USB,169.end = MSP_INT_USB,170.flags = IORESOURCE_IRQ,171},172[2] = { /* MSBus-to-AMBA bridge register space */173.start = MSP_USB1_MAB_START,174.end = MSP_USB1_MAB_END,175.flags = IORESOURCE_MEM,176},177[3] = { /* Identification and general hardware parameters */178.start = MSP_USB1_ID_START,179.end = MSP_USB1_ID_END,180.flags = IORESOURCE_MEM,181},182};183184/* This may need to be converted to a mspusb_device, too. */185static struct mspusb_device msp_usbdev1_device = {186.dev = {187.name = "msp71xx_udc",188.id = 0,189.dev = {190.dma_mask = &msp_usbdev_dma_mask,191.coherent_dma_mask = 0xffffffffUL,192},193.num_resources = ARRAY_SIZE(msp_usbdev1_resources),194.resource = msp_usbdev1_resources,195},196};197198#endif /* CONFIG_MSP_HAS_DUAL_USB */199#endif /* CONFIG_USB_GADGET */200201static int __init msp_usb_setup(void)202{203char *strp;204char envstr[32];205struct platform_device *msp_devs[NUM_USB_DEVS];206unsigned int val;207208/* construct environment name usbmode */209/* set usbmode <host/device> as pmon environment var */210/*211* Could this perhaps be integrated into the "features" env var?212* Use the features key "U", and follow with "H" for host-mode,213* "D" for device-mode. If it works for Ethernet, why not USB...214* -- hammtrev, 2007/03/22215*/216snprintf((char *)&envstr[0], sizeof(envstr), "usbmode");217218/* set default host mode */219val = 1;220221/* get environment string */222strp = prom_getenv((char *)&envstr[0]);223if (strp) {224/* compare string */225if (!strcmp(strp, "device"))226val = 0;227}228229if (val) {230#if defined(CONFIG_USB_EHCI_HCD)231msp_devs[0] = &msp_usbhost0_device.dev;232ppfinit("platform add USB HOST done %s.\n", msp_devs[0]->name);233#ifdef CONFIG_MSP_HAS_DUAL_USB234msp_devs[1] = &msp_usbhost1_device.dev;235ppfinit("platform add USB HOST done %s.\n", msp_devs[1]->name);236#endif237#else238ppfinit("%s: echi_hcd not supported\n", __FILE__);239#endif /* CONFIG_USB_EHCI_HCD */240} else {241#if defined(CONFIG_USB_GADGET)242/* get device mode structure */243msp_devs[0] = &msp_usbdev0_device.dev;244ppfinit("platform add USB DEVICE done %s.\n"245, msp_devs[0]->name);246#ifdef CONFIG_MSP_HAS_DUAL_USB247msp_devs[1] = &msp_usbdev1_device.dev;248ppfinit("platform add USB DEVICE done %s.\n"249, msp_devs[1]->name);250#endif251#else252ppfinit("%s: usb_gadget not supported\n", __FILE__);253#endif /* CONFIG_USB_GADGET */254}255/* add device */256platform_add_devices(msp_devs, ARRAY_SIZE(msp_devs));257258return 0;259}260261subsys_initcall(msp_usb_setup);262#endif /* CONFIG_USB_EHCI_HCD || CONFIG_USB_GADGET */263264265