diff options
-rw-r--r-- | drivers/usb/host/ohci-at91.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/ohci-au1xxx.c | 5 | ||||
-rw-r--r-- | drivers/usb/host/ohci-dbg.c | 5 | ||||
-rw-r--r-- | drivers/usb/host/ohci-ep93xx.c | 1 | ||||
-rw-r--r-- | drivers/usb/host/ohci-hcd.c | 41 | ||||
-rw-r--r-- | drivers/usb/host/ohci-hub.c | 67 | ||||
-rw-r--r-- | drivers/usb/host/ohci-lh7a404.c | 5 | ||||
-rw-r--r-- | drivers/usb/host/ohci-omap.c | 5 | ||||
-rw-r--r-- | drivers/usb/host/ohci-pci.c | 5 | ||||
-rw-r--r-- | drivers/usb/host/ohci-ppc-soc.c | 1 | ||||
-rw-r--r-- | drivers/usb/host/ohci-pxa27x.c | 1 | ||||
-rw-r--r-- | drivers/usb/host/ohci-s3c2410.c | 1 | ||||
-rw-r--r-- | drivers/usb/host/ohci-sa1111.c | 5 |
13 files changed, 99 insertions, 45 deletions
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 85cc059705a6..33b75087bc0c 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
@@ -239,7 +239,7 @@ static const struct hc_driver ohci_at91_hc_driver = { | |||
239 | */ | 239 | */ |
240 | .hub_status_data = ohci_hub_status_data, | 240 | .hub_status_data = ohci_hub_status_data, |
241 | .hub_control = ohci_hub_control, | 241 | .hub_control = ohci_hub_control, |
242 | 242 | .hub_irq_enable = ohci_rhsc_enable, | |
243 | #ifdef CONFIG_PM | 243 | #ifdef CONFIG_PM |
244 | .bus_suspend = ohci_bus_suspend, | 244 | .bus_suspend = ohci_bus_suspend, |
245 | .bus_resume = ohci_bus_resume, | 245 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c index f7a975d5db09..44ed3a4c01ef 100644 --- a/drivers/usb/host/ohci-au1xxx.c +++ b/drivers/usb/host/ohci-au1xxx.c | |||
@@ -268,10 +268,6 @@ static const struct hc_driver ohci_au1xxx_hc_driver = { | |||
268 | * basic lifecycle operations | 268 | * basic lifecycle operations |
269 | */ | 269 | */ |
270 | .start = ohci_au1xxx_start, | 270 | .start = ohci_au1xxx_start, |
271 | #ifdef CONFIG_PM | ||
272 | /* suspend: ohci_au1xxx_suspend, -- tbd */ | ||
273 | /* resume: ohci_au1xxx_resume, -- tbd */ | ||
274 | #endif /*CONFIG_PM*/ | ||
275 | .stop = ohci_stop, | 271 | .stop = ohci_stop, |
276 | 272 | ||
277 | /* | 273 | /* |
@@ -291,6 +287,7 @@ static const struct hc_driver ohci_au1xxx_hc_driver = { | |||
291 | */ | 287 | */ |
292 | .hub_status_data = ohci_hub_status_data, | 288 | .hub_status_data = ohci_hub_status_data, |
293 | .hub_control = ohci_hub_control, | 289 | .hub_control = ohci_hub_control, |
290 | .hub_irq_enable = ohci_rhsc_enable, | ||
294 | #ifdef CONFIG_PM | 291 | #ifdef CONFIG_PM |
295 | .bus_suspend = ohci_bus_suspend, | 292 | .bus_suspend = ohci_bus_suspend, |
296 | .bus_resume = ohci_bus_resume, | 293 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c index 7bfffcbbd226..da52609a9290 100644 --- a/drivers/usb/host/ohci-dbg.c +++ b/drivers/usb/host/ohci-dbg.c | |||
@@ -667,6 +667,11 @@ show_registers (struct class_device *class_dev, char *buf) | |||
667 | size -= temp; | 667 | size -= temp; |
668 | next += temp; | 668 | next += temp; |
669 | 669 | ||
670 | temp = scnprintf (next, size, "hub poll timer %s\n", | ||
671 | ohci_to_hcd(ohci)->poll_rh ? "ON" : "off"); | ||
672 | size -= temp; | ||
673 | next += temp; | ||
674 | |||
670 | /* roothub */ | 675 | /* roothub */ |
671 | ohci_dump_roothub (ohci, 1, &next, &size); | 676 | ohci_dump_roothub (ohci, 1, &next, &size); |
672 | 677 | ||
diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c index 6531c4d26527..1a1d320b7995 100644 --- a/drivers/usb/host/ohci-ep93xx.c +++ b/drivers/usb/host/ohci-ep93xx.c | |||
@@ -134,6 +134,7 @@ static struct hc_driver ohci_ep93xx_hc_driver = { | |||
134 | .get_frame_number = ohci_get_frame, | 134 | .get_frame_number = ohci_get_frame, |
135 | .hub_status_data = ohci_hub_status_data, | 135 | .hub_status_data = ohci_hub_status_data, |
136 | .hub_control = ohci_hub_control, | 136 | .hub_control = ohci_hub_control, |
137 | .hub_irq_enable = ohci_rhsc_enable, | ||
137 | #ifdef CONFIG_PM | 138 | #ifdef CONFIG_PM |
138 | .bus_suspend = ohci_bus_suspend, | 139 | .bus_suspend = ohci_bus_suspend, |
139 | .bus_resume = ohci_bus_resume, | 140 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 94d8cf4b36c1..0684f57c14a0 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -101,7 +101,7 @@ | |||
101 | 101 | ||
102 | #include "../core/hcd.h" | 102 | #include "../core/hcd.h" |
103 | 103 | ||
104 | #define DRIVER_VERSION "2005 April 22" | 104 | #define DRIVER_VERSION "2006 August 04" |
105 | #define DRIVER_AUTHOR "Roman Weissgaerber, David Brownell" | 105 | #define DRIVER_AUTHOR "Roman Weissgaerber, David Brownell" |
106 | #define DRIVER_DESC "USB 1.1 'Open' Host Controller (OHCI) Driver" | 106 | #define DRIVER_DESC "USB 1.1 'Open' Host Controller (OHCI) Driver" |
107 | 107 | ||
@@ -110,9 +110,10 @@ | |||
110 | #undef OHCI_VERBOSE_DEBUG /* not always helpful */ | 110 | #undef OHCI_VERBOSE_DEBUG /* not always helpful */ |
111 | 111 | ||
112 | /* For initializing controller (mask in an HCFS mode too) */ | 112 | /* For initializing controller (mask in an HCFS mode too) */ |
113 | #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR | 113 | #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR |
114 | #define OHCI_INTR_INIT \ | 114 | #define OHCI_INTR_INIT \ |
115 | (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_WDH) | 115 | (OHCI_INTR_MIE | OHCI_INTR_RHSC | OHCI_INTR_UE \ |
116 | | OHCI_INTR_RD | OHCI_INTR_WDH) | ||
116 | 117 | ||
117 | #ifdef __hppa__ | 118 | #ifdef __hppa__ |
118 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ | 119 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ |
@@ -128,6 +129,8 @@ | |||
128 | 129 | ||
129 | static const char hcd_name [] = "ohci_hcd"; | 130 | static const char hcd_name [] = "ohci_hcd"; |
130 | 131 | ||
132 | #define STATECHANGE_DELAY msecs_to_jiffies(300) | ||
133 | |||
131 | #include "ohci.h" | 134 | #include "ohci.h" |
132 | 135 | ||
133 | static void ohci_dump (struct ohci_hcd *ohci, int verbose); | 136 | static void ohci_dump (struct ohci_hcd *ohci, int verbose); |
@@ -446,7 +449,6 @@ static int ohci_init (struct ohci_hcd *ohci) | |||
446 | 449 | ||
447 | disable (ohci); | 450 | disable (ohci); |
448 | ohci->regs = hcd->regs; | 451 | ohci->regs = hcd->regs; |
449 | ohci->next_statechange = jiffies; | ||
450 | 452 | ||
451 | /* REVISIT this BIOS handshake is now moved into PCI "quirks", and | 453 | /* REVISIT this BIOS handshake is now moved into PCI "quirks", and |
452 | * was never needed for most non-PCI systems ... remove the code? | 454 | * was never needed for most non-PCI systems ... remove the code? |
@@ -637,10 +639,14 @@ retry: | |||
637 | return -EOVERFLOW; | 639 | return -EOVERFLOW; |
638 | } | 640 | } |
639 | 641 | ||
640 | /* start controller operations */ | 642 | /* use rhsc irqs after khubd is fully initialized */ |
643 | hcd->poll_rh = 1; | ||
644 | hcd->uses_new_polling = 1; | ||
645 | |||
646 | /* start controller operations */ | ||
641 | ohci->hc_control &= OHCI_CTRL_RWC; | 647 | ohci->hc_control &= OHCI_CTRL_RWC; |
642 | ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER; | 648 | ohci->hc_control |= OHCI_CONTROL_INIT | OHCI_USB_OPER; |
643 | ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); | 649 | ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); |
644 | hcd->state = HC_STATE_RUNNING; | 650 | hcd->state = HC_STATE_RUNNING; |
645 | 651 | ||
646 | /* wake on ConnectStatusChange, matching external hubs */ | 652 | /* wake on ConnectStatusChange, matching external hubs */ |
@@ -648,7 +654,7 @@ retry: | |||
648 | 654 | ||
649 | /* Choose the interrupts we care about now, others later on demand */ | 655 | /* Choose the interrupts we care about now, others later on demand */ |
650 | mask = OHCI_INTR_INIT; | 656 | mask = OHCI_INTR_INIT; |
651 | ohci_writel (ohci, mask, &ohci->regs->intrstatus); | 657 | ohci_writel (ohci, ~0, &ohci->regs->intrstatus); |
652 | ohci_writel (ohci, mask, &ohci->regs->intrenable); | 658 | ohci_writel (ohci, mask, &ohci->regs->intrenable); |
653 | 659 | ||
654 | /* handle root hub init quirks ... */ | 660 | /* handle root hub init quirks ... */ |
@@ -672,6 +678,7 @@ retry: | |||
672 | // flush those writes | 678 | // flush those writes |
673 | (void) ohci_readl (ohci, &ohci->regs->control); | 679 | (void) ohci_readl (ohci, &ohci->regs->control); |
674 | 680 | ||
681 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; | ||
675 | spin_unlock_irq (&ohci->lock); | 682 | spin_unlock_irq (&ohci->lock); |
676 | 683 | ||
677 | // POTPGT delay is bits 24-31, in 2 ms units. | 684 | // POTPGT delay is bits 24-31, in 2 ms units. |
@@ -709,7 +716,23 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd, struct pt_regs *ptregs) | |||
709 | /* interrupt for some other device? */ | 716 | /* interrupt for some other device? */ |
710 | } else if ((ints &= ohci_readl (ohci, ®s->intrenable)) == 0) { | 717 | } else if ((ints &= ohci_readl (ohci, ®s->intrenable)) == 0) { |
711 | return IRQ_NOTMINE; | 718 | return IRQ_NOTMINE; |
712 | } | 719 | } |
720 | |||
721 | /* NOTE: vendors didn't always make the same implementation | ||
722 | * choices for RHSC. Sometimes it triggers on an edge (like | ||
723 | * setting and maybe clearing a port status change bit); and | ||
724 | * it's level-triggered on other silicon, active until khubd | ||
725 | * clears all active port status change bits. Poll by timer | ||
726 | * til it's fully debounced and the difference won't matter. | ||
727 | */ | ||
728 | if (ints & OHCI_INTR_RHSC) { | ||
729 | ohci_vdbg (ohci, "rhsc\n"); | ||
730 | ohci_writel (ohci, OHCI_INTR_RHSC, ®s->intrdisable); | ||
731 | hcd->poll_rh = 1; | ||
732 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; | ||
733 | ohci_writel (ohci, OHCI_INTR_RHSC, ®s->intrstatus); | ||
734 | usb_hcd_poll_rh_status(hcd); | ||
735 | } | ||
713 | 736 | ||
714 | if (ints & OHCI_INTR_UE) { | 737 | if (ints & OHCI_INTR_UE) { |
715 | disable (ohci); | 738 | disable (ohci); |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 5b0a23fd798b..f1b1ed086bde 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -36,6 +36,14 @@ | |||
36 | 36 | ||
37 | /*-------------------------------------------------------------------------*/ | 37 | /*-------------------------------------------------------------------------*/ |
38 | 38 | ||
39 | /* hcd->hub_irq_enable() */ | ||
40 | static void ohci_rhsc_enable (struct usb_hcd *hcd) | ||
41 | { | ||
42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | ||
43 | |||
44 | ohci_writel (ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | ||
45 | } | ||
46 | |||
39 | #ifdef CONFIG_PM | 47 | #ifdef CONFIG_PM |
40 | 48 | ||
41 | #define OHCI_SCHED_ENABLES \ | 49 | #define OHCI_SCHED_ENABLES \ |
@@ -123,6 +131,9 @@ static int ohci_bus_suspend (struct usb_hcd *hcd) | |||
123 | /* no resumes until devices finish suspending */ | 131 | /* no resumes until devices finish suspending */ |
124 | ohci->next_statechange = jiffies + msecs_to_jiffies (5); | 132 | ohci->next_statechange = jiffies + msecs_to_jiffies (5); |
125 | 133 | ||
134 | /* no timer polling */ | ||
135 | hcd->poll_rh = 0; | ||
136 | |||
126 | done: | 137 | done: |
127 | /* external suspend vs self autosuspend ... same effect */ | 138 | /* external suspend vs self autosuspend ... same effect */ |
128 | if (status == 0) | 139 | if (status == 0) |
@@ -256,8 +267,8 @@ static int ohci_bus_resume (struct usb_hcd *hcd) | |||
256 | /* TRSMRCY */ | 267 | /* TRSMRCY */ |
257 | msleep (10); | 268 | msleep (10); |
258 | 269 | ||
259 | /* keep it alive for ~5x suspend + resume costs */ | 270 | /* keep it alive for more than ~5x suspend + resume costs */ |
260 | ohci->next_statechange = jiffies + msecs_to_jiffies (250); | 271 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; |
261 | 272 | ||
262 | /* maybe turn schedules back on */ | 273 | /* maybe turn schedules back on */ |
263 | enables = 0; | 274 | enables = 0; |
@@ -302,9 +313,10 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
302 | { | 313 | { |
303 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 314 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
304 | int i, changed = 0, length = 1; | 315 | int i, changed = 0, length = 1; |
305 | int can_suspend = device_may_wakeup(&hcd->self.root_hub->dev); | 316 | int can_suspend; |
306 | unsigned long flags; | 317 | unsigned long flags; |
307 | 318 | ||
319 | can_suspend = device_may_wakeup(&hcd->self.root_hub->dev); | ||
308 | spin_lock_irqsave (&ohci->lock, flags); | 320 | spin_lock_irqsave (&ohci->lock, flags); |
309 | 321 | ||
310 | /* handle autosuspended root: finish resuming before | 322 | /* handle autosuspended root: finish resuming before |
@@ -339,6 +351,10 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
339 | for (i = 0; i < ohci->num_ports; i++) { | 351 | for (i = 0; i < ohci->num_ports; i++) { |
340 | u32 status = roothub_portstatus (ohci, i); | 352 | u32 status = roothub_portstatus (ohci, i); |
341 | 353 | ||
354 | /* can't autosuspend with active ports */ | ||
355 | if ((status & RH_PS_PES) && !(status & RH_PS_PSS)) | ||
356 | can_suspend = 0; | ||
357 | |||
342 | if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC | 358 | if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC |
343 | | RH_PS_OCIC | RH_PS_PRSC)) { | 359 | | RH_PS_OCIC | RH_PS_PRSC)) { |
344 | changed = 1; | 360 | changed = 1; |
@@ -348,32 +364,41 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
348 | buf [1] |= 1 << (i - 7); | 364 | buf [1] |= 1 << (i - 7); |
349 | continue; | 365 | continue; |
350 | } | 366 | } |
367 | } | ||
351 | 368 | ||
352 | /* can suspend if no ports are enabled; or if all all | 369 | /* after root hub changes, stop polling after debouncing |
353 | * enabled ports are suspended AND remote wakeup is on. | 370 | * for a while and maybe kicking in autosuspend |
354 | */ | 371 | */ |
355 | if (!(status & RH_PS_CCS)) | 372 | if (changed) { |
356 | continue; | 373 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; |
357 | if ((status & RH_PS_PSS) && can_suspend) | ||
358 | continue; | ||
359 | can_suspend = 0; | 374 | can_suspend = 0; |
375 | } else if (time_before (jiffies, ohci->next_statechange)) { | ||
376 | can_suspend = 0; | ||
377 | } else { | ||
378 | #ifdef CONFIG_PM | ||
379 | can_suspend = can_suspend | ||
380 | && !ohci->ed_rm_list | ||
381 | && ((OHCI_CTRL_HCFS | OHCI_SCHED_ENABLES) | ||
382 | & ohci->hc_control) | ||
383 | == OHCI_USB_OPER; | ||
384 | #endif | ||
385 | if (hcd->uses_new_polling) { | ||
386 | hcd->poll_rh = 0; | ||
387 | /* use INTR_RHSC iff INTR_RD won't apply */ | ||
388 | if (!can_suspend) | ||
389 | ohci_writel (ohci, OHCI_INTR_RHSC, | ||
390 | &ohci->regs->intrenable); | ||
391 | } | ||
360 | } | 392 | } |
393 | |||
361 | done: | 394 | done: |
362 | spin_unlock_irqrestore (&ohci->lock, flags); | 395 | spin_unlock_irqrestore (&ohci->lock, flags); |
363 | 396 | ||
364 | #ifdef CONFIG_PM | 397 | #ifdef CONFIG_PM |
365 | /* save power by suspending idle root hubs; | 398 | /* save power by autosuspending idle root hubs; |
366 | * INTR_RD wakes us when there's work | 399 | * INTR_RD wakes us when there's work |
367 | */ | 400 | */ |
368 | if (can_suspend | 401 | if (can_suspend && usb_trylock_device (hcd->self.root_hub) == 0) { |
369 | && !changed | ||
370 | && !ohci->ed_rm_list | ||
371 | && ((OHCI_CTRL_HCFS | OHCI_SCHED_ENABLES) | ||
372 | & ohci->hc_control) | ||
373 | == OHCI_USB_OPER | ||
374 | && time_after (jiffies, ohci->next_statechange) | ||
375 | && usb_trylock_device (hcd->self.root_hub) == 0 | ||
376 | ) { | ||
377 | ohci_vdbg (ohci, "autosuspend\n"); | 402 | ohci_vdbg (ohci, "autosuspend\n"); |
378 | (void) ohci_bus_suspend (hcd); | 403 | (void) ohci_bus_suspend (hcd); |
379 | usb_unlock_device (hcd->self.root_hub); | 404 | usb_unlock_device (hcd->self.root_hub); |
diff --git a/drivers/usb/host/ohci-lh7a404.c b/drivers/usb/host/ohci-lh7a404.c index 5602da9bd52c..f2c9161d6d6a 100644 --- a/drivers/usb/host/ohci-lh7a404.c +++ b/drivers/usb/host/ohci-lh7a404.c | |||
@@ -173,10 +173,6 @@ static const struct hc_driver ohci_lh7a404_hc_driver = { | |||
173 | * basic lifecycle operations | 173 | * basic lifecycle operations |
174 | */ | 174 | */ |
175 | .start = ohci_lh7a404_start, | 175 | .start = ohci_lh7a404_start, |
176 | #ifdef CONFIG_PM | ||
177 | /* suspend: ohci_lh7a404_suspend, -- tbd */ | ||
178 | /* resume: ohci_lh7a404_resume, -- tbd */ | ||
179 | #endif /*CONFIG_PM*/ | ||
180 | .stop = ohci_stop, | 176 | .stop = ohci_stop, |
181 | 177 | ||
182 | /* | 178 | /* |
@@ -196,6 +192,7 @@ static const struct hc_driver ohci_lh7a404_hc_driver = { | |||
196 | */ | 192 | */ |
197 | .hub_status_data = ohci_hub_status_data, | 193 | .hub_status_data = ohci_hub_status_data, |
198 | .hub_control = ohci_hub_control, | 194 | .hub_control = ohci_hub_control, |
195 | .hub_irq_enable = ohci_rhsc_enable, | ||
199 | #ifdef CONFIG_PM | 196 | #ifdef CONFIG_PM |
200 | .bus_suspend = ohci_bus_suspend, | 197 | .bus_suspend = ohci_bus_suspend, |
201 | .bus_resume = ohci_bus_resume, | 198 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index c4c4babd4767..47f1c9bbef87 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c | |||
@@ -382,8 +382,10 @@ ohci_omap_start (struct usb_hcd *hcd) | |||
382 | int ret; | 382 | int ret; |
383 | 383 | ||
384 | config = hcd->self.controller->platform_data; | 384 | config = hcd->self.controller->platform_data; |
385 | if (config->otg || config->rwc) | 385 | if (config->otg || config->rwc) { |
386 | ohci->hc_control = OHCI_CTRL_RWC; | ||
386 | writel(OHCI_CTRL_RWC, &ohci->regs->control); | 387 | writel(OHCI_CTRL_RWC, &ohci->regs->control); |
388 | } | ||
387 | 389 | ||
388 | if ((ret = ohci_run (ohci)) < 0) { | 390 | if ((ret = ohci_run (ohci)) < 0) { |
389 | dev_err(hcd->self.controller, "can't start\n"); | 391 | dev_err(hcd->self.controller, "can't start\n"); |
@@ -429,6 +431,7 @@ static const struct hc_driver ohci_omap_hc_driver = { | |||
429 | */ | 431 | */ |
430 | .hub_status_data = ohci_hub_status_data, | 432 | .hub_status_data = ohci_hub_status_data, |
431 | .hub_control = ohci_hub_control, | 433 | .hub_control = ohci_hub_control, |
434 | .hub_irq_enable = ohci_rhsc_enable, | ||
432 | #ifdef CONFIG_PM | 435 | #ifdef CONFIG_PM |
433 | .bus_suspend = ohci_bus_suspend, | 436 | .bus_suspend = ohci_bus_suspend, |
434 | .bus_resume = ohci_bus_resume, | 437 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 37e122812b67..ef874443aa9f 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c | |||
@@ -176,11 +176,13 @@ static const struct hc_driver ohci_pci_hc_driver = { | |||
176 | */ | 176 | */ |
177 | .reset = ohci_pci_reset, | 177 | .reset = ohci_pci_reset, |
178 | .start = ohci_pci_start, | 178 | .start = ohci_pci_start, |
179 | .stop = ohci_stop, | ||
180 | |||
179 | #ifdef CONFIG_PM | 181 | #ifdef CONFIG_PM |
182 | /* these suspend/resume entries are for upstream PCI glue ONLY */ | ||
180 | .suspend = ohci_pci_suspend, | 183 | .suspend = ohci_pci_suspend, |
181 | .resume = ohci_pci_resume, | 184 | .resume = ohci_pci_resume, |
182 | #endif | 185 | #endif |
183 | .stop = ohci_stop, | ||
184 | 186 | ||
185 | /* | 187 | /* |
186 | * managing i/o requests and associated device resources | 188 | * managing i/o requests and associated device resources |
@@ -199,6 +201,7 @@ static const struct hc_driver ohci_pci_hc_driver = { | |||
199 | */ | 201 | */ |
200 | .hub_status_data = ohci_hub_status_data, | 202 | .hub_status_data = ohci_hub_status_data, |
201 | .hub_control = ohci_hub_control, | 203 | .hub_control = ohci_hub_control, |
204 | .hub_irq_enable = ohci_rhsc_enable, | ||
202 | #ifdef CONFIG_PM | 205 | #ifdef CONFIG_PM |
203 | .bus_suspend = ohci_bus_suspend, | 206 | .bus_suspend = ohci_bus_suspend, |
204 | .bus_resume = ohci_bus_resume, | 207 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c index 9fe56ff1615d..270aaaad8c6d 100644 --- a/drivers/usb/host/ohci-ppc-soc.c +++ b/drivers/usb/host/ohci-ppc-soc.c | |||
@@ -166,6 +166,7 @@ static const struct hc_driver ohci_ppc_soc_hc_driver = { | |||
166 | */ | 166 | */ |
167 | .hub_status_data = ohci_hub_status_data, | 167 | .hub_status_data = ohci_hub_status_data, |
168 | .hub_control = ohci_hub_control, | 168 | .hub_control = ohci_hub_control, |
169 | .hub_irq_enable = ohci_rhsc_enable, | ||
169 | #ifdef CONFIG_PM | 170 | #ifdef CONFIG_PM |
170 | .bus_suspend = ohci_bus_suspend, | 171 | .bus_suspend = ohci_bus_suspend, |
171 | .bus_resume = ohci_bus_resume, | 172 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 6f559e102789..2752d36c2a78 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c | |||
@@ -288,6 +288,7 @@ static const struct hc_driver ohci_pxa27x_hc_driver = { | |||
288 | */ | 288 | */ |
289 | .hub_status_data = ohci_hub_status_data, | 289 | .hub_status_data = ohci_hub_status_data, |
290 | .hub_control = ohci_hub_control, | 290 | .hub_control = ohci_hub_control, |
291 | .hub_irq_enable = ohci_rhsc_enable, | ||
291 | #ifdef CONFIG_PM | 292 | #ifdef CONFIG_PM |
292 | .bus_suspend = ohci_bus_suspend, | 293 | .bus_suspend = ohci_bus_suspend, |
293 | .bus_resume = ohci_bus_resume, | 294 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index d2fc6969a9f7..c4c77d26ca1f 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c | |||
@@ -465,6 +465,7 @@ static const struct hc_driver ohci_s3c2410_hc_driver = { | |||
465 | */ | 465 | */ |
466 | .hub_status_data = ohci_s3c2410_hub_status_data, | 466 | .hub_status_data = ohci_s3c2410_hub_status_data, |
467 | .hub_control = ohci_s3c2410_hub_control, | 467 | .hub_control = ohci_s3c2410_hub_control, |
468 | .hub_irq_enable = ohci_rhsc_enable, | ||
468 | #ifdef CONFIG_PM | 469 | #ifdef CONFIG_PM |
469 | .bus_suspend = ohci_bus_suspend, | 470 | .bus_suspend = ohci_bus_suspend, |
470 | .bus_resume = ohci_bus_resume, | 471 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c index ce3de106cadc..71371de32ada 100644 --- a/drivers/usb/host/ohci-sa1111.c +++ b/drivers/usb/host/ohci-sa1111.c | |||
@@ -212,10 +212,6 @@ static const struct hc_driver ohci_sa1111_hc_driver = { | |||
212 | * basic lifecycle operations | 212 | * basic lifecycle operations |
213 | */ | 213 | */ |
214 | .start = ohci_sa1111_start, | 214 | .start = ohci_sa1111_start, |
215 | #ifdef CONFIG_PM | ||
216 | /* suspend: ohci_sa1111_suspend, -- tbd */ | ||
217 | /* resume: ohci_sa1111_resume, -- tbd */ | ||
218 | #endif | ||
219 | .stop = ohci_stop, | 215 | .stop = ohci_stop, |
220 | 216 | ||
221 | /* | 217 | /* |
@@ -235,6 +231,7 @@ static const struct hc_driver ohci_sa1111_hc_driver = { | |||
235 | */ | 231 | */ |
236 | .hub_status_data = ohci_hub_status_data, | 232 | .hub_status_data = ohci_hub_status_data, |
237 | .hub_control = ohci_hub_control, | 233 | .hub_control = ohci_hub_control, |
234 | .hub_irq_enable = ohci_rhsc_enable, | ||
238 | #ifdef CONFIG_PM | 235 | #ifdef CONFIG_PM |
239 | .bus_suspend = ohci_bus_suspend, | 236 | .bus_suspend = ohci_bus_suspend, |
240 | .bus_resume = ohci_bus_resume, | 237 | .bus_resume = ohci_bus_resume, |