Currently we enable the clock immediately after requesting it and leave it on the whole time. Afterwards if the phy request is failing we leave the usb-controller <-> usb-phy connection in a partly initialized state. At least on i.MX8M SoCs this can cause strange system hangs during boot. The (more) correct way would be to have the whole power-domain framework and the blk-ctrl driver support within barebox. So we can leave the power-domain in a known good state for linux. Since this is not the case we can move the clk_enable() call so it gets called after we know that all ressources are available. So the probability to leave the system in a partly initialized state is lesser. Drop the !IS_ERR() since NULL and errors are handled in clk_enable() as well. Signed-off-by: Marco Felsch <m.felsch@xxxxxxxxxxxxxx> --- drivers/usb/imx/chipidea-imx.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/usb/imx/chipidea-imx.c b/drivers/usb/imx/chipidea-imx.c index bf8b6f1eb8..f71cf80b7d 100644 --- a/drivers/usb/imx/chipidea-imx.c +++ b/drivers/usb/imx/chipidea-imx.c @@ -260,8 +260,6 @@ static int imx_chipidea_probe(struct device_d *dev) * devices which have only one. */ ci->clk = clk_get(dev, NULL); - if (!IS_ERR(ci->clk)) - clk_enable(ci->clk); /* Device trees are using both "phys" and "fsl,usbphy". Prefer the * more modern former one but fall back to the old one. @@ -302,6 +300,14 @@ static int imx_chipidea_probe(struct device_d *dev) ci->data.drvdata = ci; ci->data.usbphy = ci->usbphy; + /* + * Enable the clock after we ensured that all resources are available. + * This is crucial since the phy can be missing which and so the + * usb-controller <-> usb-phy communication is only partly initialized. + * This can trigger strange system hangs at least on i.MX8M SoCs. + */ + clk_enable(ci->clk); + if ((ci->flags & MXC_EHCI_PORTSC_MASK) == MXC_EHCI_MODE_HSIC) imx_chipidea_port_init(ci); -- 2.30.2