0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #ifndef __DRIVERS_USB_DWC3_CORE_H
0012 #define __DRIVERS_USB_DWC3_CORE_H
0013
0014 #include <linux/device.h>
0015 #include <linux/spinlock.h>
0016 #include <linux/mutex.h>
0017 #include <linux/ioport.h>
0018 #include <linux/list.h>
0019 #include <linux/bitops.h>
0020 #include <linux/dma-mapping.h>
0021 #include <linux/mm.h>
0022 #include <linux/debugfs.h>
0023 #include <linux/wait.h>
0024 #include <linux/workqueue.h>
0025
0026 #include <linux/usb/ch9.h>
0027 #include <linux/usb/gadget.h>
0028 #include <linux/usb/otg.h>
0029 #include <linux/usb/role.h>
0030 #include <linux/ulpi/interface.h>
0031
0032 #include <linux/phy/phy.h>
0033
0034 #include <linux/power_supply.h>
0035
0036 #define DWC3_MSG_MAX 500
0037
0038
0039 #define DWC3_PULL_UP_TIMEOUT 500
0040 #define DWC3_BOUNCE_SIZE 1024
0041 #define DWC3_EP0_SETUP_SIZE 512
0042 #define DWC3_ENDPOINTS_NUM 32
0043 #define DWC3_XHCI_RESOURCES_NUM 2
0044 #define DWC3_ISOC_MAX_RETRIES 5
0045
0046 #define DWC3_SCRATCHBUF_SIZE 4096
0047 #define DWC3_EVENT_BUFFERS_SIZE 4096
0048 #define DWC3_EVENT_TYPE_MASK 0xfe
0049
0050 #define DWC3_EVENT_TYPE_DEV 0
0051 #define DWC3_EVENT_TYPE_CARKIT 3
0052 #define DWC3_EVENT_TYPE_I2C 4
0053
0054 #define DWC3_DEVICE_EVENT_DISCONNECT 0
0055 #define DWC3_DEVICE_EVENT_RESET 1
0056 #define DWC3_DEVICE_EVENT_CONNECT_DONE 2
0057 #define DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE 3
0058 #define DWC3_DEVICE_EVENT_WAKEUP 4
0059 #define DWC3_DEVICE_EVENT_HIBER_REQ 5
0060 #define DWC3_DEVICE_EVENT_SUSPEND 6
0061 #define DWC3_DEVICE_EVENT_SOF 7
0062 #define DWC3_DEVICE_EVENT_ERRATIC_ERROR 9
0063 #define DWC3_DEVICE_EVENT_CMD_CMPL 10
0064 #define DWC3_DEVICE_EVENT_OVERFLOW 11
0065
0066
0067 #define DWC3_OTG_ROLE_IDLE 0
0068 #define DWC3_OTG_ROLE_HOST 1
0069 #define DWC3_OTG_ROLE_DEVICE 2
0070
0071 #define DWC3_GEVNTCOUNT_MASK 0xfffc
0072 #define DWC3_GEVNTCOUNT_EHB BIT(31)
0073 #define DWC3_GSNPSID_MASK 0xffff0000
0074 #define DWC3_GSNPSREV_MASK 0xffff
0075 #define DWC3_GSNPS_ID(p) (((p) & DWC3_GSNPSID_MASK) >> 16)
0076
0077
0078 #define DWC3_XHCI_REGS_START 0x0
0079 #define DWC3_XHCI_REGS_END 0x7fff
0080 #define DWC3_GLOBALS_REGS_START 0xc100
0081 #define DWC3_GLOBALS_REGS_END 0xc6ff
0082 #define DWC3_DEVICE_REGS_START 0xc700
0083 #define DWC3_DEVICE_REGS_END 0xcbff
0084 #define DWC3_OTG_REGS_START 0xcc00
0085 #define DWC3_OTG_REGS_END 0xccff
0086
0087
0088 #define DWC3_GSBUSCFG0 0xc100
0089 #define DWC3_GSBUSCFG1 0xc104
0090 #define DWC3_GTXTHRCFG 0xc108
0091 #define DWC3_GRXTHRCFG 0xc10c
0092 #define DWC3_GCTL 0xc110
0093 #define DWC3_GEVTEN 0xc114
0094 #define DWC3_GSTS 0xc118
0095 #define DWC3_GUCTL1 0xc11c
0096 #define DWC3_GSNPSID 0xc120
0097 #define DWC3_GGPIO 0xc124
0098 #define DWC3_GUID 0xc128
0099 #define DWC3_GUCTL 0xc12c
0100 #define DWC3_GBUSERRADDR0 0xc130
0101 #define DWC3_GBUSERRADDR1 0xc134
0102 #define DWC3_GPRTBIMAP0 0xc138
0103 #define DWC3_GPRTBIMAP1 0xc13c
0104 #define DWC3_GHWPARAMS0 0xc140
0105 #define DWC3_GHWPARAMS1 0xc144
0106 #define DWC3_GHWPARAMS2 0xc148
0107 #define DWC3_GHWPARAMS3 0xc14c
0108 #define DWC3_GHWPARAMS4 0xc150
0109 #define DWC3_GHWPARAMS5 0xc154
0110 #define DWC3_GHWPARAMS6 0xc158
0111 #define DWC3_GHWPARAMS7 0xc15c
0112 #define DWC3_GDBGFIFOSPACE 0xc160
0113 #define DWC3_GDBGLTSSM 0xc164
0114 #define DWC3_GDBGBMU 0xc16c
0115 #define DWC3_GDBGLSPMUX 0xc170
0116 #define DWC3_GDBGLSP 0xc174
0117 #define DWC3_GDBGEPINFO0 0xc178
0118 #define DWC3_GDBGEPINFO1 0xc17c
0119 #define DWC3_GPRTBIMAP_HS0 0xc180
0120 #define DWC3_GPRTBIMAP_HS1 0xc184
0121 #define DWC3_GPRTBIMAP_FS0 0xc188
0122 #define DWC3_GPRTBIMAP_FS1 0xc18c
0123 #define DWC3_GUCTL2 0xc19c
0124
0125 #define DWC3_VER_NUMBER 0xc1a0
0126 #define DWC3_VER_TYPE 0xc1a4
0127
0128 #define DWC3_GUSB2PHYCFG(n) (0xc200 + ((n) * 0x04))
0129 #define DWC3_GUSB2I2CCTL(n) (0xc240 + ((n) * 0x04))
0130
0131 #define DWC3_GUSB2PHYACC(n) (0xc280 + ((n) * 0x04))
0132
0133 #define DWC3_GUSB3PIPECTL(n) (0xc2c0 + ((n) * 0x04))
0134
0135 #define DWC3_GTXFIFOSIZ(n) (0xc300 + ((n) * 0x04))
0136 #define DWC3_GRXFIFOSIZ(n) (0xc380 + ((n) * 0x04))
0137
0138 #define DWC3_GEVNTADRLO(n) (0xc400 + ((n) * 0x10))
0139 #define DWC3_GEVNTADRHI(n) (0xc404 + ((n) * 0x10))
0140 #define DWC3_GEVNTSIZ(n) (0xc408 + ((n) * 0x10))
0141 #define DWC3_GEVNTCOUNT(n) (0xc40c + ((n) * 0x10))
0142
0143 #define DWC3_GHWPARAMS8 0xc600
0144 #define DWC3_GUCTL3 0xc60c
0145 #define DWC3_GFLADJ 0xc630
0146 #define DWC3_GHWPARAMS9 0xc6e0
0147
0148
0149 #define DWC3_DCFG 0xc700
0150 #define DWC3_DCTL 0xc704
0151 #define DWC3_DEVTEN 0xc708
0152 #define DWC3_DSTS 0xc70c
0153 #define DWC3_DGCMDPAR 0xc710
0154 #define DWC3_DGCMD 0xc714
0155 #define DWC3_DALEPENA 0xc720
0156 #define DWC3_DCFG1 0xc740
0157
0158 #define DWC3_DEP_BASE(n) (0xc800 + ((n) * 0x10))
0159 #define DWC3_DEPCMDPAR2 0x00
0160 #define DWC3_DEPCMDPAR1 0x04
0161 #define DWC3_DEPCMDPAR0 0x08
0162 #define DWC3_DEPCMD 0x0c
0163
0164 #define DWC3_DEV_IMOD(n) (0xca00 + ((n) * 0x4))
0165
0166
0167 #define DWC3_OCFG 0xcc00
0168 #define DWC3_OCTL 0xcc04
0169 #define DWC3_OEVT 0xcc08
0170 #define DWC3_OEVTEN 0xcc0C
0171 #define DWC3_OSTS 0xcc10
0172
0173
0174
0175
0176 #define DWC3_GSBUSCFG0_INCR256BRSTENA (1 << 7)
0177 #define DWC3_GSBUSCFG0_INCR128BRSTENA (1 << 6)
0178 #define DWC3_GSBUSCFG0_INCR64BRSTENA (1 << 5)
0179 #define DWC3_GSBUSCFG0_INCR32BRSTENA (1 << 4)
0180 #define DWC3_GSBUSCFG0_INCR16BRSTENA (1 << 3)
0181 #define DWC3_GSBUSCFG0_INCR8BRSTENA (1 << 2)
0182 #define DWC3_GSBUSCFG0_INCR4BRSTENA (1 << 1)
0183 #define DWC3_GSBUSCFG0_INCRBRSTENA (1 << 0)
0184 #define DWC3_GSBUSCFG0_INCRBRST_MASK 0xff
0185
0186
0187 #define DWC3_GDBGLSPMUX_ENDBC BIT(15)
0188 #define DWC3_GDBGLSPMUX_HOSTSELECT(n) ((n) & 0x3fff)
0189 #define DWC3_GDBGLSPMUX_DEVSELECT(n) (((n) & 0xf) << 4)
0190 #define DWC3_GDBGLSPMUX_EPSELECT(n) ((n) & 0xf)
0191
0192
0193 #define DWC3_GDBGFIFOSPACE_NUM(n) ((n) & 0x1f)
0194 #define DWC3_GDBGFIFOSPACE_TYPE(n) (((n) << 5) & 0x1e0)
0195 #define DWC3_GDBGFIFOSPACE_SPACE_AVAILABLE(n) (((n) >> 16) & 0xffff)
0196
0197 #define DWC3_TXFIFO 0
0198 #define DWC3_RXFIFO 1
0199 #define DWC3_TXREQQ 2
0200 #define DWC3_RXREQQ 3
0201 #define DWC3_RXINFOQ 4
0202 #define DWC3_PSTATQ 5
0203 #define DWC3_DESCFETCHQ 6
0204 #define DWC3_EVENTQ 7
0205 #define DWC3_AUXEVENTQ 8
0206
0207
0208 #define DWC3_GRXTHRCFG_MAXRXBURSTSIZE(n) (((n) & 0x1f) << 19)
0209 #define DWC3_GRXTHRCFG_RXPKTCNT(n) (((n) & 0xf) << 24)
0210 #define DWC3_GRXTHRCFG_PKTCNTSEL BIT(29)
0211
0212
0213 #define DWC31_GRXTHRCFG_MAXRXBURSTSIZE(n) (((n) & 0x1f) << 16)
0214 #define DWC31_GRXTHRCFG_RXPKTCNT(n) (((n) & 0x1f) << 21)
0215 #define DWC31_GRXTHRCFG_PKTCNTSEL BIT(26)
0216 #define DWC31_RXTHRNUMPKTSEL_HS_PRD BIT(15)
0217 #define DWC31_RXTHRNUMPKT_HS_PRD(n) (((n) & 0x3) << 13)
0218 #define DWC31_RXTHRNUMPKTSEL_PRD BIT(10)
0219 #define DWC31_RXTHRNUMPKT_PRD(n) (((n) & 0x1f) << 5)
0220 #define DWC31_MAXRXBURSTSIZE_PRD(n) ((n) & 0x1f)
0221
0222
0223 #define DWC31_GTXTHRCFG_MAXTXBURSTSIZE(n) (((n) & 0x1f) << 16)
0224 #define DWC31_GTXTHRCFG_TXPKTCNT(n) (((n) & 0x1f) << 21)
0225 #define DWC31_GTXTHRCFG_PKTCNTSEL BIT(26)
0226 #define DWC31_TXTHRNUMPKTSEL_HS_PRD BIT(15)
0227 #define DWC31_TXTHRNUMPKT_HS_PRD(n) (((n) & 0x3) << 13)
0228 #define DWC31_TXTHRNUMPKTSEL_PRD BIT(10)
0229 #define DWC31_TXTHRNUMPKT_PRD(n) (((n) & 0x1f) << 5)
0230 #define DWC31_MAXTXBURSTSIZE_PRD(n) ((n) & 0x1f)
0231
0232
0233 #define DWC3_GCTL_PWRDNSCALE(n) ((n) << 19)
0234 #define DWC3_GCTL_PWRDNSCALE_MASK GENMASK(31, 19)
0235 #define DWC3_GCTL_U2RSTECN BIT(16)
0236 #define DWC3_GCTL_RAMCLKSEL(x) (((x) & DWC3_GCTL_CLK_MASK) << 6)
0237 #define DWC3_GCTL_CLK_BUS (0)
0238 #define DWC3_GCTL_CLK_PIPE (1)
0239 #define DWC3_GCTL_CLK_PIPEHALF (2)
0240 #define DWC3_GCTL_CLK_MASK (3)
0241
0242 #define DWC3_GCTL_PRTCAP(n) (((n) & (3 << 12)) >> 12)
0243 #define DWC3_GCTL_PRTCAPDIR(n) ((n) << 12)
0244 #define DWC3_GCTL_PRTCAP_HOST 1
0245 #define DWC3_GCTL_PRTCAP_DEVICE 2
0246 #define DWC3_GCTL_PRTCAP_OTG 3
0247
0248 #define DWC3_GCTL_CORESOFTRESET BIT(11)
0249 #define DWC3_GCTL_SOFITPSYNC BIT(10)
0250 #define DWC3_GCTL_SCALEDOWN(n) ((n) << 4)
0251 #define DWC3_GCTL_SCALEDOWN_MASK DWC3_GCTL_SCALEDOWN(3)
0252 #define DWC3_GCTL_DISSCRAMBLE BIT(3)
0253 #define DWC3_GCTL_U2EXIT_LFPS BIT(2)
0254 #define DWC3_GCTL_GBLHIBERNATIONEN BIT(1)
0255 #define DWC3_GCTL_DSBLCLKGTNG BIT(0)
0256
0257
0258 #define DWC3_GUCTL_HSTINAUTORETRY BIT(14)
0259
0260
0261 #define DWC3_GUCTL1_DEV_DECOUPLE_L1L2_EVT BIT(31)
0262 #define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS BIT(28)
0263 #define DWC3_GUCTL1_DEV_FORCE_20_CLK_FOR_30_CLK BIT(26)
0264 #define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW BIT(24)
0265 #define DWC3_GUCTL1_PARKMODE_DISABLE_SS BIT(17)
0266
0267
0268 #define DWC3_GSTS_OTG_IP BIT(10)
0269 #define DWC3_GSTS_BC_IP BIT(9)
0270 #define DWC3_GSTS_ADP_IP BIT(8)
0271 #define DWC3_GSTS_HOST_IP BIT(7)
0272 #define DWC3_GSTS_DEVICE_IP BIT(6)
0273 #define DWC3_GSTS_CSR_TIMEOUT BIT(5)
0274 #define DWC3_GSTS_BUS_ERR_ADDR_VLD BIT(4)
0275 #define DWC3_GSTS_CURMOD(n) ((n) & 0x3)
0276 #define DWC3_GSTS_CURMOD_DEVICE 0
0277 #define DWC3_GSTS_CURMOD_HOST 1
0278
0279
0280 #define DWC3_GUSB2PHYCFG_PHYSOFTRST BIT(31)
0281 #define DWC3_GUSB2PHYCFG_U2_FREECLK_EXISTS BIT(30)
0282 #define DWC3_GUSB2PHYCFG_SUSPHY BIT(6)
0283 #define DWC3_GUSB2PHYCFG_ULPI_UTMI BIT(4)
0284 #define DWC3_GUSB2PHYCFG_ENBLSLPM BIT(8)
0285 #define DWC3_GUSB2PHYCFG_PHYIF(n) (n << 3)
0286 #define DWC3_GUSB2PHYCFG_PHYIF_MASK DWC3_GUSB2PHYCFG_PHYIF(1)
0287 #define DWC3_GUSB2PHYCFG_USBTRDTIM(n) (n << 10)
0288 #define DWC3_GUSB2PHYCFG_USBTRDTIM_MASK DWC3_GUSB2PHYCFG_USBTRDTIM(0xf)
0289 #define USBTRDTIM_UTMI_8_BIT 9
0290 #define USBTRDTIM_UTMI_16_BIT 5
0291 #define UTMI_PHYIF_16_BIT 1
0292 #define UTMI_PHYIF_8_BIT 0
0293
0294
0295 #define DWC3_GUSB2PHYACC_NEWREGREQ BIT(25)
0296 #define DWC3_GUSB2PHYACC_DONE BIT(24)
0297 #define DWC3_GUSB2PHYACC_BUSY BIT(23)
0298 #define DWC3_GUSB2PHYACC_WRITE BIT(22)
0299 #define DWC3_GUSB2PHYACC_ADDR(n) (n << 16)
0300 #define DWC3_GUSB2PHYACC_EXTEND_ADDR(n) (n << 8)
0301 #define DWC3_GUSB2PHYACC_DATA(n) (n & 0xff)
0302
0303
0304 #define DWC3_GUSB3PIPECTL_PHYSOFTRST BIT(31)
0305 #define DWC3_GUSB3PIPECTL_U2SSINP3OK BIT(29)
0306 #define DWC3_GUSB3PIPECTL_DISRXDETINP3 BIT(28)
0307 #define DWC3_GUSB3PIPECTL_UX_EXIT_PX BIT(27)
0308 #define DWC3_GUSB3PIPECTL_REQP1P2P3 BIT(24)
0309 #define DWC3_GUSB3PIPECTL_DEP1P2P3(n) ((n) << 19)
0310 #define DWC3_GUSB3PIPECTL_DEP1P2P3_MASK DWC3_GUSB3PIPECTL_DEP1P2P3(7)
0311 #define DWC3_GUSB3PIPECTL_DEP1P2P3_EN DWC3_GUSB3PIPECTL_DEP1P2P3(1)
0312 #define DWC3_GUSB3PIPECTL_DEPOCHANGE BIT(18)
0313 #define DWC3_GUSB3PIPECTL_SUSPHY BIT(17)
0314 #define DWC3_GUSB3PIPECTL_LFPSFILT BIT(9)
0315 #define DWC3_GUSB3PIPECTL_RX_DETOPOLL BIT(8)
0316 #define DWC3_GUSB3PIPECTL_TX_DEEPH_MASK DWC3_GUSB3PIPECTL_TX_DEEPH(3)
0317 #define DWC3_GUSB3PIPECTL_TX_DEEPH(n) ((n) << 1)
0318
0319
0320 #define DWC31_GTXFIFOSIZ_TXFRAMNUM BIT(15)
0321 #define DWC31_GTXFIFOSIZ_TXFDEP(n) ((n) & 0x7fff)
0322 #define DWC3_GTXFIFOSIZ_TXFDEP(n) ((n) & 0xffff)
0323 #define DWC3_GTXFIFOSIZ_TXFSTADDR(n) ((n) & 0xffff0000)
0324
0325
0326 #define DWC31_GRXFIFOSIZ_RXFDEP(n) ((n) & 0x7fff)
0327 #define DWC3_GRXFIFOSIZ_RXFDEP(n) ((n) & 0xffff)
0328
0329
0330 #define DWC3_GEVNTSIZ_INTMASK BIT(31)
0331 #define DWC3_GEVNTSIZ_SIZE(n) ((n) & 0xffff)
0332
0333
0334 #define DWC3_GHWPARAMS0_MODE(n) ((n) & 0x3)
0335 #define DWC3_GHWPARAMS0_MODE_GADGET 0
0336 #define DWC3_GHWPARAMS0_MODE_HOST 1
0337 #define DWC3_GHWPARAMS0_MODE_DRD 2
0338 #define DWC3_GHWPARAMS0_MBUS_TYPE(n) (((n) >> 3) & 0x7)
0339 #define DWC3_GHWPARAMS0_SBUS_TYPE(n) (((n) >> 6) & 0x3)
0340 #define DWC3_GHWPARAMS0_MDWIDTH(n) (((n) >> 8) & 0xff)
0341 #define DWC3_GHWPARAMS0_SDWIDTH(n) (((n) >> 16) & 0xff)
0342 #define DWC3_GHWPARAMS0_AWIDTH(n) (((n) >> 24) & 0xff)
0343
0344
0345 #define DWC3_GHWPARAMS1_EN_PWROPT(n) (((n) & (3 << 24)) >> 24)
0346 #define DWC3_GHWPARAMS1_EN_PWROPT_NO 0
0347 #define DWC3_GHWPARAMS1_EN_PWROPT_CLK 1
0348 #define DWC3_GHWPARAMS1_EN_PWROPT_HIB 2
0349 #define DWC3_GHWPARAMS1_PWROPT(n) ((n) << 24)
0350 #define DWC3_GHWPARAMS1_PWROPT_MASK DWC3_GHWPARAMS1_PWROPT(3)
0351 #define DWC3_GHWPARAMS1_ENDBC BIT(31)
0352
0353
0354 #define DWC3_GHWPARAMS3_SSPHY_IFC(n) ((n) & 3)
0355 #define DWC3_GHWPARAMS3_SSPHY_IFC_DIS 0
0356 #define DWC3_GHWPARAMS3_SSPHY_IFC_GEN1 1
0357 #define DWC3_GHWPARAMS3_SSPHY_IFC_GEN2 2
0358 #define DWC3_GHWPARAMS3_HSPHY_IFC(n) (((n) & (3 << 2)) >> 2)
0359 #define DWC3_GHWPARAMS3_HSPHY_IFC_DIS 0
0360 #define DWC3_GHWPARAMS3_HSPHY_IFC_UTMI 1
0361 #define DWC3_GHWPARAMS3_HSPHY_IFC_ULPI 2
0362 #define DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI 3
0363 #define DWC3_GHWPARAMS3_FSPHY_IFC(n) (((n) & (3 << 4)) >> 4)
0364 #define DWC3_GHWPARAMS3_FSPHY_IFC_DIS 0
0365 #define DWC3_GHWPARAMS3_FSPHY_IFC_ENA 1
0366
0367
0368 #define DWC3_GHWPARAMS4_HIBER_SCRATCHBUFS(n) (((n) & (0x0f << 13)) >> 13)
0369 #define DWC3_MAX_HIBER_SCRATCHBUFS 15
0370
0371
0372 #define DWC3_GHWPARAMS6_BCSUPPORT BIT(14)
0373 #define DWC3_GHWPARAMS6_OTG3SUPPORT BIT(13)
0374 #define DWC3_GHWPARAMS6_ADPSUPPORT BIT(12)
0375 #define DWC3_GHWPARAMS6_HNPSUPPORT BIT(11)
0376 #define DWC3_GHWPARAMS6_SRPSUPPORT BIT(10)
0377 #define DWC3_GHWPARAMS6_EN_FPGA BIT(7)
0378
0379
0380 #define DWC3_GHWPARAMS6_MDWIDTH(n) ((n) & (0x3 << 8))
0381
0382
0383 #define DWC3_GHWPARAMS7_RAM1_DEPTH(n) ((n) & 0xffff)
0384 #define DWC3_GHWPARAMS7_RAM2_DEPTH(n) (((n) >> 16) & 0xffff)
0385
0386
0387 #define DWC3_GHWPARAMS9_DEV_TXF_FLUSH_BYPASS BIT(0)
0388 #define DWC3_GHWPARAMS9_DEV_MST BIT(1)
0389
0390
0391 #define DWC3_GFLADJ_30MHZ_SDBND_SEL BIT(7)
0392 #define DWC3_GFLADJ_30MHZ_MASK 0x3f
0393 #define DWC3_GFLADJ_REFCLK_FLADJ_MASK GENMASK(21, 8)
0394 #define DWC3_GFLADJ_240MHZDECR GENMASK(30, 24)
0395 #define DWC3_GFLADJ_240MHZDECR_PLS1 BIT(31)
0396
0397
0398 #define DWC3_GUCTL_REFCLKPER_MASK 0xffc00000
0399 #define DWC3_GUCTL_REFCLKPER_SEL 22
0400
0401
0402 #define DWC3_GUCTL2_RST_ACTBITLATER BIT(14)
0403
0404
0405 #define DWC3_GUCTL3_SPLITDISABLE BIT(14)
0406
0407
0408 #define DWC3_DCFG_NUMLANES(n) (((n) & 0x3) << 30)
0409
0410 #define DWC3_DCFG_DEVADDR(addr) ((addr) << 3)
0411 #define DWC3_DCFG_DEVADDR_MASK DWC3_DCFG_DEVADDR(0x7f)
0412
0413 #define DWC3_DCFG_SPEED_MASK (7 << 0)
0414 #define DWC3_DCFG_SUPERSPEED_PLUS (5 << 0)
0415 #define DWC3_DCFG_SUPERSPEED (4 << 0)
0416 #define DWC3_DCFG_HIGHSPEED (0 << 0)
0417 #define DWC3_DCFG_FULLSPEED BIT(0)
0418
0419 #define DWC3_DCFG_NUMP_SHIFT 17
0420 #define DWC3_DCFG_NUMP(n) (((n) >> DWC3_DCFG_NUMP_SHIFT) & 0x1f)
0421 #define DWC3_DCFG_NUMP_MASK (0x1f << DWC3_DCFG_NUMP_SHIFT)
0422 #define DWC3_DCFG_LPM_CAP BIT(22)
0423 #define DWC3_DCFG_IGNSTRMPP BIT(23)
0424
0425
0426 #define DWC3_DCTL_RUN_STOP BIT(31)
0427 #define DWC3_DCTL_CSFTRST BIT(30)
0428 #define DWC3_DCTL_LSFTRST BIT(29)
0429
0430 #define DWC3_DCTL_HIRD_THRES_MASK (0x1f << 24)
0431 #define DWC3_DCTL_HIRD_THRES(n) ((n) << 24)
0432
0433 #define DWC3_DCTL_APPL1RES BIT(23)
0434
0435
0436 #define DWC3_DCTL_TRGTULST_MASK (0x0f << 17)
0437 #define DWC3_DCTL_TRGTULST(n) ((n) << 17)
0438 #define DWC3_DCTL_TRGTULST_U2 (DWC3_DCTL_TRGTULST(2))
0439 #define DWC3_DCTL_TRGTULST_U3 (DWC3_DCTL_TRGTULST(3))
0440 #define DWC3_DCTL_TRGTULST_SS_DIS (DWC3_DCTL_TRGTULST(4))
0441 #define DWC3_DCTL_TRGTULST_RX_DET (DWC3_DCTL_TRGTULST(5))
0442 #define DWC3_DCTL_TRGTULST_SS_INACT (DWC3_DCTL_TRGTULST(6))
0443
0444
0445 #define DWC3_DCTL_NYET_THRES(n) (((n) & 0xf) << 20)
0446
0447 #define DWC3_DCTL_KEEP_CONNECT BIT(19)
0448 #define DWC3_DCTL_L1_HIBER_EN BIT(18)
0449 #define DWC3_DCTL_CRS BIT(17)
0450 #define DWC3_DCTL_CSS BIT(16)
0451
0452 #define DWC3_DCTL_INITU2ENA BIT(12)
0453 #define DWC3_DCTL_ACCEPTU2ENA BIT(11)
0454 #define DWC3_DCTL_INITU1ENA BIT(10)
0455 #define DWC3_DCTL_ACCEPTU1ENA BIT(9)
0456 #define DWC3_DCTL_TSTCTRL_MASK (0xf << 1)
0457
0458 #define DWC3_DCTL_ULSTCHNGREQ_MASK (0x0f << 5)
0459 #define DWC3_DCTL_ULSTCHNGREQ(n) (((n) << 5) & DWC3_DCTL_ULSTCHNGREQ_MASK)
0460
0461 #define DWC3_DCTL_ULSTCHNG_NO_ACTION (DWC3_DCTL_ULSTCHNGREQ(0))
0462 #define DWC3_DCTL_ULSTCHNG_SS_DISABLED (DWC3_DCTL_ULSTCHNGREQ(4))
0463 #define DWC3_DCTL_ULSTCHNG_RX_DETECT (DWC3_DCTL_ULSTCHNGREQ(5))
0464 #define DWC3_DCTL_ULSTCHNG_SS_INACTIVE (DWC3_DCTL_ULSTCHNGREQ(6))
0465 #define DWC3_DCTL_ULSTCHNG_RECOVERY (DWC3_DCTL_ULSTCHNGREQ(8))
0466 #define DWC3_DCTL_ULSTCHNG_COMPLIANCE (DWC3_DCTL_ULSTCHNGREQ(10))
0467 #define DWC3_DCTL_ULSTCHNG_LOOPBACK (DWC3_DCTL_ULSTCHNGREQ(11))
0468
0469
0470 #define DWC3_DEVTEN_VNDRDEVTSTRCVEDEN BIT(12)
0471 #define DWC3_DEVTEN_EVNTOVERFLOWEN BIT(11)
0472 #define DWC3_DEVTEN_CMDCMPLTEN BIT(10)
0473 #define DWC3_DEVTEN_ERRTICERREN BIT(9)
0474 #define DWC3_DEVTEN_SOFEN BIT(7)
0475 #define DWC3_DEVTEN_U3L2L1SUSPEN BIT(6)
0476 #define DWC3_DEVTEN_HIBERNATIONREQEVTEN BIT(5)
0477 #define DWC3_DEVTEN_WKUPEVTEN BIT(4)
0478 #define DWC3_DEVTEN_ULSTCNGEN BIT(3)
0479 #define DWC3_DEVTEN_CONNECTDONEEN BIT(2)
0480 #define DWC3_DEVTEN_USBRSTEN BIT(1)
0481 #define DWC3_DEVTEN_DISCONNEVTEN BIT(0)
0482
0483 #define DWC3_DSTS_CONNLANES(n) (((n) >> 30) & 0x3)
0484
0485
0486 #define DWC3_DSTS_DCNRD BIT(29)
0487
0488
0489 #define DWC3_DSTS_PWRUPREQ BIT(24)
0490
0491
0492 #define DWC3_DSTS_RSS BIT(25)
0493 #define DWC3_DSTS_SSS BIT(24)
0494
0495 #define DWC3_DSTS_COREIDLE BIT(23)
0496 #define DWC3_DSTS_DEVCTRLHLT BIT(22)
0497
0498 #define DWC3_DSTS_USBLNKST_MASK (0x0f << 18)
0499 #define DWC3_DSTS_USBLNKST(n) (((n) & DWC3_DSTS_USBLNKST_MASK) >> 18)
0500
0501 #define DWC3_DSTS_RXFIFOEMPTY BIT(17)
0502
0503 #define DWC3_DSTS_SOFFN_MASK (0x3fff << 3)
0504 #define DWC3_DSTS_SOFFN(n) (((n) & DWC3_DSTS_SOFFN_MASK) >> 3)
0505
0506 #define DWC3_DSTS_CONNECTSPD (7 << 0)
0507
0508 #define DWC3_DSTS_SUPERSPEED_PLUS (5 << 0)
0509 #define DWC3_DSTS_SUPERSPEED (4 << 0)
0510 #define DWC3_DSTS_HIGHSPEED (0 << 0)
0511 #define DWC3_DSTS_FULLSPEED BIT(0)
0512
0513
0514 #define DWC3_DGCMD_SET_LMP 0x01
0515 #define DWC3_DGCMD_SET_PERIODIC_PAR 0x02
0516 #define DWC3_DGCMD_XMIT_FUNCTION 0x03
0517
0518
0519 #define DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO 0x04
0520 #define DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI 0x05
0521
0522 #define DWC3_DGCMD_SELECTED_FIFO_FLUSH 0x09
0523 #define DWC3_DGCMD_ALL_FIFO_FLUSH 0x0a
0524 #define DWC3_DGCMD_SET_ENDPOINT_NRDY 0x0c
0525 #define DWC3_DGCMD_SET_ENDPOINT_PRIME 0x0d
0526 #define DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK 0x10
0527
0528 #define DWC3_DGCMD_STATUS(n) (((n) >> 12) & 0x0F)
0529 #define DWC3_DGCMD_CMDACT BIT(10)
0530 #define DWC3_DGCMD_CMDIOC BIT(8)
0531
0532
0533 #define DWC3_DGCMDPAR_FORCE_LINKPM_ACCEPT BIT(0)
0534 #define DWC3_DGCMDPAR_FIFO_NUM(n) ((n) << 0)
0535 #define DWC3_DGCMDPAR_RX_FIFO (0 << 5)
0536 #define DWC3_DGCMDPAR_TX_FIFO BIT(5)
0537 #define DWC3_DGCMDPAR_LOOPBACK_DIS (0 << 0)
0538 #define DWC3_DGCMDPAR_LOOPBACK_ENA BIT(0)
0539
0540
0541 #define DWC3_DEPCMD_PARAM_SHIFT 16
0542 #define DWC3_DEPCMD_PARAM(x) ((x) << DWC3_DEPCMD_PARAM_SHIFT)
0543 #define DWC3_DEPCMD_GET_RSC_IDX(x) (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f)
0544 #define DWC3_DEPCMD_STATUS(x) (((x) >> 12) & 0x0F)
0545 #define DWC3_DEPCMD_HIPRI_FORCERM BIT(11)
0546 #define DWC3_DEPCMD_CLEARPENDIN BIT(11)
0547 #define DWC3_DEPCMD_CMDACT BIT(10)
0548 #define DWC3_DEPCMD_CMDIOC BIT(8)
0549
0550 #define DWC3_DEPCMD_DEPSTARTCFG (0x09 << 0)
0551 #define DWC3_DEPCMD_ENDTRANSFER (0x08 << 0)
0552 #define DWC3_DEPCMD_UPDATETRANSFER (0x07 << 0)
0553 #define DWC3_DEPCMD_STARTTRANSFER (0x06 << 0)
0554 #define DWC3_DEPCMD_CLEARSTALL (0x05 << 0)
0555 #define DWC3_DEPCMD_SETSTALL (0x04 << 0)
0556
0557 #define DWC3_DEPCMD_GETSEQNUMBER (0x03 << 0)
0558
0559 #define DWC3_DEPCMD_GETEPSTATE (0x03 << 0)
0560 #define DWC3_DEPCMD_SETTRANSFRESOURCE (0x02 << 0)
0561 #define DWC3_DEPCMD_SETEPCONFIG (0x01 << 0)
0562
0563 #define DWC3_DEPCMD_CMD(x) ((x) & 0xf)
0564
0565
0566 #define DWC3_DALEPENA_EP(n) BIT(n)
0567
0568
0569 #define DWC3_DCFG1_DIS_MST_ENH BIT(1)
0570
0571 #define DWC3_DEPCMD_TYPE_CONTROL 0
0572 #define DWC3_DEPCMD_TYPE_ISOC 1
0573 #define DWC3_DEPCMD_TYPE_BULK 2
0574 #define DWC3_DEPCMD_TYPE_INTR 3
0575
0576 #define DWC3_DEV_IMOD_COUNT_SHIFT 16
0577 #define DWC3_DEV_IMOD_COUNT_MASK (0xffff << 16)
0578 #define DWC3_DEV_IMOD_INTERVAL_SHIFT 0
0579 #define DWC3_DEV_IMOD_INTERVAL_MASK (0xffff << 0)
0580
0581
0582 #define DWC3_OCFG_DISPWRCUTTOFF BIT(5)
0583 #define DWC3_OCFG_HIBDISMASK BIT(4)
0584 #define DWC3_OCFG_SFTRSTMASK BIT(3)
0585 #define DWC3_OCFG_OTGVERSION BIT(2)
0586 #define DWC3_OCFG_HNPCAP BIT(1)
0587 #define DWC3_OCFG_SRPCAP BIT(0)
0588
0589
0590 #define DWC3_OCTL_OTG3GOERR BIT(7)
0591 #define DWC3_OCTL_PERIMODE BIT(6)
0592 #define DWC3_OCTL_PRTPWRCTL BIT(5)
0593 #define DWC3_OCTL_HNPREQ BIT(4)
0594 #define DWC3_OCTL_SESREQ BIT(3)
0595 #define DWC3_OCTL_TERMSELIDPULSE BIT(2)
0596 #define DWC3_OCTL_DEVSETHNPEN BIT(1)
0597 #define DWC3_OCTL_HSTSETHNPEN BIT(0)
0598
0599
0600 #define DWC3_OEVT_DEVICEMODE BIT(31)
0601 #define DWC3_OEVT_XHCIRUNSTPSET BIT(27)
0602 #define DWC3_OEVT_DEVRUNSTPSET BIT(26)
0603 #define DWC3_OEVT_HIBENTRY BIT(25)
0604 #define DWC3_OEVT_CONIDSTSCHNG BIT(24)
0605 #define DWC3_OEVT_HRRCONFNOTIF BIT(23)
0606 #define DWC3_OEVT_HRRINITNOTIF BIT(22)
0607 #define DWC3_OEVT_ADEVIDLE BIT(21)
0608 #define DWC3_OEVT_ADEVBHOSTEND BIT(20)
0609 #define DWC3_OEVT_ADEVHOST BIT(19)
0610 #define DWC3_OEVT_ADEVHNPCHNG BIT(18)
0611 #define DWC3_OEVT_ADEVSRPDET BIT(17)
0612 #define DWC3_OEVT_ADEVSESSENDDET BIT(16)
0613 #define DWC3_OEVT_BDEVBHOSTEND BIT(11)
0614 #define DWC3_OEVT_BDEVHNPCHNG BIT(10)
0615 #define DWC3_OEVT_BDEVSESSVLDDET BIT(9)
0616 #define DWC3_OEVT_BDEVVBUSCHNG BIT(8)
0617 #define DWC3_OEVT_BSESSVLD BIT(3)
0618 #define DWC3_OEVT_HSTNEGSTS BIT(2)
0619 #define DWC3_OEVT_SESREQSTS BIT(1)
0620 #define DWC3_OEVT_ERROR BIT(0)
0621
0622
0623 #define DWC3_OEVTEN_XHCIRUNSTPSETEN BIT(27)
0624 #define DWC3_OEVTEN_DEVRUNSTPSETEN BIT(26)
0625 #define DWC3_OEVTEN_HIBENTRYEN BIT(25)
0626 #define DWC3_OEVTEN_CONIDSTSCHNGEN BIT(24)
0627 #define DWC3_OEVTEN_HRRCONFNOTIFEN BIT(23)
0628 #define DWC3_OEVTEN_HRRINITNOTIFEN BIT(22)
0629 #define DWC3_OEVTEN_ADEVIDLEEN BIT(21)
0630 #define DWC3_OEVTEN_ADEVBHOSTENDEN BIT(20)
0631 #define DWC3_OEVTEN_ADEVHOSTEN BIT(19)
0632 #define DWC3_OEVTEN_ADEVHNPCHNGEN BIT(18)
0633 #define DWC3_OEVTEN_ADEVSRPDETEN BIT(17)
0634 #define DWC3_OEVTEN_ADEVSESSENDDETEN BIT(16)
0635 #define DWC3_OEVTEN_BDEVBHOSTENDEN BIT(11)
0636 #define DWC3_OEVTEN_BDEVHNPCHNGEN BIT(10)
0637 #define DWC3_OEVTEN_BDEVSESSVLDDETEN BIT(9)
0638 #define DWC3_OEVTEN_BDEVVBUSCHNGEN BIT(8)
0639
0640
0641 #define DWC3_OSTS_DEVRUNSTP BIT(13)
0642 #define DWC3_OSTS_XHCIRUNSTP BIT(12)
0643 #define DWC3_OSTS_PERIPHERALSTATE BIT(4)
0644 #define DWC3_OSTS_XHCIPRTPOWER BIT(3)
0645 #define DWC3_OSTS_BSESVLD BIT(2)
0646 #define DWC3_OSTS_VBUSVLD BIT(1)
0647 #define DWC3_OSTS_CONIDSTS BIT(0)
0648
0649
0650
0651 struct dwc3_trb;
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664 struct dwc3_event_buffer {
0665 void *buf;
0666 void *cache;
0667 unsigned int length;
0668 unsigned int lpos;
0669 unsigned int count;
0670 unsigned int flags;
0671
0672 #define DWC3_EVENT_PENDING BIT(0)
0673
0674 dma_addr_t dma;
0675
0676 struct dwc3 *dwc;
0677 };
0678
0679 #define DWC3_EP_FLAG_STALLED BIT(0)
0680 #define DWC3_EP_FLAG_WEDGED BIT(1)
0681
0682 #define DWC3_EP_DIRECTION_TX true
0683 #define DWC3_EP_DIRECTION_RX false
0684
0685 #define DWC3_TRB_NUM 256
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714 struct dwc3_ep {
0715 struct usb_ep endpoint;
0716 struct list_head cancelled_list;
0717 struct list_head pending_list;
0718 struct list_head started_list;
0719
0720 void __iomem *regs;
0721
0722 struct dwc3_trb *trb_pool;
0723 dma_addr_t trb_pool_dma;
0724 struct dwc3 *dwc;
0725
0726 u32 saved_state;
0727 unsigned int flags;
0728 #define DWC3_EP_ENABLED BIT(0)
0729 #define DWC3_EP_STALL BIT(1)
0730 #define DWC3_EP_WEDGE BIT(2)
0731 #define DWC3_EP_TRANSFER_STARTED BIT(3)
0732 #define DWC3_EP_END_TRANSFER_PENDING BIT(4)
0733 #define DWC3_EP_PENDING_REQUEST BIT(5)
0734 #define DWC3_EP_DELAY_START BIT(6)
0735 #define DWC3_EP_WAIT_TRANSFER_COMPLETE BIT(7)
0736 #define DWC3_EP_IGNORE_NEXT_NOSTREAM BIT(8)
0737 #define DWC3_EP_FORCE_RESTART_STREAM BIT(9)
0738 #define DWC3_EP_FIRST_STREAM_PRIMED BIT(10)
0739 #define DWC3_EP_PENDING_CLEAR_STALL BIT(11)
0740 #define DWC3_EP_TXFIFO_RESIZED BIT(12)
0741 #define DWC3_EP_DELAY_STOP BIT(13)
0742
0743
0744 #define DWC3_EP0_DIR_IN BIT(31)
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755 u8 trb_enqueue;
0756 u8 trb_dequeue;
0757
0758 u8 number;
0759 u8 type;
0760 u8 resource_index;
0761 u32 frame_number;
0762 u32 interval;
0763
0764 char name[20];
0765
0766 unsigned direction:1;
0767 unsigned stream_capable:1;
0768
0769
0770 u8 combo_num;
0771 int start_cmd_status;
0772 };
0773
0774 enum dwc3_phy {
0775 DWC3_PHY_UNKNOWN = 0,
0776 DWC3_PHY_USB3,
0777 DWC3_PHY_USB2,
0778 };
0779
0780 enum dwc3_ep0_next {
0781 DWC3_EP0_UNKNOWN = 0,
0782 DWC3_EP0_COMPLETE,
0783 DWC3_EP0_NRDY_DATA,
0784 DWC3_EP0_NRDY_STATUS,
0785 };
0786
0787 enum dwc3_ep0_state {
0788 EP0_UNCONNECTED = 0,
0789 EP0_SETUP_PHASE,
0790 EP0_DATA_PHASE,
0791 EP0_STATUS_PHASE,
0792 };
0793
0794 enum dwc3_link_state {
0795
0796 DWC3_LINK_STATE_U0 = 0x00,
0797 DWC3_LINK_STATE_U1 = 0x01,
0798 DWC3_LINK_STATE_U2 = 0x02,
0799 DWC3_LINK_STATE_U3 = 0x03,
0800 DWC3_LINK_STATE_SS_DIS = 0x04,
0801 DWC3_LINK_STATE_RX_DET = 0x05,
0802 DWC3_LINK_STATE_SS_INACT = 0x06,
0803 DWC3_LINK_STATE_POLL = 0x07,
0804 DWC3_LINK_STATE_RECOV = 0x08,
0805 DWC3_LINK_STATE_HRESET = 0x09,
0806 DWC3_LINK_STATE_CMPLY = 0x0a,
0807 DWC3_LINK_STATE_LPBK = 0x0b,
0808 DWC3_LINK_STATE_RESET = 0x0e,
0809 DWC3_LINK_STATE_RESUME = 0x0f,
0810 DWC3_LINK_STATE_MASK = 0x0f,
0811 };
0812
0813
0814 #define DWC3_TRB_SIZE_MASK (0x00ffffff)
0815 #define DWC3_TRB_SIZE_LENGTH(n) ((n) & DWC3_TRB_SIZE_MASK)
0816 #define DWC3_TRB_SIZE_PCM1(n) (((n) & 0x03) << 24)
0817 #define DWC3_TRB_SIZE_TRBSTS(n) (((n) & (0x0f << 28)) >> 28)
0818
0819 #define DWC3_TRBSTS_OK 0
0820 #define DWC3_TRBSTS_MISSED_ISOC 1
0821 #define DWC3_TRBSTS_SETUP_PENDING 2
0822 #define DWC3_TRB_STS_XFER_IN_PROG 4
0823
0824
0825 #define DWC3_TRB_CTRL_HWO BIT(0)
0826 #define DWC3_TRB_CTRL_LST BIT(1)
0827 #define DWC3_TRB_CTRL_CHN BIT(2)
0828 #define DWC3_TRB_CTRL_CSP BIT(3)
0829 #define DWC3_TRB_CTRL_TRBCTL(n) (((n) & 0x3f) << 4)
0830 #define DWC3_TRB_CTRL_ISP_IMI BIT(10)
0831 #define DWC3_TRB_CTRL_IOC BIT(11)
0832 #define DWC3_TRB_CTRL_SID_SOFN(n) (((n) & 0xffff) << 14)
0833 #define DWC3_TRB_CTRL_GET_SID_SOFN(n) (((n) & (0xffff << 14)) >> 14)
0834
0835 #define DWC3_TRBCTL_TYPE(n) ((n) & (0x3f << 4))
0836 #define DWC3_TRBCTL_NORMAL DWC3_TRB_CTRL_TRBCTL(1)
0837 #define DWC3_TRBCTL_CONTROL_SETUP DWC3_TRB_CTRL_TRBCTL(2)
0838 #define DWC3_TRBCTL_CONTROL_STATUS2 DWC3_TRB_CTRL_TRBCTL(3)
0839 #define DWC3_TRBCTL_CONTROL_STATUS3 DWC3_TRB_CTRL_TRBCTL(4)
0840 #define DWC3_TRBCTL_CONTROL_DATA DWC3_TRB_CTRL_TRBCTL(5)
0841 #define DWC3_TRBCTL_ISOCHRONOUS_FIRST DWC3_TRB_CTRL_TRBCTL(6)
0842 #define DWC3_TRBCTL_ISOCHRONOUS DWC3_TRB_CTRL_TRBCTL(7)
0843 #define DWC3_TRBCTL_LINK_TRB DWC3_TRB_CTRL_TRBCTL(8)
0844
0845
0846
0847
0848
0849
0850
0851
0852 struct dwc3_trb {
0853 u32 bpl;
0854 u32 bph;
0855 u32 size;
0856 u32 ctrl;
0857 } __packed;
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872 struct dwc3_hwparams {
0873 u32 hwparams0;
0874 u32 hwparams1;
0875 u32 hwparams2;
0876 u32 hwparams3;
0877 u32 hwparams4;
0878 u32 hwparams5;
0879 u32 hwparams6;
0880 u32 hwparams7;
0881 u32 hwparams8;
0882 u32 hwparams9;
0883 };
0884
0885
0886 #define DWC3_MODE(n) ((n) & 0x7)
0887
0888
0889 #define DWC3_NUM_INT(n) (((n) & (0x3f << 15)) >> 15)
0890
0891
0892 #define DWC3_NUM_IN_EPS_MASK (0x1f << 18)
0893 #define DWC3_NUM_EPS_MASK (0x3f << 12)
0894 #define DWC3_NUM_EPS(p) (((p)->hwparams3 & \
0895 (DWC3_NUM_EPS_MASK)) >> 12)
0896 #define DWC3_NUM_IN_EPS(p) (((p)->hwparams3 & \
0897 (DWC3_NUM_IN_EPS_MASK)) >> 18)
0898
0899
0900 #define DWC3_RAM1_DEPTH(n) ((n) & 0xffff)
0901
0902
0903 #define DWC3_MST_CAPABLE(p) (!!((p)->hwparams9 & \
0904 DWC3_GHWPARAMS9_DEV_MST))
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926 struct dwc3_request {
0927 struct usb_request request;
0928 struct list_head list;
0929 struct dwc3_ep *dep;
0930 struct scatterlist *sg;
0931 struct scatterlist *start_sg;
0932
0933 unsigned int num_pending_sgs;
0934 unsigned int num_queued_sgs;
0935 unsigned int remaining;
0936
0937 unsigned int status;
0938 #define DWC3_REQUEST_STATUS_QUEUED 0
0939 #define DWC3_REQUEST_STATUS_STARTED 1
0940 #define DWC3_REQUEST_STATUS_DISCONNECTED 2
0941 #define DWC3_REQUEST_STATUS_DEQUEUED 3
0942 #define DWC3_REQUEST_STATUS_STALLED 4
0943 #define DWC3_REQUEST_STATUS_COMPLETED 5
0944 #define DWC3_REQUEST_STATUS_UNKNOWN -1
0945
0946 u8 epnum;
0947 struct dwc3_trb *trb;
0948 dma_addr_t trb_dma;
0949
0950 unsigned int num_trbs;
0951
0952 unsigned int needs_extra_trb:1;
0953 unsigned int direction:1;
0954 unsigned int mapped:1;
0955 };
0956
0957
0958
0959
0960
0961 struct dwc3_scratchpad_array {
0962 __le64 dma_adr[DWC3_MAX_HIBER_SCRATCHBUFS];
0963 };
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117 struct dwc3 {
1118 struct work_struct drd_work;
1119 struct dwc3_trb *ep0_trb;
1120 void *bounce;
1121 void *scratchbuf;
1122 u8 *setup_buf;
1123 dma_addr_t ep0_trb_addr;
1124 dma_addr_t bounce_addr;
1125 dma_addr_t scratch_addr;
1126 struct dwc3_request ep0_usb_req;
1127 struct completion ep0_in_setup;
1128
1129
1130 spinlock_t lock;
1131
1132
1133 struct mutex mutex;
1134
1135 struct device *dev;
1136 struct device *sysdev;
1137
1138 struct platform_device *xhci;
1139 struct resource xhci_resources[DWC3_XHCI_RESOURCES_NUM];
1140
1141 struct dwc3_event_buffer *ev_buf;
1142 struct dwc3_ep *eps[DWC3_ENDPOINTS_NUM];
1143
1144 struct usb_gadget *gadget;
1145 struct usb_gadget_driver *gadget_driver;
1146
1147 struct clk *bus_clk;
1148 struct clk *ref_clk;
1149 struct clk *susp_clk;
1150
1151 struct reset_control *reset;
1152
1153 struct usb_phy *usb2_phy;
1154 struct usb_phy *usb3_phy;
1155
1156 struct phy *usb2_generic_phy;
1157 struct phy *usb3_generic_phy;
1158
1159 bool phys_ready;
1160
1161 struct ulpi *ulpi;
1162 bool ulpi_ready;
1163
1164 void __iomem *regs;
1165 size_t regs_size;
1166
1167 enum usb_dr_mode dr_mode;
1168 u32 current_dr_role;
1169 u32 desired_dr_role;
1170 struct extcon_dev *edev;
1171 struct notifier_block edev_nb;
1172 enum usb_phy_interface hsphy_mode;
1173 struct usb_role_switch *role_sw;
1174 enum usb_dr_mode role_switch_default_mode;
1175
1176 struct power_supply *usb_psy;
1177
1178 u32 fladj;
1179 u32 ref_clk_per;
1180 u32 irq_gadget;
1181 u32 otg_irq;
1182 u32 current_otg_role;
1183 u32 desired_otg_role;
1184 bool otg_restart_host;
1185 u32 nr_scratch;
1186 u32 u1u2;
1187 u32 maximum_speed;
1188 u32 gadget_max_speed;
1189 enum usb_ssp_rate max_ssp_rate;
1190 enum usb_ssp_rate gadget_ssp_rate;
1191
1192 u32 ip;
1193
1194 #define DWC3_IP 0x5533
1195 #define DWC31_IP 0x3331
1196 #define DWC32_IP 0x3332
1197
1198 u32 revision;
1199
1200 #define DWC3_REVISION_ANY 0x0
1201 #define DWC3_REVISION_173A 0x5533173a
1202 #define DWC3_REVISION_175A 0x5533175a
1203 #define DWC3_REVISION_180A 0x5533180a
1204 #define DWC3_REVISION_183A 0x5533183a
1205 #define DWC3_REVISION_185A 0x5533185a
1206 #define DWC3_REVISION_187A 0x5533187a
1207 #define DWC3_REVISION_188A 0x5533188a
1208 #define DWC3_REVISION_190A 0x5533190a
1209 #define DWC3_REVISION_194A 0x5533194a
1210 #define DWC3_REVISION_200A 0x5533200a
1211 #define DWC3_REVISION_202A 0x5533202a
1212 #define DWC3_REVISION_210A 0x5533210a
1213 #define DWC3_REVISION_220A 0x5533220a
1214 #define DWC3_REVISION_230A 0x5533230a
1215 #define DWC3_REVISION_240A 0x5533240a
1216 #define DWC3_REVISION_250A 0x5533250a
1217 #define DWC3_REVISION_260A 0x5533260a
1218 #define DWC3_REVISION_270A 0x5533270a
1219 #define DWC3_REVISION_280A 0x5533280a
1220 #define DWC3_REVISION_290A 0x5533290a
1221 #define DWC3_REVISION_300A 0x5533300a
1222 #define DWC3_REVISION_310A 0x5533310a
1223 #define DWC3_REVISION_330A 0x5533330a
1224
1225 #define DWC31_REVISION_ANY 0x0
1226 #define DWC31_REVISION_110A 0x3131302a
1227 #define DWC31_REVISION_120A 0x3132302a
1228 #define DWC31_REVISION_160A 0x3136302a
1229 #define DWC31_REVISION_170A 0x3137302a
1230 #define DWC31_REVISION_180A 0x3138302a
1231 #define DWC31_REVISION_190A 0x3139302a
1232
1233 #define DWC32_REVISION_ANY 0x0
1234 #define DWC32_REVISION_100A 0x3130302a
1235
1236 u32 version_type;
1237
1238 #define DWC31_VERSIONTYPE_ANY 0x0
1239 #define DWC31_VERSIONTYPE_EA01 0x65613031
1240 #define DWC31_VERSIONTYPE_EA02 0x65613032
1241 #define DWC31_VERSIONTYPE_EA03 0x65613033
1242 #define DWC31_VERSIONTYPE_EA04 0x65613034
1243 #define DWC31_VERSIONTYPE_EA05 0x65613035
1244 #define DWC31_VERSIONTYPE_EA06 0x65613036
1245
1246 enum dwc3_ep0_next ep0_next_event;
1247 enum dwc3_ep0_state ep0state;
1248 enum dwc3_link_state link_state;
1249
1250 u16 u2sel;
1251 u16 u2pel;
1252 u8 u1sel;
1253 u8 u1pel;
1254
1255 u8 speed;
1256
1257 u8 num_eps;
1258
1259 struct dwc3_hwparams hwparams;
1260 struct debugfs_regset32 *regset;
1261
1262 u32 dbg_lsp_select;
1263
1264 u8 test_mode;
1265 u8 test_mode_nr;
1266 u8 lpm_nyet_threshold;
1267 u8 hird_threshold;
1268 u8 rx_thr_num_pkt_prd;
1269 u8 rx_max_burst_prd;
1270 u8 tx_thr_num_pkt_prd;
1271 u8 tx_max_burst_prd;
1272 u8 tx_fifo_resize_max_num;
1273 u8 clear_stall_protocol;
1274
1275 const char *hsphy_interface;
1276
1277 unsigned connected:1;
1278 unsigned softconnect:1;
1279 unsigned delayed_status:1;
1280 unsigned ep0_bounced:1;
1281 unsigned ep0_expect_in:1;
1282 unsigned has_hibernation:1;
1283 unsigned sysdev_is_parent:1;
1284 unsigned has_lpm_erratum:1;
1285 unsigned is_utmi_l1_suspend:1;
1286 unsigned is_fpga:1;
1287 unsigned pending_events:1;
1288 unsigned do_fifo_resize:1;
1289 unsigned pullups_connected:1;
1290 unsigned setup_packet_pending:1;
1291 unsigned three_stage_setup:1;
1292 unsigned dis_start_transfer_quirk:1;
1293 unsigned usb3_lpm_capable:1;
1294 unsigned usb2_lpm_disable:1;
1295 unsigned usb2_gadget_lpm_disable:1;
1296
1297 unsigned disable_scramble_quirk:1;
1298 unsigned u2exit_lfps_quirk:1;
1299 unsigned u2ss_inp3_quirk:1;
1300 unsigned req_p1p2p3_quirk:1;
1301 unsigned del_p1p2p3_quirk:1;
1302 unsigned del_phy_power_chg_quirk:1;
1303 unsigned lfps_filter_quirk:1;
1304 unsigned rx_detect_poll_quirk:1;
1305 unsigned dis_u3_susphy_quirk:1;
1306 unsigned dis_u2_susphy_quirk:1;
1307 unsigned dis_enblslpm_quirk:1;
1308 unsigned dis_u1_entry_quirk:1;
1309 unsigned dis_u2_entry_quirk:1;
1310 unsigned dis_rxdet_inp3_quirk:1;
1311 unsigned dis_u2_freeclk_exists_quirk:1;
1312 unsigned dis_del_phy_power_chg_quirk:1;
1313 unsigned dis_tx_ipgap_linecheck_quirk:1;
1314 unsigned parkmode_disable_ss_quirk:1;
1315
1316 unsigned tx_de_emphasis_quirk:1;
1317 unsigned tx_de_emphasis:2;
1318
1319 unsigned dis_metastability_quirk:1;
1320
1321 unsigned dis_split_quirk:1;
1322 unsigned async_callbacks:1;
1323
1324 u16 imod_interval;
1325
1326 int max_cfg_eps;
1327 int last_fifo_depth;
1328 int num_ep_resized;
1329 };
1330
1331 #define INCRX_BURST_MODE 0
1332 #define INCRX_UNDEF_LENGTH_BURST_MODE 1
1333
1334 #define work_to_dwc(w) (container_of((w), struct dwc3, drd_work))
1335
1336
1337
1338 struct dwc3_event_type {
1339 u32 is_devspec:1;
1340 u32 type:7;
1341 u32 reserved8_31:24;
1342 } __packed;
1343
1344 #define DWC3_DEPEVT_XFERCOMPLETE 0x01
1345 #define DWC3_DEPEVT_XFERINPROGRESS 0x02
1346 #define DWC3_DEPEVT_XFERNOTREADY 0x03
1347 #define DWC3_DEPEVT_RXTXFIFOEVT 0x04
1348 #define DWC3_DEPEVT_STREAMEVT 0x06
1349 #define DWC3_DEPEVT_EPCMDCMPLT 0x07
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370 struct dwc3_event_depevt {
1371 u32 one_bit:1;
1372 u32 endpoint_number:5;
1373 u32 endpoint_event:4;
1374 u32 reserved11_10:2;
1375 u32 status:4;
1376
1377
1378 #define DEPEVT_STATUS_TRANSFER_ACTIVE BIT(3)
1379
1380
1381 #define DEPEVT_STATUS_BUSERR BIT(0)
1382 #define DEPEVT_STATUS_SHORT BIT(1)
1383 #define DEPEVT_STATUS_IOC BIT(2)
1384 #define DEPEVT_STATUS_LST BIT(3)
1385 #define DEPEVT_STATUS_MISSED_ISOC BIT(3)
1386
1387
1388 #define DEPEVT_STREAMEVT_FOUND 1
1389 #define DEPEVT_STREAMEVT_NOTFOUND 2
1390
1391
1392 #define DEPEVT_STREAM_PRIME 0xfffe
1393 #define DEPEVT_STREAM_NOSTREAM 0x0
1394
1395
1396 #define DEPEVT_STATUS_CONTROL_DATA 1
1397 #define DEPEVT_STATUS_CONTROL_STATUS 2
1398 #define DEPEVT_STATUS_CONTROL_PHASE(n) ((n) & 3)
1399
1400
1401 #define DEPEVT_TRANSFER_NO_RESOURCE 1
1402 #define DEPEVT_TRANSFER_BUS_EXPIRY 2
1403
1404 u32 parameters:16;
1405
1406
1407 #define DEPEVT_PARAMETER_CMD(n) (((n) & (0xf << 8)) >> 8)
1408 } __packed;
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432 struct dwc3_event_devt {
1433 u32 one_bit:1;
1434 u32 device_event:7;
1435 u32 type:4;
1436 u32 reserved15_12:4;
1437 u32 event_info:9;
1438 u32 reserved31_25:7;
1439 } __packed;
1440
1441
1442
1443
1444
1445
1446
1447
1448 struct dwc3_event_gevt {
1449 u32 one_bit:1;
1450 u32 device_event:7;
1451 u32 phy_port_number:4;
1452 u32 reserved31_12:20;
1453 } __packed;
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463 union dwc3_event {
1464 u32 raw;
1465 struct dwc3_event_type type;
1466 struct dwc3_event_depevt depevt;
1467 struct dwc3_event_devt devt;
1468 struct dwc3_event_gevt gevt;
1469 };
1470
1471
1472
1473
1474
1475
1476
1477
1478 struct dwc3_gadget_ep_cmd_params {
1479 u32 param2;
1480 u32 param1;
1481 u32 param0;
1482 };
1483
1484
1485
1486
1487
1488 #define DWC3_HAS_PERIPHERAL BIT(0)
1489 #define DWC3_HAS_XHCI BIT(1)
1490 #define DWC3_HAS_OTG BIT(3)
1491
1492
1493 void dwc3_set_prtcap(struct dwc3 *dwc, u32 mode);
1494 void dwc3_set_mode(struct dwc3 *dwc, u32 mode);
1495 u32 dwc3_core_fifo_space(struct dwc3_ep *dep, u8 type);
1496
1497 #define DWC3_IP_IS(_ip) \
1498 (dwc->ip == _ip##_IP)
1499
1500 #define DWC3_VER_IS(_ip, _ver) \
1501 (DWC3_IP_IS(_ip) && dwc->revision == _ip##_REVISION_##_ver)
1502
1503 #define DWC3_VER_IS_PRIOR(_ip, _ver) \
1504 (DWC3_IP_IS(_ip) && dwc->revision < _ip##_REVISION_##_ver)
1505
1506 #define DWC3_VER_IS_WITHIN(_ip, _from, _to) \
1507 (DWC3_IP_IS(_ip) && \
1508 dwc->revision >= _ip##_REVISION_##_from && \
1509 (!(_ip##_REVISION_##_to) || \
1510 dwc->revision <= _ip##_REVISION_##_to))
1511
1512 #define DWC3_VER_TYPE_IS_WITHIN(_ip, _ver, _from, _to) \
1513 (DWC3_VER_IS(_ip, _ver) && \
1514 dwc->version_type >= _ip##_VERSIONTYPE_##_from && \
1515 (!(_ip##_VERSIONTYPE_##_to) || \
1516 dwc->version_type <= _ip##_VERSIONTYPE_##_to))
1517
1518
1519
1520
1521
1522
1523
1524 static inline u32 dwc3_mdwidth(struct dwc3 *dwc)
1525 {
1526 u32 mdwidth;
1527
1528 mdwidth = DWC3_GHWPARAMS0_MDWIDTH(dwc->hwparams.hwparams0);
1529 if (DWC3_IP_IS(DWC32))
1530 mdwidth += DWC3_GHWPARAMS6_MDWIDTH(dwc->hwparams.hwparams6);
1531
1532 return mdwidth;
1533 }
1534
1535 bool dwc3_has_imod(struct dwc3 *dwc);
1536
1537 int dwc3_event_buffers_setup(struct dwc3 *dwc);
1538 void dwc3_event_buffers_cleanup(struct dwc3 *dwc);
1539
1540 int dwc3_core_soft_reset(struct dwc3 *dwc);
1541
1542 #if IS_ENABLED(CONFIG_USB_DWC3_HOST) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)
1543 int dwc3_host_init(struct dwc3 *dwc);
1544 void dwc3_host_exit(struct dwc3 *dwc);
1545 #else
1546 static inline int dwc3_host_init(struct dwc3 *dwc)
1547 { return 0; }
1548 static inline void dwc3_host_exit(struct dwc3 *dwc)
1549 { }
1550 #endif
1551
1552 #if IS_ENABLED(CONFIG_USB_DWC3_GADGET) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)
1553 int dwc3_gadget_init(struct dwc3 *dwc);
1554 void dwc3_gadget_exit(struct dwc3 *dwc);
1555 int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode);
1556 int dwc3_gadget_get_link_state(struct dwc3 *dwc);
1557 int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state);
1558 int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,
1559 struct dwc3_gadget_ep_cmd_params *params);
1560 int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned int cmd,
1561 u32 param);
1562 void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc);
1563 #else
1564 static inline int dwc3_gadget_init(struct dwc3 *dwc)
1565 { return 0; }
1566 static inline void dwc3_gadget_exit(struct dwc3 *dwc)
1567 { }
1568 static inline int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode)
1569 { return 0; }
1570 static inline int dwc3_gadget_get_link_state(struct dwc3 *dwc)
1571 { return 0; }
1572 static inline int dwc3_gadget_set_link_state(struct dwc3 *dwc,
1573 enum dwc3_link_state state)
1574 { return 0; }
1575
1576 static inline int dwc3_send_gadget_ep_cmd(struct dwc3_ep *dep, unsigned int cmd,
1577 struct dwc3_gadget_ep_cmd_params *params)
1578 { return 0; }
1579 static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc,
1580 int cmd, u32 param)
1581 { return 0; }
1582 static inline void dwc3_gadget_clear_tx_fifos(struct dwc3 *dwc)
1583 { }
1584 #endif
1585
1586 #if IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE)
1587 int dwc3_drd_init(struct dwc3 *dwc);
1588 void dwc3_drd_exit(struct dwc3 *dwc);
1589 void dwc3_otg_init(struct dwc3 *dwc);
1590 void dwc3_otg_exit(struct dwc3 *dwc);
1591 void dwc3_otg_update(struct dwc3 *dwc, bool ignore_idstatus);
1592 void dwc3_otg_host_init(struct dwc3 *dwc);
1593 #else
1594 static inline int dwc3_drd_init(struct dwc3 *dwc)
1595 { return 0; }
1596 static inline void dwc3_drd_exit(struct dwc3 *dwc)
1597 { }
1598 static inline void dwc3_otg_init(struct dwc3 *dwc)
1599 { }
1600 static inline void dwc3_otg_exit(struct dwc3 *dwc)
1601 { }
1602 static inline void dwc3_otg_update(struct dwc3 *dwc, bool ignore_idstatus)
1603 { }
1604 static inline void dwc3_otg_host_init(struct dwc3 *dwc)
1605 { }
1606 #endif
1607
1608
1609 #if !IS_ENABLED(CONFIG_USB_DWC3_HOST)
1610 int dwc3_gadget_suspend(struct dwc3 *dwc);
1611 int dwc3_gadget_resume(struct dwc3 *dwc);
1612 void dwc3_gadget_process_pending_events(struct dwc3 *dwc);
1613 #else
1614 static inline int dwc3_gadget_suspend(struct dwc3 *dwc)
1615 {
1616 return 0;
1617 }
1618
1619 static inline int dwc3_gadget_resume(struct dwc3 *dwc)
1620 {
1621 return 0;
1622 }
1623
1624 static inline void dwc3_gadget_process_pending_events(struct dwc3 *dwc)
1625 {
1626 }
1627 #endif
1628
1629 #if IS_ENABLED(CONFIG_USB_DWC3_ULPI)
1630 int dwc3_ulpi_init(struct dwc3 *dwc);
1631 void dwc3_ulpi_exit(struct dwc3 *dwc);
1632 #else
1633 static inline int dwc3_ulpi_init(struct dwc3 *dwc)
1634 { return 0; }
1635 static inline void dwc3_ulpi_exit(struct dwc3 *dwc)
1636 { }
1637 #endif
1638
1639 #endif