build/patch/kernel/archive/sunxi-6.4/patches.megous/usb-dwc3-Track-the-power-state-of-usb3_generic_phy.patch

59 lines
1.6 KiB
Diff

From 2b37cb9576a0a66242a2081f7a0709355e15c6b0 Mon Sep 17 00:00:00 2001
From: Ondrej Jirman <megi@xff.cz>
Date: Sun, 30 Apr 2023 18:54:51 +0200
Subject: [PATCH 372/469] 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>
# Conflicts:
# drivers/usb/dwc3/core.c
---
drivers/usb/dwc3/core.c | 6 +++++-
drivers/usb/dwc3/core.h | 1 +
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index d68958e151a7..6a72e002b0ff 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -781,6 +781,7 @@ static int dwc3_phy_power_on(struct dwc3 *dwc)
if (ret < 0)
goto err_power_off_usb2_phy;
+ dwc->usb3_phy_powered = true;
return 0;
err_power_off_usb2_phy:
@@ -794,7 +795,10 @@ static int dwc3_phy_power_on(struct dwc3 *dwc)
static void dwc3_phy_power_off(struct dwc3 *dwc)
{
- phy_power_off(dwc->usb3_generic_phy);
+ if (dwc->usb3_phy_powered)
+ phy_power_off(dwc->usb3_generic_phy);
+ dwc->usb3_phy_powered = false;
+
phy_power_off(dwc->usb2_generic_phy);
usb_phy_set_suspend(dwc->usb3_phy, 1);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 1f043c31a096..6a7bd508bece 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -1165,6 +1165,7 @@ struct dwc3 {
struct phy *usb2_generic_phy;
struct phy *usb3_generic_phy;
+ bool usb3_phy_powered;
bool phys_ready;
--
2.34.1