Skip to contentSkip to conversation

Add clock and reset in cdns3 platform

PATCH Superseded Minda Chen 3 participants 9 messages May 2, 2023 – May 6, 2023

Subsystems (4)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Minda Chen

author
#0 lore raw

cover Add clock and reset in cdns3 platform

The patchset is add generic clock and reset init codes in Cadence USBSS controller.

This patchset is base on v6.3-rc4.

patch 1 is add clock and reset dts in cdns3 dt-binding doc. patch 2 is cdns3 platform codes changes.

Minda Chen (2):
dt-binding: cdns,usb3: Add clock and reset
usb: cdns3: cdns3-plat: Add clk and reset init

 .../devicetree/bindings/usb/cdns,usb3.yaml    | 12 +++++
 drivers/usb/cdns3/cdns3-plat.c                | 52 +++++++++++++++++++
 drivers/usb/cdns3/core.h                      |  3 ++
 3 files changed, 67 insertions(+)

base-commit: 197b6b60ae7bc51dd0814953c562833143b292aa

Signature · 1 line
2.17.1
author
#1 lore raw

PATCH 1/2 dt-binding: cdns,usb3: Add clock and reset

To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.

---
 Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++
 1 file changed, 12 insertions(+)
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +12 -0
index cae46c4982ad..7bffd8fb1e38 100644
@@ -42,6 +42,18 @@ properties:
       - const: otg
       - const: wakeup
 
+  clocks:
+    minItems: 1
+
+  clock-names:
+    minItems: 1
+
+  resets:
+    minItems: 1
+
+  reset-names:
+    minItems: 1
+
   dr_mode:
     enum: [host, otg, peripheral]
 
Signature · 1 line
2.17.1
#2 lore raw

Re: [PATCH v1 1/2] dt-binding: cdns,usb3: Add clock and reset

Quoted 4 lines · Minda Chen

To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.

Subject prefix: dt-bindings

Quoted 9 lines
---
 Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++
 1 file changed, 12 insertions(+)
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +0 -0
index cae46c4982ad..7bffd8fb1e38 100644

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 46

Quoted 5 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +2 -0
@@ -42,6 +42,18 @@ properties:
       - const: otg
       - const: wakeup
 
+  clocks:
+    minItems: 1

no, this must maxItems.

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 49

Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3 -0
+
+  clock-names:
+    minItems: 1

Drop entire property, not useful without descriptive name.

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 52

Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3 -0
+
+  resets:
+    minItems: 1

instead maxItems.

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 55

Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3 -0
+
+  reset-names:
+    minItems: 1

Drop entire property, not useful without descriptive name.

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 59

Quoted 4 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +1 -0
+
   dr_mode:
     enum: [host, otg, peripheral]
 

Best regards,
Krzysztof

author
#3 lore raw

Re: [PATCH v1 1/2] dt-binding: cdns,usb3: Add clock and reset

Quoted 8 lines · Krzysztof Kozlowski
Quoted 4 lines · Minda Chen

To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.

Subject prefix: dt-bindings

ok

Quoted 12 lines
Quoted 12 lines
---
 Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++
 1 file changed, 12 insertions(+)
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +0 -0
index cae46c4982ad..7bffd8fb1e38 100644
@@ -42,6 +42,18 @@ properties:
       - const: otg
       - const: wakeup
 
Quoted 5 lines

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 46

Quoted 2 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +2 -0
+  clocks:
+    minItems: 1

no, this must maxItems.

ok

Quoted 6 lines

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 49

Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3 -0
+
+  clock-names:
+    minItems: 1

Drop entire property, not useful without descriptive name.

So I will delete clock-names and reset-names in my starfive codes.

Quoted 20 lines

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 52

Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3 -0
+
+  resets:
+    minItems: 1

instead maxItems.

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 55

Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3 -0
+
+  reset-names:
+    minItems: 1

Drop entire property, not useful without descriptive name.

Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 59

Quoted 4 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +1 -0
+
   dr_mode:
     enum: [host, otg, peripheral]
 

Best regards,
Krzysztof

#4 lore raw

Re: [PATCH v1 1/2] dt-binding: cdns,usb3: Add clock and reset

In reply to Minda Chen
Quoted 2 lines · Minda Chen

To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.

s/. Add/, add/
(although still weird sentence)

Quoted 4 lines
---
 Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++

Also update the example or any in-tree DTS. Why existing users do not need it? Aren't you duplicating clocks with wrapping node?

Best regards,
Krzysztof

author
#5 lore raw

