1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef __DRIVERS_USB_DWC3_CORE_H
18#define __DRIVERS_USB_DWC3_CORE_H
19
20#include <linux/bitops.h>
21#include <linux/ioport.h>
22
23#include <linux/usb/ch9.h>
24#include <linux/usb/otg.h>
25#include <linux/usb/phy.h>
26
27#define DWC3_MSG_MAX 500
28
29
30#define DWC3_EP0_BOUNCE_SIZE 512
31#define DWC3_ENDPOINTS_NUM 32
32#define DWC3_XHCI_RESOURCES_NUM 2
33
34#define DWC3_SCRATCHBUF_SIZE 4096
35#define DWC3_EVENT_SIZE 4
36#define DWC3_EVENT_MAX_NUM 64
37#define DWC3_EVENT_BUFFERS_SIZE (DWC3_EVENT_SIZE * DWC3_EVENT_MAX_NUM)
38#define DWC3_EVENT_TYPE_MASK 0xfe
39
40#define DWC3_EVENT_TYPE_DEV 0
41#define DWC3_EVENT_TYPE_CARKIT 3
42#define DWC3_EVENT_TYPE_I2C 4
43
44#define DWC3_DEVICE_EVENT_DISCONNECT 0
45#define DWC3_DEVICE_EVENT_RESET 1
46#define DWC3_DEVICE_EVENT_CONNECT_DONE 2
47#define DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE 3
48#define DWC3_DEVICE_EVENT_WAKEUP 4
49#define DWC3_DEVICE_EVENT_HIBER_REQ 5
50#define DWC3_DEVICE_EVENT_EOPF 6
51#define DWC3_DEVICE_EVENT_SOF 7
52#define DWC3_DEVICE_EVENT_ERRATIC_ERROR 9
53#define DWC3_DEVICE_EVENT_CMD_CMPL 10
54#define DWC3_DEVICE_EVENT_OVERFLOW 11
55
56#define DWC3_GEVNTCOUNT_MASK 0xfffc
57#define DWC3_GSNPSID_MASK 0xffff0000
58#define DWC3_GSNPSREV_MASK 0xffff
59
60
61#define DWC3_XHCI_REGS_START 0x0
62#define DWC3_XHCI_REGS_END 0x7fff
63#define DWC3_GLOBALS_REGS_START 0xc100
64#define DWC3_GLOBALS_REGS_END 0xc6ff
65#define DWC3_DEVICE_REGS_START 0xc700
66#define DWC3_DEVICE_REGS_END 0xcbff
67#define DWC3_OTG_REGS_START 0xcc00
68#define DWC3_OTG_REGS_END 0xccff
69
70
71#define DWC3_GSBUSCFG0 0xc100
72#define DWC3_GSBUSCFG1 0xc104
73#define DWC3_GTXTHRCFG 0xc108
74#define DWC3_GRXTHRCFG 0xc10c
75#define DWC3_GCTL 0xc110
76#define DWC3_GEVTEN 0xc114
77#define DWC3_GSTS 0xc118
78#define DWC3_GUCTL1 0xc11c
79#define DWC3_GSNPSID 0xc120
80#define DWC3_GGPIO 0xc124
81#define DWC3_GUID 0xc128
82#define DWC3_GUCTL 0xc12c
83#define DWC3_GBUSERRADDR0 0xc130
84#define DWC3_GBUSERRADDR1 0xc134
85#define DWC3_GPRTBIMAP0 0xc138
86#define DWC3_GPRTBIMAP1 0xc13c
87#define DWC3_GHWPARAMS0 0xc140
88#define DWC3_GHWPARAMS1 0xc144
89#define DWC3_GHWPARAMS2 0xc148
90#define DWC3_GHWPARAMS3 0xc14c
91#define DWC3_GHWPARAMS4 0xc150
92#define DWC3_GHWPARAMS5 0xc154
93#define DWC3_GHWPARAMS6 0xc158
94#define DWC3_GHWPARAMS7 0xc15c
95#define DWC3_GDBGFIFOSPACE 0xc160
96#define DWC3_GDBGLTSSM 0xc164
97#define DWC3_GPRTBIMAP_HS0 0xc180
98#define DWC3_GPRTBIMAP_HS1 0xc184
99#define DWC3_GPRTBIMAP_FS0 0xc188
100#define DWC3_GPRTBIMAP_FS1 0xc18c
101
102#define DWC3_GUSB2PHYCFG(n) (0xc200 + (n * 0x04))
103#define DWC3_GUSB2I2CCTL(n) (0xc240 + (n * 0x04))
104
105#define DWC3_GUSB2PHYACC(n) (0xc280 + (n * 0x04))
106
107#define DWC3_GUSB3PIPECTL(n) (0xc2c0 + (n * 0x04))
108
109#define DWC3_GTXFIFOSIZ(n) (0xc300 + (n * 0x04))
110#define DWC3_GRXFIFOSIZ(n) (0xc380 + (n * 0x04))
111
112#define DWC3_GEVNTADRLO(n) (0xc400 + (n * 0x10))
113#define DWC3_GEVNTADRHI(n) (0xc404 + (n * 0x10))
114#define DWC3_GEVNTSIZ(n) (0xc408 + (n * 0x10))
115#define DWC3_GEVNTCOUNT(n) (0xc40c + (n * 0x10))
116
117#define DWC3_GHWPARAMS8 0xc600
118#define DWC3_GFLADJ 0xc630
119
120
121#define DWC3_DCFG 0xc700
122#define DWC3_DCTL 0xc704
123#define DWC3_DEVTEN 0xc708
124#define DWC3_DSTS 0xc70c
125#define DWC3_DGCMDPAR 0xc710
126#define DWC3_DGCMD 0xc714
127#define DWC3_DALEPENA 0xc720
128#define DWC3_DEPCMDPAR2(n) (0xc800 + (n * 0x10))
129#define DWC3_DEPCMDPAR1(n) (0xc804 + (n * 0x10))
130#define DWC3_DEPCMDPAR0(n) (0xc808 + (n * 0x10))
131#define DWC3_DEPCMD(n) (0xc80c + (n * 0x10))
132
133
134#define DWC3_OCFG 0xcc00
135#define DWC3_OCTL 0xcc04
136#define DWC3_OEVT 0xcc08
137#define DWC3_OEVTEN 0xcc0C
138#define DWC3_OSTS 0xcc10
139
140
141
142
143#define DWC3_GSBUSCFG0_INCR256BRSTENA (1 << 7)
144#define DWC3_GSBUSCFG0_INCR128BRSTENA (1 << 6)
145#define DWC3_GSBUSCFG0_INCR64BRSTENA (1 << 5)
146#define DWC3_GSBUSCFG0_INCR32BRSTENA (1 << 4)
147#define DWC3_GSBUSCFG0_INCR16BRSTENA (1 << 3)
148#define DWC3_GSBUSCFG0_INCR8BRSTENA (1 << 2)
149#define DWC3_GSBUSCFG0_INCR4BRSTENA (1 << 1)
150#define DWC3_GSBUSCFG0_INCRBRSTENA (1 << 0)
151#define DWC3_GSBUSCFG0_INCRBRST_MASK 0xff
152
153
154#define DWC3_GCTL_PWRDNSCALE(n) ((n) << 19)
155#define DWC3_GCTL_U2RSTECN (1 << 16)
156#define DWC3_GCTL_RAMCLKSEL(x) (((x) & DWC3_GCTL_CLK_MASK) << 6)
157#define DWC3_GCTL_CLK_BUS (0)
158#define DWC3_GCTL_CLK_PIPE (1)
159#define DWC3_GCTL_CLK_PIPEHALF (2)
160#define DWC3_GCTL_CLK_MASK (3)
161
162#define DWC3_GCTL_PRTCAP(n) (((n) & (3 << 12)) >> 12)
163#define DWC3_GCTL_PRTCAPDIR(n) ((n) << 12)
164#define DWC3_GCTL_PRTCAP_HOST 1
165#define DWC3_GCTL_PRTCAP_DEVICE 2
166#define DWC3_GCTL_PRTCAP_OTG 3
167
168#define DWC3_GCTL_CORESOFTRESET (1 << 11)
169#define DWC3_GCTL_SOFITPSYNC (1 << 10)
170#define DWC3_GCTL_SCALEDOWN(n) ((n) << 4)
171#define DWC3_GCTL_SCALEDOWN_MASK DWC3_GCTL_SCALEDOWN(3)
172#define DWC3_GCTL_DISSCRAMBLE (1 << 3)
173#define DWC3_GCTL_U2EXIT_LFPS (1 << 2)
174#define DWC3_GCTL_GBLHIBERNATIONEN (1 << 1)
175#define DWC3_GCTL_DSBLCLKGTNG (1 << 0)
176
177
178#define DWC3_GUCTL_HSTINAUTORETRY BIT(14)
179
180
181#define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS BIT(28)
182#define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW BIT(24)
183
184
185#define DWC3_GUSB2PHYCFG_PHYSOFTRST (1 << 31)
186#define DWC3_GUSB2PHYCFG_U2_FREECLK_EXISTS (1 << 30)
187#define DWC3_GUSB2PHYCFG_SUSPHY (1 << 6)
188#define DWC3_GUSB2PHYCFG_ENBLSLPM (1 << 8)
189#define DWC3_GUSB2PHYCFG_PHYIF(n) ((n) << 3)
190#define DWC3_GUSB2PHYCFG_PHYIF_MASK DWC3_GUSB2PHYCFG_PHYIF(1)
191#define DWC3_GUSB2PHYCFG_USBTRDTIM(n) ((n) << 10)
192#define DWC3_GUSB2PHYCFG_USBTRDTIM_MASK DWC3_GUSB2PHYCFG_USBTRDTIM(0xf)
193#define USBTRDTIM_UTMI_8_BIT 9
194#define USBTRDTIM_UTMI_16_BIT 5
195#define UTMI_PHYIF_16_BIT 1
196#define UTMI_PHYIF_8_BIT 0
197
198
199#define DWC3_GUSB3PIPECTL_PHYSOFTRST (1 << 31)
200#define DWC3_GUSB3PIPECTL_U2SSINP3OK (1 << 29)
201#define DWC3_GUSB3PIPECTL_REQP1P2P3 (1 << 24)
202#define DWC3_GUSB3PIPECTL_DEP1P2P3(n) ((n) << 19)
203#define DWC3_GUSB3PIPECTL_DEP1P2P3_MASK DWC3_GUSB3PIPECTL_DEP1P2P3(7)
204#define DWC3_GUSB3PIPECTL_DEP1P2P3_EN DWC3_GUSB3PIPECTL_DEP1P2P3(1)
205#define DWC3_GUSB3PIPECTL_DEPOCHANGE (1 << 18)
206#define DWC3_GUSB3PIPECTL_SUSPHY (1 << 17)
207#define DWC3_GUSB3PIPECTL_LFPSFILT (1 << 9)
208#define DWC3_GUSB3PIPECTL_RX_DETOPOLL (1 << 8)
209#define DWC3_GUSB3PIPECTL_TX_DEEPH_MASK DWC3_GUSB3PIPECTL_TX_DEEPH(3)
210#define DWC3_GUSB3PIPECTL_TX_DEEPH(n) ((n) << 1)
211
212
213#define DWC3_GTXFIFOSIZ_TXFDEF(n) ((n) & 0xffff)
214#define DWC3_GTXFIFOSIZ_TXFSTADDR(n) ((n) & 0xffff0000)
215
216
217#define DWC3_GEVNTSIZ_INTMASK (1 << 31)
218#define DWC3_GEVNTSIZ_SIZE(n) ((n) & 0xffff)
219
220
221#define DWC3_GHWPARAMS1_EN_PWROPT(n) (((n) & (3 << 24)) >> 24)
222#define DWC3_GHWPARAMS1_EN_PWROPT_NO 0
223#define DWC3_GHWPARAMS1_EN_PWROPT_CLK 1
224#define DWC3_GHWPARAMS1_EN_PWROPT_HIB 2
225#define DWC3_GHWPARAMS1_PWROPT(n) ((n) << 24)
226#define DWC3_GHWPARAMS1_PWROPT_MASK DWC3_GHWPARAMS1_PWROPT(3)
227
228
229#define DWC3_GHWPARAMS3_SSPHY_IFC(n) ((n) & 3)
230#define DWC3_GHWPARAMS3_SSPHY_IFC_DIS 0
231#define DWC3_GHWPARAMS3_SSPHY_IFC_ENA 1
232#define DWC3_GHWPARAMS3_HSPHY_IFC(n) (((n) & (3 << 2)) >> 2)
233#define DWC3_GHWPARAMS3_HSPHY_IFC_DIS 0
234#define DWC3_GHWPARAMS3_HSPHY_IFC_UTMI 1
235#define DWC3_GHWPARAMS3_HSPHY_IFC_ULPI 2
236#define DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI 3
237#define DWC3_GHWPARAMS3_FSPHY_IFC(n) (((n) & (3 << 4)) >> 4)
238#define DWC3_GHWPARAMS3_FSPHY_IFC_DIS 0
239#define DWC3_GHWPARAMS3_FSPHY_IFC_ENA 1
240
241
242#define DWC3_GHWPARAMS4_HIBER_SCRATCHBUFS(n) (((n) & (0x0f << 13)) >> 13)
243#define DWC3_MAX_HIBER_SCRATCHBUFS 15
244
245
246#define DWC3_GHWPARAMS6_EN_FPGA (1 << 7)
247
248
249#define DWC3_GFLADJ_30MHZ_SDBND_SEL (1 << 7)
250#define DWC3_GFLADJ_30MHZ_MASK 0x3f
251
252
253#define DWC3_DCFG_DEVADDR(addr) ((addr) << 3)
254#define DWC3_DCFG_DEVADDR_MASK DWC3_DCFG_DEVADDR(0x7f)
255
256#define DWC3_DCFG_SPEED_MASK (7 << 0)
257#define DWC3_DCFG_SUPERSPEED (4 << 0)
258#define DWC3_DCFG_HIGHSPEED (0 << 0)
259#define DWC3_DCFG_FULLSPEED2 (1 << 0)
260#define DWC3_DCFG_LOWSPEED (2 << 0)
261#define DWC3_DCFG_FULLSPEED1 (3 << 0)
262
263#define DWC3_DCFG_LPM_CAP (1 << 22)
264
265
266#define DWC3_DCTL_RUN_STOP (1 << 31)
267#define DWC3_DCTL_CSFTRST (1 << 30)
268#define DWC3_DCTL_LSFTRST (1 << 29)
269
270#define DWC3_DCTL_HIRD_THRES_MASK (0x1f << 24)
271#define DWC3_DCTL_HIRD_THRES(n) ((n) << 24)
272
273#define DWC3_DCTL_APPL1RES (1 << 23)
274
275
276#define DWC3_DCTL_TRGTULST_MASK (0x0f << 17)
277#define DWC3_DCTL_TRGTULST(n) ((n) << 17)
278#define DWC3_DCTL_TRGTULST_U2 (DWC3_DCTL_TRGTULST(2))
279#define DWC3_DCTL_TRGTULST_U3 (DWC3_DCTL_TRGTULST(3))
280#define DWC3_DCTL_TRGTULST_SS_DIS (DWC3_DCTL_TRGTULST(4))
281#define DWC3_DCTL_TRGTULST_RX_DET (DWC3_DCTL_TRGTULST(5))
282#define DWC3_DCTL_TRGTULST_SS_INACT (DWC3_DCTL_TRGTULST(6))
283
284
285#define DWC3_DCTL_LPM_ERRATA_MASK DWC3_DCTL_LPM_ERRATA(0xf)
286#define DWC3_DCTL_LPM_ERRATA(n) ((n) << 20)
287
288#define DWC3_DCTL_KEEP_CONNECT (1 << 19)
289#define DWC3_DCTL_L1_HIBER_EN (1 << 18)
290#define DWC3_DCTL_CRS (1 << 17)
291#define DWC3_DCTL_CSS (1 << 16)
292
293#define DWC3_DCTL_INITU2ENA (1 << 12)
294#define DWC3_DCTL_ACCEPTU2ENA (1 << 11)
295#define DWC3_DCTL_INITU1ENA (1 << 10)
296#define DWC3_DCTL_ACCEPTU1ENA (1 << 9)
297#define DWC3_DCTL_TSTCTRL_MASK (0xf << 1)
298
299#define DWC3_DCTL_ULSTCHNGREQ_MASK (0x0f << 5)
300#define DWC3_DCTL_ULSTCHNGREQ(n) (((n) << 5) & DWC3_DCTL_ULSTCHNGREQ_MASK)
301
302#define DWC3_DCTL_ULSTCHNG_NO_ACTION (DWC3_DCTL_ULSTCHNGREQ(0))
303#define DWC3_DCTL_ULSTCHNG_SS_DISABLED (DWC3_DCTL_ULSTCHNGREQ(4))
304#define DWC3_DCTL_ULSTCHNG_RX_DETECT (DWC3_DCTL_ULSTCHNGREQ(5))
305#define DWC3_DCTL_ULSTCHNG_SS_INACTIVE (DWC3_DCTL_ULSTCHNGREQ(6))
306#define DWC3_DCTL_ULSTCHNG_RECOVERY (DWC3_DCTL_ULSTCHNGREQ(8))
307#define DWC3_DCTL_ULSTCHNG_COMPLIANCE (DWC3_DCTL_ULSTCHNGREQ(10))
308#define DWC3_DCTL_ULSTCHNG_LOOPBACK (DWC3_DCTL_ULSTCHNGREQ(11))
309
310
311#define DWC3_DEVTEN_VNDRDEVTSTRCVEDEN (1 << 12)
312#define DWC3_DEVTEN_EVNTOVERFLOWEN (1 << 11)
313#define DWC3_DEVTEN_CMDCMPLTEN (1 << 10)
314#define DWC3_DEVTEN_ERRTICERREN (1 << 9)
315#define DWC3_DEVTEN_SOFEN (1 << 7)
316#define DWC3_DEVTEN_EOPFEN (1 << 6)
317#define DWC3_DEVTEN_HIBERNATIONREQEVTEN (1 << 5)
318#define DWC3_DEVTEN_WKUPEVTEN (1 << 4)
319#define DWC3_DEVTEN_ULSTCNGEN (1 << 3)
320#define DWC3_DEVTEN_CONNECTDONEEN (1 << 2)
321#define DWC3_DEVTEN_USBRSTEN (1 << 1)
322#define DWC3_DEVTEN_DISCONNEVTEN (1 << 0)
323
324
325#define DWC3_DSTS_DCNRD (1 << 29)
326
327
328#define DWC3_DSTS_PWRUPREQ (1 << 24)
329
330
331#define DWC3_DSTS_RSS (1 << 25)
332#define DWC3_DSTS_SSS (1 << 24)
333
334#define DWC3_DSTS_COREIDLE (1 << 23)
335#define DWC3_DSTS_DEVCTRLHLT (1 << 22)
336
337#define DWC3_DSTS_USBLNKST_MASK (0x0f << 18)
338#define DWC3_DSTS_USBLNKST(n) (((n) & DWC3_DSTS_USBLNKST_MASK) >> 18)
339
340#define DWC3_DSTS_RXFIFOEMPTY (1 << 17)
341
342#define DWC3_DSTS_SOFFN_MASK (0x3fff << 3)
343#define DWC3_DSTS_SOFFN(n) (((n) & DWC3_DSTS_SOFFN_MASK) >> 3)
344
345#define DWC3_DSTS_CONNECTSPD (7 << 0)
346
347#define DWC3_DSTS_SUPERSPEED (4 << 0)
348#define DWC3_DSTS_HIGHSPEED (0 << 0)
349#define DWC3_DSTS_FULLSPEED2 (1 << 0)
350#define DWC3_DSTS_LOWSPEED (2 << 0)
351#define DWC3_DSTS_FULLSPEED1 (3 << 0)
352
353
354#define DWC3_DGCMD_SET_LMP 0x01
355#define DWC3_DGCMD_SET_PERIODIC_PAR 0x02
356#define DWC3_DGCMD_XMIT_FUNCTION 0x03
357
358
359#define DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO 0x04
360#define DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI 0x05
361
362#define DWC3_DGCMD_SELECTED_FIFO_FLUSH 0x09
363#define DWC3_DGCMD_ALL_FIFO_FLUSH 0x0a
364#define DWC3_DGCMD_SET_ENDPOINT_NRDY 0x0c
365#define DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK 0x10
366
367#define DWC3_DGCMD_STATUS(n) (((n) >> 15) & 1)
368#define DWC3_DGCMD_CMDACT (1 << 10)
369#define DWC3_DGCMD_CMDIOC (1 << 8)
370
371
372#define DWC3_DGCMDPAR_FORCE_LINKPM_ACCEPT (1 << 0)
373#define DWC3_DGCMDPAR_FIFO_NUM(n) ((n) << 0)
374#define DWC3_DGCMDPAR_RX_FIFO (0 << 5)
375#define DWC3_DGCMDPAR_TX_FIFO (1 << 5)
376#define DWC3_DGCMDPAR_LOOPBACK_DIS (0 << 0)
377#define DWC3_DGCMDPAR_LOOPBACK_ENA (1 << 0)
378
379
380#define DWC3_DEPCMD_PARAM_SHIFT 16
381#define DWC3_DEPCMD_PARAM(x) ((x) << DWC3_DEPCMD_PARAM_SHIFT)
382#define DWC3_DEPCMD_GET_RSC_IDX(x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f)
383#define DWC3_DEPCMD_STATUS(x) (((x) >> 15) & 1)
384#define DWC3_DEPCMD_HIPRI_FORCERM (1 << 11)
385#define DWC3_DEPCMD_CMDACT (1 << 10)
386#define DWC3_DEPCMD_CMDIOC (1 << 8)
387
388#define DWC3_DEPCMD_DEPSTARTCFG (0x09 << 0)
389#define DWC3_DEPCMD_ENDTRANSFER (0x08 << 0)
390#define DWC3_DEPCMD_UPDATETRANSFER (0x07 << 0)
391#define DWC3_DEPCMD_STARTTRANSFER (0x06 << 0)
392#define DWC3_DEPCMD_CLEARSTALL (0x05 << 0)
393#define DWC3_DEPCMD_SETSTALL (0x04 << 0)
394
395#define DWC3_DEPCMD_GETSEQNUMBER (0x03 << 0)
396
397#define DWC3_DEPCMD_GETEPSTATE (0x03 << 0)
398#define DWC3_DEPCMD_SETTRANSFRESOURCE (0x02 << 0)
399#define DWC3_DEPCMD_SETEPCONFIG (0x01 << 0)
400
401
402#define DWC3_DALEPENA_EP(n) (1 << n)
403
404#define DWC3_DEPCMD_TYPE_CONTROL 0
405#define DWC3_DEPCMD_TYPE_ISOC 1
406#define DWC3_DEPCMD_TYPE_BULK 2
407#define DWC3_DEPCMD_TYPE_INTR 3
408
409
410
411struct dwc3_trb;
412
413
414
415
416
417
418
419
420
421
422
423struct dwc3_event_buffer {
424 void *buf;
425 unsigned length;
426 unsigned int lpos;
427 unsigned int count;
428 unsigned int flags;
429
430#define DWC3_EVENT_PENDING (1UL << 0)
431
432 dma_addr_t dma;
433
434 struct dwc3 *dwc;
435};
436
437#define DWC3_EP_FLAG_STALLED (1 << 0)
438#define DWC3_EP_FLAG_WEDGED (1 << 1)
439
440#define DWC3_EP_DIRECTION_TX true
441#define DWC3_EP_DIRECTION_RX false
442
443#define DWC3_TRB_NUM 32
444#define DWC3_TRB_MASK (DWC3_TRB_NUM - 1)
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468struct dwc3_ep {
469 struct usb_ep endpoint;
470 struct list_head request_list;
471 struct list_head req_queued;
472
473 struct dwc3_trb *trb_pool;
474 dma_addr_t trb_pool_dma;
475 u32 free_slot;
476 u32 busy_slot;
477 const struct usb_ss_ep_comp_descriptor *comp_desc;
478 struct dwc3 *dwc;
479
480 u32 saved_state;
481 unsigned flags;
482#define DWC3_EP_ENABLED (1 << 0)
483#define DWC3_EP_STALL (1 << 1)
484#define DWC3_EP_WEDGE (1 << 2)
485#define DWC3_EP_BUSY (1 << 4)
486#define DWC3_EP_PENDING_REQUEST (1 << 5)
487#define DWC3_EP_MISSED_ISOC (1 << 6)
488
489
490#define DWC3_EP0_DIR_IN (1 << 31)
491
492 unsigned current_trb;
493
494 u8 number;
495 u8 type;
496 u8 resource_index;
497 u32 interval;
498
499 char name[20];
500
501 unsigned direction:1;
502 unsigned stream_capable:1;
503};
504
505enum dwc3_phy {
506 DWC3_PHY_UNKNOWN = 0,
507 DWC3_PHY_USB3,
508 DWC3_PHY_USB2,
509};
510
511enum dwc3_ep0_next {
512 DWC3_EP0_UNKNOWN = 0,
513 DWC3_EP0_COMPLETE,
514 DWC3_EP0_NRDY_DATA,
515 DWC3_EP0_NRDY_STATUS,
516};
517
518enum dwc3_ep0_state {
519 EP0_UNCONNECTED = 0,
520 EP0_SETUP_PHASE,
521 EP0_DATA_PHASE,
522 EP0_STATUS_PHASE,
523};
524
525enum dwc3_link_state {
526
527 DWC3_LINK_STATE_U0 = 0x00,
528 DWC3_LINK_STATE_U1 = 0x01,
529 DWC3_LINK_STATE_U2 = 0x02,
530 DWC3_LINK_STATE_U3 = 0x03,
531 DWC3_LINK_STATE_SS_DIS = 0x04,
532 DWC3_LINK_STATE_RX_DET = 0x05,
533 DWC3_LINK_STATE_SS_INACT = 0x06,
534 DWC3_LINK_STATE_POLL = 0x07,
535 DWC3_LINK_STATE_RECOV = 0x08,
536 DWC3_LINK_STATE_HRESET = 0x09,
537 DWC3_LINK_STATE_CMPLY = 0x0a,
538 DWC3_LINK_STATE_LPBK = 0x0b,
539 DWC3_LINK_STATE_RESET = 0x0e,
540 DWC3_LINK_STATE_RESUME = 0x0f,
541 DWC3_LINK_STATE_MASK = 0x0f,
542};
543
544
545#define DWC3_TRB_SIZE_MASK (0x00ffffff)
546#define DWC3_TRB_SIZE_LENGTH(n) ((n) & DWC3_TRB_SIZE_MASK)
547#define DWC3_TRB_SIZE_PCM1(n) (((n) & 0x03) << 24)
548#define DWC3_TRB_SIZE_TRBSTS(n) (((n) & (0x0f << 28)) >> 28)
549
550#define DWC3_TRBSTS_OK 0
551#define DWC3_TRBSTS_MISSED_ISOC 1
552#define DWC3_TRBSTS_SETUP_PENDING 2
553#define DWC3_TRB_STS_XFER_IN_PROG 4
554
555
556#define DWC3_TRB_CTRL_HWO (1 << 0)
557#define DWC3_TRB_CTRL_LST (1 << 1)
558#define DWC3_TRB_CTRL_CHN (1 << 2)
559#define DWC3_TRB_CTRL_CSP (1 << 3)
560#define DWC3_TRB_CTRL_TRBCTL(n) (((n) & 0x3f) << 4)
561#define DWC3_TRB_CTRL_ISP_IMI (1 << 10)
562#define DWC3_TRB_CTRL_IOC (1 << 11)
563#define DWC3_TRB_CTRL_SID_SOFN(n) (((n) & 0xffff) << 14)
564
565#define DWC3_TRBCTL_NORMAL DWC3_TRB_CTRL_TRBCTL(1)
566#define DWC3_TRBCTL_CONTROL_SETUP DWC3_TRB_CTRL_TRBCTL(2)
567#define DWC3_TRBCTL_CONTROL_STATUS2 DWC3_TRB_CTRL_TRBCTL(3)
568#define DWC3_TRBCTL_CONTROL_STATUS3 DWC3_TRB_CTRL_TRBCTL(4)
569#define DWC3_TRBCTL_CONTROL_DATA DWC3_TRB_CTRL_TRBCTL(5)
570#define DWC3_TRBCTL_ISOCHRONOUS_FIRST DWC3_TRB_CTRL_TRBCTL(6)
571#define DWC3_TRBCTL_ISOCHRONOUS DWC3_TRB_CTRL_TRBCTL(7)
572#define DWC3_TRBCTL_LINK_TRB DWC3_TRB_CTRL_TRBCTL(8)
573
574
575
576
577
578
579
580
581struct dwc3_trb {
582 u32 bpl;
583 u32 bph;
584 u32 size;
585 u32 ctrl;
586} __packed;
587
588
589
590
591
592
593
594
595
596
597
598
599
600struct dwc3_hwparams {
601 u32 hwparams0;
602 u32 hwparams1;
603 u32 hwparams2;
604 u32 hwparams3;
605 u32 hwparams4;
606 u32 hwparams5;
607 u32 hwparams6;
608 u32 hwparams7;
609 u32 hwparams8;
610};
611
612
613#define DWC3_MODE(n) ((n) & 0x7)
614
615#define DWC3_MDWIDTH(n) (((n) & 0xff00) >> 8)
616
617
618#define DWC3_NUM_INT(n) (((n) & (0x3f << 15)) >> 15)
619
620
621#define DWC3_NUM_IN_EPS_MASK (0x1f << 18)
622#define DWC3_NUM_EPS_MASK (0x3f << 12)
623#define DWC3_NUM_EPS(p) (((p)->hwparams3 & \
624 (DWC3_NUM_EPS_MASK)) >> 12)
625#define DWC3_NUM_IN_EPS(p) (((p)->hwparams3 & \
626 (DWC3_NUM_IN_EPS_MASK)) >> 18)
627
628
629#define DWC3_RAM1_DEPTH(n) ((n) & 0xffff)
630
631struct dwc3_request {
632 struct usb_request request;
633 struct list_head list;
634 struct dwc3_ep *dep;
635 u32 start_slot;
636
637 u8 epnum;
638 struct dwc3_trb *trb;
639 dma_addr_t trb_dma;
640
641 unsigned direction:1;
642 unsigned mapped:1;
643 unsigned queued:1;
644};
645
646
647
648
649
650struct dwc3_scratchpad_array {
651 __le64 dma_adr[DWC3_MAX_HIBER_SCRATCHBUFS];
652};
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739struct dwc3 {
740 struct usb_ctrlrequest *ctrl_req;
741 struct dwc3_trb *ep0_trb;
742 void *ep0_bounce;
743 void *scratchbuf;
744 u8 *setup_buf;
745 dma_addr_t ctrl_req_addr;
746 dma_addr_t ep0_trb_addr;
747 dma_addr_t ep0_bounce_addr;
748 dma_addr_t scratch_addr;
749 struct dwc3_request ep0_usb_req;
750
751
752 spinlock_t lock;
753
754#if defined(__UBOOT__) && CONFIG_IS_ENABLED(DM_USB)
755 struct udevice *dev;
756#else
757 struct device *dev;
758#endif
759
760 struct platform_device *xhci;
761 struct resource xhci_resources[DWC3_XHCI_RESOURCES_NUM];
762
763 struct dwc3_event_buffer **ev_buffs;
764 struct dwc3_ep *eps[DWC3_ENDPOINTS_NUM];
765
766 struct usb_gadget gadget;
767 struct usb_gadget_driver *gadget_driver;
768
769 void __iomem *regs;
770 size_t regs_size;
771
772 enum usb_dr_mode dr_mode;
773 enum usb_phy_interface hsphy_mode;
774
775
776 u32 dcfg;
777 u32 gctl;
778
779 u32 nr_scratch;
780 u32 num_event_buffers;
781 u32 u1u2;
782 u32 maximum_speed;
783 u32 revision;
784
785#define DWC3_REVISION_173A 0x5533173a
786#define DWC3_REVISION_175A 0x5533175a
787#define DWC3_REVISION_180A 0x5533180a
788#define DWC3_REVISION_183A 0x5533183a
789#define DWC3_REVISION_185A 0x5533185a
790#define DWC3_REVISION_187A 0x5533187a
791#define DWC3_REVISION_188A 0x5533188a
792#define DWC3_REVISION_190A 0x5533190a
793#define DWC3_REVISION_194A 0x5533194a
794#define DWC3_REVISION_200A 0x5533200a
795#define DWC3_REVISION_202A 0x5533202a
796#define DWC3_REVISION_210A 0x5533210a
797#define DWC3_REVISION_220A 0x5533220a
798#define DWC3_REVISION_230A 0x5533230a
799#define DWC3_REVISION_240A 0x5533240a
800#define DWC3_REVISION_250A 0x5533250a
801#define DWC3_REVISION_260A 0x5533260a
802#define DWC3_REVISION_270A 0x5533270a
803#define DWC3_REVISION_280A 0x5533280a
804#define DWC3_REVISION_290A 0x5533290a
805
806 enum dwc3_ep0_next ep0_next_event;
807 enum dwc3_ep0_state ep0state;
808 enum dwc3_link_state link_state;
809
810 u16 isoch_delay;
811 u16 u2sel;
812 u16 u2pel;
813 u8 u1sel;
814 u8 u1pel;
815
816 u8 speed;
817
818 u8 num_out_eps;
819 u8 num_in_eps;
820
821 void *mem;
822
823 struct dwc3_hwparams hwparams;
824 struct dentry *root;
825 struct debugfs_regset32 *regset;
826
827 u8 test_mode;
828 u8 test_mode_nr;
829 u8 lpm_nyet_threshold;
830 u8 hird_threshold;
831 u32 fladj;
832 u8 incrx_mode;
833 u32 incrx_size;
834
835 unsigned delayed_status:1;
836 unsigned ep0_bounced:1;
837 unsigned ep0_expect_in:1;
838 unsigned has_hibernation:1;
839 unsigned has_lpm_erratum:1;
840 unsigned is_utmi_l1_suspend:1;
841 unsigned is_selfpowered:1;
842 unsigned is_fpga:1;
843 unsigned needs_fifo_resize:1;
844 unsigned pullups_connected:1;
845 unsigned resize_fifos:1;
846 unsigned setup_packet_pending:1;
847 unsigned start_config_issued:1;
848 unsigned three_stage_setup:1;
849
850 unsigned disable_scramble_quirk:1;
851 unsigned u2exit_lfps_quirk:1;
852 unsigned u2ss_inp3_quirk:1;
853 unsigned req_p1p2p3_quirk:1;
854 unsigned del_p1p2p3_quirk:1;
855 unsigned del_phy_power_chg_quirk:1;
856 unsigned lfps_filter_quirk:1;
857 unsigned rx_detect_poll_quirk:1;
858 unsigned dis_u3_susphy_quirk:1;
859 unsigned dis_u2_susphy_quirk:1;
860 unsigned dis_del_phy_power_chg_quirk:1;
861 unsigned dis_tx_ipgap_linecheck_quirk:1;
862 unsigned dis_enblslpm_quirk:1;
863 unsigned dis_u2_freeclk_exists_quirk:1;
864
865 unsigned tx_de_emphasis_quirk:1;
866 unsigned tx_de_emphasis:2;
867 int index;
868 struct list_head list;
869};
870
871#define INCRX_BURST_MODE 0
872#define INCRX_UNDEF_LENGTH_BURST_MODE 1
873
874
875
876
877
878struct dwc3_event_type {
879 u32 is_devspec:1;
880 u32 type:7;
881 u32 reserved8_31:24;
882} __packed;
883
884#define DWC3_DEPEVT_XFERCOMPLETE 0x01
885#define DWC3_DEPEVT_XFERINPROGRESS 0x02
886#define DWC3_DEPEVT_XFERNOTREADY 0x03
887#define DWC3_DEPEVT_RXTXFIFOEVT 0x04
888#define DWC3_DEPEVT_STREAMEVT 0x06
889#define DWC3_DEPEVT_EPCMDCMPLT 0x07
890
891
892
893
894
895static inline const char *dwc3_ep_event_string(u8 event)
896{
897 switch (event) {
898 case DWC3_DEPEVT_XFERCOMPLETE:
899 return "Transfer Complete";
900 case DWC3_DEPEVT_XFERINPROGRESS:
901 return "Transfer In-Progress";
902 case DWC3_DEPEVT_XFERNOTREADY:
903 return "Transfer Not Ready";
904 case DWC3_DEPEVT_RXTXFIFOEVT:
905 return "FIFO";
906 case DWC3_DEPEVT_STREAMEVT:
907 return "Stream";
908 case DWC3_DEPEVT_EPCMDCMPLT:
909 return "Endpoint Command Complete";
910 }
911
912 return "UNKNOWN";
913}
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934struct dwc3_event_depevt {
935 u32 one_bit:1;
936 u32 endpoint_number:5;
937 u32 endpoint_event:4;
938 u32 reserved11_10:2;
939 u32 status:4;
940
941
942#define DEPEVT_STATUS_TRANSFER_ACTIVE (1 << 3)
943
944
945#define DEPEVT_STATUS_BUSERR (1 << 0)
946#define DEPEVT_STATUS_SHORT (1 << 1)
947#define DEPEVT_STATUS_IOC (1 << 2)
948#define DEPEVT_STATUS_LST (1 << 3)
949
950
951#define DEPEVT_STREAMEVT_FOUND 1
952#define DEPEVT_STREAMEVT_NOTFOUND 2
953
954
955#define DEPEVT_STATUS_CONTROL_DATA 1
956#define DEPEVT_STATUS_CONTROL_STATUS 2
957
958 u32 parameters:16;
959} __packed;
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983struct dwc3_event_devt {
984 u32 one_bit:1;
985 u32 device_event:7;
986 u32 type:4;
987 u32 reserved15_12:4;
988 u32 event_info:9;
989 u32 reserved31_25:7;
990} __packed;
991
992
993
994
995
996
997
998
999struct dwc3_event_gevt {
1000 u32 one_bit:1;
1001 u32 device_event:7;
1002 u32 phy_port_number:4;
1003 u32 reserved31_12:20;
1004} __packed;
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014union dwc3_event {
1015 u32 raw;
1016 struct dwc3_event_type type;
1017 struct dwc3_event_depevt depevt;
1018 struct dwc3_event_devt devt;
1019 struct dwc3_event_gevt gevt;
1020};
1021
1022
1023
1024
1025
1026
1027
1028
1029struct dwc3_gadget_ep_cmd_params {
1030 u32 param2;
1031 u32 param1;
1032 u32 param0;
1033};
1034
1035
1036
1037
1038
1039#define DWC3_HAS_PERIPHERAL BIT(0)
1040#define DWC3_HAS_XHCI BIT(1)
1041#define DWC3_HAS_OTG BIT(3)
1042
1043
1044int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc);
1045void dwc3_of_parse(struct dwc3 *dwc);
1046int dwc3_init(struct dwc3 *dwc);
1047void dwc3_remove(struct dwc3 *dwc);
1048
1049static inline int dwc3_host_init(struct dwc3 *dwc)
1050{ return 0; }
1051static inline void dwc3_host_exit(struct dwc3 *dwc)
1052{ }
1053
1054#ifdef CONFIG_USB_DWC3_GADGET
1055int dwc3_gadget_init(struct dwc3 *dwc);
1056void dwc3_gadget_exit(struct dwc3 *dwc);
1057int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode);
1058int dwc3_gadget_get_link_state(struct dwc3 *dwc);
1059int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state);
1060int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
1061 unsigned cmd, struct dwc3_gadget_ep_cmd_params *params);
1062int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param);
1063#else
1064static inline int dwc3_gadget_init(struct dwc3 *dwc)
1065{ return 0; }
1066static inline void dwc3_gadget_exit(struct dwc3 *dwc)
1067{ }
1068static inline int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
1069{ return 0; }
1070static inline int dwc3_gadget_get_link_state(struct dwc3 *dwc)
1071{ return 0; }
1072static inline int dwc3_gadget_set_link_state(struct dwc3 *dwc,
1073 enum dwc3_link_state state)
1074{ return 0; }
1075
1076static inline int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
1077 unsigned cmd, struct dwc3_gadget_ep_cmd_params *params)
1078{ return 0; }
1079static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc,
1080 int cmd, u32 param)
1081{ return 0; }
1082#endif
1083
1084#endif
1085