From 07b8b9031605fe2f59ca99df113979f21716130b Mon Sep 17 00:00:00 2001 From: Benoit Goby Date: Mon, 20 Sep 2010 17:40:34 -0700 Subject: [PATCH] mdm6600: Enable the wakeup irq on suspend Other ports may need the wakeup irq even if the modem main port is not opened. Enable the wakeup irq when the first opened port is suspended, instead of enabling it when the main port is opened. Change-Id: I15f32bb885673765cf5c7a574896e1c427d24977 Signed-off-by: Benoit Goby --- drivers/usb/serial/mdm6600.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/drivers/usb/serial/mdm6600.c b/drivers/usb/serial/mdm6600.c index fcdc9153b56a..5e7ecbb31b81 100644 --- a/drivers/usb/serial/mdm6600.c +++ b/drivers/usb/serial/mdm6600.c @@ -106,6 +106,7 @@ static int mdm6600_wake_irq; * changed if other ttyUSB have been registered before. */ static int mdm6600_attached_ports; +static int mdm6600_suspended_ports; static void mdm6600_read_bulk_work(struct work_struct *work); static void mdm6600_read_bulk_cb(struct urb *urb); @@ -218,6 +219,7 @@ static int mdm6600_attach(struct usb_serial *serial) pr_err("request_irq failed; err=%d", status); return -ENXIO; } + enable_irq_wake(mdm6600_wake_irq); disable_irq(mdm6600_wake_irq); } @@ -263,8 +265,10 @@ static void mdm6600_disconnect(struct usb_serial *serial) dbg("%s: port %d", __func__, modem->number); - if (modem->number == MODEM_INTERFACE_NUM) + if (modem->number == MODEM_INTERFACE_NUM) { + disable_irq_wake(mdm6600_wake_irq); free_irq(mdm6600_wake_irq, modem); + } mdm6600_kill_urbs(modem); @@ -346,11 +350,6 @@ static int mdm6600_open(struct tty_struct *tty, struct usb_serial_port *port) modem->tiocm_status = 0; - if (modem->number == MODEM_INTERFACE_NUM) { - enable_irq(mdm6600_wake_irq); - enable_irq_wake(mdm6600_wake_irq); - } - spin_lock_irqsave(&modem->susp_lock, flags); modem->opened = 1; if (modem->susp_count) { @@ -371,11 +370,6 @@ static void mdm6600_close(struct usb_serial_port *port) dbg("%s: port %d", __func__, modem->number); - if (modem->number == MODEM_INTERFACE_NUM) { - disable_irq_wake(mdm6600_wake_irq); - disable_irq(mdm6600_wake_irq); - } - modem->opened = 0; mdm6600_kill_urbs(modem); @@ -758,7 +752,10 @@ static int mdm6600_suspend(struct usb_interface *intf, pm_message_t message) spin_lock_irq(&modem->susp_lock); - if (modem->susp_count++ == 0 && modem->opened) { + if (!modem->susp_count++ && modem->opened) { + if (!mdm6600_suspended_ports++) + enable_irq(mdm6600_wake_irq); + spin_unlock_irq(&modem->susp_lock); dbg("%s: kill urbs", __func__); mdm6600_kill_urbs(modem); @@ -780,7 +777,10 @@ static int mdm6600_resume(struct usb_interface *intf) spin_lock_irq(&modem->susp_lock); - if (--modem->susp_count == 0 && modem->opened) { + if (!--modem->susp_count && modem->opened) { + if (!--mdm6600_suspended_ports) + disable_irq(mdm6600_wake_irq); + dbg("%s: submit urbs", __func__); spin_unlock_irq(&modem->susp_lock); @@ -792,7 +792,6 @@ static int mdm6600_resume(struct usb_interface *intf) if (rc < 0) { usb_unanchor_urb(u); usb_scuttle_anchored_urbs(&modem->write.delayed); - spin_unlock_irq(&modem->susp_lock); pr_err("%s: submit bulk urb failed %d\n", __func__, rc); return rc; } -- 2.34.1