Sync Linux kernel dwc3 changes from v6.6 to v6.7.

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 v6.6..v6.7
Commits imported:
9cf87666fc6e USB: dwc3: qcom: fix ACPI platform device leak
9feefbf57d92 USB: dwc3: qcom: fix software node leak on probe errors
51392a1879ff USB: dwc3: qcom: fix resource leaks on probe deferral
aee70a1d7113 USB: dwc3: qcom: simplify wakeup interrupt setup
41f5a0973259 USB: dwc3: qcom: fix wakeup after probe deferral
8bbae288a85a usb: dwc3: set the dma max_seg_size
791cd7afe51b usb: dwc3: add missing of_node_put and platform_device_put
10d510abd096 usb: dwc3: Fix default mode initialization
97789b93b792 usb: dwc3: add optional PHY interface clocks
de7ecc4e0570 usb: dwc3: xilinx: add reset-controller support
d0d27ef87e1c Merge 6.6-rc6 into usb-next
e24bc293a6a6 usb: dwc3: document gfladj_refclk_lpm_sel field
e72fc8d6a12a usb: dwc3: core: configure TX/RX threshold for DWC3_IP
34c200483569 usb: dwc3: add Realtek DHC RTD SoC dwc3 glue layer driver

Signed-off-by: Jens Wiklander <[email protected]>
---
 drivers/usb/dwc3/core.c | 190 ++++++++++++++++++++++++++++++++--------
 drivers/usb/dwc3/core.h |  19 ++++
 2 files changed, 173 insertions(+), 36 deletions(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 343d2570189f..b101dbf8c5dc 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -854,8 +854,20 @@ static int dwc3_clk_enable(struct dwc3 *dwc)
        if (ret)
                goto disable_ref_clk;
 
+       ret = clk_prepare_enable(dwc->utmi_clk);
+       if (ret)
+               goto disable_susp_clk;
+
+       ret = clk_prepare_enable(dwc->pipe_clk);
+       if (ret)
+               goto disable_utmi_clk;
+
        return 0;
 
+disable_utmi_clk:
+       clk_disable_unprepare(dwc->utmi_clk);
+disable_susp_clk:
+       clk_disable_unprepare(dwc->susp_clk);
 disable_ref_clk:
        clk_disable_unprepare(dwc->ref_clk);
 disable_bus_clk:
@@ -865,6 +877,8 @@ disable_bus_clk:
 
 static void dwc3_clk_disable(struct dwc3 *dwc)
 {
+       clk_disable_unprepare(dwc->pipe_clk);
+       clk_disable_unprepare(dwc->utmi_clk);
        clk_disable_unprepare(dwc->susp_clk);
        clk_disable_unprepare(dwc->ref_clk);
        clk_disable_unprepare(dwc->bus_clk);
@@ -1094,6 +1108,111 @@ static void dwc3_set_power_down_clk_scale(struct dwc3 
*dwc)
        }
 }
 
