aboutsummaryrefslogtreecommitdiff
path: root/drivers/phy
diff options
context:
space:
mode:
authorPaul Kocialkowski2019-03-14 10:38:00 +0000
committerAndre Przywara2021-07-10 01:22:09 +0100
commit0d5824cbc9ee1e608c1597117aac1c129c519630 (patch)
tree027aa05b32cdc56798e2529b94f2b281c7f44f01 /drivers/phy
parent8fcf1fa24675e49a1a5b0a525c775d7aa6202090 (diff)
phy: sun4i-usb: Fix PHY0 routing and passby configuration for MUSB
Recent Allwinner platforms (starting with the H3) only use the MUSB controller for peripheral mode and use HCI for host mode. As a result, extra steps need to be taken to properly route USB signals to one or the other. More precisely, the following is required: * Routing the pins to either HCI/MUSB (controlled by PHY); * Enabling USB PHY passby in HCI mode (controlled by PMU). The current code will enable passby for each PHY and reroute PHY0 to MUSB, which is inconsistent and results in broken USB peripheral support. Passby on PHY0 must only be enabled when we want to use HCI. Since host/device mode detection is not available from the PHY code and because U-Boot does not support changing the mode dynamically anyway, we can just mux the controller to MUSB if it is enabled and mux it to HCI otherwise. This fixes USB peripheral support for platforms with PHY0 dual-route, especially H3/H5 and V3s. Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Diffstat (limited to 'drivers/phy')
-rw-r--r--drivers/phy/allwinner/phy-sun4i-usb.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c b/drivers/phy/allwinner/phy-sun4i-usb.c
index 5723c980323..82713b83815 100644
--- a/drivers/phy/allwinner/phy-sun4i-usb.c
+++ b/drivers/phy/allwinner/phy-sun4i-usb.c
@@ -313,9 +313,21 @@ static int sun4i_usb_phy_init(struct phy *phy)
data->cfg->disc_thresh, PHY_DISCON_TH_LEN);
}
+#ifdef CONFIG_USB_MUSB_SUNXI
+ /* Needed for HCI and conflicts with MUSB, keep PHY0 on MUSB */
+ if (usb_phy->id != 0)
+ sun4i_usb_phy_passby(phy, true);
+
+ /* Route PHY0 to MUSB to allow USB gadget */
+ if (data->cfg->phy0_dual_route)
+ sun4i_usb_phy0_reroute(data, true);
+#else
sun4i_usb_phy_passby(phy, true);
- sun4i_usb_phy0_reroute(data, true);
+ /* Route PHY0 to HCI to allow USB host */
+ if (data->cfg->phy0_dual_route)
+ sun4i_usb_phy0_reroute(data, false);
+#endif
return 0;
}