xref: /OK3568_Linux_fs/u-boot/arch/arm/include/asm/ehci-omap.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * OMAP EHCI port support
3*4882a593Smuzhiyun  * Based on LINUX KERNEL
4*4882a593Smuzhiyun  * drivers/usb/host/ehci-omap.c and drivers/mfd/omap-usb-host.c
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com*
7*4882a593Smuzhiyun  * Author: Govindraj R <govindraj.raja@ti.com>
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef _OMAP_COMMON_EHCI_H_
13*4882a593Smuzhiyun #define _OMAP_COMMON_EHCI_H_
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun enum usbhs_omap_port_mode {
16*4882a593Smuzhiyun 	OMAP_USBHS_PORT_MODE_UNUSED,
17*4882a593Smuzhiyun 	OMAP_EHCI_PORT_MODE_PHY,
18*4882a593Smuzhiyun 	OMAP_EHCI_PORT_MODE_TLL,
19*4882a593Smuzhiyun 	OMAP_EHCI_PORT_MODE_HSIC,
20*4882a593Smuzhiyun };
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define OMAP_HS_USB_PORTS	3
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define is_ehci_phy_mode(x)	((x) == OMAP_EHCI_PORT_MODE_PHY)
25*4882a593Smuzhiyun #define is_ehci_tll_mode(x)	((x) == OMAP_EHCI_PORT_MODE_TLL)
26*4882a593Smuzhiyun #define is_ehci_hsic_mode(x)	((x) == OMAP_EHCI_PORT_MODE_HSIC)
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /* Values of UHH_REVISION - Note: these are not given in the TRM */
29*4882a593Smuzhiyun #define OMAP_USBHS_REV1					0x00000010 /* OMAP3 */
30*4882a593Smuzhiyun #define OMAP_USBHS_REV2					0x50700100 /* OMAP4 */
31*4882a593Smuzhiyun #define OMAP_USBHS_REV2_1				0x50700101 /* OMAP5 */
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /* UHH Register Set */
34*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN		(1 << 2)
35*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN		(1 << 3)
36*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN		(1 << 4)
37*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN		(1 << 5)
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS		1
40*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS		(1 << 11)
41*4882a593Smuzhiyun #define OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS		(1 << 12)
42*4882a593Smuzhiyun #define OMAP4_UHH_HOSTCONFIG_APP_START_CLK		(1 << 31)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define OMAP_P1_MODE_CLEAR				(3 << 16)
45*4882a593Smuzhiyun #define OMAP_P1_MODE_TLL				(1 << 16)
46*4882a593Smuzhiyun #define OMAP_P1_MODE_HSIC				(3 << 16)
47*4882a593Smuzhiyun #define OMAP_P2_MODE_CLEAR				(3 << 18)
48*4882a593Smuzhiyun #define OMAP_P2_MODE_TLL				(1 << 18)
49*4882a593Smuzhiyun #define OMAP_P2_MODE_HSIC				(3 << 18)
50*4882a593Smuzhiyun #define OMAP_P3_MODE_CLEAR				(3 << 20)
51*4882a593Smuzhiyun #define OMAP_P3_MODE_HSIC				(3 << 20)
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /* EHCI Register Set */
54*4882a593Smuzhiyun #define EHCI_INSNREG04_DISABLE_UNSUSPEND		(1 << 5)
55*4882a593Smuzhiyun #define EHCI_INSNREG05_ULPI_CONTROL_SHIFT		31
56*4882a593Smuzhiyun #define EHCI_INSNREG05_ULPI_PORTSEL_SHIFT		24
57*4882a593Smuzhiyun #define EHCI_INSNREG05_ULPI_OPSEL_SHIFT			22
58*4882a593Smuzhiyun #define EHCI_INSNREG05_ULPI_REGADD_SHIFT		16
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define OMAP_REV1_TLL_CHANNEL_COUNT			3
61*4882a593Smuzhiyun #define OMAP_REV2_TLL_CHANNEL_COUNT			2
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* TLL Register Set */
64*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF(num)			(0x004 * num)
65*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_DRVVBUS			(1 << 16)
66*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_CHRGVBUS			(1 << 15)
67*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF		(1 << 11)
68*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_CHANMODE_TRANSPARENT_UTMI	(2 << 1)
69*4882a593Smuzhiyun #define OMAP_TLL_CHANNEL_CONF_CHANEN			1
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun struct omap_usbhs_board_data {
72*4882a593Smuzhiyun 	enum usbhs_omap_port_mode port_mode[OMAP_HS_USB_PORTS];
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun struct omap_usbtll {
76*4882a593Smuzhiyun 	u32 rev;		/* 0x00 */
77*4882a593Smuzhiyun 	u32 hwinfo;		/* 0x04 */
78*4882a593Smuzhiyun 	u8 reserved1[0x8];
79*4882a593Smuzhiyun 	u32 sysc;		/* 0x10 */
80*4882a593Smuzhiyun 	u32 syss;		/* 0x14 */
81*4882a593Smuzhiyun 	u32 irqst;		/* 0x18 */
82*4882a593Smuzhiyun 	u32 irqen;		/* 0x1c */
83*4882a593Smuzhiyun 	u8 reserved2[0x10];
84*4882a593Smuzhiyun 	u32 shared_conf;	/* 0x30 */
85*4882a593Smuzhiyun 	u8 reserved3[0xc];
86*4882a593Smuzhiyun 	u32 channel_conf;	/* 0x40 */
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun struct omap_uhh {
90*4882a593Smuzhiyun 	u32 rev;	/* 0x00 */
91*4882a593Smuzhiyun 	u32 hwinfo;	/* 0x04 */
92*4882a593Smuzhiyun 	u8 reserved1[0x8];
93*4882a593Smuzhiyun 	u32 sysc;	/* 0x10 */
94*4882a593Smuzhiyun 	u32 syss;	/* 0x14 */
95*4882a593Smuzhiyun 	u8 reserved2[0x28];
96*4882a593Smuzhiyun 	u32 hostconfig;	/* 0x40 */
97*4882a593Smuzhiyun 	u32 debugcsr;	/* 0x44 */
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun struct omap_ehci {
101*4882a593Smuzhiyun 	u32 hccapbase;		/* 0x00 */
102*4882a593Smuzhiyun 	u32 hcsparams;		/* 0x04 */
103*4882a593Smuzhiyun 	u32 hccparams;		/* 0x08 */
104*4882a593Smuzhiyun 	u8 reserved1[0x04];
105*4882a593Smuzhiyun 	u32 usbcmd;		/* 0x10 */
106*4882a593Smuzhiyun 	u32 usbsts;		/* 0x14 */
107*4882a593Smuzhiyun 	u32 usbintr;		/* 0x18 */
108*4882a593Smuzhiyun 	u32 frindex;		/* 0x1c */
109*4882a593Smuzhiyun 	u32 ctrldssegment;	/* 0x20 */
110*4882a593Smuzhiyun 	u32 periodiclistbase;	/* 0x24 */
111*4882a593Smuzhiyun 	u32 asysnclistaddr;	/* 0x28 */
112*4882a593Smuzhiyun 	u8 reserved2[0x24];
113*4882a593Smuzhiyun 	u32 configflag;		/* 0x50 */
114*4882a593Smuzhiyun 	u32 portsc_i;		/* 0x54 */
115*4882a593Smuzhiyun 	u8 reserved3[0x38];
116*4882a593Smuzhiyun 	u32 insreg00;		/* 0x90 */
117*4882a593Smuzhiyun 	u32 insreg01;		/* 0x94 */
118*4882a593Smuzhiyun 	u32 insreg02;		/* 0x98 */
119*4882a593Smuzhiyun 	u32 insreg03;		/* 0x9c */
120*4882a593Smuzhiyun 	u32 insreg04;		/* 0xa0 */
121*4882a593Smuzhiyun 	u32 insreg05_utmi_ulpi;	/* 0xa4 */
122*4882a593Smuzhiyun 	u32 insreg06;		/* 0xa8 */
123*4882a593Smuzhiyun 	u32 insreg07;		/* 0xac */
124*4882a593Smuzhiyun 	u32 insreg08;		/* 0xb0 */
125*4882a593Smuzhiyun };
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /*
128*4882a593Smuzhiyun  * FIXME: forward declaration of this structs needed because omap got the
129*4882a593Smuzhiyun  * ehci implementation backwards. move out ehci_hcd_x from board files
130*4882a593Smuzhiyun  */
131*4882a593Smuzhiyun struct ehci_hccr;
132*4882a593Smuzhiyun struct ehci_hcor;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun int omap_ehci_hcd_init(int index, struct omap_usbhs_board_data *usbhs_pdata,
135*4882a593Smuzhiyun 		       struct ehci_hccr **hccr, struct ehci_hcor **hcor);
136*4882a593Smuzhiyun int omap_ehci_hcd_stop(void);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun #endif /* _OMAP_COMMON_EHCI_H_ */
139