if (!clocked)
                at91_start_clock();
 
+       ohci_finish_controller_resume(hcd);
        return 0;
 }
 #else
 
        ohci->next_statechange = jiffies;
 
        ep93xx_start_hc(&pdev->dev);
-       usb_hcd_resume_root_hub(hcd);
 
+       ohci_finish_controller_resume(hcd);
        return 0;
 }
 #endif
 
        return rc;
 }
 
+/* Carry out the final steps of resuming the controller device */
+static void ohci_finish_controller_resume(struct usb_hcd *hcd)
+{
+       struct ohci_hcd         *ohci = hcd_to_ohci(hcd);
+       int                     port;
+       bool                    need_reinit = false;
+
+       /* See if the controller is already running or has been reset */
+       ohci->hc_control = ohci_readl(ohci, &ohci->regs->control);
+       if (ohci->hc_control & (OHCI_CTRL_IR | OHCI_SCHED_ENABLES)) {
+               need_reinit = true;
+       } else {
+               switch (ohci->hc_control & OHCI_CTRL_HCFS) {
+               case OHCI_USB_OPER:
+               case OHCI_USB_RESET:
+                       need_reinit = true;
+               }
+       }
+
+       /* If needed, reinitialize and suspend the root hub */
+       if (need_reinit) {
+               spin_lock_irq(&ohci->lock);
+               hcd->state = HC_STATE_RESUMING;
+               ohci_rh_resume(ohci);
+               hcd->state = HC_STATE_QUIESCING;
+               ohci_rh_suspend(ohci, 0);
+               hcd->state = HC_STATE_SUSPENDED;
+               spin_unlock_irq(&ohci->lock);
+       }
+
+       /* Normally just turn on port power and enable interrupts */
+       else {
+               ohci_dbg(ohci, "powerup ports\n");
+               for (port = 0; port < ohci->num_ports; port++)
+                       ohci_writel(ohci, RH_PS_PPS,
+                                       &ohci->regs->roothub.portstatus[port]);
+
+               ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable);
+               ohci_readl(ohci, &ohci->regs->intrenable);
+               msleep(20);
+       }
+}
+
 /* Carry out polling-, autostop-, and autoresume-related state changes */
 static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
                int any_connected)
 
 
 static int ohci_omap_resume(struct platform_device *dev)
 {
-       struct ohci_hcd *ohci = hcd_to_ohci(platform_get_drvdata(dev));
+       struct usb_hcd  *hcd = platform_get_drvdata(dev);
+       struct ohci_hcd *ohci = hcd_to_ohci(hcd);
 
        if (time_before(jiffies, ohci->next_statechange))
                msleep(5);
        ohci->next_statechange = jiffies;
 
        omap_ohci_clock_power(1);
-       usb_hcd_resume_root_hub(platform_get_drvdata(dev));
+       ohci_finish_controller_resume(hcd);
        return 0;
 }
 
 
        return ret;
 }
 
-#if    defined(CONFIG_USB_PERSIST) && (defined(CONFIG_USB_EHCI_HCD) || \
-               defined(CONFIG_USB_EHCI_HCD_MODULE))
-
-/* Following a power loss, we must prepare to regain control of the ports
- * we used to own.  This means turning on the port power before ehci-hcd
- * tries to switch ownership.
- *
- * This isn't a 100% perfect solution.  On most systems the OHCI controllers
- * lie at lower PCI addresses than the EHCI controller, so they will be
- * discovered (and hence resumed) first.  But there is no guarantee things
- * will always work this way.  If the EHCI controller is resumed first and
- * the OHCI ports are unpowered, then the handover will fail.
- */
-static void prepare_for_handover(struct usb_hcd *hcd)
-{
-       struct ohci_hcd *ohci = hcd_to_ohci(hcd);
-       int             port;
-
-       /* Here we "know" root ports should always stay powered */
-       ohci_dbg(ohci, "powerup ports\n");
-       for (port = 0; port < ohci->num_ports; port++)
-               ohci_writel(ohci, RH_PS_PPS,
-                               &ohci->regs->roothub.portstatus[port]);
-
-       /* Flush those writes */
-       ohci_readl(ohci, &ohci->regs->control);
-       msleep(20);
-}
-
-#else
-
-static inline void prepare_for_handover(struct usb_hcd *hcd)
-{ }
-
-#endif /* CONFIG_USB_PERSIST etc. */
-
 #ifdef CONFIG_PM
 
 static int ohci_pci_suspend (struct usb_hcd *hcd, pm_message_t message)
 
 static int ohci_pci_resume (struct usb_hcd *hcd)
 {
-       struct ohci_hcd *ohci = hcd_to_ohci(hcd);
-
        set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-
-       /* FIXME: we should try to detect loss of VBUS power here */
-       prepare_for_handover(hcd);
-       ohci_writel(ohci, OHCI_INTR_MIE, &ohci->regs->intrenable);
+       ohci_finish_controller_resume(hcd);
        return 0;
 }
 
 
        if ((status = pxa27x_start_hc(&pdev->dev)) < 0)
                return status;
 
-       usb_hcd_resume_root_hub(hcd);
-
+       ohci_finish_controller_resume(hcd);
        return 0;
 }
 #endif
 
 static int ohci_sm501_resume(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
-       struct ohci_hcd *ohci = hcd_to_ohci(platform_get_drvdata(pdev));
+       struct usb_hcd  *hcd = platform_get_drvdata(pdev);
+       struct ohci_hcd *ohci = hcd_to_ohci(hcd);
 
        if (time_before(jiffies, ohci->next_statechange))
                msleep(5);
        ohci->next_statechange = jiffies;
 
        sm501_unit_power(dev->parent, SM501_GATE_USB_HOST, 1);
-       usb_hcd_resume_root_hub(platform_get_drvdata(pdev));
+       ohci_finish_controller_resume(hcd);
        return 0;
 }
 #else
 
 
        ssb_device_enable(dev, ohcidev->enable_flags);
 
+       ohci_finish_controller_resume(hcd);
        return 0;
 }