mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
usb: dwc2: Allow entering hibernation from USB_SUSPEND interrupt
Do changes to allow entering hibernated state from USB_SUSPEND interrupt. All code is added under if conditions and mustn't impact existing functionality. Signed-off-by: Vardan Mikayelyan <mvardan@synopsys.com> Signed-off-by: John Youn <johnyoun@synopsys.com> Signed-off-by: Grigor Tovmasyan <tovmasya@synopsys.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
This commit is contained in:
parent
624815ce32
commit
97861781da
|
|
@ -484,32 +484,44 @@ static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg)
|
||||||
* state is active
|
* state is active
|
||||||
*/
|
*/
|
||||||
dsts = dwc2_readl(hsotg->regs + DSTS);
|
dsts = dwc2_readl(hsotg->regs + DSTS);
|
||||||
dev_dbg(hsotg->dev, "DSTS=0x%0x\n", dsts);
|
dev_dbg(hsotg->dev, "%s: DSTS=0x%0x\n", __func__, dsts);
|
||||||
dev_dbg(hsotg->dev,
|
dev_dbg(hsotg->dev,
|
||||||
"DSTS.Suspend Status=%d HWCFG4.Power Optimize=%d\n",
|
"DSTS.Suspend Status=%d HWCFG4.Power Optimize=%d HWCFG4.Hibernation=%d\n",
|
||||||
!!(dsts & DSTS_SUSPSTS),
|
!!(dsts & DSTS_SUSPSTS),
|
||||||
hsotg->hw_params.power_optimized);
|
hsotg->hw_params.power_optimized,
|
||||||
if ((dsts & DSTS_SUSPSTS) && hsotg->hw_params.power_optimized) {
|
hsotg->hw_params.hibernation);
|
||||||
/* Ignore suspend request before enumeration */
|
|
||||||
if (!dwc2_is_device_connected(hsotg)) {
|
/* Ignore suspend request before enumeration */
|
||||||
dev_dbg(hsotg->dev,
|
if (!dwc2_is_device_connected(hsotg)) {
|
||||||
"ignore suspend request before enumeration\n");
|
dev_dbg(hsotg->dev,
|
||||||
return;
|
"ignore suspend request before enumeration\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (dsts & DSTS_SUSPSTS) {
|
||||||
|
if (hsotg->hw_params.power_optimized) {
|
||||||
|
ret = dwc2_enter_partial_power_down(hsotg);
|
||||||
|
if (ret) {
|
||||||
|
if (ret != -ENOTSUPP)
|
||||||
|
dev_err(hsotg->dev,
|
||||||
|
"%s: enter partial_power_down failed\n",
|
||||||
|
__func__);
|
||||||
|
goto skip_power_saving;
|
||||||
|
}
|
||||||
|
|
||||||
|
udelay(100);
|
||||||
|
|
||||||
|
/* Ask phy to be suspended */
|
||||||
|
if (!IS_ERR_OR_NULL(hsotg->uphy))
|
||||||
|
usb_phy_set_suspend(hsotg->uphy, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dwc2_enter_partial_power_down(hsotg);
|
if (hsotg->hw_params.hibernation) {
|
||||||
if (ret) {
|
ret = dwc2_enter_hibernation(hsotg, 0);
|
||||||
if (ret != -ENOTSUPP)
|
if (ret && ret != -ENOTSUPP)
|
||||||
dev_err(hsotg->dev,
|
dev_err(hsotg->dev,
|
||||||
"enter power_down failed\n");
|
"%s: enter hibernation failed\n",
|
||||||
goto skip_power_saving;
|
__func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
udelay(100);
|
|
||||||
|
|
||||||
/* Ask phy to be suspended */
|
|
||||||
if (!IS_ERR_OR_NULL(hsotg->uphy))
|
|
||||||
usb_phy_set_suspend(hsotg->uphy, true);
|
|
||||||
skip_power_saving:
|
skip_power_saving:
|
||||||
/*
|
/*
|
||||||
* Change to L2 (suspend) state before releasing
|
* Change to L2 (suspend) state before releasing
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user