Message ID | 20200421081742.24628-1-narmstrong@baylibre.com |
---|---|
State | Accepted |
Commit | 3dc4f8397015dac7c343f86a93bfb962ff4e8d6f |
Headers | show |
Series | [v2] usb: dwc3-meson-g12a: add power-on/off of the PHYs | expand |
On 4/21/20 10:17 AM, Neil Armstrong wrote: > Power on/off the PHYs to enable power to the USB ports, fixing USB support > on Khadas VIM3/VIM3L boards. > > The G12A USB complex has at least 2 USB2 PHYs, but one is muxed between the > DWC2 and DWC3 controller and the other one directly connected to the DWC3 > controller. The USB3+PCIe combo PHY is muxed between the DWC3 controller > and a DW-PCIE controller. > All PHYs are optional, but it's type (usb2/usb3) and position are important > to determine it's capabilities, thus they are stored in a fixed size > array and the phy-name determines it's position, it's position determining > it's type and functionnalities. > This is why we need to loop over the array to power on all the DT provided > PHYs. > > Signed-off-by: Neil Armstrong <narmstrong at baylibre.com> > --- > Changes since v1: > - removed extra space before semicolon > - added clarification in commit message > > drivers/usb/dwc3/dwc3-meson-g12a.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/usb/dwc3/dwc3-meson-g12a.c b/drivers/usb/dwc3/dwc3-meson-g12a.c > index d4453f8784..de964d6c10 100644 > --- a/drivers/usb/dwc3/dwc3-meson-g12a.c > +++ b/drivers/usb/dwc3/dwc3-meson-g12a.c > @@ -408,6 +408,15 @@ static int dwc3_meson_g12a_probe(struct udevice *dev) > goto err_phy_init; > } > > + for (i = 0; i < PHY_COUNT; ++i) { i++ , unlike old c++ compilers, there's no difference here. > + if (!priv->phys[i].dev) > + continue; > + > + ret = generic_phy_power_on(&priv->phys[i]); > + if (ret) > + goto err_phy_init; > + } > + > return 0; Reviewed-by: Marek Vasut <marex at denx.de>
diff --git a/drivers/usb/dwc3/dwc3-meson-g12a.c b/drivers/usb/dwc3/dwc3-meson-g12a.c index d4453f8784..de964d6c10 100644 --- a/drivers/usb/dwc3/dwc3-meson-g12a.c +++ b/drivers/usb/dwc3/dwc3-meson-g12a.c @@ -408,6 +408,15 @@ static int dwc3_meson_g12a_probe(struct udevice *dev) goto err_phy_init; } + for (i = 0; i < PHY_COUNT; ++i) { + if (!priv->phys[i].dev) + continue; + + ret = generic_phy_power_on(&priv->phys[i]); + if (ret) + goto err_phy_init; + } + return 0; err_phy_init: @@ -430,6 +439,13 @@ static int dwc3_meson_g12a_remove(struct udevice *dev) clk_release_all(&priv->clk, 1); + for (i = 0; i < PHY_COUNT; ++i) { + if (!priv->phys[i].dev) + continue; + + generic_phy_power_off(&priv->phys[i]); + } + for (i = 0 ; i < PHY_COUNT ; ++i) { if (!priv->phys[i].dev) continue;
Power on/off the PHYs to enable power to the USB ports, fixing USB support on Khadas VIM3/VIM3L boards. The G12A USB complex has at least 2 USB2 PHYs, but one is muxed between the DWC2 and DWC3 controller and the other one directly connected to the DWC3 controller. The USB3+PCIe combo PHY is muxed between the DWC3 controller and a DW-PCIE controller. All PHYs are optional, but it's type (usb2/usb3) and position are important to determine it's capabilities, thus they are stored in a fixed size array and the phy-name determines it's position, it's position determining it's type and functionnalities. This is why we need to loop over the array to power on all the DT provided PHYs. Signed-off-by: Neil Armstrong <narmstrong at baylibre.com> --- Changes since v1: - removed extra space before semicolon - added clarification in commit message drivers/usb/dwc3/dwc3-meson-g12a.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)