diff options
| -rw-r--r-- | drivers/usb/musb/Makefile | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/am35x.c | 118 | ||||
| -rw-r--r-- | drivers/usb/musb/am35x.h | 94 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_udc.c | 2 | ||||
| -rw-r--r-- | include/usb.h | 2 | 
5 files changed, 216 insertions, 1 deletions
| diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile index 397f5fe7a..7d23e06a5 100644 --- a/drivers/usb/musb/Makefile +++ b/drivers/usb/musb/Makefile @@ -31,6 +31,7 @@ COBJS-$(CONFIG_USB_BLACKFIN) += blackfin_usb.o  COBJS-$(CONFIG_USB_DAVINCI) += davinci.o  COBJS-$(CONFIG_USB_OMAP3) += omap3.o  COBJS-$(CONFIG_USB_DA8XX) += da8xx.o +COBJS-$(CONFIG_USB_AM35X) += am35x.o  COBJS	:= $(COBJS-y)  SRCS	:= $(COBJS:.o=.c) diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c new file mode 100644 index 000000000..2024940cd --- /dev/null +++ b/drivers/usb/musb/am35x.c @@ -0,0 +1,118 @@ +/* + * am35x.c - TI's AM35x platform specific usb wrapper functions. + * + * Author: Ajay Kumar Gupta <ajay.gupta@ti.com> + * + * Based on drivers/usb/musb/da8xx.c + * + * Copyright (c) 2010 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 "am35x.h" + +/* MUSB platform configuration */ +struct musb_config musb_cfg = { +	.regs		= (struct musb_regs *)AM35X_USB_OTG_CORE_BASE, +	.timeout	= AM35X_USB_OTG_TIMEOUT, +	.musb_speed	= 0, +}; + +/* + * Enable the USB phy + */ +static u8 phy_on(void) +{ +	u32 devconf2; +	u32 timeout; + +	devconf2 = readl(&am35x_scm_general_regs->devconf2); + +	devconf2 &= ~(DEVCONF2_RESET | DEVCONF2_PHYPWRDN | DEVCONF2_OTGPWRDN | +		      DEVCONF2_OTGMODE | DEVCONF2_REFFREQ | +		      DEVCONF2_PHY_GPIOMODE); +	devconf2 |= DEVCONF2_SESENDEN | DEVCONF2_VBDTCTEN | DEVCONF2_PHY_PLLON | +		    DEVCONF2_REFFREQ_13MHZ | DEVCONF2_DATPOL; + +	writel(devconf2, &am35x_scm_general_regs->devconf2); + +	/* wait until the USB phy is turned on */ +	timeout = musb_cfg.timeout; +	while (timeout--) +		if (readl(&am35x_scm_general_regs->devconf2) & DEVCONF2_PHYCKGD) +			return 1; + +	/* USB phy was not turned on */ +	return 0; +} + +/* + * Disable the USB phy + */ +static void phy_off(void) +{ +	u32 devconf2; + +	/* +	 * Power down the on-chip PHY. +	 */ +	devconf2 = readl(&am35x_scm_general_regs->devconf2); + +	devconf2 &= ~DEVCONF2_PHY_PLLON; +	devconf2 |= DEVCONF2_PHYPWRDN | DEVCONF2_OTGPWRDN; +	writel(devconf2, &am35x_scm_general_regs->devconf2); +} + +/* + * This function performs platform specific initialization for usb0. + */ +int musb_platform_init(void) +{ +	u32 revision; +	u32 sw_reset; + +	/* global usb reset */ +	sw_reset = readl(&am35x_scm_general_regs->ip_sw_reset); +	sw_reset |= (1 << 0); +	writel(sw_reset, &am35x_scm_general_regs->ip_sw_reset); +	sw_reset &= ~(1 << 0); +	writel(sw_reset, &am35x_scm_general_regs->ip_sw_reset); + +	/* reset the controller */ +	writel(0x1, &am35x_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(&am35x_usb_regs->revision); +	if (revision == 0) +		return -1; + +	return 0; +} + +/* + * This function performs platform specific deinitialization for usb0. + */ +void musb_platform_deinit(void) +{ +	/* Turn off the phy */ +	phy_off(); +} diff --git a/drivers/usb/musb/am35x.h b/drivers/usb/musb/am35x.h new file mode 100644 index 000000000..756c3aed8 --- /dev/null +++ b/drivers/usb/musb/am35x.h @@ -0,0 +1,94 @@ +/* + * am35x.h - TI's AM35x platform specific usb wrapper definitions. + * + * Author: Ajay Kumar Gupta <ajay.gupta@ti.com> + * + * Based on drivers/usb/musb/da8xx.h + * + * Copyright (c) 2010 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 __AM35X_USB_H__ +#define __AM35X_USB_H__ + +#include <asm/arch/am35x_def.h> +#include "musb_core.h" + +/* Base address of musb wrapper */ +#define AM35X_USB_OTG_BASE	0x5C040000 + +/* Base address of musb core */ +#define AM35X_USB_OTG_CORE_BASE	(AM35X_USB_OTG_BASE + 0x400) + +/* Timeout for AM35x usb module */ +#define AM35X_USB_OTG_TIMEOUT	0x3FFFFFF + +/* + * AM35x platform USB wrapper register overlay. + */ +struct am35x_usb_regs { +	u32	revision; +	u32	control; +	u32	status; +	u32	emulation; +	u32	reserved0[1]; +	u32	autoreq; +	u32	srpfixtime; +	u32	ep_intsrc; +	u32	ep_intsrcset; +	u32	ep_intsrcclr; +	u32	ep_intmsk; +	u32	ep_intmskset; +	u32	ep_intmskclr; +	u32	ep_intsrcmsked; +	u32	reserved1[1]; +	u32	core_intsrc; +	u32	core_intsrcset; +	u32	core_intsrcclr; +	u32	core_intmsk; +	u32	core_intmskset; +	u32	core_intmskclr; +	u32	core_intsrcmsked; +	u32	reserved2[1]; +	u32	eoi; +	u32	mop_sop_en; +	u32	reserved3[2]; +	u32	txmode; +	u32	rxmode; +	u32	epcount_mode; +}; + +#define am35x_usb_regs ((struct am35x_usb_regs *)AM35X_USB_OTG_BASE) + +/* USB 2.0 PHY Control */ +#define DEVCONF2_PHY_GPIOMODE	(1 << 23) +#define DEVCONF2_OTGMODE	(3 << 14) +#define DEVCONF2_SESENDEN	(1 << 13)       /* Vsess_end comparator */ +#define DEVCONF2_VBDTCTEN	(1 << 12)       /* Vbus comparator */ +#define DEVCONF2_REFFREQ_24MHZ	(2 << 8) +#define DEVCONF2_REFFREQ_26MHZ	(7 << 8) +#define DEVCONF2_REFFREQ_13MHZ	(6 << 8) +#define DEVCONF2_REFFREQ	(0xf << 8) +#define DEVCONF2_PHYCKGD	(1 << 7) +#define DEVCONF2_VBUSSENSE	(1 << 6) +#define DEVCONF2_PHY_PLLON	(1 << 5)        /* override PLL suspend */ +#define DEVCONF2_RESET		(1 << 4) +#define DEVCONF2_PHYPWRDN	(1 << 3) +#define DEVCONF2_OTGPWRDN	(1 << 2) +#define DEVCONF2_DATPOL		(1 << 1) + +#endif	/* __AM35X_USB_H__ */ diff --git a/drivers/usb/musb/musb_udc.c b/drivers/usb/musb/musb_udc.c index fc43cf4f0..6f6ed61d0 100644 --- a/drivers/usb/musb/musb_udc.c +++ b/drivers/usb/musb/musb_udc.c @@ -57,6 +57,8 @@  #include "musb_core.h"  #if defined(CONFIG_USB_OMAP3)  #include "omap3.h" +#elif defined(CONFIG_USB_AM35X) +#include "am35x.h"  #elif defined(CONFIG_USB_DAVINCI)  #include "davinci.h"  #endif diff --git a/include/usb.h b/include/usb.h index bc4ccfe15..afd65e318 100644 --- a/include/usb.h +++ b/include/usb.h @@ -133,7 +133,7 @@ struct usb_device {  	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_DA8XX) || \ -	defined(CONFIG_USB_BLACKFIN) +	defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X)  int usb_lowlevel_init(void);  int usb_lowlevel_stop(void); |