Re: [PATCH v1 1/2] dt-binding: cdns,usb3: Add clock and reset

Quoted 7 lines · Krzysztof Kozlowski
Quoted 2 lines · Minda Chen

To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.

s/. Add/, add/
(although still weird sentence)

ok

Quoted 11 lines
Quoted 4 lines
---
 Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++

Also update the example or any in-tree DTS. Why existing users do not need it? Aren't you duplicating clocks with wrapping node?

Best regards,
Krzysztof

I will update the example. Exiting users are NXP and TI. NXP codes do not contain clock and resets, TI usb2 refclk require to set clock rate, TI codes can't direct use it. And I don't know TI's hardware. Maybe Roger can take into account to use it.

author
#6 lore raw

PATCH 2/2 usb: cdns3: cdns3-plat: Add clk and reset init

In reply to Minda Chen

Add gereric clk and reset init codes to Cadence USBSS controller. The codes has been tested by starfive vf2 board.

---
 drivers/usb/cdns3/cdns3-plat.c | 52 ++++++++++++++++++++++++++++++++++
 drivers/usb/cdns3/core.h       |  3 ++
 2 files changed, 55 insertions(+)
drivers/usb/cdns3/cdns3-plat.c +52 -0
index 2bc5d094548b..1820844c74d2 100644
@@ -12,11 +12,13 @@
  *         Roger Quadros <[email protected]>
  */
 
+#include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/irq.h>
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/reset.h>
 
 #include "core.h"
 #include "gadget-export.h"
@@ -43,6 +45,34 @@ static void set_phy_power_off(struct cdns *cdns)
 	phy_power_off(cdns->usb2_phy);
 }
 
+static int cdns3_clk_rst_init(struct cdns *cdns)
+{
+	int ret;
+
+	if (cdns->num_clks) {
+		ret = clk_bulk_prepare_enable(cdns->num_clks, cdns->clks);
+		if (ret)
+			return ret;
+	}
+
+	ret = reset_control_deassert(cdns->resets);
+	if (ret && cdns->num_clks)
+		goto err_clk_init;
+
+	return ret;
+
+err_clk_init:
+	clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);
+	return ret;
+}
+
+static void cdns3_clk_rst_deinit(struct cdns *cdns)
+{
+	reset_control_assert(cdns->resets);
+	if (cdns->num_clks)
+		clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);
+}
+
 /**
  * cdns3_plat_probe - probe for cdns3 core device
  * @pdev: Pointer to cdns3 core platform device
@@ -116,6 +146,16 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 		cdns->wakeup_irq = 0x0;
 	}
 
+	ret = devm_clk_bulk_get_all(dev, &cdns->clks);
+	if (ret < 0)
+		return ret;
+
+	cdns->num_clks = ret;
+
+	cdns->resets = devm_reset_control_array_get_optional_exclusive(dev);
+	if (IS_ERR(cdns->resets))
+		return PTR_ERR(cdns->resets);
+
 	cdns->usb2_phy = devm_phy_optional_get(dev, "cdns3,usb2-phy");
 	if (IS_ERR(cdns->usb2_phy))
 		return PTR_ERR(cdns->usb2_phy);
@@ -128,6 +168,10 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 	if (IS_ERR(cdns->usb3_phy))
 		return PTR_ERR(cdns->usb3_phy);
 
+	ret = cdns3_clk_rst_init(cdns);
+	if (ret)
+		return ret;
+
 	ret = phy_init(cdns->usb3_phy);
 	if (ret)
 		goto err_phy3_init;
@@ -165,6 +209,7 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 	phy_exit(cdns->usb3_phy);
 err_phy3_init:
 	phy_exit(cdns->usb2_phy);
+	cdns3_clk_rst_deinit(cdns);
 
 	return ret;
 }
@@ -187,6 +232,8 @@ static int cdns3_plat_remove(struct platform_device *pdev)
 	set_phy_power_off(cdns);
 	phy_exit(cdns->usb2_phy);
 	phy_exit(cdns->usb3_phy);
+	cdns3_clk_rst_deinit(cdns);
+
 	return 0;
 }
 
@@ -220,6 +267,8 @@ static int cdns3_controller_suspend(struct device *dev, pm_message_t msg)
 
 	cdns3_set_platform_suspend(cdns->dev, true, wakeup);
 	set_phy_power_off(cdns);
+	if (!PMSG_IS_AUTO(msg))
+		cdns3_clk_rst_deinit(cdns);
 	spin_lock_irqsave(&cdns->lock, flags);
 	cdns->in_lpm = true;
 	spin_unlock_irqrestore(&cdns->lock, flags);
@@ -237,6 +286,9 @@ static int cdns3_controller_resume(struct device *dev, pm_message_t msg)
 	if (!cdns->in_lpm)
 		return 0;
 
+	if (!PMSG_IS_AUTO(msg))
+		cdns3_clk_rst_init(cdns);
+
 	if (cdns_power_is_lost(cdns)) {
 		phy_exit(cdns->usb2_phy);
 		ret = phy_init(cdns->usb2_phy);
drivers/usb/cdns3/core.h +3 -0
index 2d332a788871..b894768ee485 100644
@@ -111,6 +111,9 @@ struct cdns {
 	struct mutex			mutex;
 	enum usb_dr_mode		dr_mode;
 	struct usb_role_switch		*role_sw;
+	struct reset_control *resets;
+	struct clk_bulk_data *clks;
+	int num_clks;
 	bool				in_lpm;
 	bool				wakeup_pending;
 	struct cdns3_platform_data	*pdata;
Signature · 1 line
2.17.1
reviewer
#7 lore raw

Re: [PATCH v1 2/2] usb: cdns3: cdns3-plat: Add clk and reset init

Hi,

Quoted 35 lines · Minda Chen

Add gereric clk and reset init codes to Cadence USBSS controller. The codes has been tested by starfive vf2 board.

---
 drivers/usb/cdns3/cdns3-plat.c | 52 ++++++++++++++++++++++++++++++++++
 drivers/usb/cdns3/core.h       |  3 ++
 2 files changed, 55 insertions(+)
drivers/usb/cdns3/cdns3-plat.c +5 -0
index 2bc5d094548b..1820844c74d2 100644
@@ -12,11 +12,13 @@
  *         Roger Quadros <[email protected]>
  */
 
