int opened;
int number;
u16 tiocm_status;
+ struct work_struct wake_work;
};
static int mdm6600_wake_irq;
static void mdm6600_write_bulk_cb(struct urb *urb);
static void mdm6600_release(struct usb_serial *serial);
-static irqreturn_t mdm6600_irq_handler(int irq, void *ptr)
+static void mdm6600_wake_work(struct work_struct *work)
{
- struct mdm6600_port *modem = ptr;
-
- wake_lock_timeout(&modem->readlock, MODEM_WAKELOCK_TIME);
+ struct mdm6600_port *modem = container_of(work, struct mdm6600_port,
+ wake_work);
+ dbg("%s: port %d", __func__, modem->number);
/* let usbcore auto-resume the modem */
- if (usb_autopm_get_interface_async(modem->serial->interface) == 0)
+ if (usb_autopm_get_interface(modem->serial->interface) == 0)
/* set usage count back to 0 */
usb_autopm_put_interface_no_suspend(modem->serial->interface);
+}
+
+static irqreturn_t mdm6600_irq_handler(int irq, void *ptr)
+{
+ struct mdm6600_port *modem = ptr;
+
+ wake_lock_timeout(&modem->readlock, MODEM_WAKELOCK_TIME);
+ queue_work(system_nrt_wq, &modem->wake_work);
return IRQ_HANDLED;
}
serial->dev->parent->autosuspend_delay = 0;
if (modem->number == MODEM_INTERFACE_NUM) {
+ INIT_WORK(&modem->wake_work, mdm6600_wake_work);
status = request_irq(mdm6600_wake_irq, mdm6600_irq_handler,
IRQ_TYPE_EDGE_FALLING, "usb_wake_host", modem);
if (status) {
if (modem->number == MODEM_INTERFACE_NUM) {
disable_irq_wake(mdm6600_wake_irq);
free_irq(mdm6600_wake_irq, modem);
+ cancel_work_sync(&modem->wake_work);
}
mdm6600_kill_urbs(modem);