Hi Daniel, On Wed, Sep 08, 2021 at 09:46:21AM +0200, Daniel Brát wrote: > Despite using 'phy_optional_get' to get a 'usb2_phy' inside its probe, > the driver would fail if it didnt find it. Also, there is no Kconfig > dependency on 'CONFIG_GENERIC_PHY', so without it defined te phy > functions are unimplemented and always return -ENOSYS making dwc2 probe > always fail too. Since the 'dwc2->phy' is optional, the driver was > modified to reflect this. > Tested working on Raspberry Pi 3B+. > > Signed-off-by: Daniel Brát <danek.brat@xxxxxxxxx> > --- > drivers/usb/dwc2/dwc2.c | 38 ++++++++++++++++++++++---------------- > 1 file changed, 22 insertions(+), 16 deletions(-) > > diff --git a/drivers/usb/dwc2/dwc2.c b/drivers/usb/dwc2/dwc2.c > index 9893977b8..8f3f8da00 100644 > --- a/drivers/usb/dwc2/dwc2.c > +++ b/drivers/usb/dwc2/dwc2.c > @@ -72,20 +72,22 @@ static int dwc2_probe(struct device_d *dev) > if (ret) > goto clk_disable; > > - dwc2->phy = phy_optional_get(dev, "usb2-phy"); > - if (IS_ERR(dwc2->phy)) { > - ret = PTR_ERR(dwc2->phy); > - goto clk_disable; > + if (IS_ENABLED(CONFIG_GENERIC_PHY)) { > + dwc2->phy = phy_optional_get(dev, "usb2-phy"); > + if (!dwc2->phy || IS_ERR(dwc2->phy)) { I think a better way to fix this would be have phy_optional_get to return NULL when CONFIG_GENERIC_PHY is not enabled. That way this fix is not limited to dwc2 driver. NULL is an expected return value for phy_optional_get when there is no phy, so that must not cause any issue in the driver. > + dev_warn(dev, "Didnt find any 'usb2-phy'\n"); > + dwc2->phy = NULL; > + } else { > + ret = phy_power_on(dwc2->phy); > + if (ret) > + goto clk_disable; > + > + ret = phy_init(dwc2->phy); > + if (ret) > + goto phy_power_off; > + } > } > > - ret = phy_power_on(dwc2->phy); > - if (ret) > - goto clk_disable; > - > - ret = phy_init(dwc2->phy); > - if (ret) > - goto phy_power_off; > - > ret = dwc2_check_core_version(dwc2); > if (ret) > goto error; > @@ -120,9 +122,11 @@ static int dwc2_probe(struct device_d *dev) > > return 0; > error: > - phy_exit(dwc2->phy); > + if (dwc2->phy) > + phy_exit(dwc2->phy); This is not needed as phy_exit already tests for NULL phy. > phy_power_off: > - phy_power_off(dwc2->phy); > + if (dwc2->phy) > + phy_power_off(dwc2->phy); Same for phy_power_off > clk_disable: > clk_disable(dwc2->clk); > clk_put: > @@ -140,8 +144,10 @@ static void dwc2_remove(struct device_d *dev) > dwc2_host_uninit(dwc2); > dwc2_gadget_uninit(dwc2); > > - phy_exit(dwc2->phy); > - phy_power_off(dwc2->phy); > + if (dwc2->phy) { > + phy_exit(dwc2->phy); > + phy_power_off(dwc2->phy); > + } Same as above > } > > static const struct of_device_id dwc2_platform_dt_ids[] = { > -- > 2.17.1 > > > _______________________________________________ > barebox mailing list > barebox@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/barebox > > > To declare a filtering error, please use the following link : https://www.security-mail.net/reporter.php?mid=6017.61386e3c.c78.0&r=jmaselbas%40kalray.eu&s=barebox-bounces%2Bjmaselbas%3Dkalray.eu%40lists.infradead.org&o=%5BPATCH+1%2F2%5D+usb%3A+dwc2%3A+Make+having+a+phy+optional&verdict=C&c=a2cb297eefa99425f437bd1e182a2eb5ba1e58f8 > _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox