Commit 00de6a57 authored by Claudiu Beznea's avatar Claudiu Beznea Committed by Greg Kroah-Hartman

usb: host: ohci-at91: suspend/resume ports after/before OHCI accesses

On SAMA7G5 suspending ports will cut the access to OHCI registers and
any subsequent access to them will lead to CPU being blocked trying to
access that memory. Same thing happens on resume: if OHCI memory is
accessed before resuming ports the CPU will block on that access. The
OCHI memory is accessed on suspend/resume though
ohci_suspend()/ohci_resume().
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarClaudiu Beznea <claudiu.beznea@microchip.com>
Cc: stable <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20210721132905.1970713-1-claudiu.beznea@microchip.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 68d9f95d
...@@ -611,8 +611,6 @@ ohci_hcd_at91_drv_suspend(struct device *dev) ...@@ -611,8 +611,6 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
if (ohci_at91->wakeup) if (ohci_at91->wakeup)
enable_irq_wake(hcd->irq); enable_irq_wake(hcd->irq);
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 1);
ret = ohci_suspend(hcd, ohci_at91->wakeup); ret = ohci_suspend(hcd, ohci_at91->wakeup);
if (ret) { if (ret) {
if (ohci_at91->wakeup) if (ohci_at91->wakeup)
...@@ -632,7 +630,10 @@ ohci_hcd_at91_drv_suspend(struct device *dev) ...@@ -632,7 +630,10 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
/* flush the writes */ /* flush the writes */
(void) ohci_readl (ohci, &ohci->regs->control); (void) ohci_readl (ohci, &ohci->regs->control);
msleep(1); msleep(1);
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 1);
at91_stop_clock(ohci_at91); at91_stop_clock(ohci_at91);
} else {
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 1);
} }
return ret; return ret;
...@@ -644,6 +645,8 @@ ohci_hcd_at91_drv_resume(struct device *dev) ...@@ -644,6 +645,8 @@ ohci_hcd_at91_drv_resume(struct device *dev)
struct usb_hcd *hcd = dev_get_drvdata(dev); struct usb_hcd *hcd = dev_get_drvdata(dev);
struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd); struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd);
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 0);
if (ohci_at91->wakeup) if (ohci_at91->wakeup)
disable_irq_wake(hcd->irq); disable_irq_wake(hcd->irq);
else else
...@@ -651,8 +654,6 @@ ohci_hcd_at91_drv_resume(struct device *dev) ...@@ -651,8 +654,6 @@ ohci_hcd_at91_drv_resume(struct device *dev)
ohci_resume(hcd, false); ohci_resume(hcd, false);
ohci_at91_port_suspend(ohci_at91->sfr_regmap, 0);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment