Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * core.h - DesignWare USB3 DRD Core Header
0004  *
0005  * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com
0006  *
0007  * Authors: Felipe Balbi <balbi@ti.com>,
0008  *      Sebastian Andrzej Siewior <bigeasy@linutronix.de>
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 /* Global constants */
0039 #define DWC3_PULL_UP_TIMEOUT    500 /* ms */
0040 #define DWC3_BOUNCE_SIZE    1024    /* size of a superspeed bulk */
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    /* each buffer is assumed to be 4KiB */
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 /* Controller's role while using the OTG block */
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 /* DWC3 registers memory space boundries */
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 /* Global Registers */
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 /* Device Registers */
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 /* DWC_usb32 only */
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 /* OTG Registers */
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 /* Bit fields */
0174 
0175 /* Global SoC Bus Configuration INCRx Register 0 */
0176 #define DWC3_GSBUSCFG0_INCR256BRSTENA   (1 << 7) /* INCR256 burst */
0177 #define DWC3_GSBUSCFG0_INCR128BRSTENA   (1 << 6) /* INCR128 burst */
0178 #define DWC3_GSBUSCFG0_INCR64BRSTENA    (1 << 5) /* INCR64 burst */
0179 #define DWC3_GSBUSCFG0_INCR32BRSTENA    (1 << 4) /* INCR32 burst */
0180 #define DWC3_GSBUSCFG0_INCR16BRSTENA    (1 << 3) /* INCR16 burst */
0181 #define DWC3_GSBUSCFG0_INCR8BRSTENA (1 << 2) /* INCR8 burst */
0182 #define DWC3_GSBUSCFG0_INCR4BRSTENA (1 << 1) /* INCR4 burst */
0183 #define DWC3_GSBUSCFG0_INCRBRSTENA  (1 << 0) /* undefined length enable */
0184 #define DWC3_GSBUSCFG0_INCRBRST_MASK    0xff
0185 
0186 /* Global Debug LSP MUX Select */
0187 #define DWC3_GDBGLSPMUX_ENDBC       BIT(15) /* Host only */
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 /* Global Debug Queue/FIFO Space Available Register */
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 /* Global RX Threshold Configuration Register */
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 /* Global RX Threshold Configuration Register for DWC_usb31 only */
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 /* Global TX Threshold Configuration Register for DWC_usb31 only */
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 /* Global Configuration Register */
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 /* Global User Control Register */
0258 #define DWC3_GUCTL_HSTINAUTORETRY   BIT(14)
0259 
0260 /* Global User Control 1 Register */
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 /* Global Status Register */
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 /* Global USB2 PHY Configuration Register */
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 /* Global USB2 PHY Vendor Control Register */
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 /* Global USB3 PIPE Control Register */
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 /* Global TX Fifo Size Register */
0320 #define DWC31_GTXFIFOSIZ_TXFRAMNUM  BIT(15)     /* DWC_usb31 only */
0321 #define DWC31_GTXFIFOSIZ_TXFDEP(n)  ((n) & 0x7fff)  /* DWC_usb31 only */
0322 #define DWC3_GTXFIFOSIZ_TXFDEP(n)   ((n) & 0xffff)
0323 #define DWC3_GTXFIFOSIZ_TXFSTADDR(n)    ((n) & 0xffff0000)
0324 
0325 /* Global RX Fifo Size Register */
0326 #define DWC31_GRXFIFOSIZ_RXFDEP(n)  ((n) & 0x7fff)  /* DWC_usb31 only */
0327 #define DWC3_GRXFIFOSIZ_RXFDEP(n)   ((n) & 0xffff)
0328 
0329 /* Global Event Size Registers */
0330 #define DWC3_GEVNTSIZ_INTMASK       BIT(31)
0331 #define DWC3_GEVNTSIZ_SIZE(n)       ((n) & 0xffff)
0332 
0333 /* Global HWPARAMS0 Register */
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 /* Global HWPARAMS1 Register */
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 /* Global HWPARAMS3 Register */
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 /* DWC_usb31 only */
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 /* Global HWPARAMS4 Register */
0368 #define DWC3_GHWPARAMS4_HIBER_SCRATCHBUFS(n)    (((n) & (0x0f << 13)) >> 13)
0369 #define DWC3_MAX_HIBER_SCRATCHBUFS      15
0370 
0371 /* Global HWPARAMS6 Register */
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 /* DWC_usb32 only */
0380 #define DWC3_GHWPARAMS6_MDWIDTH(n)      ((n) & (0x3 << 8))
0381 
0382 /* Global HWPARAMS7 Register */
0383 #define DWC3_GHWPARAMS7_RAM1_DEPTH(n)   ((n) & 0xffff)
0384 #define DWC3_GHWPARAMS7_RAM2_DEPTH(n)   (((n) >> 16) & 0xffff)
0385 
0386 /* Global HWPARAMS9 Register */
0387 #define DWC3_GHWPARAMS9_DEV_TXF_FLUSH_BYPASS    BIT(0)
0388 #define DWC3_GHWPARAMS9_DEV_MST         BIT(1)
0389 
0390 /* Global Frame Length Adjustment Register */
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 /* Global User Control Register*/
0398 #define DWC3_GUCTL_REFCLKPER_MASK       0xffc00000
0399 #define DWC3_GUCTL_REFCLKPER_SEL        22
0400 
0401 /* Global User Control Register 2 */
0402 #define DWC3_GUCTL2_RST_ACTBITLATER     BIT(14)
0403 
0404 /* Global User Control Register 3 */
0405 #define DWC3_GUCTL3_SPLITDISABLE        BIT(14)
0406 
0407 /* Device Configuration Register */
0408 #define DWC3_DCFG_NUMLANES(n)   (((n) & 0x3) << 30) /* DWC_usb32 only */
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)  /* DWC_usb31 only */
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 /* Device Control Register */
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 /* These apply for core versions 1.87a and earlier */
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 /* These apply for core versions 1.94a and later */
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 /* Device Event Enable Register */
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) /* DWC_usb32 only */
0484 
0485 /* Device Status Register */
0486 #define DWC3_DSTS_DCNRD         BIT(29)
0487 
0488 /* This applies for core versions 1.87a and earlier */
0489 #define DWC3_DSTS_PWRUPREQ      BIT(24)
0490 
0491 /* These apply for core versions 1.94a and later */
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) /* DWC_usb31 only */
0509 #define DWC3_DSTS_SUPERSPEED        (4 << 0)
0510 #define DWC3_DSTS_HIGHSPEED     (0 << 0)
0511 #define DWC3_DSTS_FULLSPEED     BIT(0)
0512 
0513 /* Device Generic Command Register */
0514 #define DWC3_DGCMD_SET_LMP      0x01
0515 #define DWC3_DGCMD_SET_PERIODIC_PAR 0x02
0516 #define DWC3_DGCMD_XMIT_FUNCTION    0x03
0517 
0518 /* These apply for core versions 1.94a and later */
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 /* Device Generic Command Parameter Register */
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 /* Device Endpoint Command Register */
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 /* This applies for core versions 1.90a and earlier */
0557 #define DWC3_DEPCMD_GETSEQNUMBER    (0x03 << 0)
0558 /* This applies for core versions 1.94a and later */
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 /* The EP number goes 0..31 so ep0 is always out and ep1 is always in */
0566 #define DWC3_DALEPENA_EP(n)     BIT(n)
0567 
0568 /* DWC_usb32 DCFG1 config */
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 /* OTG Configuration Register */
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 /* OTG CTL Register */
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 /* OTG Event Register */
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 /* OTG Event Enable Register */
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 /* OTG Status Register */
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 /* Structures */
0650 
0651 struct dwc3_trb;
0652 
0653 /**
0654  * struct dwc3_event_buffer - Software event buffer representation
0655  * @buf: _THE_ buffer
0656  * @cache: The buffer cache used in the threaded interrupt
0657  * @length: size of this buffer
0658  * @lpos: event offset
0659  * @count: cache of last read event count register
0660  * @flags: flags related to this event buffer
0661  * @dma: dma_addr_t
0662  * @dwc: pointer to DWC controller
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  * struct dwc3_ep - device side endpoint representation
0689  * @endpoint: usb endpoint
0690  * @cancelled_list: list of cancelled requests for this endpoint
0691  * @pending_list: list of pending requests for this endpoint
0692  * @started_list: list of started requests on this endpoint
0693  * @regs: pointer to first endpoint register
0694  * @trb_pool: array of transaction buffers
0695  * @trb_pool_dma: dma address of @trb_pool
0696  * @trb_enqueue: enqueue 'pointer' into TRB array
0697  * @trb_dequeue: dequeue 'pointer' into TRB array
0698  * @dwc: pointer to DWC controller
0699  * @saved_state: ep state saved during hibernation
0700  * @flags: endpoint flags (wedged, stalled, ...)
0701  * @number: endpoint number (1 - 15)
0702  * @type: set to bmAttributes & USB_ENDPOINT_XFERTYPE_MASK
0703  * @resource_index: Resource transfer index
0704  * @frame_number: set to the frame number we want this transfer to start (ISOC)
0705  * @interval: the interval on which the ISOC transfer is started
0706  * @name: a human readable name e.g. ep1out-bulk
0707  * @direction: true for TX, false for RX
0708  * @stream_capable: true when streams are enabled
0709  * @combo_num: the test combination BIT[15:14] of the frame number to test
0710  *      isochronous START TRANSFER command failure workaround
0711  * @start_cmd_status: the status of testing START TRANSFER command with
0712  *      combo_num = 'b00
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     /* This last one is specific to EP0 */
0744 #define DWC3_EP0_DIR_IN         BIT(31)
0745 
0746     /*
0747      * IMPORTANT: we *know* we have 256 TRBs in our @trb_pool, so we will
0748      * use a u8 type here. If anybody decides to increase number of TRBs to
0749      * anything larger than 256 - I can't see why people would want to do
0750      * this though - then this type needs to be changed.
0751      *
0752      * By using u8 types we ensure that our % operator when incrementing
0753      * enqueue and dequeue get optimized away by the compiler.
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     /* For isochronous START TRANSFER workaround only */
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     /* In SuperSpeed */
0796     DWC3_LINK_STATE_U0      = 0x00, /* in HS, means ON */
0797     DWC3_LINK_STATE_U1      = 0x01,
0798     DWC3_LINK_STATE_U2      = 0x02, /* in HS, means SLEEP */
0799     DWC3_LINK_STATE_U3      = 0x03, /* in HS, means SUSPEND */
0800     DWC3_LINK_STATE_SS_DIS      = 0x04,
0801     DWC3_LINK_STATE_RX_DET      = 0x05, /* in HS, means Early Suspend */
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 /* TRB Length, PCM and Status */
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 /* TRB Control */
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  * struct dwc3_trb - transfer request block (hw format)
0847  * @bpl: DW0-3
0848  * @bph: DW4-7
0849  * @size: DW8-B
0850  * @ctrl: DWC-F
0851  */
0852 struct dwc3_trb {
0853     u32     bpl;
0854     u32     bph;
0855     u32     size;
0856     u32     ctrl;
0857 } __packed;
0858 
0859 /**
0860  * struct dwc3_hwparams - copy of HWPARAMS registers
0861  * @hwparams0: GHWPARAMS0
0862  * @hwparams1: GHWPARAMS1
0863  * @hwparams2: GHWPARAMS2
0864  * @hwparams3: GHWPARAMS3
0865  * @hwparams4: GHWPARAMS4
0866  * @hwparams5: GHWPARAMS5
0867  * @hwparams6: GHWPARAMS6
0868  * @hwparams7: GHWPARAMS7
0869  * @hwparams8: GHWPARAMS8
0870  * @hwparams9: GHWPARAMS9
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 /* HWPARAMS0 */
0886 #define DWC3_MODE(n)        ((n) & 0x7)
0887 
0888 /* HWPARAMS1 */
0889 #define DWC3_NUM_INT(n)     (((n) & (0x3f << 15)) >> 15)
0890 
0891 /* HWPARAMS3 */
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 /* HWPARAMS7 */
0900 #define DWC3_RAM1_DEPTH(n)  ((n) & 0xffff)
0901 
0902 /* HWPARAMS9 */
0903 #define DWC3_MST_CAPABLE(p) (!!((p)->hwparams9 &        \
0904             DWC3_GHWPARAMS9_DEV_MST))
0905 
0906 /**
0907  * struct dwc3_request - representation of a transfer request
0908  * @request: struct usb_request to be transferred
0909  * @list: a list_head used for request queueing
0910  * @dep: struct dwc3_ep owning this request
0911  * @sg: pointer to first incomplete sg
0912  * @start_sg: pointer to the sg which should be queued next
0913  * @num_pending_sgs: counter to pending sgs
0914  * @num_queued_sgs: counter to the number of sgs which already got queued
0915  * @remaining: amount of data remaining
0916  * @status: internal dwc3 request status tracking
0917  * @epnum: endpoint number to which this request refers
0918  * @trb: pointer to struct dwc3_trb
0919  * @trb_dma: DMA address of @trb
0920  * @num_trbs: number of TRBs used by this request
0921  * @needs_extra_trb: true when request needs one extra TRB (either due to ZLP
0922  *  or unaligned OUT)
0923  * @direction: IN or OUT direction flag
0924  * @mapped: true when request has been dma-mapped
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  * struct dwc3_scratchpad_array - hibernation scratchpad array
0959  * (format defined by hw)
0960  */
0961 struct dwc3_scratchpad_array {
0962     __le64  dma_adr[DWC3_MAX_HIBER_SCRATCHBUFS];
0963 };
0964 
0965 /**
0966  * struct dwc3 - representation of our controller
0967  * @drd_work: workqueue used for role swapping
0968  * @ep0_trb: trb which is used for the ctrl_req
0969  * @bounce: address of bounce buffer
0970  * @scratchbuf: address of scratch buffer
0971  * @setup_buf: used while precessing STD USB requests
0972  * @ep0_trb_addr: dma address of @ep0_trb
0973  * @bounce_addr: dma address of @bounce
0974  * @ep0_usb_req: dummy req used while handling STD USB requests
0975  * @scratch_addr: dma address of scratchbuf
0976  * @ep0_in_setup: one control transfer is completed and enter setup phase
0977  * @lock: for synchronizing
0978  * @mutex: for mode switching
0979  * @dev: pointer to our struct device
0980  * @sysdev: pointer to the DMA-capable device
0981  * @xhci: pointer to our xHCI child
0982  * @xhci_resources: struct resources for our @xhci child
0983  * @ev_buf: struct dwc3_event_buffer pointer
0984  * @eps: endpoint array
0985  * @gadget: device side representation of the peripheral controller
0986  * @gadget_driver: pointer to the gadget driver
0987  * @bus_clk: clock for accessing the registers
0988  * @ref_clk: reference clock
0989  * @susp_clk: clock used when the SS phy is in low power (S3) state
0990  * @reset: reset control
0991  * @regs: base address for our registers
0992  * @regs_size: address space size
0993  * @fladj: frame length adjustment
0994  * @ref_clk_per: reference clock period configuration
0995  * @irq_gadget: peripheral controller's IRQ number
0996  * @otg_irq: IRQ number for OTG IRQs
0997  * @current_otg_role: current role of operation while using the OTG block
0998  * @desired_otg_role: desired role of operation while using the OTG block
0999  * @otg_restart_host: flag that OTG controller needs to restart host
1000  * @nr_scratch: number of scratch buffers
1001  * @u1u2: only used on revisions <1.83a for workaround
1002  * @maximum_speed: maximum speed requested (mainly for testing purposes)
1003  * @max_ssp_rate: SuperSpeed Plus maximum signaling rate and lane count
1004  * @gadget_max_speed: maximum gadget speed requested
1005  * @gadget_ssp_rate: Gadget driver's maximum supported SuperSpeed Plus signaling
1006  *          rate and lane count.
1007  * @ip: controller's ID
1008  * @revision: controller's version of an IP
1009  * @version_type: VERSIONTYPE register contents, a sub release of a revision
1010  * @dr_mode: requested mode of operation
1011  * @current_dr_role: current role of operation when in dual-role mode
1012  * @desired_dr_role: desired role of operation when in dual-role mode
1013  * @edev: extcon handle
1014  * @edev_nb: extcon notifier
1015  * @hsphy_mode: UTMI phy mode, one of following:
1016  *      - USBPHY_INTERFACE_MODE_UTMI
1017  *      - USBPHY_INTERFACE_MODE_UTMIW
1018  * @role_sw: usb_role_switch handle
1019  * @role_switch_default_mode: default operation mode of controller while
1020  *          usb role is USB_ROLE_NONE.
1021  * @usb_psy: pointer to power supply interface.
1022  * @usb2_phy: pointer to USB2 PHY
1023  * @usb3_phy: pointer to USB3 PHY
1024  * @usb2_generic_phy: pointer to USB2 PHY
1025  * @usb3_generic_phy: pointer to USB3 PHY
1026  * @phys_ready: flag to indicate that PHYs are ready
1027  * @ulpi: pointer to ulpi interface
1028  * @ulpi_ready: flag to indicate that ULPI is initialized
1029  * @u2sel: parameter from Set SEL request.
1030  * @u2pel: parameter from Set SEL request.
1031  * @u1sel: parameter from Set SEL request.
1032  * @u1pel: parameter from Set SEL request.
1033  * @num_eps: number of endpoints
1034  * @ep0_next_event: hold the next expected event
1035  * @ep0state: state of endpoint zero
1036  * @link_state: link state
1037  * @speed: device speed (super, high, full, low)
1038  * @hwparams: copy of hwparams registers
1039  * @regset: debugfs pointer to regdump file
1040  * @dbg_lsp_select: current debug lsp mux register selection
1041  * @test_mode: true when we're entering a USB test mode
1042  * @test_mode_nr: test feature selector
1043  * @lpm_nyet_threshold: LPM NYET response threshold
1044  * @hird_threshold: HIRD threshold
1045  * @rx_thr_num_pkt_prd: periodic ESS receive packet count
1046  * @rx_max_burst_prd: max periodic ESS receive burst size
1047  * @tx_thr_num_pkt_prd: periodic ESS transmit packet count
1048  * @tx_max_burst_prd: max periodic ESS transmit burst size
1049  * @tx_fifo_resize_max_num: max number of fifos allocated during txfifo resize
1050  * @clear_stall_protocol: endpoint number that requires a delayed status phase
1051  * @hsphy_interface: "utmi" or "ulpi"
1052  * @connected: true when we're connected to a host, false otherwise
1053  * @softconnect: true when gadget connect is called, false when disconnect runs
1054  * @delayed_status: true when gadget driver asks for delayed status
1055  * @ep0_bounced: true when we used bounce buffer
1056  * @ep0_expect_in: true when we expect a DATA IN transfer
1057  * @has_hibernation: true when dwc3 was configured with Hibernation
1058  * @sysdev_is_parent: true when dwc3 device has a parent driver
1059  * @has_lpm_erratum: true when core was configured with LPM Erratum. Note that
1060  *          there's now way for software to detect this in runtime.
1061  * @is_utmi_l1_suspend: the core asserts output signal
1062  *  0   - utmi_sleep_n
1063  *  1   - utmi_l1_suspend_n
1064  * @is_fpga: true when we are using the FPGA board
1065  * @pending_events: true when we have pending IRQs to be handled
1066  * @do_fifo_resize: true when txfifo resizing is enabled for dwc3 endpoints
1067  * @pullups_connected: true when Run/Stop bit is set
1068  * @setup_packet_pending: true when there's a Setup Packet in FIFO. Workaround
1069  * @three_stage_setup: set if we perform a three phase setup
1070  * @dis_start_transfer_quirk: set if start_transfer failure SW workaround is
1071  *          not needed for DWC_usb31 version 1.70a-ea06 and below
1072  * @usb3_lpm_capable: set if hadrware supports Link Power Management
1073  * @usb2_lpm_disable: set to disable usb2 lpm for host
1074  * @usb2_gadget_lpm_disable: set to disable usb2 lpm for gadget
1075  * @disable_scramble_quirk: set if we enable the disable scramble quirk
1076  * @u2exit_lfps_quirk: set if we enable u2exit lfps quirk
1077  * @u2ss_inp3_quirk: set if we enable P3 OK for U2/SS Inactive quirk
1078  * @req_p1p2p3_quirk: set if we enable request p1p2p3 quirk
1079  * @del_p1p2p3_quirk: set if we enable delay p1p2p3 quirk
1080  * @del_phy_power_chg_quirk: set if we enable delay phy power change quirk
1081  * @lfps_filter_quirk: set if we enable LFPS filter quirk
1082  * @rx_detect_poll_quirk: set if we enable rx_detect to polling lfps quirk
1083  * @dis_u3_susphy_quirk: set if we disable usb3 suspend phy
1084  * @dis_u2_susphy_quirk: set if we disable usb2 suspend phy
1085  * @dis_enblslpm_quirk: set if we clear enblslpm in GUSB2PHYCFG,
1086  *                      disabling the suspend signal to the PHY.
1087  * @dis_u1_entry_quirk: set if link entering into U1 state needs to be disabled.
1088  * @dis_u2_entry_quirk: set if link entering into U2 state needs to be disabled.
1089  * @dis_rxdet_inp3_quirk: set if we disable Rx.Detect in P3
1090  * @async_callbacks: if set, indicate that async callbacks will be used.
1091  *
1092  * @dis_u2_freeclk_exists_quirk : set if we clear u2_freeclk_exists
1093  *          in GUSB2PHYCFG, specify that USB2 PHY doesn't
1094  *          provide a free-running PHY clock.
1095  * @dis_del_phy_power_chg_quirk: set if we disable delay phy power
1096  *          change quirk.
1097  * @dis_tx_ipgap_linecheck_quirk: set if we disable u2mac linestate
1098  *          check during HS transmit.
1099  * @parkmode_disable_ss_quirk: set if we need to disable all SuperSpeed
1100  *          instances in park mode.
1101  * @tx_de_emphasis_quirk: set if we enable Tx de-emphasis quirk
1102  * @tx_de_emphasis: Tx de-emphasis value
1103  *  0   - -6dB de-emphasis
1104  *  1   - -3.5dB de-emphasis
1105  *  2   - No de-emphasis
1106  *  3   - Reserved
1107  * @dis_metastability_quirk: set to disable metastability quirk.
1108  * @dis_split_quirk: set to disable split boundary.
1109  * @imod_interval: set the interrupt moderation interval in 250ns
1110  *          increments or 0 to disable.
1111  * @max_cfg_eps: current max number of IN eps used across all USB configs.
1112  * @last_fifo_depth: last fifo depth used to determine next fifo ram start
1113  *           address.
1114  * @num_ep_resized: carries the current number endpoints which have had its tx
1115  *          fifo resized.
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     /* device lock */
1130     spinlock_t      lock;
1131 
1132     /* mode switching lock */
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  * struct dwc3_event_depevt - Device Endpoint Events
1353  * @one_bit: indicates this is an endpoint event (not used)
1354  * @endpoint_number: number of the endpoint
1355  * @endpoint_event: The event we have:
1356  *  0x00    - Reserved
1357  *  0x01    - XferComplete
1358  *  0x02    - XferInProgress
1359  *  0x03    - XferNotReady
1360  *  0x04    - RxTxFifoEvt (IN->Underrun, OUT->Overrun)
1361  *  0x05    - Reserved
1362  *  0x06    - StreamEvt
1363  *  0x07    - EPCmdCmplt
1364  * @reserved11_10: Reserved, don't use.
1365  * @status: Indicates the status of the event. Refer to databook for
1366  *  more information.
1367  * @parameters: Parameters of the current event. Refer to databook for
1368  *  more information.
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 /* Within XferNotReady */
1378 #define DEPEVT_STATUS_TRANSFER_ACTIVE   BIT(3)
1379 
1380 /* Within XferComplete or XferInProgress */
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) /* XferComplete */
1385 #define DEPEVT_STATUS_MISSED_ISOC BIT(3) /* XferInProgress */
1386 
1387 /* Stream event only */
1388 #define DEPEVT_STREAMEVT_FOUND      1
1389 #define DEPEVT_STREAMEVT_NOTFOUND   2
1390 
1391 /* Stream event parameter */
1392 #define DEPEVT_STREAM_PRIME     0xfffe
1393 #define DEPEVT_STREAM_NOSTREAM      0x0
1394 
1395 /* Control-only Status */
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 /* In response to Start Transfer */
1401 #define DEPEVT_TRANSFER_NO_RESOURCE 1
1402 #define DEPEVT_TRANSFER_BUS_EXPIRY  2
1403 
1404     u32 parameters:16;
1405 
1406 /* For Command Complete Events */
1407 #define DEPEVT_PARAMETER_CMD(n) (((n) & (0xf << 8)) >> 8)
1408 } __packed;
1409 
1410 /**
1411  * struct dwc3_event_devt - Device Events
1412  * @one_bit: indicates this is a non-endpoint event (not used)
1413  * @device_event: indicates it's a device event. Should read as 0x00
1414  * @type: indicates the type of device event.
1415  *  0   - DisconnEvt
1416  *  1   - USBRst
1417  *  2   - ConnectDone
1418  *  3   - ULStChng
1419  *  4   - WkUpEvt
1420  *  5   - Reserved
1421  *  6   - Suspend (EOPF on revisions 2.10a and prior)
1422  *  7   - SOF
1423  *  8   - Reserved
1424  *  9   - ErrticErr
1425  *  10  - CmdCmplt
1426  *  11  - EvntOverflow
1427  *  12  - VndrDevTstRcved
1428  * @reserved15_12: Reserved, not used
1429  * @event_info: Information about this event
1430  * @reserved31_25: Reserved, not used
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  * struct dwc3_event_gevt - Other Core Events
1443  * @one_bit: indicates this is a non-endpoint event (not used)
1444  * @device_event: indicates it's (0x03) Carkit or (0x04) I2C event.
1445  * @phy_port_number: self-explanatory
1446  * @reserved31_12: Reserved, not used.
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  * union dwc3_event - representation of Event Buffer contents
1457  * @raw: raw 32-bit event
1458  * @type: the type of the event
1459  * @depevt: Device Endpoint Event
1460  * @devt: Device Event
1461  * @gevt: Global Event
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  * struct dwc3_gadget_ep_cmd_params - representation of endpoint command
1473  * parameters
1474  * @param2: third parameter
1475  * @param1: second parameter
1476  * @param0: first parameter
1477  */
1478 struct dwc3_gadget_ep_cmd_params {
1479     u32 param2;
1480     u32 param1;
1481     u32 param0;
1482 };
1483 
1484 /*
1485  * DWC3 Features to be used as Driver Data
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 /* prototypes */
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  * dwc3_mdwidth - get MDWIDTH value in bits
1520  * @dwc: pointer to our context structure
1521  *
1522  * Return MDWIDTH configuration value in bits.
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 /* power management interface */
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 /* !IS_ENABLED(CONFIG_USB_DWC3_HOST) */
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 /* __DRIVERS_USB_DWC3_CORE_H */