+static void dwc3_config_threshold(struct dwc3 *dwc)
+{
+       u32 reg;
+       u8 rx_thr_num;
+       u8 rx_maxburst;
+       u8 tx_thr_num;
+       u8 tx_maxburst;
+
+       /*
+        * Must config both number of packets and max burst settings to enable
+        * RX and/or TX threshold.
+        */
+       if (!DWC3_IP_IS(DWC3) && dwc->dr_mode == USB_DR_MODE_HOST) {
+               rx_thr_num = dwc->rx_thr_num_pkt_prd;
+               rx_maxburst = dwc->rx_max_burst_prd;
+               tx_thr_num = dwc->tx_thr_num_pkt_prd;
+               tx_maxburst = dwc->tx_max_burst_prd;
+
+               if (rx_thr_num && rx_maxburst) {
+                       reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG);
+                       reg |= DWC31_RXTHRNUMPKTSEL_PRD;
+
+                       reg &= ~DWC31_RXTHRNUMPKT_PRD(~0);
+                       reg |= DWC31_RXTHRNUMPKT_PRD(rx_thr_num);
+
+                       reg &= ~DWC31_MAXRXBURSTSIZE_PRD(~0);
+                       reg |= DWC31_MAXRXBURSTSIZE_PRD(rx_maxburst);
+
+                       dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg);
+               }
+
+               if (tx_thr_num && tx_maxburst) {
+                       reg = dwc3_readl(dwc->regs, DWC3_GTXTHRCFG);
+                       reg |= DWC31_TXTHRNUMPKTSEL_PRD;
+
+                       reg &= ~DWC31_TXTHRNUMPKT_PRD(~0);
+                       reg |= DWC31_TXTHRNUMPKT_PRD(tx_thr_num);
+
+                       reg &= ~DWC31_MAXTXBURSTSIZE_PRD(~0);
+                       reg |= DWC31_MAXTXBURSTSIZE_PRD(tx_maxburst);
+
+                       dwc3_writel(dwc->regs, DWC3_GTXTHRCFG, reg);
+               }
+       }
+
+       rx_thr_num = dwc->rx_thr_num_pkt;
+       rx_maxburst = dwc->rx_max_burst;
+       tx_thr_num = dwc->tx_thr_num_pkt;
+       tx_maxburst = dwc->tx_max_burst;
+
+       if (DWC3_IP_IS(DWC3)) {
+               if (rx_thr_num && rx_maxburst) {
+                       reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG);
+                       reg |= DWC3_GRXTHRCFG_PKTCNTSEL;
+
+                       reg &= ~DWC3_GRXTHRCFG_RXPKTCNT(~0);
+                       reg |= DWC3_GRXTHRCFG_RXPKTCNT(rx_thr_num);
+
+                       reg &= ~DWC3_GRXTHRCFG_MAXRXBURSTSIZE(~0);
+                       reg |= DWC3_GRXTHRCFG_MAXRXBURSTSIZE(rx_maxburst);
+
+                       dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg);
+               }
+
+               if (tx_thr_num && tx_maxburst) {
+                       reg = dwc3_readl(dwc->regs, DWC3_GTXTHRCFG);
+                       reg |= DWC3_GTXTHRCFG_PKTCNTSEL;
+
+                       reg &= ~DWC3_GTXTHRCFG_TXPKTCNT(~0);
+                       reg |= DWC3_GTXTHRCFG_TXPKTCNT(tx_thr_num);
+
+                       reg &= ~DWC3_GTXTHRCFG_MAXTXBURSTSIZE(~0);
+                       reg |= DWC3_GTXTHRCFG_MAXTXBURSTSIZE(tx_maxburst);
+
+                       dwc3_writel(dwc->regs, DWC3_GTXTHRCFG, reg);
+               }
+       } else {
+               if (rx_thr_num && rx_maxburst) {
+                       reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG);
+                       reg |= DWC31_GRXTHRCFG_PKTCNTSEL;
+
+                       reg &= ~DWC31_GRXTHRCFG_RXPKTCNT(~0);
+                       reg |= DWC31_GRXTHRCFG_RXPKTCNT(rx_thr_num);
+
+                       reg &= ~DWC31_GRXTHRCFG_MAXRXBURSTSIZE(~0);
+                       reg |= DWC31_GRXTHRCFG_MAXRXBURSTSIZE(rx_maxburst);
+
+                       dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg);
+               }
+
+               if (tx_thr_num && tx_maxburst) {
+                       reg = dwc3_readl(dwc->regs, DWC3_GTXTHRCFG);
+                       reg |= DWC31_GTXTHRCFG_PKTCNTSEL;
+
+                       reg &= ~DWC31_GTXTHRCFG_TXPKTCNT(~0);
+                       reg |= DWC31_GTXTHRCFG_TXPKTCNT(tx_thr_num);
+
+                       reg &= ~DWC31_GTXTHRCFG_MAXTXBURSTSIZE(~0);
+                       reg |= DWC31_GTXTHRCFG_MAXTXBURSTSIZE(tx_maxburst);
+
+                       dwc3_writel(dwc->regs, DWC3_GTXTHRCFG, reg);
+               }
+       }
+}
+
 /**
  * dwc3_core_init - Low-level initialization of DWC3 Core
  * @dwc: Pointer to our controller context structure
@@ -1246,42 +1365,7 @@ static int dwc3_core_init(struct dwc3 *dwc)
                dwc3_writel(dwc->regs, DWC3_GUCTL1, reg);
        }
 
-       /*
-        * Must config both number of packets and max burst settings to enable
-        * RX and/or TX threshold.
-        */
-       if (!DWC3_IP_IS(DWC3) && dwc->dr_mode == USB_DR_MODE_HOST) {
-               u8 rx_thr_num = dwc->rx_thr_num_pkt_prd;
-               u8 rx_maxburst = dwc->rx_max_burst_prd;
-               u8 tx_thr_num = dwc->tx_thr_num_pkt_prd;
-               u8 tx_maxburst = dwc->tx_max_burst_prd;
-
-               if (rx_thr_num && rx_maxburst) {
-                       reg = dwc3_readl(dwc->regs, DWC3_GRXTHRCFG);
-                       reg |= DWC31_RXTHRNUMPKTSEL_PRD;
-
-                       reg &= ~DWC31_RXTHRNUMPKT_PRD(~0);
-                       reg |= DWC31_RXTHRNUMPKT_PRD(rx_thr_num);
-
-                       reg &= ~DWC31_MAXRXBURSTSIZE_PRD(~0);
-                       reg |= DWC31_MAXRXBURSTSIZE_PRD(rx_maxburst);
-
-                       dwc3_writel(dwc->regs, DWC3_GRXTHRCFG, reg);
-               }
-
-               if (tx_thr_num && tx_maxburst) {
-                       reg = dwc3_readl(dwc->regs, DWC3_GTXTHRCFG);
-                       reg |= DWC31_TXTHRNUMPKTSEL_PRD;
-
-                       reg &= ~DWC31_TXTHRNUMPKT_PRD(~0);
-                       reg |= DWC31_TXTHRNUMPKT_PRD(tx_thr_num);
-
-                       reg &= ~DWC31_MAXTXBURSTSIZE_PRD(~0);
-                       reg |= DWC31_MAXTXBURSTSIZE_PRD(tx_maxburst);
-
-                       dwc3_writel(dwc->regs, DWC3_GTXTHRCFG, reg);
-               }
-       }
+       dwc3_config_threshold(dwc);
 
        return 0;
 
