On Thu, Mar 14, 2019 at 4:08 PM Paul Kocialkowski <[email protected]> wrote: > > 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 <[email protected]> > --- > drivers/phy/allwinner/phy-sun4i-usb.c | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) > > diff --git a/drivers/phy/allwinner/phy-sun4i-usb.c > b/drivers/phy/allwinner/phy-sun4i-usb.c > index f206fa3f5d48..4f1c7e519d71 100644 > --- a/drivers/phy/allwinner/phy-sun4i-usb.c > +++ b/drivers/phy/allwinner/phy-sun4i-usb.c > @@ -302,9 +302,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
I think we can manage this route and passby dynamically by detecting id since we have dr_mode verify the MUSB host or peripheral via usb_get_dr_mode, any chance to try that way? -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
