[U-Boot] [PATCH v4 1/3] AM335x : Add USB support for AM335x in u-boot

Harman Sohanpal harman_sohanpal at ti.com
Fri Jun 29 13:33:24 CEST 2012


From: Gene Zarkhin <gene_zarkhin at bose.com>

Adds USB support in uboot for AM335x.
The support for USB0 and USB1 can be added dynamically
by changing the boards.cfg file for USB0 or USB1.
This patch adds support for USB0.
USB 1 has a full size connector so acts in host mode and
USB 0 has a mini connector so used in device mode.

Signed-off-by: Gene Zarkhin <gene_zarkhin at bose.com>
Signed-off-by: Harman Sohanpal <harman_sohanpal at ti.com>
---
Changes for v2:
	- none
Changes for v3:
	- Changed commit message to specify why USB 1 
	has been enabled by default.
Changes for v4:
	- Selected USB module from board.cfg.
	- Cleaned up indentation.
	- Base address of USB selected according to 
	 config selected in boards.cfg.

 boards.cfg                |    2 +-
 drivers/usb/musb/Makefile |    1 +
 drivers/usb/musb/am335x.c |  121 ++++++++++++++++++++++++++++++++++++++++++++
 drivers/usb/musb/am335x.h |  122 +++++++++++++++++++++++++++++++++++++++++++++
 include/usb.h             |    3 +-
 5 files changed, 247 insertions(+), 2 deletions(-)
 create mode 100644 drivers/usb/musb/am335x.c
 create mode 100644 drivers/usb/musb/am335x.h

diff --git a/boards.cfg b/boards.cfg
index 9ef903a..35aec79 100644
--- a/boards.cfg
+++ b/boards.cfg
@@ -183,7 +183,7 @@ versatileqemu                arm         arm926ejs   versatile           armltd
 integratorap_cm946es         arm         arm946es    integrator          armltd         -               integratorap:CM946ES
 integratorcp_cm946es         arm         arm946es    integrator          armltd         -               integratorcp:CM946ES
 ca9x4_ct_vxp                 arm         armv7       vexpress            armltd
-am335x_evm                   arm         armv7       am335x              ti             am33xx
+am335x_evm                   arm         armv7       am335x              ti             am33xx		am335x_evm:AM335X_USB0
 highbank                     arm         armv7       highbank            -              highbank
 efikamx                      arm         armv7       efikamx             -              mx5		efikamx:MACH_TYPE=MACH_TYPE_MX51_EFIKAMX,IMX_CONFIG=board/efikamx/imximage_mx.cfg
 efikasb                      arm         armv7       efikamx             -              mx5		efikamx:MACH_TYPE=MACH_TYPE_MX51_EFIKASB,IMX_CONFIG=board/efikamx/imximage_sb.cfg
diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile
index 20b5503..d00ec40 100644
--- a/drivers/usb/musb/Makefile
+++ b/drivers/usb/musb/Makefile
@@ -32,6 +32,7 @@ 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-$(CONFIG_USB_AM335X) += am335x.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
diff --git a/drivers/usb/musb/am335x.c b/drivers/usb/musb/am335x.c
new file mode 100644
index 0000000..4b59769
--- /dev/null
+++ b/drivers/usb/musb/am335x.c
@@ -0,0 +1,121 @@
+/*
+ * am335x.c - TI's AM335x platform specific usb wrapper functions.
+ *
+ * Author: gene Zarkhin <gene_zarkhin at bose.com>
+ * Modified by: Harman Sohanpal <harman_sohanpal at ti.com>
+ *
+ * Based on drivers/usb/musb/da8xx.c
+ *
+ * Copyright (c) 2012 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 "am335x.h"
+
+/* MUSB platform configuration */
+struct musb_config musb_cfg = {
+	.regs = (struct musb_regs *)(AM335X_USB_OTG_CORE_BASE),
+	.timeout	= AM335X_USB_OTG_TIMEOUT,
+	.musb_speed	= 0,
+};
+
+/*
+ * Enable the USB phy
+ */
+static u8 phy_on(void)
+{
+	u32 timeout;
+	u32 regAddr = CM_REGISTERS + USB_CTRL0_REG_OFFSET;
+	u32 usb_ctrl_reg;
+
+	usb_ctrl_reg = readl(regAddr);
+	usb_ctrl_reg &= ~(CM_PHY_PWRDN | CM_PHY_OTG_PWRDN);
+	usb_ctrl_reg |= (OTGVDET_EN | OTGSESSENDEN);
+	writel(usb_ctrl_reg, regAddr);
+
+	timeout = musb_cfg.timeout;
+	writel(0x1, &am335x_usb_regs->ctrl);
+	udelay(6000);
+	while (timeout--) {
+		if ((readl(&am335x_usb_regs->ctrl) & SOFT_RESET_BIT) == 0)
+			return 1;
+	}
+	/* USB phy was not turned on */
+	return 0;
+}
+
+/*
+ * Disable the USB phy
+ */
+static void phy_off(void)
+{
+	u32 regAddr = CM_REGISTERS + USB_CTRL0_REG_OFFSET;
+	u32 usb_ctrl_reg;
+
+	usb_ctrl_reg = readl(regAddr);
+	usb_ctrl_reg |= (CM_PHY_PWRDN | CM_PHY_OTG_PWRDN);
+	writel(usb_ctrl_reg, regAddr);
+
+	/* Disable the USB module */
+	writel(PRCM_MODULE_DSBL, CM_PER_USB0_CLKCTRL);
+}
+
+/*
+ * This function performs platform specific initialization for usb0.
+ */
+int musb_platform_init(void)
+{
+	u32 timeout;
+	u32 revision;
+
+	/* USB */
+	/* PLL Gate set up */
+	writel(DPLL_CLKDCOLDO_GATE_CTRL, CM_CLKDCOLDO_DPLL_PER);
+
+	/* CLOCK */
+	writel(PRCM_MOD_EN, CM_PER_USB0_CLKCTRL);
+	timeout = musb_cfg.timeout;
+	while (timeout--) {
+		if (readl(CM_PER_USB0_CLKCTRL) != PRCM_MOD_EN)
+			continue;
+		else
+			break;
+	}
+	if (timeout == 0) {
+		printf("\nUSB module not enabled\nAborting");
+		return -1;
+	}
+
+	/* USB module fully functional */
+	/* start the on-chip usb phy and its pll */
+	if (phy_on() == 0)
+		return -1;
+	/* Returns zero if e.g. not clocked */
+	revision = readl(&am335x_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/am335x.h b/drivers/usb/musb/am335x.h
new file mode 100644
index 0000000..b772460
--- /dev/null
+++ b/drivers/usb/musb/am335x.h
@@ -0,0 +1,122 @@
+/*
+ * am335x.h - TI's AM335x platform specific usb wrapper definitions.
+ *
+ * Author: Gene Zarkhin <gene_zarkhin at bose.com>
+ * Modified by: Harman Sohanpal <harman_sohanpal at ti.com>
+ *
+ * Based on drivers/usb/musb/da8xx.h
+ *
+ * Copyright (c) 2012 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 __AM335X_USB_H__
+#define __AM335X_USB_H__
+
+#include "musb_core.h"
+/* PRCM Definitions */
+#define CM_CLKDCOLDO_DPLL_PER		(CM_WKUP + 0x7c)
+#define CM_PER_USB0_CLKCTRL		(CM_PER + 0x1c)
+#define PRCM_MOD_EN			0x2
+#define PRCM_MODULE_DSBL		0x0
+
+
+/* Control Module Registers */
+#define CM_REGISTERS			CTRL_BASE
+
+#define PRCM_IDLEST			0x30000
+#define DPLL_CLKDCOLDO_GATE_CTRL	0x300
+
+/* Base address of musb wrapper */
+#define AM335X_USB0_OTG_BASE		0x47401000
+#define AM335X_USB1_OTG_BASE		0x47401800
+
+/* Selecting between USB0 and USB1 */
+
+#ifdef CONFIG_AM335X_USB0
+#define AM335X_USB_OTG_BASE		AM335X_USB0_OTG_BASE
+#define USB_CTRL0_REG_OFFSET		0x620
+#elif defined(CONFIG_AM335X_USB1)
+#define AM335X_USB_OTG_BASE		AM335X_USB1_OTG_BASE
+#define USB_CTRL0_REG_OFFSET		0x628
+#endif
+
+/* Base address of musb core */
+#define AM335X_USB_OTG_CORE_BASE	(AM335X_USB_OTG_BASE + 0x400)
+
+/* Timeout for AM35x usb module */
+#define AM335X_USB_OTG_TIMEOUT		0x3FFFFFF
+
+/*
+ * AM335x platform USB wrapper register overlay.
+ */
+struct am335x_usb_regs {
+	u32 revision;			/* 0x00 */
+	u32 reserved0[4];
+	u32 ctrl;			/* 0x14 */
+	u32 status;			/* 0x18 */
+	u32 reserved1[1];
+	u32 irqmstat;			/* 0x20 */
+	u32 irqeoi;			/* 0x24 */
+	u32 irqstatraw0;		/* 0x28 */
+	u32 irqstatraw1;		/* 0x2c */
+	u32 irqstat0;			/* 0x30 */
+	u32 irqstat1;			/* 0x34 */
+	u32 irqenableset0;		/* 0x38 */
+	u32 irqenableset1;		/* 0x3c */
+	u32 irqenableclr0;		/* 0x40 */
+	u32 irqenableclr1;		/* 0x44 */
+	u32 reserved2[10];
+	u32 txmode;			/* 0x70 */
+	u32 rxmode;			/* 0x74 */
+	u32 reserved3[2];
+	u32 genrndisep1;		/* 0x80	*/
+	u32 genrndisep2;		/* 0x84	*/
+	u32 genrndisep3;		/* 0x88	*/
+	u32 genrndisep4;		/* 0x8c	*/
+	u32 genrndisep5;		/* 0x90	*/
+	u32 genrndisep6;		/* 0x94	*/
+	u32 genrndisep7;		/* 0x98	*/
+	u32 genrndisep8;		/* 0x9c	*/
+	u32 genrndisep9;		/* 0xa0	*/
+	u32 genrndisep10;		/* 0xa4	*/
+	u32 genrndisep11;		/* 0xa8	*/
+	u32 genrndisep12;		/* 0xac	*/
+	u32 genrndisep13;		/* 0xb0	*/
+	u32 genrndisep14;		/* 0xb4	*/
+	u32 genrndisep15;		/* 0xb8	*/
+	u32 reserved4[5];
+	u32 autoreq;			/* 0xd0	*/
+	u32 srpfixtime;			/* 0xd4	*/
+	u32 tdown;			/* 0xd8	*/
+	u32 reserved5[1];
+	u32 utmi;			/* 0xe0	*/
+	u32 utmilb;			/* 0xe4	*/
+	u32 mode;			/* 0xe8	*/
+};
+
+#define am335x_usb_regs ((struct am335x_usb_regs *)AM335X_USB_OTG_BASE)
+
+/* USB 2.0 PHY Control */
+#define CM_PHY_PWRDN			(1 << 0)
+#define CM_PHY_OTG_PWRDN		(1 << 1)
+#define OTGVDET_EN			(1 << 19)
+#define OTGSESSENDEN			(1 << 20)
+
+/* USB CTRL REG FIELDS */
+#define SOFT_RESET_BIT			(1 << 0)
+
+#endif	/* __AM335X_USB_H__ */
diff --git a/include/usb.h b/include/usb.h
index 6da91e7..13f5434 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -141,7 +141,8 @@ 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_AM35X)
+	defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X) || \
+	defined(CONFIG_USB_AM335X)
 
 int usb_lowlevel_init(void);
 int usb_lowlevel_stop(void);
-- 
1.7.0.4



More information about the U-Boot mailing list