+#include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/irq.h>
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/reset.h>
 
 #include "core.h"
 #include "gadget-export.h"
@@ -43,6 +45,34 @@ static void set_phy_power_off(struct cdns *cdns)
 	phy_power_off(cdns->usb2_phy);
 }
 
+static int cdns3_clk_rst_init(struct cdns *cdns)
+{
+	int ret;

drivers/usb/cdns3/cdns3-plat.c static void set_phy_power_off(struct cdns *cdns) · line 60

Quoted 10 lines
drivers/usb/cdns3/cdns3-plat.c +10 -0
+
+	if (cdns->num_clks) {
+		ret = clk_bulk_prepare_enable(cdns->num_clks, cdns->clks);
+		if (ret)
+			return ret;
+	}
+
+	ret = reset_control_deassert(cdns->resets);
+	if (ret && cdns->num_clks)
+		goto err_clk_init;

if (ret)

	goto err_clk_init;

drivers/usb/cdns3/cdns3-plat.c static void set_phy_power_off(struct cdns *cdns) · line 65

Quoted 5 lines
drivers/usb/cdns3/cdns3-plat.c +5 -0
+
+	return ret;
+
+err_clk_init:
+	clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);

if (cdns->num_clks)

	clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);

This way is more nicer I think.

Quoted 59 lines
drivers/usb/cdns3/cdns3-plat.c +27 -0
+	return ret;
+}
+
+static void cdns3_clk_rst_deinit(struct cdns *cdns)
+{
+	reset_control_assert(cdns->resets);
+	if (cdns->num_clks)
+		clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);
+}
+
 /**
  * cdns3_plat_probe - probe for cdns3 core device
  * @pdev: Pointer to cdns3 core platform device
@@ -116,6 +146,16 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 		cdns->wakeup_irq = 0x0;
 	}
 
+	ret = devm_clk_bulk_get_all(dev, &cdns->clks);
+	if (ret < 0)
+		return ret;
+
+	cdns->num_clks = ret;
+
+	cdns->resets = devm_reset_control_array_get_optional_exclusive(dev);
+	if (IS_ERR(cdns->resets))
+		return PTR_ERR(cdns->resets);
+
 	cdns->usb2_phy = devm_phy_optional_get(dev, "cdns3,usb2-phy");
 	if (IS_ERR(cdns->usb2_phy))
 		return PTR_ERR(cdns->usb2_phy);
@@ -128,6 +168,10 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 	if (IS_ERR(cdns->usb3_phy))
 		return PTR_ERR(cdns->usb3_phy);
 
+	ret = cdns3_clk_rst_init(cdns);
+	if (ret)
+		return ret;
+
 	ret = phy_init(cdns->usb3_phy);
 	if (ret)
 		goto err_phy3_init;
@@ -165,6 +209,7 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 	phy_exit(cdns->usb3_phy);
 err_phy3_init:
 	phy_exit(cdns->usb2_phy);
+	cdns3_clk_rst_deinit(cdns);
 
 	return ret;
 }
@@ -187,6 +232,8 @@ static int cdns3_plat_remove(struct platform_device *pdev)
 	set_phy_power_off(cdns);
 	phy_exit(cdns->usb2_phy);
 	phy_exit(cdns->usb3_phy);
+	cdns3_clk_rst_deinit(cdns);
+
 	return 0;
 }
 

drivers/usb/cdns3/cdns3-plat.c static int cdns3_controller_suspend(struct device *dev, pm_message_t msg) · line 271

Quoted 5 lines
drivers/usb/cdns3/cdns3-plat.c +2 -0
@@ -220,6 +267,8 @@ static int cdns3_controller_suspend(struct device *dev, pm_message_t msg)
 
 	cdns3_set_platform_suspend(cdns->dev, true, wakeup);
 	set_phy_power_off(cdns);
+	if (!PMSG_IS_AUTO(msg))
+		cdns3_clk_rst_deinit(cdns);

If you reset the controller here all state will be lost. How is it expected to work on system resume?

Quoted 18 lines
drivers/usb/cdns3/cdns3-plat.c +3 -0
 	spin_lock_irqsave(&cdns->lock, flags);
 	cdns->in_lpm = true;
 	spin_unlock_irqrestore(&cdns->lock, flags);
@@ -237,6 +286,9 @@ static int cdns3_controller_resume(struct device *dev, pm_message_t msg)
 	if (!cdns->in_lpm)
 		return 0;
 
+	if (!PMSG_IS_AUTO(msg))
+		cdns3_clk_rst_init(cdns);
+
 	if (cdns_power_is_lost(cdns)) {
 		phy_exit(cdns->usb2_phy);
 		ret = phy_init(cdns->usb2_phy);
drivers/usb/cdns3/core.h +0 -0
index 2d332a788871..b894768ee485 100644

drivers/usb/cdns3/core.h struct cdns { · line 119

Quoted 9 lines
drivers/usb/cdns3/core.h +3 -0
@@ -111,6 +111,9 @@ struct cdns {
 	struct mutex			mutex;
 	enum usb_dr_mode		dr_mode;
 	struct usb_role_switch		*role_sw;
+	struct reset_control *resets;
+	struct clk_bulk_data *clks;
+	int num_clks;
 	bool				in_lpm;
 	bool				wakeup_pending;
 	struct cdns3_platform_data	*pdata;

cheers,
-roger

author
#8 lore raw

Re: [PATCH v1 2/2] usb: cdns3: cdns3-plat: Add clk and reset init

Quoted 59 lines · Roger Quadros

Hi,

Quoted 35 lines · Minda Chen

Add gereric clk and reset init codes to Cadence USBSS controller. The codes has been tested by starfive vf2 board.

---
 drivers/usb/cdns3/cdns3-plat.c | 52 ++++++++++++++++++++++++++++++++++
 drivers/usb/cdns3/core.h       |  3 ++
 2 files changed, 55 insertions(+)
drivers/usb/cdns3/cdns3-plat.c +5 -0
index 2bc5d094548b..1820844c74d2 100644
@@ -12,11 +12,13 @@
  *         Roger Quadros <[email protected]>
  */
 
