diff mbox series

phy: usb: disable COMMONONN for dual mode

Message ID 20241010185344.859865-1-justin.chen@broadcom.com
State Accepted
Commit 1e48fd0574ee697e87f9c9bbd64d9a121d271f7a
Headers show
Series phy: usb: disable COMMONONN for dual mode | expand

Commit Message

Justin Chen Oct. 10, 2024, 6:53 p.m. UTC
The COMMONONN bit suspends the phy when the port is put into a suspend
state. However when the phy is shared between host and device in dual
mode, this no longer works cleanly as there is no synchronization between
the two.

Fixes: 5095d045a962 ("phy: usb: Turn off phy when port is in suspend")
Signed-off-by: Justin Chen <justin.chen@broadcom.com>
---
 drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

Comments

Florian Fainelli Oct. 10, 2024, 8:04 p.m. UTC | #1
On 10/10/24 11:53, Justin Chen wrote:
> The COMMONONN bit suspends the phy when the port is put into a suspend
> state. However when the phy is shared between host and device in dual
> mode, this no longer works cleanly as there is no synchronization between
> the two.
> 
> Fixes: 5095d045a962 ("phy: usb: Turn off phy when port is in suspend")
> Signed-off-by: Justin Chen <justin.chen@broadcom.com>

Acked-by: Florian Fainelli <florian.fainelli@broadcom.com>
Vinod Koul Oct. 12, 2024, 5:50 p.m. UTC | #2
On Thu, 10 Oct 2024 11:53:44 -0700, Justin Chen wrote:
> The COMMONONN bit suspends the phy when the port is put into a suspend
> state. However when the phy is shared between host and device in dual
> mode, this no longer works cleanly as there is no synchronization between
> the two.
> 
> 

Applied, thanks!

[1/1] phy: usb: disable COMMONONN for dual mode
      commit: 1e48fd0574ee697e87f9c9bbd64d9a121d271f7a

Best regards,
diff mbox series

Patch

diff --git a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
index 4c10cafded4e..950b7ae1d1a8 100644
--- a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
+++ b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c
@@ -153,7 +153,9 @@  static void xhci_soft_reset(struct brcm_usb_init_params *params,
 	} else {
 		USB_CTRL_SET(ctrl, USB_PM, XHC_SOFT_RESETB);
 		/* Required for COMMONONN to be set */
-		USB_XHCI_GBL_UNSET(xhci_gbl, GUSB2PHYCFG, U2_FREECLK_EXISTS);
+		if (params->supported_port_modes != USB_CTLR_MODE_DRD)
+			USB_XHCI_GBL_UNSET(xhci_gbl, GUSB2PHYCFG,
+					   U2_FREECLK_EXISTS);
 	}
 }
 
@@ -328,8 +330,12 @@  static void usb_init_common_7216(struct brcm_usb_init_params *params)
 	/* 1 millisecond - for USB clocks to settle down */
 	usleep_range(1000, 2000);
 
-	/* Disable PHY when port is suspended */
-	USB_CTRL_SET(ctrl, P0_U2PHY_CFG1, COMMONONN);
+	/*
+	 * Disable PHY when port is suspended
+	 * Does not work in DRD mode
+	 */
+	if (params->supported_port_modes != USB_CTLR_MODE_DRD)
+		USB_CTRL_SET(ctrl, P0_U2PHY_CFG1, COMMONONN);
 
 	usb_wake_enable_7216(params, false);
 	usb_init_common(params);