diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c index 8f536f2c500f..8df68261a320 100644 --- a/drivers/usb/renesas_usbhs/common.c +++ b/drivers/usb/renesas_usbhs/common.c @@ -827,23 +827,7 @@ static void usbhs_remove(struct platform_device *pdev) usbhs_pipe_remove(priv); } -static int usbhsc_suspend(struct device *dev) -{ - struct usbhs_priv *priv = dev_get_drvdata(dev); - struct usbhs_mod *mod = usbhs_mod_get_current(priv); - - if (mod) { - usbhs_mod_call(priv, stop, priv); - usbhs_mod_change(priv, -1); - } - - if (mod || !usbhs_get_dparam(priv, runtime_pwctrl)) - usbhsc_power_ctrl(priv, 0); - - return 0; -} - -static int usbhsc_resume(struct device *dev) +static void usbhsc_restore(struct device *dev) { struct usbhs_priv *priv = dev_get_drvdata(dev); struct platform_device *pdev = usbhs_priv_to_pdev(priv); @@ -856,6 +840,39 @@ static int usbhsc_resume(struct device *dev) usbhs_platform_call(priv, phy_reset, pdev); usbhsc_schedule_notify_hotplug(pdev); +} + +static int usbhsc_suspend(struct device *dev) +{ + struct usbhs_priv *priv = dev_get_drvdata(dev); + struct usbhs_mod *mod = usbhs_mod_get_current(priv); + int ret; + + if (mod) { + usbhs_mod_call(priv, stop, priv); + usbhs_mod_change(priv, -1); + } + + if (mod || !usbhs_get_dparam(priv, runtime_pwctrl)) + usbhsc_power_ctrl(priv, 0); + + ret = reset_control_assert(priv->rsts); + if (ret) + usbhsc_restore(dev); + + return ret; +} + +static int usbhsc_resume(struct device *dev) +{ + struct usbhs_priv *priv = dev_get_drvdata(dev); + int ret; + + ret = reset_control_deassert(priv->rsts); + if (ret) + return ret; + + usbhsc_restore(dev); return 0; }