diff options
Diffstat (limited to 'drivers/usb/host/ohci-hub.c')
-rw-r--r-- | drivers/usb/host/ohci-hub.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index c81c8721cc5a..cd871b895013 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -90,6 +90,24 @@ __acquires(ohci->lock) | |||
90 | dl_done_list (ohci); | 90 | dl_done_list (ohci); |
91 | finish_unlinks (ohci, ohci_frame_no(ohci)); | 91 | finish_unlinks (ohci, ohci_frame_no(ohci)); |
92 | 92 | ||
93 | /* | ||
94 | * Some controllers don't handle "global" suspend properly if | ||
95 | * there are unsuspended ports. For these controllers, put all | ||
96 | * the enabled ports into suspend before suspending the root hub. | ||
97 | */ | ||
98 | if (ohci->flags & OHCI_QUIRK_GLOBAL_SUSPEND) { | ||
99 | __hc32 __iomem *portstat = ohci->regs->roothub.portstatus; | ||
100 | int i; | ||
101 | unsigned temp; | ||
102 | |||
103 | for (i = 0; i < ohci->num_ports; (++i, ++portstat)) { | ||
104 | temp = ohci_readl(ohci, portstat); | ||
105 | if ((temp & (RH_PS_PES | RH_PS_PSS)) == | ||
106 | RH_PS_PES) | ||
107 | ohci_writel(ohci, RH_PS_PSS, portstat); | ||
108 | } | ||
109 | } | ||
110 | |||
93 | /* maybe resume can wake root hub */ | 111 | /* maybe resume can wake root hub */ |
94 | if (ohci_to_hcd(ohci)->self.root_hub->do_remote_wakeup || autostop) { | 112 | if (ohci_to_hcd(ohci)->self.root_hub->do_remote_wakeup || autostop) { |
95 | ohci->hc_control |= OHCI_CTRL_RWE; | 113 | ohci->hc_control |= OHCI_CTRL_RWE; |