usb: dwc3: core: make dwc3_set_mode() work properly
[linux-2.6-block.git] / drivers / usb / dwc3 / core.h
index 2b9e4ca3c932e5691376dc9504d870804cccc695..1fe23e36485f53c807ca11fe77d187028b790fc8 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/ioport.h>
 #include <linux/list.h>
+#include <linux/bitops.h>
 #include <linux/dma-mapping.h>
 #include <linux/mm.h>
 #include <linux/debugfs.h>
 #include <linux/wait.h>
+#include <linux/workqueue.h>
 
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
@@ -39,9 +41,8 @@
 
 /* Global constants */
 #define DWC3_PULL_UP_TIMEOUT   500     /* ms */
-#define DWC3_ZLP_BUF_SIZE      1024    /* size of a superspeed bulk */
 #define DWC3_BOUNCE_SIZE       1024    /* size of a superspeed bulk */
-#define DWC3_EP0_BOUNCE_SIZE   512
+#define DWC3_EP0_SETUP_SIZE    512
 #define DWC3_ENDPOINTS_NUM     32
 #define DWC3_XHCI_RESOURCES_NUM        2
 
@@ -66,7 +67,7 @@
 #define DWC3_DEVICE_EVENT_OVERFLOW             11
 
 #define DWC3_GEVNTCOUNT_MASK   0xfffc
-#define DWC3_GEVNTCOUNT_EHB    (1 << 31)
+#define DWC3_GEVNTCOUNT_EHB    BIT(31)
 #define DWC3_GSNPSID_MASK      0xffff0000
 #define DWC3_GSNPSREV_MASK     0xffff
 
 #define DWC3_VER_NUMBER                0xc1a0
 #define DWC3_VER_TYPE          0xc1a4
 
-#define DWC3_GUSB2PHYCFG(n)    (0xc200 + (n * 0x04))
-#define DWC3_GUSB2I2CCTL(n)    (0xc240 + (n * 0x04))
+#define DWC3_GUSB2PHYCFG(n)    (0xc200 + ((n) * 0x04))
+#define DWC3_GUSB2I2CCTL(n)    (0xc240 + ((n) * 0x04))
 
-#define DWC3_GUSB2PHYACC(n)    (0xc280 + (n * 0x04))
+#define DWC3_GUSB2PHYACC(n)    (0xc280 + ((n) * 0x04))
 
-#define DWC3_GUSB3PIPECTL(n)   (0xc2c0 + (n * 0x04))
+#define DWC3_GUSB3PIPECTL(n)   (0xc2c0 + ((n) * 0x04))
 
-#define DWC3_GTXFIFOSIZ(n)     (0xc300 + (n * 0x04))
-#define DWC3_GRXFIFOSIZ(n)     (0xc380 + (n * 0x04))
+#define DWC3_GTXFIFOSIZ(n)     (0xc300 + ((n) * 0x04))
+#define DWC3_GRXFIFOSIZ(n)     (0xc380 + ((n) * 0x04))
 
-#define DWC3_GEVNTADRLO(n)     (0xc400 + (n * 0x10))
-#define DWC3_GEVNTADRHI(n)     (0xc404 + (n * 0x10))
-#define DWC3_GEVNTSIZ(n)       (0xc408 + (n * 0x10))
-#define DWC3_GEVNTCOUNT(n)     (0xc40c + (n * 0x10))
+#define DWC3_GEVNTADRLO(n)     (0xc400 + ((n) * 0x10))
+#define DWC3_GEVNTADRHI(n)     (0xc404 + ((n) * 0x10))
+#define DWC3_GEVNTSIZ(n)       (0xc408 + ((n) * 0x10))
+#define DWC3_GEVNTCOUNT(n)     (0xc40c + ((n) * 0x10))
 
 #define DWC3_GHWPARAMS8                0xc600
 #define DWC3_GFLADJ            0xc630
 #define DWC3_DGCMD             0xc714
 #define DWC3_DALEPENA          0xc720
 
-#define DWC3_DEP_BASE(n)       (0xc800 + (n * 0x10))
+#define DWC3_DEP_BASE(n)       (0xc800 + ((n) * 0x10))
 #define DWC3_DEPCMDPAR2                0x00
 #define DWC3_DEPCMDPAR1                0x04
 #define DWC3_DEPCMDPAR0                0x08
 #define DWC3_DEPCMD            0x0c
 
-#define DWC3_DEV_IMOD(n)       (0xca00 + (n * 0x4))
+#define DWC3_DEV_IMOD(n)       (0xca00 + ((n) * 0x4))
 
 /* OTG Registers */
 #define DWC3_OCFG              0xcc00
 /* Global RX Threshold Configuration Register */
 #define DWC3_GRXTHRCFG_MAXRXBURSTSIZE(n) (((n) & 0x1f) << 19)
 #define DWC3_GRXTHRCFG_RXPKTCNT(n) (((n) & 0xf) << 24)
-#define DWC3_GRXTHRCFG_PKTCNTSEL (1 << 29)
+#define DWC3_GRXTHRCFG_PKTCNTSEL BIT(29)
 
 /* Global Configuration Register */
 #define DWC3_GCTL_PWRDNSCALE(n)        ((n) << 19)
-#define DWC3_GCTL_U2RSTECN     (1 << 16)
+#define DWC3_GCTL_U2RSTECN     BIT(16)
 #define DWC3_GCTL_RAMCLKSEL(x) (((x) & DWC3_GCTL_CLK_MASK) << 6)
 #define DWC3_GCTL_CLK_BUS      (0)
 #define DWC3_GCTL_CLK_PIPE     (1)
 #define DWC3_GCTL_PRTCAP_DEVICE        2
 #define DWC3_GCTL_PRTCAP_OTG   3
 
-#define DWC3_GCTL_CORESOFTRESET                (1 << 11)
-#define DWC3_GCTL_SOFITPSYNC           (1 << 10)
+#define DWC3_GCTL_CORESOFTRESET                BIT(11)
+#define DWC3_GCTL_SOFITPSYNC           BIT(10)
 #define DWC3_GCTL_SCALEDOWN(n)         ((n) << 4)
 #define DWC3_GCTL_SCALEDOWN_MASK       DWC3_GCTL_SCALEDOWN(3)
-#define DWC3_GCTL_DISSCRAMBLE          (1 << 3)
-#define DWC3_GCTL_U2EXIT_LFPS          (1 << 2)
-#define DWC3_GCTL_GBLHIBERNATIONEN     (1 << 1)
-#define DWC3_GCTL_DSBLCLKGTNG          (1 << 0)
+#define DWC3_GCTL_DISSCRAMBLE          BIT(3)
+#define DWC3_GCTL_U2EXIT_LFPS          BIT(2)
+#define DWC3_GCTL_GBLHIBERNATIONEN     BIT(1)
+#define DWC3_GCTL_DSBLCLKGTNG          BIT(0)
 
 /* Global User Control 1 Register */
-#define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW  (1 << 24)
+#define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW  BIT(24)
 
 /* Global USB2 PHY Configuration Register */
-#define DWC3_GUSB2PHYCFG_PHYSOFTRST    (1 << 31)
-#define DWC3_GUSB2PHYCFG_U2_FREECLK_EXISTS     (1 << 30)
-#define DWC3_GUSB2PHYCFG_SUSPHY                (1 << 6)
-#define DWC3_GUSB2PHYCFG_ULPI_UTMI     (1 << 4)
-#define DWC3_GUSB2PHYCFG_ENBLSLPM      (1 << 8)
+#define DWC3_GUSB2PHYCFG_PHYSOFTRST    BIT(31)
+#define DWC3_GUSB2PHYCFG_U2_FREECLK_EXISTS     BIT(30)
+#define DWC3_GUSB2PHYCFG_SUSPHY                BIT(6)
+#define DWC3_GUSB2PHYCFG_ULPI_UTMI     BIT(4)
+#define DWC3_GUSB2PHYCFG_ENBLSLPM      BIT(8)
 #define DWC3_GUSB2PHYCFG_PHYIF(n)      (n << 3)
 #define DWC3_GUSB2PHYCFG_PHYIF_MASK    DWC3_GUSB2PHYCFG_PHYIF(1)
 #define DWC3_GUSB2PHYCFG_USBTRDTIM(n)  (n << 10)
 #define UTMI_PHYIF_8_BIT               0
 
 /* Global USB2 PHY Vendor Control Register */
-#define DWC3_GUSB2PHYACC_NEWREGREQ     (1 << 25)
-#define DWC3_GUSB2PHYACC_BUSY          (1 << 23)
-#define DWC3_GUSB2PHYACC_WRITE         (1 << 22)
+#define DWC3_GUSB2PHYACC_NEWREGREQ     BIT(25)
+#define DWC3_GUSB2PHYACC_BUSY          BIT(23)
+#define DWC3_GUSB2PHYACC_WRITE         BIT(22)
 #define DWC3_GUSB2PHYACC_ADDR(n)       (n << 16)
 #define DWC3_GUSB2PHYACC_EXTEND_ADDR(n)        (n << 8)
 #define DWC3_GUSB2PHYACC_DATA(n)       (n & 0xff)
 
 /* Global USB3 PIPE Control Register */
-#define DWC3_GUSB3PIPECTL_PHYSOFTRST   (1 << 31)
-#define DWC3_GUSB3PIPECTL_U2SSINP3OK   (1 << 29)
-#define DWC3_GUSB3PIPECTL_DISRXDETINP3 (1 << 28)
-#define DWC3_GUSB3PIPECTL_REQP1P2P3    (1 << 24)
+#define DWC3_GUSB3PIPECTL_PHYSOFTRST   BIT(31)
+#define DWC3_GUSB3PIPECTL_U2SSINP3OK   BIT(29)
+#define DWC3_GUSB3PIPECTL_DISRXDETINP3 BIT(28)
+#define DWC3_GUSB3PIPECTL_UX_EXIT_PX   BIT(27)
+#define DWC3_GUSB3PIPECTL_REQP1P2P3    BIT(24)
 #define DWC3_GUSB3PIPECTL_DEP1P2P3(n)  ((n) << 19)
 #define DWC3_GUSB3PIPECTL_DEP1P2P3_MASK        DWC3_GUSB3PIPECTL_DEP1P2P3(7)
 #define DWC3_GUSB3PIPECTL_DEP1P2P3_EN  DWC3_GUSB3PIPECTL_DEP1P2P3(1)
-#define DWC3_GUSB3PIPECTL_DEPOCHANGE   (1 << 18)
-#define DWC3_GUSB3PIPECTL_SUSPHY       (1 << 17)
-#define DWC3_GUSB3PIPECTL_LFPSFILT     (1 << 9)
-#define DWC3_GUSB3PIPECTL_RX_DETOPOLL  (1 << 8)
+#define DWC3_GUSB3PIPECTL_DEPOCHANGE   BIT(18)
+#define DWC3_GUSB3PIPECTL_SUSPHY       BIT(17)
+#define DWC3_GUSB3PIPECTL_LFPSFILT     BIT(9)
+#define DWC3_GUSB3PIPECTL_RX_DETOPOLL  BIT(8)
 #define DWC3_GUSB3PIPECTL_TX_DEEPH_MASK        DWC3_GUSB3PIPECTL_TX_DEEPH(3)
 #define DWC3_GUSB3PIPECTL_TX_DEEPH(n)  ((n) << 1)
 
 #define DWC3_GTXFIFOSIZ_TXFSTADDR(n)   ((n) & 0xffff0000)
 
 /* Global Event Size Registers */
-#define DWC3_GEVNTSIZ_INTMASK          (1 << 31)
+#define DWC3_GEVNTSIZ_INTMASK          BIT(31)
 #define DWC3_GEVNTSIZ_SIZE(n)          ((n) & 0xffff)
 
 /* Global HWPARAMS0 Register */
 #define DWC3_MAX_HIBER_SCRATCHBUFS             15
 
 /* Global HWPARAMS6 Register */
-#define DWC3_GHWPARAMS6_EN_FPGA                        (1 << 7)
+#define DWC3_GHWPARAMS6_EN_FPGA                        BIT(7)
 
 /* Global HWPARAMS7 Register */
 #define DWC3_GHWPARAMS7_RAM1_DEPTH(n)  ((n) & 0xffff)
 #define DWC3_GHWPARAMS7_RAM2_DEPTH(n)  (((n) >> 16) & 0xffff)
 
 /* Global Frame Length Adjustment Register */
-#define DWC3_GFLADJ_30MHZ_SDBND_SEL            (1 << 7)
+#define DWC3_GFLADJ_30MHZ_SDBND_SEL            BIT(7)
 #define DWC3_GFLADJ_30MHZ_MASK                 0x3f
 
 /* Global User Control Register 2 */
-#define DWC3_GUCTL2_RST_ACTBITLATER            (1 << 14)
+#define DWC3_GUCTL2_RST_ACTBITLATER            BIT(14)
 
 /* Device Configuration Register */
 #define DWC3_DCFG_DEVADDR(addr)        ((addr) << 3)
 #define DWC3_DCFG_SUPERSPEED_PLUS (5 << 0)  /* DWC_usb31 only */
 #define DWC3_DCFG_SUPERSPEED   (4 << 0)
 #define DWC3_DCFG_HIGHSPEED    (0 << 0)
-#define DWC3_DCFG_FULLSPEED    (1 << 0)
+#define DWC3_DCFG_FULLSPEED    BIT(0)
 #define DWC3_DCFG_LOWSPEED     (2 << 0)
 
 #define DWC3_DCFG_NUMP_SHIFT   17
 #define DWC3_DCFG_NUMP(n)      (((n) >> DWC3_DCFG_NUMP_SHIFT) & 0x1f)
 #define DWC3_DCFG_NUMP_MASK    (0x1f << DWC3_DCFG_NUMP_SHIFT)
-#define DWC3_DCFG_LPM_CAP      (1 << 22)
+#define DWC3_DCFG_LPM_CAP      BIT(22)
 
 /* Device Control Register */
-#define DWC3_DCTL_RUN_STOP     (1 << 31)
-#define DWC3_DCTL_CSFTRST      (1 << 30)
-#define DWC3_DCTL_LSFTRST      (1 << 29)
+#define DWC3_DCTL_RUN_STOP     BIT(31)
+#define DWC3_DCTL_CSFTRST      BIT(30)
+#define DWC3_DCTL_LSFTRST      BIT(29)
 
 #define DWC3_DCTL_HIRD_THRES_MASK      (0x1f << 24)
 #define DWC3_DCTL_HIRD_THRES(n)        ((n) << 24)
 
-#define DWC3_DCTL_APPL1RES     (1 << 23)
+#define DWC3_DCTL_APPL1RES     BIT(23)
 
 /* These apply for core versions 1.87a and earlier */
 #define DWC3_DCTL_TRGTULST_MASK                (0x0f << 17)
 #define DWC3_DCTL_LPM_ERRATA_MASK      DWC3_DCTL_LPM_ERRATA(0xf)
 #define DWC3_DCTL_LPM_ERRATA(n)                ((n) << 20)
 
-#define DWC3_DCTL_KEEP_CONNECT         (1 << 19)
-#define DWC3_DCTL_L1_HIBER_EN          (1 << 18)
-#define DWC3_DCTL_CRS                  (1 << 17)
-#define DWC3_DCTL_CSS                  (1 << 16)
+#define DWC3_DCTL_KEEP_CONNECT         BIT(19)
+#define DWC3_DCTL_L1_HIBER_EN          BIT(18)
+#define DWC3_DCTL_CRS                  BIT(17)
+#define DWC3_DCTL_CSS                  BIT(16)
 
-#define DWC3_DCTL_INITU2ENA            (1 << 12)
-#define DWC3_DCTL_ACCEPTU2ENA          (1 << 11)
-#define DWC3_DCTL_INITU1ENA            (1 << 10)
-#define DWC3_DCTL_ACCEPTU1ENA          (1 << 9)
+#define DWC3_DCTL_INITU2ENA            BIT(12)
+#define DWC3_DCTL_ACCEPTU2ENA          BIT(11)
+#define DWC3_DCTL_INITU1ENA            BIT(10)
+#define DWC3_DCTL_ACCEPTU1ENA          BIT(9)
 #define DWC3_DCTL_TSTCTRL_MASK         (0xf << 1)
 
 #define DWC3_DCTL_ULSTCHNGREQ_MASK     (0x0f << 5)
 #define DWC3_DCTL_ULSTCHNG_LOOPBACK    (DWC3_DCTL_ULSTCHNGREQ(11))
 
 /* Device Event Enable Register */
-#define DWC3_DEVTEN_VNDRDEVTSTRCVEDEN  (1 << 12)
-#define DWC3_DEVTEN_EVNTOVERFLOWEN     (1 << 11)
-#define DWC3_DEVTEN_CMDCMPLTEN         (1 << 10)
-#define DWC3_DEVTEN_ERRTICERREN                (1 << 9)
-#define DWC3_DEVTEN_SOFEN              (1 << 7)
-#define DWC3_DEVTEN_EOPFEN             (1 << 6)
-#define DWC3_DEVTEN_HIBERNATIONREQEVTEN        (1 << 5)
-#define DWC3_DEVTEN_WKUPEVTEN          (1 << 4)
-#define DWC3_DEVTEN_ULSTCNGEN          (1 << 3)
-#define DWC3_DEVTEN_CONNECTDONEEN      (1 << 2)
-#define DWC3_DEVTEN_USBRSTEN           (1 << 1)
-#define DWC3_DEVTEN_DISCONNEVTEN       (1 << 0)
+#define DWC3_DEVTEN_VNDRDEVTSTRCVEDEN  BIT(12)
+#define DWC3_DEVTEN_EVNTOVERFLOWEN     BIT(11)
+#define DWC3_DEVTEN_CMDCMPLTEN         BIT(10)
+#define DWC3_DEVTEN_ERRTICERREN                BIT(9)
+#define DWC3_DEVTEN_SOFEN              BIT(7)
+#define DWC3_DEVTEN_EOPFEN             BIT(6)
+#define DWC3_DEVTEN_HIBERNATIONREQEVTEN        BIT(5)
+#define DWC3_DEVTEN_WKUPEVTEN          BIT(4)
+#define DWC3_DEVTEN_ULSTCNGEN          BIT(3)
+#define DWC3_DEVTEN_CONNECTDONEEN      BIT(2)
+#define DWC3_DEVTEN_USBRSTEN           BIT(1)
+#define DWC3_DEVTEN_DISCONNEVTEN       BIT(0)
 
 /* Device Status Register */
-#define DWC3_DSTS_DCNRD                        (1 << 29)
+#define DWC3_DSTS_DCNRD                        BIT(29)
 
 /* This applies for core versions 1.87a and earlier */
-#define DWC3_DSTS_PWRUPREQ             (1 << 24)
+#define DWC3_DSTS_PWRUPREQ             BIT(24)
 
 /* These apply for core versions 1.94a and later */
-#define DWC3_DSTS_RSS                  (1 << 25)
-#define DWC3_DSTS_SSS                  (1 << 24)
+#define DWC3_DSTS_RSS                  BIT(25)
+#define DWC3_DSTS_SSS                  BIT(24)
 
-#define DWC3_DSTS_COREIDLE             (1 << 23)
-#define DWC3_DSTS_DEVCTRLHLT           (1 << 22)
+#define DWC3_DSTS_COREIDLE             BIT(23)
+#define DWC3_DSTS_DEVCTRLHLT           BIT(22)
 
 #define DWC3_DSTS_USBLNKST_MASK                (0x0f << 18)
 #define DWC3_DSTS_USBLNKST(n)          (((n) & DWC3_DSTS_USBLNKST_MASK) >> 18)
 
-#define DWC3_DSTS_RXFIFOEMPTY          (1 << 17)
+#define DWC3_DSTS_RXFIFOEMPTY          BIT(17)
 
 #define DWC3_DSTS_SOFFN_MASK           (0x3fff << 3)
 #define DWC3_DSTS_SOFFN(n)             (((n) & DWC3_DSTS_SOFFN_MASK) >> 3)
 #define DWC3_DSTS_SUPERSPEED_PLUS      (5 << 0) /* DWC_usb31 only */
 #define DWC3_DSTS_SUPERSPEED           (4 << 0)
 #define DWC3_DSTS_HIGHSPEED            (0 << 0)
-#define DWC3_DSTS_FULLSPEED            (1 << 0)
+#define DWC3_DSTS_FULLSPEED            BIT(0)
 #define DWC3_DSTS_LOWSPEED             (2 << 0)
 
 /* Device Generic Command Register */
 #define DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK        0x10
 
 #define DWC3_DGCMD_STATUS(n)           (((n) >> 12) & 0x0F)
-#define DWC3_DGCMD_CMDACT              (1 << 10)
-#define DWC3_DGCMD_CMDIOC              (1 << 8)
+#define DWC3_DGCMD_CMDACT              BIT(10)
+#define DWC3_DGCMD_CMDIOC              BIT(8)
 
 /* Device Generic Command Parameter Register */
-#define DWC3_DGCMDPAR_FORCE_LINKPM_ACCEPT      (1 << 0)
+#define DWC3_DGCMDPAR_FORCE_LINKPM_ACCEPT      BIT(0)
 #define DWC3_DGCMDPAR_FIFO_NUM(n)              ((n) << 0)
 #define DWC3_DGCMDPAR_RX_FIFO                  (0 << 5)
-#define DWC3_DGCMDPAR_TX_FIFO                  (1 << 5)
+#define DWC3_DGCMDPAR_TX_FIFO                  BIT(5)
 #define DWC3_DGCMDPAR_LOOPBACK_DIS             (0 << 0)
-#define DWC3_DGCMDPAR_LOOPBACK_ENA             (1 << 0)
+#define DWC3_DGCMDPAR_LOOPBACK_ENA             BIT(0)
 
 /* Device Endpoint Command Register */
 #define DWC3_DEPCMD_PARAM_SHIFT                16
 #define DWC3_DEPCMD_PARAM(x)           ((x) << DWC3_DEPCMD_PARAM_SHIFT)
 #define DWC3_DEPCMD_GET_RSC_IDX(x)     (((x) >> DWC3_DEPCMD_PARAM_SHIFT) & 0x7f)
 #define DWC3_DEPCMD_STATUS(x)          (((x) >> 12) & 0x0F)
-#define DWC3_DEPCMD_HIPRI_FORCERM      (1 << 11)
-#define DWC3_DEPCMD_CLEARPENDIN                (1 << 11)
-#define DWC3_DEPCMD_CMDACT             (1 << 10)
-#define DWC3_DEPCMD_CMDIOC             (1 << 8)
+#define DWC3_DEPCMD_HIPRI_FORCERM      BIT(11)
+#define DWC3_DEPCMD_CLEARPENDIN                BIT(11)
+#define DWC3_DEPCMD_CMDACT             BIT(10)
+#define DWC3_DEPCMD_CMDIOC             BIT(8)
 
 #define DWC3_DEPCMD_DEPSTARTCFG                (0x09 << 0)
 #define DWC3_DEPCMD_ENDTRANSFER                (0x08 << 0)
 #define DWC3_DEPCMD_CMD(x)             ((x) & 0xf)
 
 /* The EP number goes 0..31 so ep0 is always out and ep1 is always in */
-#define DWC3_DALEPENA_EP(n)            (1 << n)
+#define DWC3_DALEPENA_EP(n)            BIT(n)
 
 #define DWC3_DEPCMD_TYPE_CONTROL       0
 #define DWC3_DEPCMD_TYPE_ISOC          1
@@ -500,8 +502,8 @@ struct dwc3_event_buffer {
        struct dwc3             *dwc;
 };
 
-#define DWC3_EP_FLAG_STALLED   (1 << 0)
-#define DWC3_EP_FLAG_WEDGED    (1 << 1)
+#define DWC3_EP_FLAG_STALLED   BIT(0)
+#define DWC3_EP_FLAG_WEDGED    BIT(1)
 
 #define DWC3_EP_DIRECTION_TX   true
 #define DWC3_EP_DIRECTION_RX   false
@@ -550,17 +552,17 @@ struct dwc3_ep {
 
        u32                     saved_state;
        unsigned                flags;
-#define DWC3_EP_ENABLED                (1 << 0)
-#define DWC3_EP_STALL          (1 << 1)
-#define DWC3_EP_WEDGE          (1 << 2)
-#define DWC3_EP_BUSY           (1 << 4)
-#define DWC3_EP_PENDING_REQUEST        (1 << 5)
-#define DWC3_EP_MISSED_ISOC    (1 << 6)
-#define DWC3_EP_END_TRANSFER_PENDING   (1 << 7)
-#define DWC3_EP_TRANSFER_STARTED (1 << 8)
+#define DWC3_EP_ENABLED                BIT(0)
+#define DWC3_EP_STALL          BIT(1)
+#define DWC3_EP_WEDGE          BIT(2)
+#define DWC3_EP_BUSY           BIT(4)
+#define DWC3_EP_PENDING_REQUEST        BIT(5)
+#define DWC3_EP_MISSED_ISOC    BIT(6)
+#define DWC3_EP_END_TRANSFER_PENDING   BIT(7)
+#define DWC3_EP_TRANSFER_STARTED BIT(8)
 
        /* This last one is specific to EP0 */
-#define DWC3_EP0_DIR_IN                (1 << 31)
+#define DWC3_EP0_DIR_IN                BIT(31)
 
        /*
         * IMPORTANT: we *know* we have 256 TRBs in our @trb_pool, so we will
@@ -638,13 +640,13 @@ enum dwc3_link_state {
 #define DWC3_TRB_STS_XFER_IN_PROG      4
 
 /* TRB Control */
-#define DWC3_TRB_CTRL_HWO              (1 << 0)
-#define DWC3_TRB_CTRL_LST              (1 << 1)
-#define DWC3_TRB_CTRL_CHN              (1 << 2)
-#define DWC3_TRB_CTRL_CSP              (1 << 3)
+#define DWC3_TRB_CTRL_HWO              BIT(0)
+#define DWC3_TRB_CTRL_LST              BIT(1)
+#define DWC3_TRB_CTRL_CHN              BIT(2)
+#define DWC3_TRB_CTRL_CSP              BIT(3)
 #define DWC3_TRB_CTRL_TRBCTL(n)                (((n) & 0x3f) << 4)
-#define DWC3_TRB_CTRL_ISP_IMI          (1 << 10)
-#define DWC3_TRB_CTRL_IOC              (1 << 11)
+#define DWC3_TRB_CTRL_ISP_IMI          BIT(10)
+#define DWC3_TRB_CTRL_IOC              BIT(11)
 #define DWC3_TRB_CTRL_SID_SOFN(n)      (((n) & 0xffff) << 14)
 
 #define DWC3_TRBCTL_TYPE(n)            ((n) & (0x3f << 4))
@@ -746,6 +748,7 @@ struct dwc3_request {
        unsigned                direction:1;
        unsigned                mapped:1;
        unsigned                started:1;
+       unsigned                zero:1;
 };
 
 /*
@@ -758,15 +761,11 @@ struct dwc3_scratchpad_array {
 
 /**
  * struct dwc3 - representation of our controller
- * @ctrl_req: usb control request which is used for ep0
+ * @drd_work - workqueue used for role swapping
  * @ep0_trb: trb which is used for the ctrl_req
- * @ep0_bounce: bounce buffer for ep0
- * @zlp_buf: used when request->zero is set
  * @setup_buf: used while precessing STD USB requests
- * @ctrl_req_addr: dma address of ctrl_req
  * @ep0_trb: dma address of ep0_trb
  * @ep0_usb_req: dummy req used while handling STD USB requests
- * @ep0_bounce_addr: dma address of ep0_bounce
  * @scratch_addr: dma address of scratchbuf
  * @ep0_in_setup: one control transfer is completed and enter setup phase
  * @lock: for synchronizing
@@ -784,6 +783,8 @@ struct dwc3_scratchpad_array {
  * @maximum_speed: maximum speed requested (mainly for testing purposes)
  * @revision: revision register contents
  * @dr_mode: requested mode of operation
+ * @current_dr_role: current role of operation when in dual-role mode
+ * @desired_dr_role: desired role of operation when in dual-role mode
  * @hsphy_mode: UTMI phy mode, one of following:
  *             - USBPHY_INTERFACE_MODE_UTMI
  *             - USBPHY_INTERFACE_MODE_UTMIW
@@ -799,8 +800,7 @@ struct dwc3_scratchpad_array {
  * @u2pel: parameter from Set SEL request.
  * @u1sel: parameter from Set SEL request.
  * @u1pel: parameter from Set SEL request.
- * @num_out_eps: number of out endpoints
- * @num_in_eps: number of in endpoints
+ * @num_eps: number of endpoints
  * @ep0_next_event: hold the next expected event
  * @ep0state: state of endpoint zero
  * @link_state: link state
@@ -858,17 +858,13 @@ struct dwc3_scratchpad_array {
  *                 increments or 0 to disable.
  */
 struct dwc3 {
-       struct usb_ctrlrequest  *ctrl_req;
+       struct work_struct      drd_work;
        struct dwc3_trb         *ep0_trb;
        void                    *bounce;
-       void                    *ep0_bounce;
-       void                    *zlp_buf;
        void                    *scratchbuf;
        u8                      *setup_buf;
-       dma_addr_t              ctrl_req_addr;
        dma_addr_t              ep0_trb_addr;
        dma_addr_t              bounce_addr;
-       dma_addr_t              ep0_bounce_addr;
        dma_addr_t              scratch_addr;
        struct dwc3_request     ep0_usb_req;
        struct completion       ep0_in_setup;
@@ -900,6 +896,8 @@ struct dwc3 {
        size_t                  regs_size;
 
        enum usb_dr_mode        dr_mode;
+       u32                     current_dr_role;
+       u32                     desired_dr_role;
        enum usb_phy_interface  hsphy_mode;
 
        u32                     fladj;
@@ -960,8 +958,7 @@ struct dwc3 {
 
        u8                      speed;
 
-       u8                      num_out_eps;
-       u8                      num_in_eps;
+       u8                      num_eps;
 
        struct dwc3_hwparams    hwparams;
        struct dentry           *root;
@@ -1010,7 +1007,7 @@ struct dwc3 {
        u16                     imod_interval;
 };
 
-/* -------------------------------------------------------------------------- */
+#define work_to_dwc(w)         (container_of((w), struct dwc3, drd_work))
 
 /* -------------------------------------------------------------------------- */
 
@@ -1054,13 +1051,13 @@ struct dwc3_event_depevt {
        u32     status:4;
 
 /* Within XferNotReady */
-#define DEPEVT_STATUS_TRANSFER_ACTIVE  (1 << 3)
+#define DEPEVT_STATUS_TRANSFER_ACTIVE  BIT(3)
 
 /* Within XferComplete */
-#define DEPEVT_STATUS_BUSERR   (1 << 0)
-#define DEPEVT_STATUS_SHORT    (1 << 1)
-#define DEPEVT_STATUS_IOC      (1 << 2)
-#define DEPEVT_STATUS_LST      (1 << 3)
+#define DEPEVT_STATUS_BUSERR   BIT(0)
+#define DEPEVT_STATUS_SHORT    BIT(1)
+#define DEPEVT_STATUS_IOC      BIT(2)
+#define DEPEVT_STATUS_LST      BIT(3)
 
 /* Stream event only */
 #define DEPEVT_STREAMEVT_FOUND         1