Skip to content

Commit

Permalink
usb: dwc3: core: simplify suspend/resume operations
Browse files Browse the repository at this point in the history
now that we have re-factored dwc3_core_init() and
dwc3_core_exit() we can use them for suspend/resume
operations.

This will help us avoid some common mistakes when
patching code when we have duplicated pieces of code
doing the same thing.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
  • Loading branch information
Felipe Balbi committed Jun 20, 2016
1 parent c499ff7 commit 51f5d49
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 57 deletions.
59 changes: 5 additions & 54 deletions drivers/usb/dwc3/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1113,33 +1113,19 @@ static int dwc3_remove(struct platform_device *pdev)
static int dwc3_suspend(struct device *dev)
{
struct dwc3 *dwc = dev_get_drvdata(dev);
unsigned long flags;

spin_lock_irqsave(&dwc->lock, flags);

switch (dwc->dr_mode) {
case USB_DR_MODE_PERIPHERAL:
case USB_DR_MODE_OTG:
dwc3_gadget_suspend(dwc);
/* FALLTHROUGH */
break;
case USB_DR_MODE_HOST:
default:
dwc3_event_buffers_cleanup(dwc);
/* do nothing */
break;
}

dwc->gctl = dwc3_readl(dwc->regs, DWC3_GCTL);
spin_unlock_irqrestore(&dwc->lock, flags);

usb_phy_shutdown(dwc->usb3_phy);
usb_phy_shutdown(dwc->usb2_phy);
phy_exit(dwc->usb2_generic_phy);
phy_exit(dwc->usb3_generic_phy);

usb_phy_set_suspend(dwc->usb2_phy, 1);
usb_phy_set_suspend(dwc->usb3_phy, 1);
WARN_ON(phy_power_off(dwc->usb2_generic_phy) < 0);
WARN_ON(phy_power_off(dwc->usb3_generic_phy) < 0);
dwc3_core_exit(dwc);

pinctrl_pm_select_sleep_state(dev);

Expand All @@ -1149,36 +1135,14 @@ static int dwc3_suspend(struct device *dev)
static int dwc3_resume(struct device *dev)
{
struct dwc3 *dwc = dev_get_drvdata(dev);
unsigned long flags;
int ret;

pinctrl_pm_select_default_state(dev);

usb_phy_set_suspend(dwc->usb2_phy, 0);
usb_phy_set_suspend(dwc->usb3_phy, 0);
ret = phy_power_on(dwc->usb2_generic_phy);
if (ret < 0)
ret = dwc3_core_init(dwc);
if (ret)
return ret;

ret = phy_power_on(dwc->usb3_generic_phy);
if (ret < 0)
goto err_usb2phy_power;

usb_phy_init(dwc->usb3_phy);
usb_phy_init(dwc->usb2_phy);
ret = phy_init(dwc->usb2_generic_phy);
if (ret < 0)
goto err_usb3phy_power;

ret = phy_init(dwc->usb3_generic_phy);
if (ret < 0)
goto err_usb2phy_init;

spin_lock_irqsave(&dwc->lock, flags);

dwc3_event_buffers_setup(dwc);
dwc3_writel(dwc->regs, DWC3_GCTL, dwc->gctl);

switch (dwc->dr_mode) {
case USB_DR_MODE_PERIPHERAL:
case USB_DR_MODE_OTG:
Expand All @@ -1190,24 +1154,11 @@ static int dwc3_resume(struct device *dev)
break;
}

spin_unlock_irqrestore(&dwc->lock, flags);

pm_runtime_disable(dev);
pm_runtime_set_active(dev);
pm_runtime_enable(dev);

return 0;

err_usb2phy_init:
phy_exit(dwc->usb2_generic_phy);

err_usb3phy_power:
phy_power_off(dwc->usb3_generic_phy);

err_usb2phy_power:
phy_power_off(dwc->usb2_generic_phy);

return ret;
}
#endif /* CONFIG_PM_SLEEP */

Expand Down
3 changes: 0 additions & 3 deletions drivers/usb/dwc3/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -836,9 +836,6 @@ struct dwc3 {

enum usb_dr_mode dr_mode;

/* used for suspend/resume */
u32 gctl;

u32 fladj;
u32 nr_scratch;
u32 u1u2;
Expand Down

0 comments on commit 51f5d49

Please sign in to comment.