@@ -1417,6 +1501,10 @@ static void dwc3_get_properties(struct dwc3 *dwc)
        u8                      lpm_nyet_threshold;
        u8                      tx_de_emphasis;
        u8                      hird_threshold;
+       u8                      rx_thr_num_pkt = 0;
+       u8                      rx_max_burst = 0;
+       u8                      tx_thr_num_pkt = 0;
+       u8                      tx_max_burst = 0;
        u8                      rx_thr_num_pkt_prd = 0;
        u8                      rx_max_burst_prd = 0;
        u8                      tx_thr_num_pkt_prd = 0;
@@ -1479,6 +1567,14 @@ static void dwc3_get_properties(struct dwc3 *dwc)
                                "snps,usb2-lpm-disable");
        dwc->usb2_gadget_lpm_disable = device_property_read_bool(dev,
                                "snps,usb2-gadget-lpm-disable");
+       device_property_read_u8(dev, "snps,rx-thr-num-pkt",
+                               &rx_thr_num_pkt);
+       device_property_read_u8(dev, "snps,rx-max-burst",
+                               &rx_max_burst);
+       device_property_read_u8(dev, "snps,tx-thr-num-pkt",
+                               &tx_thr_num_pkt);
+       device_property_read_u8(dev, "snps,tx-max-burst",
+                               &tx_max_burst);
        device_property_read_u8(dev, "snps,rx-thr-num-pkt-prd",
                                &rx_thr_num_pkt_prd);
        device_property_read_u8(dev, "snps,rx-max-burst-prd",
@@ -1560,6 +1656,12 @@ static void dwc3_get_properties(struct dwc3 *dwc)
 
        dwc->hird_threshold = hird_threshold;
 
+       dwc->rx_thr_num_pkt = rx_thr_num_pkt;
+       dwc->rx_max_burst = rx_max_burst;
+
+       dwc->tx_thr_num_pkt = tx_thr_num_pkt;
+       dwc->tx_max_burst = tx_max_burst;
+
        dwc->rx_thr_num_pkt_prd = rx_thr_num_pkt_prd;
        dwc->rx_max_burst_prd = rx_max_burst_prd;
 
@@ -1785,6 +1887,20 @@ static int dwc3_get_clocks(struct dwc3 *dwc)
                }
        }
 
+       /* specific to Rockchip RK3588 */
+       dwc->utmi_clk = devm_clk_get_optional(dev, "utmi");
+       if (IS_ERR(dwc->utmi_clk)) {
+               return dev_err_probe(dev, PTR_ERR(dwc->utmi_clk),
+                               "could not get utmi clock\n");
+       }
+
+       /* specific to Rockchip RK3588 */
+       dwc->pipe_clk = devm_clk_get_optional(dev, "pipe");
+       if (IS_ERR(dwc->pipe_clk)) {
+               return dev_err_probe(dev, PTR_ERR(dwc->pipe_clk),
+                               "could not get pipe clock\n");
+       }
+
        return 0;
 }
 
@@ -1918,6 +2034,8 @@ static int dwc3_probe(struct platform_device *pdev)
 
        pm_runtime_put(dev);
 
+       dma_set_max_seg_size(dev, UINT_MAX);
+
        return 0;
 
 err_exit_debugfs:
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index a69ac67d89fe..efe6caf4d0e8 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -211,6 +211,11 @@
 #define DWC3_GRXTHRCFG_RXPKTCNT(n) (((n) & 0xf) << 24)
 #define DWC3_GRXTHRCFG_PKTCNTSEL BIT(29)
 
+/* Global TX Threshold Configuration Register */
+#define DWC3_GTXTHRCFG_MAXTXBURSTSIZE(n) (((n) & 0xff) << 16)
+#define DWC3_GTXTHRCFG_TXPKTCNT(n) (((n) & 0xf) << 24)
+#define DWC3_GTXTHRCFG_PKTCNTSEL BIT(29)
+
 /* Global RX Threshold Configuration Register for DWC_usb31 only */
 #define DWC31_GRXTHRCFG_MAXRXBURSTSIZE(n)      (((n) & 0x1f) << 16)
 #define DWC31_GRXTHRCFG_RXPKTCNT(n)            (((n) & 0x1f) << 21)
@@ -991,6 +996,8 @@ struct dwc3_scratchpad_array {
  * @bus_clk: clock for accessing the registers
  * @ref_clk: reference clock
  * @susp_clk: clock used when the SS phy is in low power (S3) state
+ * @utmi_clk: clock used for USB2 PHY communication
+ * @pipe_clk: clock used for USB3 PHY communication
  * @reset: reset control
  * @regs: base address for our registers
  * @regs_size: address space size
@@ -1045,6 +1052,10 @@ struct dwc3_scratchpad_array {
  * @test_mode_nr: test feature selector
  * @lpm_nyet_threshold: LPM NYET response threshold
  * @hird_threshold: HIRD threshold
+ * @rx_thr_num_pkt: USB receive packet count
+ * @rx_max_burst: max USB receive burst size
+ * @tx_thr_num_pkt: USB transmit packet count
+ * @tx_max_burst: max USB transmit burst size
  * @rx_thr_num_pkt_prd: periodic ESS receive packet count
  * @rx_max_burst_prd: max periodic ESS receive burst size
  * @tx_thr_num_pkt_prd: periodic ESS transmit packet count
@@ -1106,6 +1117,8 @@ struct dwc3_scratchpad_array {
  *                     instances in park mode.
  * @parkmode_disable_hs_quirk: set if we need to disable all HishSpeed
  *                     instances in park mode.
+ * @gfladj_refclk_lpm_sel: set if we need to enable SOF/ITP counter
+ *                          running based on ref_clk
  * @tx_de_emphasis_quirk: set if we enable Tx de-emphasis quirk
  * @tx_de_emphasis: Tx de-emphasis value
  *     0       - -6dB de-emphasis
@@ -1156,6 +1169,8 @@ struct dwc3 {
        struct clk              *bus_clk;
        struct clk              *ref_clk;
        struct clk              *susp_clk;
+       struct clk              *utmi_clk;
+       struct clk              *pipe_clk;
 
        struct reset_control    *reset;
 
@@ -1273,6 +1288,10 @@ struct dwc3 {
        u8                      test_mode_nr;
        u8                      lpm_nyet_threshold;
        u8                      hird_threshold;
+       u8                      rx_thr_num_pkt;
+       u8                      rx_max_burst;
+       u8                      tx_thr_num_pkt;
+       u8                      tx_max_burst;
        u8                      rx_thr_num_pkt_prd;
        u8                      rx_max_burst_prd;
        u8                      tx_thr_num_pkt_prd;
-- 
2.43.0

Reply via email to