Files
build/patch/kernel/archive/sunxi-5.18/patches.megous/usb-dwc3-Track-the-power-state-of-usb3_generic_phy.patch
The-going 7b0c873f4d Sunxi 5.18: add megous patches: tag: orange-pi-5.18-20220627-1924 (#3946)
* sunxi-5.18: add megous patches: tag: orange-pi-5.18-20220627-1924

* tools: mk_format_patch: ignore-matching-lines git version

* sunxi-5.18: re-extracted armbian patches after being applied to 5.18.8

* sunxi-5.18: switch to version tag=v5.18.8
2022-07-01 01:02:59 +02:00

64 lines
1.9 KiB
Diff

From b01bae017ee319db09098ba72cffeb49c06c12a7 Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
Date: Mon, 27 Jun 2022 16:27:11 +0200
Subject: [PATCH 544/548] usb: dwc3: Track the power state of usb3_generic_phy
We will need to manage power state of this phy inisde set_mode work,
without any ability to perform recovery if power on fails, so we'll
need to track result of power on separately, to be able to balance
the phy on/off calls.
Signed-off-by: Ondrej Jirman <megi@xff.cz>
---
drivers/usb/dwc3/core.c | 7 ++++++-
drivers/usb/dwc3/core.h | 1 +
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index d28cd1a6709b..d881edddbc97 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -835,7 +835,9 @@ static void dwc3_core_exit(struct dwc3 *dwc)
usb_phy_set_suspend(dwc->usb2_phy, 1);
usb_phy_set_suspend(dwc->usb3_phy, 1);
phy_power_off(dwc->usb2_generic_phy);
- phy_power_off(dwc->usb3_generic_phy);
+ if (dwc->usb3_phy_powered)
+ phy_power_off(dwc->usb3_generic_phy);
+ dwc->usb3_phy_powered = false;
dwc3_clk_disable(dwc);
reset_control_assert(dwc->reset);
}
@@ -1124,6 +1126,8 @@ static int dwc3_core_init(struct dwc3 *dwc)
if (ret < 0)
goto err3;
+ dwc->usb3_phy_powered = true;
+
ret = dwc3_event_buffers_setup(dwc);
if (ret) {
dev_err(dwc->dev, "failed to setup event buffers\n");
@@ -1231,6 +1235,7 @@ static int dwc3_core_init(struct dwc3 *dwc)
err4:
phy_power_off(dwc->usb3_generic_phy);
+ dwc->usb3_phy_powered = false;
err3:
phy_power_off(dwc->usb2_generic_phy);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 5c9d467195a6..6b060c7e8d44 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -1151,6 +1151,7 @@ struct dwc3 {
struct phy *usb2_generic_phy;
struct phy *usb3_generic_phy;
+ bool usb3_phy_powered;
bool phys_ready;
--
2.35.3