|
@@ -432,11 +432,56 @@ static void smsusb_disconnect(struct usb_interface *intf)
|
|
|
smsusb_term_device(intf);
|
|
|
}
|
|
|
|
|
|
+static int smsusb_suspend(struct usb_interface *intf, pm_message_t msg)
|
|
|
+{
|
|
|
+ struct smsusb_device_t *dev =
|
|
|
+ (struct smsusb_device_t *)usb_get_intfdata(intf);
|
|
|
+ printk(KERN_INFO "%s Entering status %d.\n", __func__, msg.event);
|
|
|
+ smsusb_stop_streaming(dev);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int smsusb_resume(struct usb_interface *intf)
|
|
|
+{
|
|
|
+ int rc, i;
|
|
|
+ struct smsusb_device_t *dev =
|
|
|
+ (struct smsusb_device_t *)usb_get_intfdata(intf);
|
|
|
+ struct usb_device *udev = interface_to_usbdev(intf);
|
|
|
+
|
|
|
+ printk(KERN_INFO "%s Entering.\n", __func__);
|
|
|
+ usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x81));
|
|
|
+ usb_clear_halt(udev, usb_rcvbulkpipe(udev, 0x02));
|
|
|
+
|
|
|
+ for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++)
|
|
|
+ printk(KERN_INFO "endpoint %d %02x %02x %d\n", i,
|
|
|
+ intf->cur_altsetting->endpoint[i].desc.bEndpointAddress,
|
|
|
+ intf->cur_altsetting->endpoint[i].desc.bmAttributes,
|
|
|
+ intf->cur_altsetting->endpoint[i].desc.wMaxPacketSize);
|
|
|
+
|
|
|
+ if (intf->num_altsetting > 0) {
|
|
|
+ rc = usb_set_interface(udev,
|
|
|
+ intf->cur_altsetting->desc.
|
|
|
+ bInterfaceNumber, 0);
|
|
|
+ if (rc < 0) {
|
|
|
+ printk(KERN_INFO
|
|
|
+ "%s usb_set_interface failed, rc %d\n",
|
|
|
+ __func__, rc);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ smsusb_start_streaming(dev);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static struct usb_driver smsusb_driver = {
|
|
|
.name = "sms1xxx",
|
|
|
.probe = smsusb_probe,
|
|
|
.disconnect = smsusb_disconnect,
|
|
|
.id_table = smsusb_id_table,
|
|
|
+
|
|
|
+ .suspend = smsusb_suspend,
|
|
|
+ .resume = smsusb_resume,
|
|
|
};
|
|
|
|
|
|
int smsusb_register(void)
|