From 03662c049573f5c6434c6b1b5d7de6e44c39c527 Mon Sep 17 00:00:00 2001 From: Tilman Schmidt Date: Wed, 6 Feb 2008 01:38:27 -0800 Subject: [PATCH] --- yaml --- r: 83507 b: refs/heads/master c: 1ff0a5296ff4157e7c46861bccc8d61e168c4e2b h: refs/heads/master i: 83505: cfdbfdcce5155be9aee4f2f52f3bf214c8a16437 83503: 29d153c539b3aa365933a6d5fb0807d810668adc v: v3 --- [refs] | 2 +- trunk/drivers/isdn/gigaset/usb-gigaset.c | 56 ++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 267bf032b7f5..6f5d09c9b032 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 024fd299ba6e933055fccf1bb1cc2e7bdc58bde6 +refs/heads/master: 1ff0a5296ff4157e7c46861bccc8d61e168c4e2b diff --git a/trunk/drivers/isdn/gigaset/usb-gigaset.c b/trunk/drivers/isdn/gigaset/usb-gigaset.c index d81c0e3f7702..7028911d91ed 100644 --- a/trunk/drivers/isdn/gigaset/usb-gigaset.c +++ b/trunk/drivers/isdn/gigaset/usb-gigaset.c @@ -109,6 +109,11 @@ static int gigaset_probe(struct usb_interface *interface, const struct usb_device_id *id); static void gigaset_disconnect(struct usb_interface *interface); +/* functions called before/after suspend */ +static int gigaset_suspend(struct usb_interface *intf, pm_message_t message); +static int gigaset_resume(struct usb_interface *intf); +static int gigaset_pre_reset(struct usb_interface *intf); + static struct gigaset_driver *driver = NULL; static struct cardstate *cardstate = NULL; @@ -118,6 +123,11 @@ static struct usb_driver gigaset_usb_driver = { .probe = gigaset_probe, .disconnect = gigaset_disconnect, .id_table = gigaset_table, + .suspend = gigaset_suspend, + .resume = gigaset_resume, + .reset_resume = gigaset_resume, + .pre_reset = gigaset_pre_reset, + .post_reset = gigaset_resume, }; struct usb_cardstate { @@ -845,6 +855,52 @@ static void gigaset_disconnect(struct usb_interface *interface) gigaset_unassign(cs); } +/* gigaset_suspend + * This function is called before the USB connection is suspended or reset. + */ +static int gigaset_suspend(struct usb_interface *intf, pm_message_t message) +{ + struct cardstate *cs = usb_get_intfdata(intf); + + /* stop activity */ + cs->connected = 0; /* prevent rescheduling */ + usb_kill_urb(cs->hw.usb->read_urb); + tasklet_kill(&cs->write_tasklet); + usb_kill_urb(cs->hw.usb->bulk_out_urb); + + gig_dbg(DEBUG_SUSPEND, "suspend complete"); + return 0; +} + +/* gigaset_resume + * This function is called after the USB connection has been resumed or reset. + */ +static int gigaset_resume(struct usb_interface *intf) +{ + struct cardstate *cs = usb_get_intfdata(intf); + int rc; + + /* resubmit interrupt URB */ + cs->connected = 1; + rc = usb_submit_urb(cs->hw.usb->read_urb, GFP_KERNEL); + if (rc) { + dev_err(cs->dev, "Could not submit read URB (error %d)\n", -rc); + return rc; + } + + gig_dbg(DEBUG_SUSPEND, "resume complete"); + return 0; +} + +/* gigaset_pre_reset + * This function is called before the USB connection is reset. + */ +static int gigaset_pre_reset(struct usb_interface *intf) +{ + /* same as suspend */ + return gigaset_suspend(intf, PMSG_ON); +} + static const struct gigaset_ops ops = { gigaset_write_cmd, gigaset_write_room,