+#include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/irq.h>
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/reset.h>
 
 #include "core.h"
 #include "gadget-export.h"
@@ -43,6 +45,34 @@ static void set_phy_power_off(struct cdns *cdns)
 	phy_power_off(cdns->usb2_phy);
 }
 
+static int cdns3_clk_rst_init(struct cdns *cdns)
+{
+	int ret;

drivers/usb/cdns3/cdns3-plat.c static void set_phy_power_off(struct cdns *cdns) · line 60

Quoted 10 lines
drivers/usb/cdns3/cdns3-plat.c +10 -0
+
+	if (cdns->num_clks) {
+		ret = clk_bulk_prepare_enable(cdns->num_clks, cdns->clks);
+		if (ret)
+			return ret;
+	}
+
+	ret = reset_control_deassert(cdns->resets);
+	if (ret && cdns->num_clks)
+		goto err_clk_init;

if (ret)

	goto err_clk_init;

drivers/usb/cdns3/cdns3-plat.c static void set_phy_power_off(struct cdns *cdns) · line 65

Quoted 5 lines
drivers/usb/cdns3/cdns3-plat.c +5 -0
+
+	return ret;
+
+err_clk_init:
+	clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);

if (cdns->num_clks)

Quoted 4 lines
	clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);

This way is more nicer I think.

