vserver 1.9.5.x5
[linux-2.6.git] / drivers / usb / host / ohci-pci.c
index 73d9aee..b611582 100644 (file)
@@ -35,9 +35,8 @@ ohci_pci_reset (struct usb_hcd *hcd)
 {
        struct ohci_hcd *ohci = hcd_to_ohci (hcd);
 
-       ohci->regs = hcd->regs;
-       ohci->next_statechange = jiffies;
-       return hc_reset (ohci);
+       ohci_hcd_init (ohci);
+       return ohci_init (ohci);
 }
 
 static int __devinit
@@ -46,11 +45,6 @@ ohci_pci_start (struct usb_hcd *hcd)
        struct ohci_hcd *ohci = hcd_to_ohci (hcd);
        int             ret;
 
-       ohci->hcca = dma_alloc_coherent (hcd->self.controller,
-                       sizeof *ohci->hcca, &ohci->hcca_dma, 0);
-       if (!ohci->hcca)
-               return -ENOMEM;
-
        if(hcd->self.controller && hcd->self.controller->bus == &pci_bus_type) {
                struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
 
@@ -61,6 +55,7 @@ ohci_pci_start (struct usb_hcd *hcd)
                                && pdev->device == 0x740c) {
                        ohci->flags = OHCI_QUIRK_AMD756;
                        ohci_info (ohci, "AMD756 erratum 4 workaround\n");
+                       // also somewhat erratum 10 (suspend/resume issues)
                }
 
                /* FIXME for some of the early AMD 760 southbridges, OHCI
@@ -92,25 +87,16 @@ ohci_pci_start (struct usb_hcd *hcd)
                                ohci_info (ohci, "Using NSC SuperIO setup\n");
                        }
                }
-       
-       }
-
-        memset (ohci->hcca, 0, sizeof (struct ohci_hcca));
-       if ((ret = ohci_mem_init (ohci)) < 0) {
-               ohci_stop (hcd);
-               return ret;
        }
 
-       if (hc_start (ohci) < 0) {
+       /* NOTE: there may have already been a first reset, to
+        * keep bios/smm irqs from making trouble
+        */
+       if ((ret = ohci_run (ohci)) < 0) {
                ohci_err (ohci, "can't start\n");
                ohci_stop (hcd);
-               return -EBUSY;
+               return ret;
        }
-       create_debug_files (ohci);
-
-#ifdef DEBUG
-       ohci_dump (ohci, 1);
-#endif
        return 0;
 }
 
@@ -121,25 +107,22 @@ static int ohci_pci_suspend (struct usb_hcd *hcd, u32 state)
        struct ohci_hcd         *ohci = hcd_to_ohci (hcd);
 
        /* suspend root hub, hoping it keeps power during suspend */
-       while (time_before (jiffies, ohci->next_statechange))
+       if (time_before (jiffies, ohci->next_statechange))
                msleep (100);
 
 #ifdef CONFIG_USB_SUSPEND
        (void) usb_suspend_device (hcd->self.root_hub, state);
 #else
-       down (&hcd->self.root_hub->serialize);
+       usb_lock_device (hcd->self.root_hub);
        (void) ohci_hub_suspend (hcd);
-       up (&hcd->self.root_hub->serialize);
+       usb_unlock_device (hcd->self.root_hub);
 #endif
 
        /* let things settle down a bit */
        msleep (100);
        
 #ifdef CONFIG_PMAC_PBOOK
-       if (_machine == _MACH_Pmac)
-               disable_irq ((to_pci_dev(hcd->self.controller))->irq);
-
-       {
+       if (_machine == _MACH_Pmac) {
                struct device_node      *of_node;
  
                /* Disable USB PAD & cell clock */
@@ -147,7 +130,7 @@ static int ohci_pci_suspend (struct usb_hcd *hcd, u32 state)
                if (of_node)
                        pmac_call_feature(PMAC_FTR_USB_ENABLE, of_node, 0, 0);
        }
-#endif
+#endif /* CONFIG_PMAC_PBOOK */
        return 0;
 }
 
@@ -158,7 +141,7 @@ static int ohci_pci_resume (struct usb_hcd *hcd)
        int                     retval = 0;
 
 #ifdef CONFIG_PMAC_PBOOK
-       {
+       if (_machine == _MACH_Pmac) {
                struct device_node *of_node;
 
                /* Re-enable USB PAD & cell clock */
@@ -166,27 +149,20 @@ static int ohci_pci_resume (struct usb_hcd *hcd)
                if (of_node)
                        pmac_call_feature (PMAC_FTR_USB_ENABLE, of_node, 0, 1);
        }
-#endif
+#endif /* CONFIG_PMAC_PBOOK */
 
        /* resume root hub */
-       while (time_before (jiffies, ohci->next_statechange))
+       if (time_before (jiffies, ohci->next_statechange))
                msleep (100);
 #ifdef CONFIG_USB_SUSPEND
        /* get extra cleanup even if remote wakeup isn't in use */
        retval = usb_resume_device (hcd->self.root_hub);
 #else
-       down (&hcd->self.root_hub->serialize);
+       usb_lock_device (hcd->self.root_hub);
        retval = ohci_hub_resume (hcd);
-       up (&hcd->self.root_hub->serialize);
+       usb_unlock_device (hcd->self.root_hub);
 #endif
 
-       if (retval == 0) {
-               hcd->self.controller->power.power_state = 0;
-#ifdef CONFIG_PMAC_PBOOK
-               if (_machine == _MACH_Pmac)
-                       enable_irq (to_pci_dev(hcd->self.controller)->irq);
-#endif
-       }
        return retval;
 }
 
@@ -197,6 +173,8 @@ static int ohci_pci_resume (struct usb_hcd *hcd)
 
 static const struct hc_driver ohci_pci_hc_driver = {
        .description =          hcd_name,
+       .product_desc =         "OHCI Host Controller",
+       .hcd_priv_size =        sizeof(struct ohci_hcd),
 
        /*
         * generic hardware linkage
@@ -215,12 +193,6 @@ static const struct hc_driver ohci_pci_hc_driver = {
 #endif
        .stop =                 ohci_stop,
 
-       /*
-        * memory lifecycle (except per-request)
-        */
-       .hcd_alloc =            ohci_hcd_alloc,
-       .hcd_free =             ohci_hcd_free,
-
        /*
         * managing i/o requests and associated device resources
         */
@@ -279,7 +251,7 @@ static int __init ohci_hcd_pci_init (void)
 
        pr_debug ("%s: block sizes: ed %Zd td %Zd\n", hcd_name,
                sizeof (struct ed), sizeof (struct td));
-       return pci_module_init (&ohci_pci_driver);
+       return pci_register_driver (&ohci_pci_driver);
 }
 module_init (ohci_hcd_pci_init);