diff options
| author | Ajay Kumar Gupta <ajay.gupta@ti.com> | 2009-12-22 10:56:13 +0530 | 
|---|---|---|
| committer | Remy Bohmer <linux@bohmer.net> | 2010-01-09 10:25:07 +0100 | 
| commit | 7359273d946a7dcde04c5e8d5bad669146efc87c (patch) | |
| tree | 87d82269b118af9beaaa63400550c2a1f70a362b | |
| parent | 0b232310b2087d4278fb224fa01e228136fb8bdf (diff) | |
| download | olio-uboot-2014.01-7359273d946a7dcde04c5e8d5bad669146efc87c.tar.xz olio-uboot-2014.01-7359273d946a7dcde04c5e8d5bad669146efc87c.zip | |
DA8xx: Add MUSB host support
Tested USB host functionality on DA830 EVM.
Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Swaminathan S <swami.iyer@ti.com>
| -rw-r--r-- | drivers/usb/musb/Makefile | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/da8xx.c | 139 | ||||
| -rw-r--r-- | drivers/usb/musb/da8xx.h | 103 | ||||
| -rw-r--r-- | include/usb.h | 2 | 
4 files changed, 244 insertions, 1 deletions
| diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile index f2ccd9fe0..12e115ef1 100644 --- a/drivers/usb/musb/Makefile +++ b/drivers/usb/musb/Makefile @@ -29,6 +29,7 @@ COBJS-$(CONFIG_MUSB_HCD) += musb_hcd.o musb_core.o  COBJS-$(CONFIG_MUSB_UDC) += musb_udc.o musb_core.o  COBJS-$(CONFIG_USB_DAVINCI) += davinci.o  COBJS-$(CONFIG_USB_OMAP3) += omap3.o +COBJS-$(CONFIG_USB_DA8XX) += da8xx.o  COBJS	:= $(COBJS-y)  SRCS	:= $(COBJS:.o=.c) diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c new file mode 100644 index 000000000..40bfe440d --- /dev/null +++ b/drivers/usb/musb/da8xx.c @@ -0,0 +1,139 @@ +/* + * da8xx.c - TI's DA8xx platform specific usb wrapper functions. + * + * Author: Ajay Kumar Gupta <ajay.gupta@ti.com> + * + * Based on drivers/usb/musb/davinci.c + * + * Copyright (C) 2009 Texas Instruments Incorporated + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include <common.h> + +#include "da8xx.h" + +/* MUSB platform configuration */ +struct musb_config musb_cfg = { +	(struct	musb_regs *)DA8XX_USB_OTG_CORE_BASE, +	DA8XX_USB_OTG_TIMEOUT, +	0 +}; + +/* + * This function enables VBUS by driving the GPIO Bank4 Pin 15 high. + */ +static void enable_vbus(void) +{ +	u32 value; + +	/* configure GPIO bank4 pin 15 in output direction */ +	value = readl(&davinci_gpio_bank45->dir); +	writel((value & (~DA8XX_USB_VBUS_GPIO)), &davinci_gpio_bank45->dir); + +	/* set GPIO bank4 pin 15 high to drive VBUS */ +	value = readl(&davinci_gpio_bank45->set_data); +	writel((value | DA8XX_USB_VBUS_GPIO), &davinci_gpio_bank45->set_data); +} + +/* + * Enable the usb0 phy. This initialization procedure is explained in + * the DA8xx USB user guide document. + */ +static u8 phy_on(void) +{ +	u32 timeout; +	u32 cfgchip2; + +	cfgchip2 = readl(&davinci_syscfg_regs->cfgchip2); + +	cfgchip2 &= ~(CFGCHIP2_RESET | CFGCHIP2_PHYPWRDN | CFGCHIP2_OTGPWRDN | +		      CFGCHIP2_OTGMODE | CFGCHIP2_REFFREQ); +	cfgchip2 |= CFGCHIP2_SESENDEN | CFGCHIP2_VBDTCTEN | CFGCHIP2_PHY_PLLON | +		    CFGCHIP2_REFFREQ_24MHZ; + +	writel(cfgchip2, &davinci_syscfg_regs->cfgchip2); + +	/* wait until the usb phy pll locks */ +	timeout = musb_cfg.timeout; +	while (timeout--) +		if (readl(&davinci_syscfg_regs->cfgchip2) & CFGCHIP2_PHYCLKGD) +			return 1; + +	/* USB phy was not turned on */ +	return 0; +} + +/* + * Disable the usb phy + */ +static void phy_off(void) +{ +	u32 cfgchip2; + +	/* +	 * Power down the on-chip PHY. +	 */ +	cfgchip2 = readl(&davinci_syscfg_regs->cfgchip2); +	cfgchip2 &= ~CFGCHIP2_PHY_PLLON; +	cfgchip2 |= CFGCHIP2_PHYPWRDN | CFGCHIP2_OTGPWRDN; +	writel(cfgchip2, &davinci_syscfg_regs->cfgchip2); +} + +/* + * This function performs DA8xx platform specific initialization for usb0. + */ +int musb_platform_init(void) +{ +	u32  revision; + +	/* enable psc for usb2.0 */ +	lpsc_on(33); + +	/* enable usb vbus */ +	enable_vbus(); + +	/* reset the controller */ +	writel(0x1, &da8xx_usb_regs->control); +	udelay(5000); + +	/* start the on-chip usb phy and its pll */ +	if (phy_on() == 0) +		return -1; + +	/* Returns zero if e.g. not clocked */ +	revision = readl(&da8xx_usb_regs->revision); +	if (revision == 0) +		return -1; + +	/* Disable all interrupts */ +	writel((DA8XX_USB_USBINT_MASK | DA8XX_USB_TXINT_MASK | +		DA8XX_USB_RXINT_MASK), &da8xx_usb_regs->intmsk_set); +	return 0; +} + +/* + * This function performs DA8xx platform specific deinitialization for usb0. + */ +void musb_platform_deinit(void) +{ +	/* Turn of the phy */ +	phy_off(); + +	/* flush any interrupts */ +	writel((DA8XX_USB_USBINT_MASK | DA8XX_USB_TXINT_MASK | +		DA8XX_USB_RXINT_MASK), &da8xx_usb_regs->intmsk_clr); +	writel(0, &da8xx_usb_regs->eoi); +} diff --git a/drivers/usb/musb/da8xx.h b/drivers/usb/musb/da8xx.h new file mode 100644 index 000000000..93234f0dd --- /dev/null +++ b/drivers/usb/musb/da8xx.h @@ -0,0 +1,103 @@ +/* + * da8xx.h -- TI's DA8xx platform specific usb wrapper definitions. + * + * Author: Ajay Kumar Gupta <ajay.gupta@ti.com> + * + * Based on drivers/usb/musb/davinci.h + * + * Copyright (C) 2009 Texas Instruments Incorporated + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#ifndef __DA8XX_MUSB_H__ +#define __DA8XX_MUSB_H__ + +#include <asm/arch/hardware.h> +#include <asm/arch/gpio_defs.h> +#include "musb_core.h" + +/* Base address of da8xx usb0 wrapper */ +#define DA8XX_USB_OTG_BASE  0x01E00000 + +/* Base address of da8xx musb core */ +#define DA8XX_USB_OTG_CORE_BASE (DA8XX_USB_OTG_BASE + 0x400) + +/* Timeout for DA8xx usb module */ +#define DA8XX_USB_OTG_TIMEOUT 0x3FFFFFF + +/* + * DA8xx platform USB wrapper register overlay. + */ +struct da8xx_usb_regs { +	dv_reg	revision; +	dv_reg	control; +	dv_reg 	status; +	dv_reg 	emulation; +	dv_reg 	mode; +	dv_reg 	autoreq; +	dv_reg 	srpfixtime; +	dv_reg 	teardown; +	dv_reg 	intsrc; +	dv_reg 	intsrc_set; +	dv_reg 	intsrc_clr; +	dv_reg 	intmsk; +	dv_reg 	intmsk_set; +	dv_reg 	intmsk_clr; +	dv_reg 	intsrcmsk; +	dv_reg 	eoi; +	dv_reg 	intvector; +	dv_reg 	grndis_size[4]; +}; + +#define da8xx_usb_regs ((struct da8xx_usb_regs *)DA8XX_USB_OTG_BASE) + +/* DA8XX interrupt bits definitions */ +#define DA8XX_USB_TX_ENDPTS_MASK  0x1f	/* ep0 + 4 tx */ +#define DA8XX_USB_RX_ENDPTS_MASK  0x1e	/* 4 rx */ +#define DA8XX_USB_TXINT_SHIFT	  0 +#define DA8XX_USB_RXINT_SHIFT	  8 + +#define DA8XX_USB_USBINT_MASK	  0x01ff0000	/* 8 Mentor, DRVVBUS */ +#define DA8XX_USB_TXINT_MASK \ +		(DA8XX_USB_TX_ENDPTS_MASK << DA8XX_USB_TXINT_SHIFT) +#define DA8XX_USB_RXINT_MASK \ +		(DA8XX_USB_RX_ENDPTS_MASK << DA8XX_USB_RXINT_SHIFT) + +/* DA8xx CFGCHIP2 (USB 2.0 PHY Control) register bits */ +#define CFGCHIP2_PHYCLKGD	(1 << 17) +#define CFGCHIP2_VBUSSENSE	(1 << 16) +#define CFGCHIP2_RESET		(1 << 15) +#define CFGCHIP2_OTGMODE	(3 << 13) +#define CFGCHIP2_NO_OVERRIDE	(0 << 13) +#define CFGCHIP2_FORCE_HOST	(1 << 13) +#define CFGCHIP2_FORCE_DEVICE 	(2 << 13) +#define CFGCHIP2_FORCE_HOST_VBUS_LOW (3 << 13) +#define CFGCHIP2_USB1PHYCLKMUX	(1 << 12) +#define CFGCHIP2_USB2PHYCLKMUX	(1 << 11) +#define CFGCHIP2_PHYPWRDN	(1 << 10) +#define CFGCHIP2_OTGPWRDN	(1 << 9) +#define CFGCHIP2_DATPOL 	(1 << 8) +#define CFGCHIP2_USB1SUSPENDM	(1 << 7) +#define CFGCHIP2_PHY_PLLON	(1 << 6)	/* override PLL suspend */ +#define CFGCHIP2_SESENDEN	(1 << 5)	/* Vsess_end comparator */ +#define CFGCHIP2_VBDTCTEN	(1 << 4)	/* Vbus comparator */ +#define CFGCHIP2_REFFREQ	(0xf << 0) +#define CFGCHIP2_REFFREQ_12MHZ	(1 << 0) +#define CFGCHIP2_REFFREQ_24MHZ	(2 << 0) +#define CFGCHIP2_REFFREQ_48MHZ	(3 << 0) + +#define DA8XX_USB_VBUS_GPIO	(1 << 15) +#endif	/* __DA8XX_MUSB_H__ */ + diff --git a/include/usb.h b/include/usb.h index 1cc3e4229..2a9cd04eb 100644 --- a/include/usb.h +++ b/include/usb.h @@ -132,7 +132,7 @@ struct usb_device {  	defined(CONFIG_USB_EHCI) || defined(CONFIG_USB_OHCI_NEW) || \  	defined(CONFIG_USB_SL811HS) || defined(CONFIG_USB_ISP116X_HCD) || \  	defined(CONFIG_USB_R8A66597_HCD) || defined(CONFIG_USB_DAVINCI) || \ -	defined(CONFIG_USB_OMAP3) +	defined(CONFIG_USB_OMAP3) || defined(CONFIG_USB_DA8XX)  int usb_lowlevel_init(void);  int usb_lowlevel_stop(void); |