OK, thanks.

Quoted 60 lines
Quoted 60 lines
drivers/usb/cdns3/cdns3-plat.c +27 -0
+	return ret;
+}
+
+static void cdns3_clk_rst_deinit(struct cdns *cdns)
+{
+	reset_control_assert(cdns->resets);
+	if (cdns->num_clks)
+		clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);
+}
+
 /**
  * cdns3_plat_probe - probe for cdns3 core device
  * @pdev: Pointer to cdns3 core platform device
@@ -116,6 +146,16 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 		cdns->wakeup_irq = 0x0;
 	}
 
+	ret = devm_clk_bulk_get_all(dev, &cdns->clks);
+	if (ret < 0)
+		return ret;
+
+	cdns->num_clks = ret;
+
+	cdns->resets = devm_reset_control_array_get_optional_exclusive(dev);
+	if (IS_ERR(cdns->resets))
+		return PTR_ERR(cdns->resets);
+
 	cdns->usb2_phy = devm_phy_optional_get(dev, "cdns3,usb2-phy");
 	if (IS_ERR(cdns->usb2_phy))
 		return PTR_ERR(cdns->usb2_phy);
@@ -128,6 +168,10 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 	if (IS_ERR(cdns->usb3_phy))
 		return PTR_ERR(cdns->usb3_phy);
 
+	ret = cdns3_clk_rst_init(cdns);
+	if (ret)
+		return ret;
+
 	ret = phy_init(cdns->usb3_phy);
 	if (ret)
 		goto err_phy3_init;
@@ -165,6 +209,7 @@ static int cdns3_plat_probe(struct platform_device *pdev)
 	phy_exit(cdns->usb3_phy);
 err_phy3_init:
 	phy_exit(cdns->usb2_phy);
+	cdns3_clk_rst_deinit(cdns);
 
 	return ret;
 }
@@ -187,6 +232,8 @@ static int cdns3_plat_remove(struct platform_device *pdev)
 	set_phy_power_off(cdns);
 	phy_exit(cdns->usb2_phy);
 	phy_exit(cdns->usb3_phy);
+	cdns3_clk_rst_deinit(cdns);
+
 	return 0;
 }
 
@@ -220,6 +267,8 @@ static int cdns3_controller_suspend(struct device *dev, pm_message_t msg)
 
Quoted 8 lines

drivers/usb/cdns3/cdns3-plat.c static int cdns3_controller_suspend(struct device *dev, pm_message_t msg) · line 271

Quoted 4 lines
drivers/usb/cdns3/cdns3-plat.c +2 -0
 	cdns3_set_platform_suspend(cdns->dev, true, wakeup);
 	set_phy_power_off(cdns);
+	if (!PMSG_IS_AUTO(msg))
+		cdns3_clk_rst_deinit(cdns);

If you reset the controller here all state will be lost. How is it expected to work on system resume?

I will delete them. This is platform codes.

Quoted 30 lines
Quoted 18 lines
drivers/usb/cdns3/cdns3-plat.c +3 -0
 	spin_lock_irqsave(&cdns->lock, flags);
 	cdns->in_lpm = true;
 	spin_unlock_irqrestore(&cdns->lock, flags);
@@ -237,6 +286,9 @@ static int cdns3_controller_resume(struct device *dev, pm_message_t msg)
 	if (!cdns->in_lpm)
 		return 0;
 
+	if (!PMSG_IS_AUTO(msg))
+		cdns3_clk_rst_init(cdns);
+
 	if (cdns_power_is_lost(cdns)) {
 		phy_exit(cdns->usb2_phy);
 		ret = phy_init(cdns->usb2_phy);
drivers/usb/cdns3/core.h +0 -0
index 2d332a788871..b894768ee485 100644

drivers/usb/cdns3/core.h struct cdns { · line 119

Quoted 9 lines
drivers/usb/cdns3/core.h +3 -0
@@ -111,6 +111,9 @@ struct cdns {
 	struct mutex			mutex;
 	enum usb_dr_mode		dr_mode;
 	struct usb_role_switch		*role_sw;
+	struct reset_control *resets;
+	struct clk_bulk_data *clks;
+	int num_clks;
 	bool				in_lpm;
 	bool				wakeup_pending;
 	struct cdns3_platform_data	*pdata;

cheers,
-roger