xref: /OK3568_Linux_fs/u-boot/drivers/usb/musb/omap3.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 2009 Wind River Systems, Inc.
3*4882a593Smuzhiyun  * Tom Rix <Tom.Rix@windriver.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This is file is based on
6*4882a593Smuzhiyun  * repository git.gitorious.org/u-boot-omap3/mainline.git,
7*4882a593Smuzhiyun  * branch omap3-dev-usb, file drivers/usb/host/omap3530_usb.c
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This is the unique part of its copyright :
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * ------------------------------------------------------------------------
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  * Copyright (c) 2009 Texas Instruments
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * ------------------------------------------------------------------------
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <asm/omap_common.h>
21*4882a593Smuzhiyun #include <twl4030.h>
22*4882a593Smuzhiyun #include <twl6030.h>
23*4882a593Smuzhiyun #include "omap3.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun static int platform_needs_initialization = 1;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun struct musb_config musb_cfg = {
28*4882a593Smuzhiyun 	.regs		= (struct musb_regs *)MENTOR_USB0_BASE,
29*4882a593Smuzhiyun 	.timeout	= OMAP3_USB_TIMEOUT,
30*4882a593Smuzhiyun 	.musb_speed	= 0,
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun  * OMAP3 USB OTG registers.
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun struct omap3_otg_regs {
37*4882a593Smuzhiyun 	u32	revision;
38*4882a593Smuzhiyun 	u32	sysconfig;
39*4882a593Smuzhiyun 	u32	sysstatus;
40*4882a593Smuzhiyun 	u32	interfsel;
41*4882a593Smuzhiyun 	u32	simenable;
42*4882a593Smuzhiyun 	u32	forcestdby;
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun static struct omap3_otg_regs *otg;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define OMAP3_OTG_SYSCONFIG_SMART_STANDBY_MODE		0x2000
48*4882a593Smuzhiyun #define OMAP3_OTG_SYSCONFIG_NO_STANDBY_MODE		0x1000
49*4882a593Smuzhiyun #define OMAP3_OTG_SYSCONFIG_SMART_IDLE_MODE		0x0010
50*4882a593Smuzhiyun #define OMAP3_OTG_SYSCONFIG_NO_IDLE_MODE		0x0008
51*4882a593Smuzhiyun #define OMAP3_OTG_SYSCONFIG_ENABLEWAKEUP		0x0004
52*4882a593Smuzhiyun #define OMAP3_OTG_SYSCONFIG_SOFTRESET			0x0002
53*4882a593Smuzhiyun #define OMAP3_OTG_SYSCONFIG_AUTOIDLE			0x0001
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define OMAP3_OTG_SYSSTATUS_RESETDONE			0x0001
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* OMAP4430 has an internal PHY, use it */
58*4882a593Smuzhiyun #ifdef CONFIG_OMAP44XX
59*4882a593Smuzhiyun #define OMAP3_OTG_INTERFSEL_OMAP			0x0000
60*4882a593Smuzhiyun #else
61*4882a593Smuzhiyun #define OMAP3_OTG_INTERFSEL_OMAP			0x0001
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #define OMAP3_OTG_FORCESTDBY_STANDBY			0x0001
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #ifdef DEBUG_MUSB_OMAP3
musb_db_otg_regs(void)68*4882a593Smuzhiyun static void musb_db_otg_regs(void)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	u32 l;
71*4882a593Smuzhiyun 	l = readl(&otg->revision);
72*4882a593Smuzhiyun 	serial_printf("OTG_REVISION 0x%x\n", l);
73*4882a593Smuzhiyun 	l = readl(&otg->sysconfig);
74*4882a593Smuzhiyun 	serial_printf("OTG_SYSCONFIG 0x%x\n", l);
75*4882a593Smuzhiyun 	l = readl(&otg->sysstatus);
76*4882a593Smuzhiyun 	serial_printf("OTG_SYSSTATUS 0x%x\n", l);
77*4882a593Smuzhiyun 	l = readl(&otg->interfsel);
78*4882a593Smuzhiyun 	serial_printf("OTG_INTERFSEL 0x%x\n", l);
79*4882a593Smuzhiyun 	l = readl(&otg->forcestdby);
80*4882a593Smuzhiyun 	serial_printf("OTG_FORCESTDBY 0x%x\n", l);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun #endif
83*4882a593Smuzhiyun 
musb_platform_init(void)84*4882a593Smuzhiyun int musb_platform_init(void)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun 	int ret = -1;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	if (platform_needs_initialization) {
89*4882a593Smuzhiyun 		u32 stdby;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 		/*
92*4882a593Smuzhiyun 		 * OMAP3EVM uses ISP1504 phy and so
93*4882a593Smuzhiyun 		 * twl4030 related init is not required.
94*4882a593Smuzhiyun 		 */
95*4882a593Smuzhiyun #ifdef CONFIG_TWL4030_USB
96*4882a593Smuzhiyun 		if (twl4030_usb_ulpi_init()) {
97*4882a593Smuzhiyun 			serial_printf("ERROR: %s Could not initialize PHY\n",
98*4882a593Smuzhiyun 				__PRETTY_FUNCTION__);
99*4882a593Smuzhiyun 			goto end;
100*4882a593Smuzhiyun 		}
101*4882a593Smuzhiyun #endif
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #ifdef CONFIG_TWL6030_POWER
104*4882a593Smuzhiyun 		twl6030_usb_device_settings();
105*4882a593Smuzhiyun #endif
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 		otg = (struct omap3_otg_regs *)OMAP3_OTG_BASE;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 		/* Set OTG to always be on */
110*4882a593Smuzhiyun 		writel(OMAP3_OTG_SYSCONFIG_NO_STANDBY_MODE |
111*4882a593Smuzhiyun 		       OMAP3_OTG_SYSCONFIG_NO_IDLE_MODE, &otg->sysconfig);
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 		/* Set the interface */
114*4882a593Smuzhiyun 		writel(OMAP3_OTG_INTERFSEL_OMAP, &otg->interfsel);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun 		/* Clear force standby */
117*4882a593Smuzhiyun 		stdby = readl(&otg->forcestdby);
118*4882a593Smuzhiyun 		stdby &= ~OMAP3_OTG_FORCESTDBY_STANDBY;
119*4882a593Smuzhiyun 		writel(stdby, &otg->forcestdby);
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun #ifdef CONFIG_TARGET_OMAP3_EVM
122*4882a593Smuzhiyun 		musb_cfg.extvbus = omap3_evm_need_extvbus();
123*4882a593Smuzhiyun #endif
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #ifdef CONFIG_OMAP44XX
126*4882a593Smuzhiyun 		u32 *usbotghs_control =
127*4882a593Smuzhiyun 			(u32 *)((*ctrl)->control_usbotghs_ctrl);
128*4882a593Smuzhiyun 		*usbotghs_control = 0x15;
129*4882a593Smuzhiyun #endif
130*4882a593Smuzhiyun 		platform_needs_initialization = 0;
131*4882a593Smuzhiyun 	}
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	ret = platform_needs_initialization;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #ifdef CONFIG_TWL4030_USB
136*4882a593Smuzhiyun end:
137*4882a593Smuzhiyun #endif
138*4882a593Smuzhiyun 	return ret;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
musb_platform_deinit(void)142*4882a593Smuzhiyun void musb_platform_deinit(void)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun 	/* noop */
145*4882a593Smuzhiyun }
146