Sync Linux kernel dwc3 changes from v5.2 to v5.3.

The following files are preserved accross the import:
Makefile Kconfig dwc3-meson-g12a.c dwc3-meson-gxl.c dwc3-omap.c
dwc3-uniphier.c dwc3-generic.h dwc3-generic.c dwc3-generic-sti.c
dwc3-layerscape.c ti_usb_phy.c

Skipping unused files:
debugfs.c drd.c dwc3-exynos.c dwc3-haps.c dwc3-imx8mp.c dwc3-keystone.c
dwc3-octeon.c dwc3-of-simple.c dwc3-pci.c dwc3-qcom.c dwc3-qcom-legacy.c
dwc3-rtk.c dwc3-st.c dwc3-xilinx.c host.c trace.c trace.h ulpi.c

Note that this is a raw import and doesn't build.
A fixup commit at the end of the series fixes that.

List of commits: git log --oneline v5.2..v5.3
Commits imported:
332694f8a4f7 Revert "usb:gadget Separated decoding functions from dwc3 driver."
3db1b636c07e usb:gadget Separated decoding functions from dwc3 driver.
b3649dee5fbb usb: dwc3: pci: add support for TigerLake Devices
aa23ce847dda usb: dwc3: remove unused @lock member of dwc3_ep struct
dbb0569de852 usb: dwc3: pci: Add Support for Intel Elkhart Lake Devices
729dcffd1ed3 usb: dwc3: gadget: Add support for disabling U1 and U2 entries
4d20a6107050 usb: dwc3: qcom: Use of_clk_get_parent_count()
dc1b5d9aed17 usb: dwc3: Fix core validation in probe, move after clocks are 
enabled
7f5d6a469617 usb: dwc3: qcom: Improve error handling
a6e456209d08 usb: dwc3: qcom: Start USB in 'host mode' on the SDM845
2bc02355f8ba usb: dwc3: qcom: Add support for booting with ACPI
f90db10779ad usb: dwc3: meson-g12a: Add support for IRQ based OTG switching

Signed-off-by: Jens Wiklander <[email protected]>
---
 drivers/usb/dwc3/core.c   | 16 +++++++++++-----
 drivers/usb/dwc3/core.h   |  6 ++++--
 drivers/usb/dwc3/ep0.c    |  9 ++++++++-
 drivers/usb/dwc3/gadget.c | 22 ++++++++++++++++++++--
 drivers/usb/dwc3/gadget.h |  6 ++++++
 5 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 4aff1d8dbc4f..c9bb93a2c81e 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1282,6 +1282,10 @@ static void dwc3_get_properties(struct dwc3 *dwc)
                                "snps,dis_u2_susphy_quirk");
        dwc->dis_enblslpm_quirk = device_property_read_bool(dev,
                                "snps,dis_enblslpm_quirk");
+       dwc->dis_u1_entry_quirk = device_property_read_bool(dev,
+                               "snps,dis-u1-entry-quirk");
+       dwc->dis_u2_entry_quirk = device_property_read_bool(dev,
+                               "snps,dis-u2-entry-quirk");
        dwc->dis_rxdet_inp3_quirk = device_property_read_bool(dev,
                                "snps,dis_rxdet_inp3_quirk");
        dwc->dis_u2_freeclk_exists_quirk = device_property_read_bool(dev,
@@ -1423,11 +1427,6 @@ static int dwc3_probe(struct platform_device *pdev)
        dwc->regs       = regs;
        dwc->regs_size  = resource_size(&dwc_res);
 
-       if (!dwc3_core_is_valid(dwc)) {
-               dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n");
-               return -ENODEV;
-       }
-
        dwc3_get_properties(dwc);
 
        dwc->reset = devm_reset_control_get_optional_shared(dev, NULL);
@@ -1460,6 +1459,12 @@ static int dwc3_probe(struct platform_device *pdev)
        if (ret)
                goto unprepare_clks;
 
+       if (!dwc3_core_is_valid(dwc)) {
+               dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n");
+               ret = -ENODEV;
+               goto disable_clks;
+       }
+
        platform_set_drvdata(pdev, dwc);
        dwc3_cache_hwparams(dwc);
 
@@ -1525,6 +1530,7 @@ err1:
        pm_runtime_put_sync(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
 
+disable_clks:
        clk_bulk_disable(dwc->num_clks, dwc->clks);
 unprepare_clks:
        clk_bulk_unprepare(dwc->num_clks, dwc->clks);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index f19cbeb01087..3dd783b889cb 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -649,7 +649,6 @@ struct dwc3_event_buffer {
  * @cancelled_list: list of cancelled requests for this endpoint
  * @pending_list: list of pending requests for this endpoint
  * @started_list: list of started requests on this endpoint
- * @lock: spinlock for endpoint request queue traversal
  * @regs: pointer to first endpoint register
  * @trb_pool: array of transaction buffers
  * @trb_pool_dma: dma address of @trb_pool
@@ -677,7 +676,6 @@ struct dwc3_ep {
        struct list_head        pending_list;
        struct list_head        started_list;
 
-       spinlock_t              lock;
        void __iomem            *regs;
 
        struct dwc3_trb         *trb_pool;
@@ -1014,6 +1012,8 @@ struct dwc3_scratchpad_array {
  * @dis_u2_susphy_quirk: set if we disable usb2 suspend phy
  * @dis_enblslpm_quirk: set if we clear enblslpm in GUSB2PHYCFG,
  *                      disabling the suspend signal to the PHY.
+ * @dis_u1_entry_quirk: set if link entering into U1 state needs to be 
disabled.
+ * @dis_u2_entry_quirk: set if link entering into U2 state needs to be 
disabled.
  * @dis_rxdet_inp3_quirk: set if we disable Rx.Detect in P3
  * @dis_u2_freeclk_exists_quirk : set if we clear u2_freeclk_exists
  *                     in GUSB2PHYCFG, specify that USB2 PHY doesn't
@@ -1205,6 +1205,8 @@ struct dwc3 {
        unsigned                dis_u3_susphy_quirk:1;
        unsigned                dis_u2_susphy_quirk:1;
        unsigned                dis_enblslpm_quirk:1;
+       unsigned                dis_u1_entry_quirk:1;
+       unsigned                dis_u2_entry_quirk:1;
        unsigned                dis_rxdet_inp3_quirk:1;
        unsigned                dis_u2_freeclk_exists_quirk:1;
        unsigned                dis_del_phy_power_chg_quirk:1;
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 8efde178eef4..3996b9c4ff8d 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -379,6 +379,8 @@ static int dwc3_ep0_handle_u1(struct dwc3 *dwc, enum 
usb_device_state state,
        if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
                        (dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
                return -EINVAL;
+       if (set && dwc->dis_u1_entry_quirk)
+               return -EINVAL;
 
        reg = dwc3_readl(dwc->regs, DWC3_DCTL);
        if (set)
@@ -401,6 +403,8 @@ static int dwc3_ep0_handle_u2(struct dwc3 *dwc, enum 
usb_device_state state,
        if ((dwc->speed != DWC3_DSTS_SUPERSPEED) &&
                        (dwc->speed != DWC3_DSTS_SUPERSPEED_PLUS))
                return -EINVAL;
+       if (set && dwc->dis_u2_entry_quirk)
+               return -EINVAL;
 
        reg = dwc3_readl(dwc->regs, DWC3_DCTL);
        if (set)
@@ -626,7 +630,10 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct 
usb_ctrlrequest *ctrl)
                         * nothing is pending from application.
                         */
                        reg = dwc3_readl(dwc->regs, DWC3_DCTL);
-                       reg |= (DWC3_DCTL_ACCEPTU1ENA | DWC3_DCTL_ACCEPTU2ENA);
+                       if (!dwc->dis_u1_entry_quirk)
+                               reg |= DWC3_DCTL_ACCEPTU1ENA;
+                       if (!dwc->dis_u2_entry_quirk)
+                               reg |= DWC3_DCTL_ACCEPTU2ENA;
                        dwc3_writel(dwc->regs, DWC3_DCTL, reg);
                }
                break;
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index d67655384eb2..173f5329d3d9 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2073,6 +2073,25 @@ out:
        return 0;
 }
 
+static void dwc3_gadget_config_params(struct usb_gadget *g,
+                                     struct usb_dcd_config_params *params)
+{
+       struct dwc3             *dwc = gadget_to_dwc(g);
+
+       /* U1 Device exit Latency */
+       if (dwc->dis_u1_entry_quirk)
+               params->bU1devExitLat = 0;
+       else
+               params->bU1devExitLat = DWC3_DEFAULT_U1_DEV_EXIT_LAT;
+
+       /* U2 Device exit Latency */
+       if (dwc->dis_u2_entry_quirk)
+               params->bU2DevExitLat = 0;
+       else
+               params->bU2DevExitLat =
+                               cpu_to_le16(DWC3_DEFAULT_U2_DEV_EXIT_LAT);
+}
+
 static void dwc3_gadget_set_speed(struct usb_gadget *g,
                                  enum usb_device_speed speed)
 {
@@ -2142,6 +2161,7 @@ static const struct usb_gadget_ops dwc3_gadget_ops = {
        .udc_start              = dwc3_gadget_start,
        .udc_stop               = dwc3_gadget_stop,
        .udc_set_speed          = dwc3_gadget_set_speed,
+       .get_config_params      = dwc3_gadget_config_params,
 };
 
 /* -------------------------------------------------------------------------- 
*/
@@ -2251,8 +2271,6 @@ static int dwc3_gadget_init_endpoint(struct dwc3 *dwc, u8 
epnum)
                dep->endpoint.comp_desc = NULL;
        }
 
-       spin_lock_init(&dep->lock);
-
        if (num == 0)
                ret = dwc3_gadget_init_control_endpoint(dep);
        else if (direction)
diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h
index 3ed738e86ea7..5faf4d1249e0 100644
--- a/drivers/usb/dwc3/gadget.h
+++ b/drivers/usb/dwc3/gadget.h
@@ -48,6 +48,12 @@ struct dwc3;
 /* DEPXFERCFG parameter 0 */
 #define DWC3_DEPXFERCFG_NUM_XFER_RES(n)        ((n) & 0xffff)
 
+/* U1 Device exit Latency */
+#define DWC3_DEFAULT_U1_DEV_EXIT_LAT   0x0A    /* Less then 10 microsec */
+
+/* U2 Device exit Latency */
+#define DWC3_DEFAULT_U2_DEV_EXIT_LAT   0x1FF   /* Less then 511 microsec */
+
 /* -------------------------------------------------------------------------- 
*/
 
 #define to_dwc3_request(r)     (container_of(r, struct dwc3_request, request))
-- 
2.43.0

Reply via email to