xref: /rk3399_rockchip-uboot/include/usb/designware_udc.h (revision 2721551a11e64ac639547211dae027eea476af4c)
1*2721551aSVipin KUMAR /*
2*2721551aSVipin KUMAR  * (C) Copyright 2009
3*2721551aSVipin KUMAR  * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com.
4*2721551aSVipin KUMAR  *
5*2721551aSVipin KUMAR  * See file CREDITS for list of people who contributed to this
6*2721551aSVipin KUMAR  * project.
7*2721551aSVipin KUMAR  *
8*2721551aSVipin KUMAR  * This program is free software; you can redistribute it and/or
9*2721551aSVipin KUMAR  * modify it under the terms of the GNU General Public License as
10*2721551aSVipin KUMAR  * published by the Free Software Foundation; either version 2 of
11*2721551aSVipin KUMAR  * the License, or (at your option) any later version.
12*2721551aSVipin KUMAR  *
13*2721551aSVipin KUMAR  * This program is distributed in the hope that it will be useful,
14*2721551aSVipin KUMAR  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15*2721551aSVipin KUMAR  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*2721551aSVipin KUMAR  * GNU General Public License for more details.
17*2721551aSVipin KUMAR  *
18*2721551aSVipin KUMAR  * You should have received a copy of the GNU General Public License
19*2721551aSVipin KUMAR  * along with this program; if not, write to the Free Software
20*2721551aSVipin KUMAR  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21*2721551aSVipin KUMAR  * MA 02111-1307 USA
22*2721551aSVipin KUMAR  */
23*2721551aSVipin KUMAR 
24*2721551aSVipin KUMAR #ifndef __DW_UDC_H
25*2721551aSVipin KUMAR #define __DW_UDC_H
26*2721551aSVipin KUMAR 
27*2721551aSVipin KUMAR /*
28*2721551aSVipin KUMAR  * Defines for  USBD
29*2721551aSVipin KUMAR  *
30*2721551aSVipin KUMAR  * The udc_ahb controller has three AHB slaves:
31*2721551aSVipin KUMAR  *
32*2721551aSVipin KUMAR  * 1.  THe UDC registers
33*2721551aSVipin KUMAR  * 2.  The plug detect
34*2721551aSVipin KUMAR  * 3.  The RX/TX FIFO
35*2721551aSVipin KUMAR  */
36*2721551aSVipin KUMAR 
37*2721551aSVipin KUMAR #define MAX_ENDPOINTS		16
38*2721551aSVipin KUMAR 
39*2721551aSVipin KUMAR struct udc_endp_regs {
40*2721551aSVipin KUMAR 	u32 endp_cntl;
41*2721551aSVipin KUMAR 	u32 endp_status;
42*2721551aSVipin KUMAR 	u32 endp_bsorfn;
43*2721551aSVipin KUMAR 	u32 endp_maxpacksize;
44*2721551aSVipin KUMAR 	u32 reserved_1;
45*2721551aSVipin KUMAR 	u32 endp_desc_point;
46*2721551aSVipin KUMAR 	u32 reserved_2;
47*2721551aSVipin KUMAR 	u32 write_done;
48*2721551aSVipin KUMAR };
49*2721551aSVipin KUMAR 
50*2721551aSVipin KUMAR /* Endpoint Control Register definitions */
51*2721551aSVipin KUMAR 
52*2721551aSVipin KUMAR #define  ENDP_CNTL_STALL		0x00000001
53*2721551aSVipin KUMAR #define  ENDP_CNTL_FLUSH		0x00000002
54*2721551aSVipin KUMAR #define  ENDP_CNTL_SNOOP		0x00000004
55*2721551aSVipin KUMAR #define  ENDP_CNTL_POLL			0x00000008
56*2721551aSVipin KUMAR #define  ENDP_CNTL_CONTROL		0x00000000
57*2721551aSVipin KUMAR #define  ENDP_CNTL_ISO			0x00000010
58*2721551aSVipin KUMAR #define  ENDP_CNTL_BULK			0x00000020
59*2721551aSVipin KUMAR #define  ENDP_CNTL_INT			0x00000030
60*2721551aSVipin KUMAR #define  ENDP_CNTL_NAK			0x00000040
61*2721551aSVipin KUMAR #define  ENDP_CNTL_SNAK			0x00000080
62*2721551aSVipin KUMAR #define  ENDP_CNTL_CNAK			0x00000100
63*2721551aSVipin KUMAR #define  ENDP_CNTL_RRDY			0x00000200
64*2721551aSVipin KUMAR 
65*2721551aSVipin KUMAR /* Endpoint Satus Register definitions */
66*2721551aSVipin KUMAR 
67*2721551aSVipin KUMAR #define  ENDP_STATUS_PIDMSK		0x0000000f
68*2721551aSVipin KUMAR #define  ENDP_STATUS_OUTMSK		0x00000030
69*2721551aSVipin KUMAR #define  ENDP_STATUS_OUT_NONE		0x00000000
70*2721551aSVipin KUMAR #define  ENDP_STATUS_OUT_DATA		0x00000010
71*2721551aSVipin KUMAR #define  ENDP_STATUS_OUT_SETUP		0x00000020
72*2721551aSVipin KUMAR #define  ENDP_STATUS_IN			0x00000040
73*2721551aSVipin KUMAR #define  ENDP_STATUS_BUFFNAV		0x00000080
74*2721551aSVipin KUMAR #define  ENDP_STATUS_FATERR		0x00000100
75*2721551aSVipin KUMAR #define  ENDP_STATUS_HOSTBUSERR		0x00000200
76*2721551aSVipin KUMAR #define  ENDP_STATUS_TDC		0x00000400
77*2721551aSVipin KUMAR #define  ENDP_STATUS_RXPKTMSK		0x003ff800
78*2721551aSVipin KUMAR 
79*2721551aSVipin KUMAR struct udc_regs {
80*2721551aSVipin KUMAR 	struct udc_endp_regs in_regs[MAX_ENDPOINTS];
81*2721551aSVipin KUMAR 	struct udc_endp_regs out_regs[MAX_ENDPOINTS];
82*2721551aSVipin KUMAR 	u32 dev_conf;
83*2721551aSVipin KUMAR 	u32 dev_cntl;
84*2721551aSVipin KUMAR 	u32 dev_stat;
85*2721551aSVipin KUMAR 	u32 dev_int;
86*2721551aSVipin KUMAR 	u32 dev_int_mask;
87*2721551aSVipin KUMAR 	u32 endp_int;
88*2721551aSVipin KUMAR 	u32 endp_int_mask;
89*2721551aSVipin KUMAR 	u32 reserved_3[0x39];
90*2721551aSVipin KUMAR 	u32 reserved_4;		/* offset 0x500 */
91*2721551aSVipin KUMAR 	u32 udc_endp_reg[MAX_ENDPOINTS];
92*2721551aSVipin KUMAR };
93*2721551aSVipin KUMAR 
94*2721551aSVipin KUMAR /* Device Configuration Register definitions */
95*2721551aSVipin KUMAR 
96*2721551aSVipin KUMAR #define  DEV_CONF_HS_SPEED		0x00000000
97*2721551aSVipin KUMAR #define  DEV_CONF_LS_SPEED		0x00000002
98*2721551aSVipin KUMAR #define  DEV_CONF_FS_SPEED		0x00000003
99*2721551aSVipin KUMAR #define  DEV_CONF_REMWAKEUP		0x00000004
100*2721551aSVipin KUMAR #define  DEV_CONF_SELFPOW		0x00000008
101*2721551aSVipin KUMAR #define  DEV_CONF_SYNCFRAME		0x00000010
102*2721551aSVipin KUMAR #define  DEV_CONF_PHYINT_8		0x00000020
103*2721551aSVipin KUMAR #define  DEV_CONF_PHYINT_16		0x00000000
104*2721551aSVipin KUMAR #define  DEV_CONF_UTMI_BIDIR		0x00000040
105*2721551aSVipin KUMAR #define  DEV_CONF_STATUS_STALL		0x00000080
106*2721551aSVipin KUMAR 
107*2721551aSVipin KUMAR /* Device Control Register definitions */
108*2721551aSVipin KUMAR 
109*2721551aSVipin KUMAR #define  DEV_CNTL_RESUME		0x00000001
110*2721551aSVipin KUMAR #define  DEV_CNTL_TFFLUSH		0x00000002
111*2721551aSVipin KUMAR #define  DEV_CNTL_RXDMAEN		0x00000004
112*2721551aSVipin KUMAR #define  DEV_CNTL_TXDMAEN		0x00000008
113*2721551aSVipin KUMAR #define  DEV_CNTL_DESCRUPD		0x00000010
114*2721551aSVipin KUMAR #define  DEV_CNTL_BIGEND		0x00000020
115*2721551aSVipin KUMAR #define  DEV_CNTL_BUFFILL		0x00000040
116*2721551aSVipin KUMAR #define  DEV_CNTL_TSHLDEN		0x00000080
117*2721551aSVipin KUMAR #define  DEV_CNTL_BURSTEN		0x00000100
118*2721551aSVipin KUMAR #define  DEV_CNTL_DMAMODE		0x00000200
119*2721551aSVipin KUMAR #define  DEV_CNTL_SOFTDISCONNECT	0x00000400
120*2721551aSVipin KUMAR #define  DEV_CNTL_SCALEDOWN		0x00000800
121*2721551aSVipin KUMAR #define  DEV_CNTL_BURSTLENU		0x00010000
122*2721551aSVipin KUMAR #define  DEV_CNTL_BURSTLENMSK		0x00ff0000
123*2721551aSVipin KUMAR #define  DEV_CNTL_TSHLDLENU		0x01000000
124*2721551aSVipin KUMAR #define  DEV_CNTL_TSHLDLENMSK		0xff000000
125*2721551aSVipin KUMAR 
126*2721551aSVipin KUMAR /* Device Status Register definitions */
127*2721551aSVipin KUMAR 
128*2721551aSVipin KUMAR #define  DEV_STAT_CFG			0x0000000f
129*2721551aSVipin KUMAR #define  DEV_STAT_INTF			0x000000f0
130*2721551aSVipin KUMAR #define  DEV_STAT_ALT			0x00000f00
131*2721551aSVipin KUMAR #define  DEV_STAT_SUSP			0x00001000
132*2721551aSVipin KUMAR #define  DEV_STAT_ENUM			0x00006000
133*2721551aSVipin KUMAR #define  DEV_STAT_ENUM_SPEED_HS		0x00000000
134*2721551aSVipin KUMAR #define  DEV_STAT_ENUM_SPEED_FS		0x00002000
135*2721551aSVipin KUMAR #define  DEV_STAT_ENUM_SPEED_LS		0x00004000
136*2721551aSVipin KUMAR #define  DEV_STAT_RXFIFO_EMPTY		0x00008000
137*2721551aSVipin KUMAR #define  DEV_STAT_PHY_ERR		0x00010000
138*2721551aSVipin KUMAR #define  DEV_STAT_TS			0xf0000000
139*2721551aSVipin KUMAR 
140*2721551aSVipin KUMAR /* Device Interrupt Register definitions */
141*2721551aSVipin KUMAR 
142*2721551aSVipin KUMAR #define  DEV_INT_MSK			0x0000007f
143*2721551aSVipin KUMAR #define  DEV_INT_SETCFG			0x00000001
144*2721551aSVipin KUMAR #define  DEV_INT_SETINTF		0x00000002
145*2721551aSVipin KUMAR #define  DEV_INT_INACTIVE		0x00000004
146*2721551aSVipin KUMAR #define  DEV_INT_USBRESET		0x00000008
147*2721551aSVipin KUMAR #define  DEV_INT_SUSPUSB		0x00000010
148*2721551aSVipin KUMAR #define  DEV_INT_SOF			0x00000020
149*2721551aSVipin KUMAR #define  DEV_INT_ENUM			0x00000040
150*2721551aSVipin KUMAR 
151*2721551aSVipin KUMAR /* Endpoint Interrupt Register definitions */
152*2721551aSVipin KUMAR 
153*2721551aSVipin KUMAR #define  ENDP0_INT_CTRLIN		0x00000001
154*2721551aSVipin KUMAR #define  ENDP1_INT_BULKIN		0x00000002
155*2721551aSVipin KUMAR #define  ENDP_INT_NONISOIN_MSK		0x0000AAAA
156*2721551aSVipin KUMAR #define  ENDP2_INT_BULKIN		0x00000004
157*2721551aSVipin KUMAR #define  ENDP0_INT_CTRLOUT		0x00010000
158*2721551aSVipin KUMAR #define  ENDP1_INT_BULKOUT		0x00020000
159*2721551aSVipin KUMAR #define  ENDP2_INT_BULKOUT		0x00040000
160*2721551aSVipin KUMAR #define  ENDP_INT_NONISOOUT_MSK		0x55540000
161*2721551aSVipin KUMAR 
162*2721551aSVipin KUMAR /* Endpoint Register definitions */
163*2721551aSVipin KUMAR #define  ENDP_EPDIR_OUT			0x00000000
164*2721551aSVipin KUMAR #define  ENDP_EPDIR_IN			0x00000010
165*2721551aSVipin KUMAR #define  ENDP_EPTYPE_CNTL		0x0
166*2721551aSVipin KUMAR #define  ENDP_EPTYPE_ISO		0x1
167*2721551aSVipin KUMAR #define  ENDP_EPTYPE_BULK		0x2
168*2721551aSVipin KUMAR #define  ENDP_EPTYPE_INT		0x3
169*2721551aSVipin KUMAR 
170*2721551aSVipin KUMAR /*
171*2721551aSVipin KUMAR  * Defines for Plug Detect
172*2721551aSVipin KUMAR  */
173*2721551aSVipin KUMAR 
174*2721551aSVipin KUMAR struct plug_regs {
175*2721551aSVipin KUMAR 	u32 plug_state;
176*2721551aSVipin KUMAR 	u32 plug_pending;
177*2721551aSVipin KUMAR };
178*2721551aSVipin KUMAR 
179*2721551aSVipin KUMAR /* Plug State Register definitions */
180*2721551aSVipin KUMAR #define  PLUG_STATUS_EN			0x1
181*2721551aSVipin KUMAR #define  PLUG_STATUS_ATTACHED		0x2
182*2721551aSVipin KUMAR #define  PLUG_STATUS_PHY_RESET		0x4
183*2721551aSVipin KUMAR #define  PLUG_STATUS_PHY_MODE		0x8
184*2721551aSVipin KUMAR 
185*2721551aSVipin KUMAR /*
186*2721551aSVipin KUMAR  * Defines for UDC FIFO (Slave Mode)
187*2721551aSVipin KUMAR  */
188*2721551aSVipin KUMAR struct udcfifo_regs {
189*2721551aSVipin KUMAR 	u32 *fifo_p;
190*2721551aSVipin KUMAR };
191*2721551aSVipin KUMAR 
192*2721551aSVipin KUMAR /*
193*2721551aSVipin KUMAR  * USBTTY definitions
194*2721551aSVipin KUMAR  */
195*2721551aSVipin KUMAR #define  EP0_MAX_PACKET_SIZE		64
196*2721551aSVipin KUMAR #define  UDC_INT_ENDPOINT		1
197*2721551aSVipin KUMAR #define  UDC_INT_PACKET_SIZE		64
198*2721551aSVipin KUMAR #define  UDC_OUT_ENDPOINT		2
199*2721551aSVipin KUMAR #define  UDC_BULK_PACKET_SIZE		64
200*2721551aSVipin KUMAR #define  UDC_IN_ENDPOINT		3
201*2721551aSVipin KUMAR #define  UDC_OUT_PACKET_SIZE		64
202*2721551aSVipin KUMAR #define  UDC_IN_PACKET_SIZE		64
203*2721551aSVipin KUMAR 
204*2721551aSVipin KUMAR /*
205*2721551aSVipin KUMAR  * UDC endpoint definitions
206*2721551aSVipin KUMAR  */
207*2721551aSVipin KUMAR #define  UDC_EP0			0
208*2721551aSVipin KUMAR #define  UDC_EP1			1
209*2721551aSVipin KUMAR #define  UDC_EP2			2
210*2721551aSVipin KUMAR #define  UDC_EP3			3
211*2721551aSVipin KUMAR 
212*2721551aSVipin KUMAR /*
213*2721551aSVipin KUMAR  * Function declarations
214*2721551aSVipin KUMAR  */
215*2721551aSVipin KUMAR 
216*2721551aSVipin KUMAR void udc_irq(void);
217*2721551aSVipin KUMAR 
218*2721551aSVipin KUMAR void udc_set_nak(int epid);
219*2721551aSVipin KUMAR void udc_unset_nak(int epid);
220*2721551aSVipin KUMAR int udc_endpoint_write(struct usb_endpoint_instance *endpoint);
221*2721551aSVipin KUMAR int udc_init(void);
222*2721551aSVipin KUMAR void udc_enable(struct usb_device_instance *device);
223*2721551aSVipin KUMAR void udc_disable(void);
224*2721551aSVipin KUMAR void udc_connect(void);
225*2721551aSVipin KUMAR void udc_disconnect(void);
226*2721551aSVipin KUMAR void udc_startup_events(struct usb_device_instance *device);
227*2721551aSVipin KUMAR void udc_setup_ep(struct usb_device_instance *device, unsigned int ep,
228*2721551aSVipin KUMAR 		  struct usb_endpoint_instance *endpoint);
229*2721551aSVipin KUMAR 
230*2721551aSVipin KUMAR #endif /* __DW_UDC_H */
231