aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host
diff options
context:
space:
mode:
authorDavid Brownell <david-b@pacbell.net>2006-08-04 14:31:55 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-09-27 14:58:48 -0400
commitd413984ae936fad46678403b38d79c595e5aaafe (patch)
treef494a450d7289d941e3ca2b2e33bfacc29cac024 /drivers/usb/host
parent06afff00bcab0e384afbef70194fd3469532abdf (diff)
USB: OHCI avoids root hub timer polling
This teaches OHCI to use the root hub status change (RHSC) IRQ, bypassing root hub timers most of the time and switching over to the "new" root hub polling scheme. It's complicated by the fact that implementations of OHCI trigger and ack that IRQ differently (the spec is vague there). Avoiding root hub timers helps mechanisms like "dynamic tick" leave the CPU in lowpower modes for longer intervals. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host')
-rw-r--r--drivers/usb/host/ohci-at91.c2
-rw-r--r--drivers/usb/host/ohci-au1xxx.c5
-rw-r--r--drivers/usb/host/ohci-dbg.c5
-rw-r--r--drivers/usb/host/ohci-ep93xx.c1
-rw-r--r--drivers/usb/host/ohci-hcd.c41
-rw-r--r--drivers/usb/host/ohci-hub.c67
-rw-r--r--drivers/usb/host/ohci-lh7a404.c5
-rw-r--r--drivers/usb/host/ohci-omap.c5
-rw-r--r--drivers/usb/host/ohci-pci.c5
-rw-r--r--drivers/usb/host/ohci-ppc-soc.c1
-rw-r--r--drivers/usb/host/ohci-pxa27x.c1
-rw-r--r--drivers/usb/host/ohci-s3c2410.c1
-rw-r--r--drivers/usb/host/ohci-sa1111.c5
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
129static const char hcd_name [] = "ohci_hcd"; 130static 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
133static void ohci_dump (struct ohci_hcd *ohci, int verbose); 136static 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, &regs->intrenable)) == 0) { 717 } else if ((ints &= ohci_readl (ohci, &regs->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, &regs->intrdisable);
731 hcd->poll_rh = 1;
732 ohci->next_statechange = jiffies + STATECHANGE_DELAY;
733 ohci_writel (ohci, OHCI_INTR_RHSC, &regs->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() */
40static 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
126done: 137done:
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
361done: 394done:
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,