fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / usb / core / hcd-pci.c
index 29b5b2a..edf4300 100644 (file)
@@ -16,7 +16,6 @@
  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -126,7 +125,7 @@ int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id)
 
        pci_set_master (dev);
 
-       retval = usb_add_hcd (hcd, dev->irq, SA_SHIRQ);
+       retval = usb_add_hcd (hcd, dev->irq, IRQF_SHARED);
        if (retval != 0)
                goto err4;
        return retval;
@@ -213,11 +212,9 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message)
 
        if (hcd->driver->suspend) {
                retval = hcd->driver->suspend(hcd, message);
-               if (retval) {
-                       dev_dbg (&dev->dev, "PCI pre-suspend fail, %d\n",
-                               retval);
+               suspend_report_result(hcd->driver->suspend, retval);
+               if (retval)
                        goto done;
-               }
        }
        synchronize_irq(dev->irq);
 
@@ -263,22 +260,28 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message)
                 * some device state (e.g. as part of clock reinit).
                 */
                retval = pci_set_power_state (dev, PCI_D3hot);
+               suspend_report_result(pci_set_power_state, retval);
                if (retval == 0) {
-                       dev_dbg (hcd->self.controller, "--> PCI D3\n");
+                       int wake = device_can_wakeup(&hcd->self.root_hub->dev);
+
+                       wake = wake && device_may_wakeup(hcd->self.controller);
+
+                       dev_dbg (hcd->self.controller, "--> PCI D3%s\n",
+                                       wake ? "/wakeup" : "");
 
                        /* Ignore these return values.  We rely on pci code to
                         * reject requests the hardware can't implement, rather
                         * than coding the same thing.
                         */
-                       (void) pci_enable_wake (dev, PCI_D3hot, hcd->remote_wakeup);
-                       (void) pci_enable_wake (dev, PCI_D3cold, hcd->remote_wakeup);
+                       (void) pci_enable_wake (dev, PCI_D3hot, wake);
+                       (void) pci_enable_wake (dev, PCI_D3cold, wake);
                } else {
                        dev_dbg (&dev->dev, "PCI D3 suspend fail, %d\n",
                                        retval);
                        (void) usb_hcd_pci_resume (dev);
                }
 
-       } else {
+       } else if (hcd->state != HC_STATE_HALT) {
                dev_dbg (hcd->self.controller, "hcd state %d; not suspended\n",
                        hcd->state);
                WARN_ON(1);
@@ -291,7 +294,7 @@ done:
 
 #ifdef CONFIG_PPC_PMAC
                /* Disable ASIC clocks for USB */
-               if (_machine == _MACH_Pmac) {
+               if (machine_is(powermac)) {
                        struct device_node      *of_node;
 
                        of_node = pci_device_to_OF_node (dev);
@@ -326,7 +329,7 @@ int usb_hcd_pci_resume (struct pci_dev *dev)
 
 #ifdef CONFIG_PPC_PMAC
        /* Reenable ASIC clocks for USB */
-       if (_machine == _MACH_Pmac) {
+       if (machine_is(powermac)) {
                struct device_node *of_node;
 
                of_node = pci_device_to_OF_node (dev);
@@ -410,4 +413,20 @@ EXPORT_SYMBOL (usb_hcd_pci_resume);
 
 #endif /* CONFIG_PM */
 
+/**
+ * usb_hcd_pci_shutdown - shutdown host controller
+ * @dev: USB Host Controller being shutdown
+ */
+void usb_hcd_pci_shutdown (struct pci_dev *dev)
+{
+       struct usb_hcd          *hcd;
+
+       hcd = pci_get_drvdata(dev);
+       if (!hcd)
+               return;
+
+       if (hcd->driver->shutdown)
+               hcd->driver->shutdown(hcd);
+}
+EXPORT_SYMBOL (usb_hcd_pci_shutdown);