diff options
author | Douglas Anderson <dianders@chromium.org> | 2015-10-15 00:58:27 +0200 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2015-10-16 21:44:15 +0200 |
commit | 4d273c2af0fe4fdc84eef27e4521694dc7992065 (patch) | |
tree | aa2a089e4da05ac54cf9ef44694fe545ae349e3e /drivers/usb | |
parent | usb: musb: core: add common method of getting vbus status (diff) | |
download | linux-4d273c2af0fe4fdc84eef27e4521694dc7992065.tar.xz linux-4d273c2af0fe4fdc84eef27e4521694dc7992065.zip |
usb: dwc2: host: Protect PCGCTL with lock in dwc2_port_resume()
From code inspection, it appears to be unsafe to do a read-modify-write
of PCGCTL in dwc2_port_resume(). Let's make sure the spinlock is held
around this operation.
Acked-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/dwc2/hcd.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index af4e4a27126f..e79baf73c234 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -1500,6 +1500,8 @@ static void dwc2_port_resume(struct dwc2_hsotg *hsotg) u32 hprt0; u32 pcgctl; + spin_lock_irqsave(&hsotg->lock, flags); + /* * If hibernation is supported, Phy clock is already resumed * after registers restore. @@ -1508,10 +1510,11 @@ static void dwc2_port_resume(struct dwc2_hsotg *hsotg) pcgctl = dwc2_readl(hsotg->regs + PCGCTL); pcgctl &= ~PCGCTL_STOPPCLK; dwc2_writel(pcgctl, hsotg->regs + PCGCTL); + spin_unlock_irqrestore(&hsotg->lock, flags); usleep_range(20000, 40000); + spin_lock_irqsave(&hsotg->lock, flags); } - spin_lock_irqsave(&hsotg->lock, flags); hprt0 = dwc2_read_hprt0(hsotg); hprt0 |= HPRT0_RES; hprt0 &= ~HPRT0_SUSP; |