diff options
Diffstat (limited to 'drivers/usb/host/ehci-hub.c')
-rw-r--r-- | drivers/usb/host/ehci-hub.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 8a28dae8a375..84e792d71c22 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -603,6 +603,7 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
603 | u32 mask; | 603 | u32 mask; |
604 | int ports, i, retval = 1; | 604 | int ports, i, retval = 1; |
605 | unsigned long flags; | 605 | unsigned long flags; |
606 | u32 ppcd = 0; | ||
606 | 607 | ||
607 | /* if !USB_SUSPEND, root hub timers won't get shut down ... */ | 608 | /* if !USB_SUSPEND, root hub timers won't get shut down ... */ |
608 | if (!HC_IS_RUNNING(hcd->state)) | 609 | if (!HC_IS_RUNNING(hcd->state)) |
@@ -632,7 +633,15 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
632 | 633 | ||
633 | /* port N changes (bit N)? */ | 634 | /* port N changes (bit N)? */ |
634 | spin_lock_irqsave (&ehci->lock, flags); | 635 | spin_lock_irqsave (&ehci->lock, flags); |
636 | |||
637 | /* get per-port change detect bits */ | ||
638 | if (ehci->has_ppcd) | ||
639 | ppcd = ehci_readl(ehci, &ehci->regs->status) >> 16; | ||
640 | |||
635 | for (i = 0; i < ports; i++) { | 641 | for (i = 0; i < ports; i++) { |
642 | /* leverage per-port change bits feature */ | ||
643 | if (ehci->has_ppcd && !(ppcd & (1 << i))) | ||
644 | continue; | ||
636 | temp = ehci_readl(ehci, &ehci->regs->port_status [i]); | 645 | temp = ehci_readl(ehci, &ehci->regs->port_status [i]); |
637 | 646 | ||
638 | /* | 647 | /* |