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