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