xref: /freebsd/sys/dev/usb/controller/dwc_otg.h (revision 9ccc37e32070303fb293a2a1697ffa71eeb49b25)
1 /* $FreeBSD$ */
2 /*-
3  * Copyright (c) 2012 Hans Petter Selasky. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #ifndef _DWC_OTG_H_
28 #define	_DWC_OTG_H_
29 
30 #define	DWC_OTG_MAX_DEVICES (USB_MIN_DEVICES + 1)
31 #define	DWC_OTG_FRAME_MASK 0x7FF
32 #define	DWC_OTG_MAX_TXP 4
33 #define	DWC_OTG_MAX_TXN (0x200 * DWC_OTG_MAX_TXP)
34 
35 /* Global CSR registers */
36 
37 #define	DWC_OTG_REG_GOTGCTL		0x0000
38 #define	DWC_OTG_MSK_GOTGCTL_CHIRP_ON		(1U << 27)
39 #define	DWC_OTG_MSK_GOTGCTL_BSESS_VALID		(1U << 19)
40 #define	DWC_OTG_MSK_GOTGCTL_ASESS_VALID		(1U << 18)
41 #define	DWC_OTG_MSK_GOTGCTL_CONN_ID_STATUS	(1U << 16)
42 #define	DWC_OTG_MSK_GOTGCTL_SESS_REQ		(1U << 1)
43 #define	DWC_OTG_MSK_GOTGCTL_SESS_VALID		(1U << 0)
44 
45 #define	DWC_OTG_REG_GOTGINT		0x0004
46 #define	DWC_OTG_REG_GAHBCFG		0x0008
47 #define	DWC_OTG_MSK_GAHBCFG_GLOBAL_IRQ		(1U << 0)
48 
49 #define	DWC_OTG_REG_GUSBCFG		0x000C
50 #define	DWC_OTG_MSK_GUSBCFG_FORCE_DEVICE	(1U << 30)
51 #define	DWC_OTG_MSK_GUSBCFG_FORCE_HOST		(1U << 29)
52 #define	DWC_OTG_MSK_GUSBCFG_NO_PULLUP		(1U << 27)
53 #define	DWC_OTG_MSK_GUSBCFG_NO_PULLUP		(1U << 27)
54 #define	DWC_OTG_MSK_GUSBCFG_IC_USB_CAP		(1U << 26)
55 #define	DWC_OTG_MSK_GUSBCFG_ULPI_FS_LS		(1U << 17)
56 #define	DWC_OTG_MSK_GUSBCFG_TRD_TIM(x)		(((x) & 15U) << 10)
57 #define	DWC_OTG_MSK_GUSBCFG_HRP			(1U << 9)
58 #define	DWC_OTG_MSK_GUSBCFG_SRP			(1U << 8)
59 #define	DWC_OTG_MSK_GUSBCFG_HS_PHY		(1U << 6)
60 #define	DWC_OTG_MSK_GUSBCFG_FS_INTF		(1U << 5)
61 #define	DWC_OTG_MSK_GUSBCFG_ULPI_UMTI_SEL	(1U << 4)
62 #define	DWC_OTG_MSK_GUSBCFG_PHY_INTF		(1U << 3)
63 
64 #define	DWC_OTG_REG_GRSTCTL		0x0010
65 #define	DWC_OTG_MSK_GRSTCTL_TXFIFO(n)		(((n) & 31U) << 6)
66 #define	DWC_OTG_MSK_GRSTCTL_TXFFLUSH		(1U << 5)
67 #define	DWC_OTG_MSK_GRSTCTL_RXFFLUSH		(1U << 4)
68 #define	DWC_OTG_MSK_GRSTCTL_FRMCNTRRST		(1U << 2)
69 #define	DWC_OTG_MSK_GRSTCTL_CSFTRST		(1U << 0)
70 
71 #define	DWC_OTG_REG_GINTSTS		0x0014
72 #define	DWC_OTG_REG_GINTMSK		0x0018
73 #define	DWC_OTG_MSK_GINT_WKUPINT		(1U << 31)
74 #define	DWC_OTG_MSK_GINT_SESSREQINT		(1U << 30)
75 #define	DWC_OTG_MSK_GINT_DISCONNINT		(1U << 29)
76 #define	DWC_OTG_MSK_GINT_CONNIDSTSCHNG		(1U << 28)
77 #define	DWC_OTG_MSK_GINT_LPM			(1U << 27)
78 #define	DWC_OTG_MSK_GINT_PTXFEMP		(1U << 26)
79 #define	DWC_OTG_MSK_GINT_HCHINT			(1U << 25)
80 #define	DWC_OTG_MSK_GINT_PRTINT			(1U << 24)
81 #define	DWC_OTG_MSK_GINT_RESETDET		(1U << 23)
82 #define	DWC_OTG_MSK_GINT_FETSUSP		(1U << 22)
83 #define	DWC_OTG_MSK_GINT_INCOMPL_P		(1U << 21)
84 #define	DWC_OTG_MSK_GINT_INCOMPL_ISO_IN		(1U << 20)
85 #define	DWC_OTG_MSK_GINT_OUTEP			(1U << 19)
86 #define	DWC_OTG_MSK_GINT_INEP			(1U << 18)
87 #define	DWC_OTG_MSK_GINT_EP_MISMATCH		(1U << 17)
88 #define	DWC_OTG_MSK_GINT_RESTORE_DONE		(1U << 16)
89 #define	DWC_OTG_MSK_GINT_EOP_FRAME		(1U << 15)
90 #define	DWC_OTG_MSK_GINT_ISO_OUT_DROP		(1U << 14)
91 #define	DWC_OTG_MSK_GINT_ENUM_DONE		(1U << 13)
92 #define	DWC_OTG_MSK_GINT_USB_RESET		(1U << 12)
93 #define	DWC_OTG_MSK_GINT_USB_SUSPEND		(1U << 11)
94 #define	DWC_OTG_MSK_GINT_EARLY_SUSPEND		(1U << 10)
95 #define	DWC_OTG_MSK_GINT_I2C_INT		(1U << 9)
96 #define	DWC_OTG_MSK_GINT_ULPI_CARKIT		(1U << 8)
97 #define	DWC_OTG_MSK_GINT_GLOBAL_OUT_NAK		(1U << 7)
98 #define	DWC_OTG_MSK_GINT_GLOBAL_IN_NAK		(1U << 6)
99 #define	DWC_OTG_MSK_GINT_NPTXFEMP		(1U << 5)
100 #define	DWC_OTG_MSK_GINT_RXFLVL			(1U << 4)
101 #define	DWC_OTG_MSK_GINT_SOF			(1U << 3)
102 #define	DWC_OTG_MSK_GINT_OTG			(1U << 2)
103 #define	DWC_OTG_MSK_GINT_MODE_MISMATCH		(1U << 1)
104 #define	DWC_OTG_MSK_GINT_CUR_MODE		(1U << 0)
105 
106 #define	DWC_OTG_REG_GRXSTSR		0x001C
107 #define	DWC_OTG_REG_GRXSTSP		0x0020
108 #define	DWC_OTG_MSK_GRXSTS_PACKET_STS		(15U << 17)
109 #define	DWC_OTG_MSK_GRXSTS_HST_IN_DATA		(2U << 17)
110 #define	DWC_OTG_MSK_GRXSTS_HST_IN_COMPLETE	(3U << 17)
111 #define	DWC_OTG_MSK_GRXSTS_HST_DT_ERROR		(5U << 17)
112 #define	DWC_OTG_MSK_GRXSTS_HST_HALTED		(7U << 17)
113 #define	DWC_OTG_MSK_GRXSTS_DEV_GLOB_OUT_NAK	(1U << 17)
114 #define	DWC_OTG_MSK_GRXSTS_DEV_OUT_DATA		(2U << 17)
115 #define	DWC_OTG_MSK_GRXSTS_DEV_OUT_COMPLETE	(3U << 17)
116 #define	DWC_OTG_MSK_GRXSTS_DEV_STP_COMPLETE	(4U << 17)
117 #define	DWC_OTG_MSK_GRXSTS_DEV_STP_DATA		(6U << 17)
118 #define	DWC_OTG_MSK_GRXSTS_PID			(3U << 15)
119 #define	DWC_OTG_MSK_GRXSTS_PID_DATA0		(0U << 15)
120 #define	DWC_OTG_MSK_GRXSTS_PID_DATA1		(2U << 15)
121 #define	DWC_OTG_MSK_GRXSTS_PID_DATA2		(1U << 15)
122 #define	DWC_OTG_MSK_GRXSTS_PID_MDATA		(3U << 15)
123 #define	DWC_OTG_MSK_GRXSTS_GET_BYTE_CNT(x)	(((x) >> 4) & 0x7FFU)
124 #define	DWC_OTG_MSK_GRXSTS_GET_CHANNEL(x)	((x) & 15U)
125 #define	DWC_OTG_MSK_GRXSTS_GET_FRNUM	(x)	(((x) >> 21) & 15U)
126 
127 #define	DWC_OTG_REG_GRXFSIZ		0x0024
128 #define	DWC_OTG_REG_GNPTXFSIZ		0x0028
129 #define	DWC_OTG_REG_GNPTXSTS		0x002C
130 #define	DWC_OTG_REG_GI2CCTL		0x0030
131 #define	DWC_OTG_REG_GPVNDCTL		0x0034
132 #define	DWC_OTG_REG_GGPIO		0x0038
133 #define	DWC_OTG_REG_GUID		0x003C
134 #define	DWC_OTG_REG_GSNPSID		0x0040
135 #define	DWC_OTG_REG_GHWCFG1		0x0044
136 #define	DWC_OTG_MSK_GHWCFG1_GET_DIR(x, n)	(((x) >> (2 * (n))) & 3U)
137 #define	DWC_OTG_MSK_GHWCFG1_BIDIR		(0U)
138 #define	DWC_OTG_MSK_GHWCFG1_IN			(1U)
139 #define	DWC_OTG_MSK_GHWCFG1_OUT			(2U)
140 #define	DWC_OTG_REG_GHWCFG2		0x0048
141 #define	DWC_OTG_MSK_GHWCFG2_NUM_DEV_EP(x)	((((x) >> 10) & 15) + 1)
142 #define	DWC_OTG_MSK_GHWCFG2_NUM_HOST_EP(x)	((((x) >> 14) & 15) + 1)
143 #define	DWC_OTG_REG_GHWCFG3		0x004C
144 #define	DWC_OTG_MSK_GHWCFG3_GET_DFIFO(x)	((x) >> 16)
145 #define	DWC_OTG_MSK_GHWCFG3_PKT_SIZE		(0x10U << (((x) >> 4) & 7))
146 #define	DWC_OTG_MSK_GHWCFG3_XFR_SIZE		(0x400U << (((x) >> 0) & 15))
147 
148 #define	DWC_OTG_REG_GHWCFG4		0x0050
149 #define	DWC_OTG_MSK_GHWCFG4_NUM_IN_EPS(x)	((((x) >> 26) & 15U) + 1U)
150 #define	DWC_OTG_MSK_GHWCFG4_NUM_CTRL_EPS(x)	(((x) >> 16) & 15U)
151 #define	DWC_OTG_MSK_GHWCFG4_NUM_IN_PERIODIC_EPS(x)	(((x) >> 0) & 15U)
152 
153 #define	DWC_OTG_REG_GLPMCFG		0x0054
154 #define	DWC_OTG_MSK_GLPMCFG_HSIC_CONN		(1U << 30)
155 #define	DWC_OTG_REG_GPWRDN		0x0058
156 #define	DWC_OTG_MSK_GPWRDN_BVALID		(1U << 22)
157 #define	DWC_OTG_MSK_GPWRDN_IDDIG		(1U << 21)
158 #define	DWC_OTG_MSK_GPWRDN_CONNDET_INT		(1U << 14)
159 #define	DWC_OTG_MSK_GPWRDN_CONNDET		(1U << 13)
160 #define	DWC_OTG_MSK_GPWRDN_DISCONN_INT		(1U << 12)
161 #define	DWC_OTG_MSK_GPWRDN_DISCONN		(1U << 11)
162 #define	DWC_OTG_MSK_GPWRDN_RESETDET_INT		(1U << 10)
163 #define	DWC_OTG_MSK_GPWRDN_RESETDET		(1U << 9)
164 #define	DWC_OTG_MSK_GPWRDN_LINESTATE_INT	(1U << 8)
165 #define	DWC_OTG_MSK_GPWRDN_LINESTATE		(1U << 7)
166 #define	DWC_OTG_MSK_GPWRDN_DISABLE_VBUS		(1U << 6)
167 #define	DWC_OTG_MSK_GPWRDN_POWER_DOWN		(1U << 5)
168 #define	DWC_OTG_MSK_GPWRDN_POWER_DOWN_RST	(1U << 4)
169 #define	DWC_OTG_MSK_GPWRDN_POWER_DOWN_CLAMP	(1U << 3)
170 #define	DWC_OTG_MSK_GPWRDN_RESTORE		(1U << 2)
171 #define	DWC_OTG_MSK_GPWRDN_PMU_ACTIVE		(1U << 1)
172 #define	DWC_OTG_MSK_GPWRDN_PMU_IRQ_SEL		(1U << 0)
173 
174 #define	DWC_OTG_REG_GDFIFOCFG		0x005C
175 #define	DWC_OTG_REG_GADPCTL		0x0060
176 #define	DWC_OTG_REG_HPTXFSIZ		0x0100
177 #define	DWC_OTG_REG_DPTXFSIZ(n)			(0x0100 + (4*(n)))
178 #define	DWC_OTG_REG_DIEPTXF(n)			(0x0100 + (4*(n)))
179 
180 /* Host Mode CSR registers */
181 
182 #define	DWC_OTG_REG_HCFG		0x0400
183 #define	DWC_OTG_REG_HFIR		0x0404
184 #define	DWC_OTG_REG_HFNUM		0x0408
185 #define	DWC_OTG_REG_HPTXSTS		0x0410
186 #define	DWC_OTG_REG_HAINT		0x0414
187 #define	DWC_OTG_REG_HAINTMSK		0x0418
188 #define	DWC_OTG_REG_HPRT		0x0440
189 #define	DWC_OTG_REG_HCCHAR(n)	(0x0500 + (32*(n)))
190 #define	DWC_OTG_REG_HCSPLT(n)	(0x0504 + (32*(n)))
191 #define	DWC_OTG_REG_HCINT(n)	(0x0508 + (32*(n)))
192 #define	DWC_OTG_REG_HCINTMSK(n)	(0x050C + (32*(n)))
193 #define	DWC_OTG_REG_HCTSIZ(n)	(0x0510 + (32*(n)))
194 #define	DWC_OTG_REG_HCDMA(n)	(0x0514 + (32*(n)))
195 #define	DWC_OTG_REG_HCDMAB(n)	(0x051C + (32*(n)))
196 
197 /* Device Mode CSR registers */
198 
199 #define	DWC_OTG_REG_DCFG		0x0800
200 #define	DWC_OTG_MSK_DCFG_SET_DEV_ADDR(x) (((x) & 0x7FU) << 4)
201 #define	DWC_OTG_MSK_DCFG_SET_DEV_SPEED(x) ((x) & 0x3U)
202 #define	DWC_OTG_MSK_DCFG_DEV_SPEED_HI		(0U)
203 #define	DWC_OTG_MSK_DCFG_DEV_SPEED_FULL20	(1U)
204 #define	DWC_OTG_MSK_DCFG_DEV_SPEED_FULL10	(3U)
205 
206 #define	DWC_OTG_REG_DCTL		0x0804
207 #define	DWC_OTG_MSK_DCTL_PWRON_PROG_DONE	(1U << 11)
208 #define	DWC_OTG_MSK_DCTL_CGOUT_NAK		(1U << 10)
209 #define	DWC_OTG_MSK_DCTL_CGNPIN_NAK		(1U << 8)
210 #define	DWC_OTG_MSK_DCTL_SOFT_DISC		(1U << 1)
211 #define	DWC_OTG_MSK_DCTL_REMOTE_WAKEUP		(1U << 0)
212 
213 #define	DWC_OTG_REG_DSTS		0x0808
214 #define	DWC_OTG_MSK_DSTS_GET_FNUM(x)		(((x) >> 8) & 0x3FFF)
215 #define	DWC_OTG_MSK_DSTS_GET_ENUM_SPEED(x)	(((x) >> 1) & 3U)
216 #define	DWC_OTG_MSK_DSTS_ENUM_SPEED_HI		(0U)
217 #define	DWC_OTG_MSK_DSTS_ENUM_SPEED_FULL20	(1U)
218 #define	DWC_OTG_MSK_DSTS_ENUM_SPEED_LOW10	(2U)
219 #define	DWC_OTG_MSK_DSTS_ENUM_SPEED_FULL10	(3U)
220 #define	DWC_OTG_MSK_DSTS_SUSPEND		(1U << 0)
221 
222 #define	DWC_OTG_REG_DIEPMSK		0x0810
223 #define	DWC_OTG_MSK_DIEP_FIFO_EMPTY		(1U << 4)
224 #define	DWC_OTG_MSK_DIEP_XFER_COMPLETE		(1U << 0)
225 
226 #define	DWC_OTG_REG_DOEPMSK		0x0814
227 #define	DWC_OTG_MSK_DOEP_FIFO_EMPTY		(1U << 4)
228 #define	DWC_OTG_MSK_DOEP_XFER_COMPLETE		(1U << 0)
229 
230 #define	DWC_OTG_REG_DAINT		0x0818
231 #define	DWC_OTG_REG_DAINTMSK		0x081C
232 
233 #define	DWC_OTG_MSK_ENDPOINT(x,in) \
234 	((in) ? (1U << ((x) & 15U)) : \
235 	 (0x10000U << ((x) & 15U)))
236 
237 #define	DWC_OTG_REG_DTKNQR1		0x0820
238 #define	DWC_OTG_REG_DTKNQR2		0x0824
239 #define	DWC_OTG_REG_DTKNQR3		0x0830
240 #define	DWC_OTG_REG_DTKNQR4		0x0834
241 #define	DWC_OTG_REG_DVBUSDIS		0x0828
242 #define	DWC_OTG_REG_DVBUSPULSE		0x082C
243 #define	DWC_OTG_REG_DTHRCTL		0x0830
244 #define	DWC_OTG_REG_DIEPEMPMSK		0x0834
245 #define	DWC_OTG_REG_DEACHINT		0x0838
246 #define	DWC_OTG_REG_DEACHINTMSK		0x083C
247 #define	DWC_OTG_REG_DIEPEACHMSK(n)	(0x0840 + (4*(n)))
248 #define	DWC_OTG_MSK_DIEPEACH_XFER_COMPLETE	(1U << 0)
249 
250 #define	DWC_OTG_REG_DOEPEACHMSK(n)	(0x0880 + (4*(n)))
251 #define	DWC_OTG_MSK_DOEPEACH_SETUP		(1U << 3)
252 #define	DWC_OTG_MSK_DOEPEACH_XFER_COMPLETE	(1U << 0)
253 
254 #define	DWC_OTG_REG_DIEPCTL(n)		(0x0900 + (32*(n)))
255 #define	DWC_OTG_MSK_DIEPCTL_ENABLE		(1U << 31)
256 #define	DWC_OTG_MSK_DIEPCTL_DISABLE		(1U << 30)
257 #define	DWC_OTG_MSK_DIEPCTL_SET_DATA1		(1U << 29)	/* non-control */
258 #define	DWC_OTG_MSK_DIEPCTL_SET_DATA0		(1U << 28)	/* non-control */
259 #define	DWC_OTG_MSK_DIEPCTL_SET_NAK		(1U << 27)
260 #define	DWC_OTG_MSK_DIEPCTL_CLR_NAK		(1U << 26)
261 #define	DWC_OTG_MSK_DIEPCTL_FNUM(n)		(((n) & 15U) << 22)
262 #define	DWC_OTG_MSK_DIEPCTL_STALL		(1U << 21)
263 #define	DWC_OTG_MSK_EP_SET_TYPE(n)	(((n) & 3) << 18)
264 #define	DWC_OTG_MSK_EP_TYPE_CONTROL		(0U)
265 #define	DWC_OTG_MSK_EP_TYPE_ISOC		(1U)
266 #define	DWC_OTG_MSK_EP_TYPE_BULK		(2U)
267 #define	DWC_OTG_MSK_EP_TYPE_INTERRUPT		(3U)
268 #define	DWC_OTG_MSK_DIEPCTL_USB_AEP		(1U << 15)
269 #define	DWC_OTG_MSK_DIEPCTL_MPS_64		(0U << 0)	/* control-only */
270 #define	DWC_OTG_MSK_DIEPCTL_MPS_32		(1U << 0)	/* control-only */
271 #define	DWC_OTG_MSK_DIEPCTL_MPS_16		(2U << 0)	/* control-only */
272 #define	DWC_OTG_MSK_DIEPCTL_MPS_8		(3U << 0)	/* control-only */
273 #define	DWC_OTG_MSK_DIEPCTL_MPS(n)		((n) & 0x7FF)	/* non-control */
274 
275 #define	DWC_OTG_REG_DIEPINT(n)		(0x0908 + (32*(n)))
276 #define	DWC_OTG_MSK_DXEPINT_TXFEMP		(1U << 7)
277 #define	DWC_OTG_MSK_DXEPINT_SETUP		(1U << 3)
278 #define	DWC_OTG_MSK_DXEPINT_XFER_COMPL		(1U << 0)
279 
280 #define	DWC_OTG_REG_DIEPTSIZ(n)		(0x0910 + (32*(n)))
281 #define	DWC_OTG_MSK_DXEPTSIZ_SET_MULTI(n)	(((n) & 3) << 29)
282 #define	DWC_OTG_MSK_DXEPTSIZ_SET_NPKT(n)	(((n) & 0x3FF) << 19)
283 #define	DWC_OTG_MSK_DXEPTSIZ_GET_NPKT(n)	(((n) >> 19) & 0x3FF)
284 #define	DWC_OTG_MSK_DXEPTSIZ_SET_NBYTES(n)	(((n) & 0x7FFFFF) << 0)
285 #define	DWC_OTG_MSK_DXEPTSIZ_GET_NBYTES(n)	(((n) >> 0) & 0x7FFFFF)
286 
287 #define	DWC_OTG_REG_DIEPDMA(n)		(0x0914 + (32*(n)))
288 #define	DWC_OTG_REG_DTXFSTS(n)		(0x0918 + (32*(n)))
289 #define	DWC_OTG_REG_DIEPDMAB0		(0x091C + (32*(n)))
290 
291 #define	DWC_OTG_REG_DOEPCTL(n)		(0x0B00 + (32*(n)))
292 #define	DWC_OTG_MSK_DOEPCTL_ENABLE		(1U << 31)
293 #define	DWC_OTG_MSK_DOEPCTL_DISABLE		(1U << 30)
294 #define	DWC_OTG_MSK_DOEPCTL_SET_DATA1		(1U << 29)	/* non-control */
295 #define	DWC_OTG_MSK_DOEPCTL_SET_DATA0		(1U << 28)	/* non-control */
296 #define	DWC_OTG_MSK_DOEPCTL_SET_NAK		(1U << 27)
297 #define	DWC_OTG_MSK_DOEPCTL_CLR_NAK		(1U << 26)
298 #define	DWC_OTG_MSK_DOEPCTL_FNUM(n)		(((n) & 15U) << 22)
299 #define	DWC_OTG_MSK_DOEPCTL_STALL		(1U << 21)
300 #define	DWC_OTG_MSK_DOEPCTL_EP_TYPE(n)	(((n) & 3) << 18)
301 #define	DWC_OTG_MSK_DOEPCTL_USB_AEP		(1U << 15)
302 #define	DWC_OTG_MSK_DOEPCTL_MPS_64		(0U << 0)	/* control-only */
303 #define	DWC_OTG_MSK_DOEPCTL_MPS_32		(1U << 0)	/* control-only */
304 #define	DWC_OTG_MSK_DOEPCTL_MPS_16		(2U << 0)	/* control-only */
305 #define	DWC_OTG_MSK_DOEPCTL_MPS_8		(3U << 0)	/* control-only */
306 #define	DWC_OTG_MSK_DOEPCTL_MPS(n)	((n) & 0x7FF)	/* non-control */
307 
308 #define	DWC_OTG_REG_DOEPINT(n)		(0x0B08 + (32*(n)))
309 #define	DWC_OTG_REG_DOEPTSIZ(n)		(0x0B10 + (32*(n)))
310 #define	DWC_OTG_REG_DOEPDMA(n)		(0x0B14 + (32*(n)))
311 #define	DWC_OTG_REG_DOEPDMAB(n)		(0x0B1C + (32*(n)))
312 
313 /* FIFO access registers */
314 
315 #define	DWC_OTG_REG_DFIFO(n)		(0x1000 + (0x1000 * (n)))
316 
317 /* Power and clock gating CSR */
318 
319 #define	DWC_OTG_REG_PCGCCTL		0x0E00
320 
321 #define	DWC_OTG_READ_4(sc, reg) \
322   bus_space_read_4((sc)->sc_io_tag, (sc)->sc_io_hdl, reg)
323 
324 #define	DWC_OTG_WRITE_4(sc, reg, data)	\
325   bus_space_write_4((sc)->sc_io_tag, (sc)->sc_io_hdl, reg, data)
326 
327 struct dwc_otg_td;
328 struct dwc_otg_softc;
329 
330 typedef uint8_t (dwc_otg_cmd_t)(struct dwc_otg_td *td);
331 
332 struct dwc_otg_td {
333 	struct dwc_otg_td *obj_next;
334 	dwc_otg_cmd_t *func;
335 	struct usb_page_cache *pc;
336 	uint32_t tx_bytes;
337 	uint32_t offset;
338 	uint32_t remainder;
339 	uint16_t max_packet_size;	/* packet_size */
340 	uint16_t npkt;
341 	uint8_t	ep_no;
342 	uint8_t	error:1;
343 	uint8_t	alt_next:1;
344 	uint8_t	short_pkt:1;
345 	uint8_t	did_stall:1;
346 };
347 
348 struct dwc_otg_std_temp {
349 	dwc_otg_cmd_t *func;
350 	struct usb_page_cache *pc;
351 	struct dwc_otg_td *td;
352 	struct dwc_otg_td *td_next;
353 	uint32_t len;
354 	uint32_t offset;
355 	uint16_t max_frame_size;
356 	uint8_t	short_pkt;
357 	/*
358 	 * short_pkt = 0: transfer should be short terminated
359 	 * short_pkt = 1: transfer should not be short terminated
360 	 */
361 	uint8_t	setup_alt_next;
362 	uint8_t did_stall;
363 	uint8_t bulk_or_control;
364 };
365 
366 struct dwc_otg_config_desc {
367 	struct usb_config_descriptor confd;
368 	struct usb_interface_descriptor ifcd;
369 	struct usb_endpoint_descriptor endpd;
370 } __packed;
371 
372 union dwc_otg_hub_temp {
373 	uWord	wValue;
374 	struct usb_port_status ps;
375 };
376 
377 struct dwc_otg_flags {
378 	uint8_t	change_connect:1;
379 	uint8_t	change_suspend:1;
380 	uint8_t	status_suspend:1;	/* set if suspended */
381 	uint8_t	status_vbus:1;		/* set if present */
382 	uint8_t	status_bus_reset:1;	/* set if reset complete */
383 	uint8_t	status_high_speed:1;	/* set if High Speed is selected */
384 	uint8_t	remote_wakeup:1;
385 	uint8_t	self_powered:1;
386 	uint8_t	clocks_off:1;
387 	uint8_t	port_powered:1;
388 	uint8_t	port_enabled:1;
389 	uint8_t	d_pulled_up:1;
390 };
391 
392 struct dwc_otg_profile {
393 	struct usb_hw_ep_profile usb;
394 	uint16_t max_buffer;
395 };
396 
397 struct dwc_otg_softc {
398 	struct usb_bus sc_bus;
399 	union dwc_otg_hub_temp sc_hub_temp;
400 	struct dwc_otg_profile sc_hw_ep_profile[16];
401 
402 	struct usb_device *sc_devices[DWC_OTG_MAX_DEVICES];
403 	struct resource *sc_io_res;
404 	struct resource *sc_irq_res;
405 	void   *sc_intr_hdl;
406 	bus_size_t sc_io_size;
407 	bus_space_tag_t sc_io_tag;
408 	bus_space_handle_t sc_io_hdl;
409 
410 	uint32_t sc_rx_bounce_buffer[1024 / 4];
411 	uint32_t sc_tx_bounce_buffer[(512 * DWC_OTG_MAX_TXP) / 4];
412 
413 	uint32_t sc_fifo_size;
414 	uint32_t sc_irq_mask;
415 	uint32_t sc_last_rx_status;
416 	uint32_t sc_out_ctl[16];
417 	uint32_t sc_in_ctl[16];
418 
419 	uint16_t sc_active_out_ep;
420 
421 	uint8_t	sc_dev_ep_max;
422 	uint8_t sc_dev_in_ep_max;
423 	uint8_t	sc_rt_addr;		/* root HUB address */
424 	uint8_t	sc_conf;		/* root HUB config */
425 
426 	uint8_t	sc_hub_idata[1];
427 
428 	struct dwc_otg_flags sc_flags;
429 };
430 
431 /* prototypes */
432 
433 void dwc_otg_interrupt(struct dwc_otg_softc *);
434 int dwc_otg_init(struct dwc_otg_softc *);
435 void dwc_otg_uninit(struct dwc_otg_softc *);
436 
437 #endif		/* _DWC_OTG_H_ */
438