[PATCH] usb: hcd: allow wakeups while suspended for Moorestown

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Moorestown does not support PME, so wakeups come as regular
device interrupts.  This means that we can receive an interrupt
while we are runtime suspended, and we need to synchronously
resume our controller in order to handle the irq.  Since this
operation can sleep, the usb_hcd_irq needs to be switched to
a threaded irq.  No quick check irq was implemented because
we cannot do a synchronous resume from a quick check handler.

Signed-off-by: Kristen Carlson Accardi <kristen@xxxxxxxxxxxxxxx>
---
 drivers/usb/core/hcd.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index d2c10d0..10130db 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2092,6 +2092,8 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd)
 	unsigned long		flags;
 	irqreturn_t		rc;
 
+	pm_runtime_get_sync(hcd->self.controller);
+
 	/* IRQF_DISABLED doesn't work correctly with shared IRQs
 	 * when the first handler doesn't use it.  So let's just
 	 * assume it's never used.
@@ -2111,6 +2113,8 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd)
 	}
 
 	local_irq_restore(flags);
+	pm_runtime_put(hcd->self.controller);
+
 	return rc;
 }
 EXPORT_SYMBOL_GPL(usb_hcd_irq);
@@ -2308,8 +2312,8 @@ int usb_add_hcd(struct usb_hcd *hcd,
 
 		snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d",
 				hcd->driver->description, hcd->self.busnum);
-		if ((retval = request_irq(irqnum, &usb_hcd_irq, irqflags,
-				hcd->irq_descr, hcd)) != 0) {
+		if ((retval = request_threaded_irq(irqnum, NULL, &usb_hcd_irq,
+				irqflags, hcd->irq_descr, hcd)) != 0) {
 			dev_err(hcd->self.controller,
 					"request interrupt %d failed\n", irqnum);
 			goto err_request_irq;
-- 
1.7.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux