Merge tag 'gpio-fixes-for-v5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / drivers / usb / dwc3 / core.h
index 052b20d..c5d5760 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/device.h>
 #include <linux/spinlock.h>
+#include <linux/mutex.h>
 #include <linux/ioport.h>
 #include <linux/list.h>
 #include <linux/bitops.h>
@@ -30,6 +31,8 @@
 
 #include <linux/phy/phy.h>
 
+#include <linux/power_supply.h>
+
 #define DWC3_MSG_MAX   500
 
 /* Global constants */
@@ -54,7 +57,7 @@
 #define DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE   3
 #define DWC3_DEVICE_EVENT_WAKEUP               4
 #define DWC3_DEVICE_EVENT_HIBER_REQ            5
-#define DWC3_DEVICE_EVENT_EOPF                 6
+#define DWC3_DEVICE_EVENT_SUSPEND              6
 #define DWC3_DEVICE_EVENT_SOF                  7
 #define DWC3_DEVICE_EVENT_ERRATIC_ERROR                9
 #define DWC3_DEVICE_EVENT_CMD_CMPL             10
 #define DWC3_GHWPARAMS8                0xc600
 #define DWC3_GUCTL3            0xc60c
 #define DWC3_GFLADJ            0xc630
+#define DWC3_GHWPARAMS9                0xc680
 
 /* Device Registers */
 #define DWC3_DCFG              0xc700
 #define DWC3_GHWPARAMS7_RAM1_DEPTH(n)  ((n) & 0xffff)
 #define DWC3_GHWPARAMS7_RAM2_DEPTH(n)  (((n) >> 16) & 0xffff)
 
+/* Global HWPARAMS9 Register */
+#define DWC3_GHWPARAMS9_DEV_TXF_FLUSH_BYPASS   BIT(0)
+
 /* Global Frame Length Adjustment Register */
 #define DWC3_GFLADJ_30MHZ_SDBND_SEL            BIT(7)
 #define DWC3_GFLADJ_30MHZ_MASK                 0x3f
 #define DWC3_DCFG_SUPERSPEED   (4 << 0)
 #define DWC3_DCFG_HIGHSPEED    (0 << 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      BIT(22)
+#define DWC3_DCFG_IGNSTRMPP    BIT(23)
 
 /* Device Control Register */
 #define DWC3_DCTL_RUN_STOP     BIT(31)
 #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_U3L2L1SUSPEN       BIT(6)
 #define DWC3_DEVTEN_HIBERNATIONREQEVTEN        BIT(5)
 #define DWC3_DEVTEN_WKUPEVTEN          BIT(4)
 #define DWC3_DEVTEN_ULSTCNGEN          BIT(3)
 #define DWC3_DSTS_SUPERSPEED           (4 << 0)
 #define DWC3_DSTS_HIGHSPEED            (0 << 0)
 #define DWC3_DSTS_FULLSPEED            BIT(0)
-#define DWC3_DSTS_LOWSPEED             (2 << 0)
 
 /* Device Generic Command Register */
 #define DWC3_DGCMD_SET_LMP             0x01
@@ -844,6 +850,7 @@ struct dwc3_trb {
  * @hwparams6: GHWPARAMS6
  * @hwparams7: GHWPARAMS7
  * @hwparams8: GHWPARAMS8
+ * @hwparams9: GHWPARAMS9
  */
 struct dwc3_hwparams {
        u32     hwparams0;
@@ -855,13 +862,12 @@ struct dwc3_hwparams {
        u32     hwparams6;
        u32     hwparams7;
        u32     hwparams8;
+       u32     hwparams9;
 };
 
 /* HWPARAMS0 */
 #define DWC3_MODE(n)           ((n) & 0x7)
 
-#define DWC3_MDWIDTH(n)                (((n) & 0xff00) >> 8)
-
 /* HWPARAMS1 */
 #define DWC3_NUM_INT(n)                (((n) & (0x3f << 15)) >> 15)
 
@@ -908,11 +914,13 @@ struct dwc3_request {
        unsigned int            remaining;
 
        unsigned int            status;
-#define DWC3_REQUEST_STATUS_QUEUED     0
-#define DWC3_REQUEST_STATUS_STARTED    1
-#define DWC3_REQUEST_STATUS_CANCELLED  2
-#define DWC3_REQUEST_STATUS_COMPLETED  3
-#define DWC3_REQUEST_STATUS_UNKNOWN    -1
+#define DWC3_REQUEST_STATUS_QUEUED             0
+#define DWC3_REQUEST_STATUS_STARTED            1
+#define DWC3_REQUEST_STATUS_DISCONNECTED       2
+#define DWC3_REQUEST_STATUS_DEQUEUED           3
+#define DWC3_REQUEST_STATUS_STALLED            4
+#define DWC3_REQUEST_STATUS_COMPLETED          5
+#define DWC3_REQUEST_STATUS_UNKNOWN            -1
 
        u8                      epnum;
        struct dwc3_trb         *trb;
@@ -946,6 +954,7 @@ struct dwc3_scratchpad_array {
  * @scratch_addr: dma address of scratchbuf
  * @ep0_in_setup: one control transfer is completed and enter setup phase
  * @lock: for synchronizing
+ * @mutex: for mode switching
  * @dev: pointer to our struct device
  * @sysdev: pointer to the DMA-capable device
  * @xhci: pointer to our xHCI child
@@ -986,6 +995,7 @@ struct dwc3_scratchpad_array {
  * @role_sw: usb_role_switch handle
  * @role_switch_default_mode: default operation mode of controller while
  *                     usb role is USB_ROLE_NONE.
+ * @usb_psy: pointer to power supply interface.
  * @usb2_phy: pointer to USB2 PHY
  * @usb3_phy: pointer to USB3 PHY
  * @usb2_generic_phy: pointer to USB2 PHY
@@ -1034,7 +1044,8 @@ struct dwc3_scratchpad_array {
  * @dis_start_transfer_quirk: set if start_transfer failure SW workaround is
  *                     not needed for DWC_usb31 version 1.70a-ea06 and below
  * @usb3_lpm_capable: set if hadrware supports Link Power Management
- * @usb2_lpm_disable: set to disable usb2 lpm
+ * @usb2_lpm_disable: set to disable usb2 lpm for host
+ * @usb2_gadget_lpm_disable: set to disable usb2 lpm for gadget
  * @disable_scramble_quirk: set if we enable the disable scramble quirk
  * @u2exit_lfps_quirk: set if we enable u2exit lfps quirk
  * @u2ss_inp3_quirk: set if we enable P3 OK for U2/SS Inactive quirk
@@ -1085,6 +1096,9 @@ struct dwc3 {
        /* device lock */
        spinlock_t              lock;
 
+       /* mode switching lock */
+       struct mutex            mutex;
+
        struct device           *dev;
        struct device           *sysdev;
 
@@ -1125,6 +1139,8 @@ struct dwc3 {
        struct usb_role_switch  *role_sw;
        enum usb_dr_mode        role_switch_default_mode;
 
+       struct power_supply     *usb_psy;
+
        u32                     fladj;
        u32                     irq_gadget;
        u32                     otg_irq;
@@ -1238,6 +1254,7 @@ struct dwc3 {
        unsigned                dis_start_transfer_quirk:1;
        unsigned                usb3_lpm_capable:1;
        unsigned                usb2_lpm_disable:1;
+       unsigned                usb2_gadget_lpm_disable:1;
 
        unsigned                disable_scramble_quirk:1;
        unsigned                u2exit_lfps_quirk:1;
@@ -1358,7 +1375,7 @@ struct dwc3_event_depevt {
  *     3       - ULStChng
  *     4       - WkUpEvt
  *     5       - Reserved
- *     6       - EOPF
+ *     6       - Suspend (EOPF on revisions 2.10a and prior)
  *     7       - SOF
  *     8       - Reserved
  *     9       - ErrticErr
@@ -1455,6 +1472,23 @@ u32 dwc3_core_fifo_space(struct dwc3_ep *dep, u8 type);
         (!(_ip##_VERSIONTYPE_##_to) ||                                 \
          dwc->version_type <= _ip##_VERSIONTYPE_##_to))
 
+/**
+ * dwc3_mdwidth - get MDWIDTH value in bits
+ * @dwc: pointer to our context structure
+ *
+ * Return MDWIDTH configuration value in bits.
+ */
+static inline u32 dwc3_mdwidth(struct dwc3 *dwc)
+{
+       u32 mdwidth;
+
+       mdwidth = DWC3_GHWPARAMS0_MDWIDTH(dwc->hwparams.hwparams0);
+       if (DWC3_IP_IS(DWC32))
+               mdwidth += DWC3_GHWPARAMS6_MDWIDTH(dwc->hwparams.hwparams6);
+
+       return mdwidth;
+}
+
 bool dwc3_has_imod(struct dwc3 *dwc);
 
 int dwc3_event_buffers_setup(struct dwc3 *dwc);