summaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc2/hcd.c
diff options
context:
space:
mode:
authorArtur Petrosyan <Arthur.Petrosyan@synopsys.com>2021-04-13 09:37:00 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-04-13 12:25:12 +0200
commit3cf8143e47a9d49ad0ab4aedf18b5693cab7d1f5 (patch)
treeea21c7d30396bbf4d07f7a6fe59514aca3d561ad /drivers/usb/dwc2/hcd.c
parentusb: dwc2: Update enter clock gating when port is suspended (diff)
downloadlinux-3cf8143e47a9d49ad0ab4aedf18b5693cab7d1f5.tar.xz
linux-3cf8143e47a9d49ad0ab4aedf18b5693cab7d1f5.zip
usb: dwc2: Update exit clock gating when port is resumed
Updates the implementation of exiting clock gating mode when core receives port resume. Instead of setting the required bit fields of the registers inline, called the "dwc2_host_exit_clock_gating()" function. Signed-off-by: Artur Petrosyan <Arthur.Petrosyan@synopsys.com> Link: https://lore.kernel.org/r/20210413073701.367E0A022E@mailhost.synopsys.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/dwc2/hcd.c')
-rw-r--r--drivers/usb/dwc2/hcd.c29
1 files changed, 4 insertions, 25 deletions
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index e1225fe6c61a..8a42675ab94e 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -3359,8 +3359,6 @@ int dwc2_port_suspend(struct dwc2_hsotg *hsotg, u16 windex)
int dwc2_port_resume(struct dwc2_hsotg *hsotg)
{
unsigned long flags;
- u32 hprt0;
- u32 pcgctl;
int ret = 0;
spin_lock_irqsave(&hsotg->lock, flags);
@@ -3374,33 +3372,14 @@ int dwc2_port_resume(struct dwc2_hsotg *hsotg)
break;
case DWC2_POWER_DOWN_PARAM_HIBERNATION:
case DWC2_POWER_DOWN_PARAM_NONE:
- default:
/*
- * If power_down is supported, Phy clock is already resumed
- * after registers restore.
+ * If not hibernation nor partial power down are supported,
+ * port resume is done using the clock gating programming flow.
*/
- if (!hsotg->params.power_down) {
- pcgctl = dwc2_readl(hsotg, PCGCTL);
- pcgctl &= ~PCGCTL_STOPPCLK;
- dwc2_writel(hsotg, pcgctl, PCGCTL);
- spin_unlock_irqrestore(&hsotg->lock, flags);
- msleep(20);
- spin_lock_irqsave(&hsotg->lock, flags);
- }
-
- hprt0 = dwc2_read_hprt0(hsotg);
- hprt0 |= HPRT0_RES;
- hprt0 &= ~HPRT0_SUSP;
- dwc2_writel(hsotg, hprt0, HPRT0);
spin_unlock_irqrestore(&hsotg->lock, flags);
-
- msleep(USB_RESUME_TIMEOUT);
-
+ dwc2_host_exit_clock_gating(hsotg, 0);
spin_lock_irqsave(&hsotg->lock, flags);
- hprt0 = dwc2_read_hprt0(hsotg);
- hprt0 &= ~(HPRT0_RES | HPRT0_SUSP);
- dwc2_writel(hsotg, hprt0, HPRT0);
- hsotg->bus_suspended = false;
+ break;
}
spin_unlock_irqrestore(&hsotg->lock, flags);