diff options
Diffstat (limited to 'drivers/usb/host/ehci-pci.c')
-rw-r--r-- | drivers/usb/host/ehci-pci.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 5aa8bce90e1f..f3683e1da161 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -268,7 +268,7 @@ done: | |||
268 | * Also they depend on separate root hub suspend/resume. | 268 | * Also they depend on separate root hub suspend/resume. |
269 | */ | 269 | */ |
270 | 270 | ||
271 | static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message) | 271 | static int ehci_pci_suspend(struct usb_hcd *hcd) |
272 | { | 272 | { |
273 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 273 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
274 | unsigned long flags; | 274 | unsigned long flags; |
@@ -293,12 +293,6 @@ static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message) | |||
293 | ehci_writel(ehci, 0, &ehci->regs->intr_enable); | 293 | ehci_writel(ehci, 0, &ehci->regs->intr_enable); |
294 | (void)ehci_readl(ehci, &ehci->regs->intr_enable); | 294 | (void)ehci_readl(ehci, &ehci->regs->intr_enable); |
295 | 295 | ||
296 | /* make sure snapshot being resumed re-enumerates everything */ | ||
297 | if (message.event == PM_EVENT_PRETHAW) { | ||
298 | ehci_halt(ehci); | ||
299 | ehci_reset(ehci); | ||
300 | } | ||
301 | |||
302 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 296 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
303 | bail: | 297 | bail: |
304 | spin_unlock_irqrestore (&ehci->lock, flags); | 298 | spin_unlock_irqrestore (&ehci->lock, flags); |
@@ -309,7 +303,7 @@ static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message) | |||
309 | return rc; | 303 | return rc; |
310 | } | 304 | } |
311 | 305 | ||
312 | static int ehci_pci_resume(struct usb_hcd *hcd) | 306 | static int ehci_pci_resume(struct usb_hcd *hcd, bool hibernated) |
313 | { | 307 | { |
314 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 308 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
315 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | 309 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); |
@@ -322,10 +316,12 @@ static int ehci_pci_resume(struct usb_hcd *hcd) | |||
322 | /* Mark hardware accessible again as we are out of D3 state by now */ | 316 | /* Mark hardware accessible again as we are out of D3 state by now */ |
323 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 317 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
324 | 318 | ||
325 | /* If CF is still set, we maintained PCI Vaux power. | 319 | /* If CF is still set and we aren't resuming from hibernation |
320 | * then we maintained PCI Vaux power. | ||
326 | * Just undo the effect of ehci_pci_suspend(). | 321 | * Just undo the effect of ehci_pci_suspend(). |
327 | */ | 322 | */ |
328 | if (ehci_readl(ehci, &ehci->regs->configured_flag) == FLAG_CF) { | 323 | if (ehci_readl(ehci, &ehci->regs->configured_flag) == FLAG_CF && |
324 | !hibernated) { | ||
329 | int mask = INTR_MASK; | 325 | int mask = INTR_MASK; |
330 | 326 | ||
331 | if (!hcd->self.root_hub->do_remote_wakeup) | 327 | if (!hcd->self.root_hub->do_remote_wakeup) |
@@ -335,7 +331,6 @@ static int ehci_pci_resume(struct usb_hcd *hcd) | |||
335 | return 0; | 331 | return 0; |
336 | } | 332 | } |
337 | 333 | ||
338 | ehci_dbg(ehci, "lost power, restarting\n"); | ||
339 | usb_root_hub_lost_power(hcd->self.root_hub); | 334 | usb_root_hub_lost_power(hcd->self.root_hub); |
340 | 335 | ||
341 | /* Else reset, to cope with power loss or flush-to-storage | 336 | /* Else reset, to cope with power loss or flush-to-storage |
@@ -393,6 +388,7 @@ static const struct hc_driver ehci_pci_hc_driver = { | |||
393 | .urb_enqueue = ehci_urb_enqueue, | 388 | .urb_enqueue = ehci_urb_enqueue, |
394 | .urb_dequeue = ehci_urb_dequeue, | 389 | .urb_dequeue = ehci_urb_dequeue, |
395 | .endpoint_disable = ehci_endpoint_disable, | 390 | .endpoint_disable = ehci_endpoint_disable, |
391 | .endpoint_reset = ehci_endpoint_reset, | ||
396 | 392 | ||
397 | /* | 393 | /* |
398 | * scheduling support | 394 | * scheduling support |
@@ -429,10 +425,11 @@ static struct pci_driver ehci_pci_driver = { | |||
429 | 425 | ||
430 | .probe = usb_hcd_pci_probe, | 426 | .probe = usb_hcd_pci_probe, |
431 | .remove = usb_hcd_pci_remove, | 427 | .remove = usb_hcd_pci_remove, |
428 | .shutdown = usb_hcd_pci_shutdown, | ||
432 | 429 | ||
433 | #ifdef CONFIG_PM | 430 | #ifdef CONFIG_PM_SLEEP |
434 | .suspend = usb_hcd_pci_suspend, | 431 | .driver = { |
435 | .resume = usb_hcd_pci_resume, | 432 | .pm = &usb_hcd_pci_pm_ops |
433 | }, | ||
436 | #endif | 434 | #endif |
437 | .shutdown = usb_hcd_pci_shutdown, | ||
438 | }; | 435 | }; |