]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/core/usb.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[linux-2.6-omap-h63xx.git] / drivers / usb / core / usb.c
index 84fcaa6a21ec285e85ab309bfc0b4be728f62caa..be1fa0723f2c662a058040e8878e7ffb5c12c3df 100644 (file)
@@ -219,12 +219,6 @@ static int usb_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
 }
 #endif /* CONFIG_HOTPLUG */
 
-struct device_type usb_device_type = {
-       .name =         "usb_device",
-       .release =      usb_release_dev,
-       .uevent =       usb_dev_uevent,
-};
-
 #ifdef CONFIG_PM
 
 static int ksuspend_usb_init(void)
@@ -244,13 +238,80 @@ static void ksuspend_usb_cleanup(void)
        destroy_workqueue(ksuspend_usb_wq);
 }
 
+/* USB device Power-Management thunks.
+ * There's no need to distinguish here between quiescing a USB device
+ * and powering it down; the generic_suspend() routine takes care of
+ * it by skipping the usb_port_suspend() call for a quiesce.  And for
+ * USB interfaces there's no difference at all.
+ */
+
+static int usb_dev_prepare(struct device *dev)
+{
+       return 0;               /* Implement eventually? */
+}
+
+static void usb_dev_complete(struct device *dev)
+{
+       /* Currently used only for rebinding interfaces */
+       usb_resume(dev);        /* Implement eventually? */
+}
+
+static int usb_dev_suspend(struct device *dev)
+{
+       return usb_suspend(dev, PMSG_SUSPEND);
+}
+
+static int usb_dev_resume(struct device *dev)
+{
+       return usb_resume(dev);
+}
+
+static int usb_dev_freeze(struct device *dev)
+{
+       return usb_suspend(dev, PMSG_FREEZE);
+}
+
+static int usb_dev_thaw(struct device *dev)
+{
+       return usb_resume(dev);
+}
+
+static int usb_dev_poweroff(struct device *dev)
+{
+       return usb_suspend(dev, PMSG_HIBERNATE);
+}
+
+static int usb_dev_restore(struct device *dev)
+{
+       return usb_resume(dev);
+}
+
+static struct pm_ops usb_device_pm_ops = {
+       .prepare =      usb_dev_prepare,
+       .complete =     usb_dev_complete,
+       .suspend =      usb_dev_suspend,
+       .resume =       usb_dev_resume,
+       .freeze =       usb_dev_freeze,
+       .thaw =         usb_dev_thaw,
+       .poweroff =     usb_dev_poweroff,
+       .restore =      usb_dev_restore,
+};
+
 #else
 
 #define ksuspend_usb_init()    0
 #define ksuspend_usb_cleanup() do {} while (0)
+#define usb_device_pm_ops      (*(struct pm_ops *)0)
 
 #endif /* CONFIG_PM */
 
+struct device_type usb_device_type = {
+       .name =         "usb_device",
+       .release =      usb_release_dev,
+       .uevent =       usb_dev_uevent,
+       .pm =           &usb_device_pm_ops,
+};
+
 
 /* Returns 1 if @usb_bus is WUSB, 0 otherwise */
 static unsigned usb_bus_is_wusb(struct usb_bus *bus)