usb: dwc3: gadget: hold gadget IRQ in dwc->irq_gadget
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 16 May 2016 11:17:06 +0000 (14:17 +0300)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 20 Jun 2016 09:32:36 +0000 (12:32 +0300)
by holding gadget's IRQ number in dwc->irq_gadget,
it'll be simpler to free_irq() and disable the IRQ
in case an IRQ fires while we are runtime suspended.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/core.h
drivers/usb/dwc3/gadget.c

index 211729519eb4845b19ca312ba8649cd54b14ca88..5148c563167ea05472d2a82908ba70fe73ba0de6 100644 (file)
@@ -730,6 +730,7 @@ struct dwc3_scratchpad_array {
  * @regs: base address for our registers
  * @regs_size: address space size
  * @fladj: frame length adjustment
+ * @irq_gadget: peripheral controller's IRQ number
  * @nr_scratch: number of scratch buffers
  * @u1u2: only used on revisions <1.83a for workaround
  * @maximum_speed: maximum speed requested (mainly for testing purposes)
@@ -837,6 +838,7 @@ struct dwc3 {
        enum usb_dr_mode        dr_mode;
 
        u32                     fladj;
+       u32                     irq_gadget;
        u32                     nr_scratch;
        u32                     u1u2;
        u32                     maximum_speed;
index 7ba4287f5c7104cc450f65a597cd998a60ff572a..378c14c45fcbb37993bc3ce5815323bb57568dd7 100644 (file)
@@ -1751,6 +1751,7 @@ static int dwc3_gadget_start(struct usb_gadget *g,
                                irq, ret);
                goto err0;
        }
+       dwc->irq_gadget = irq;
 
        spin_lock_irqsave(&dwc->lock, flags);
        if (dwc->gadget_driver) {
@@ -1787,15 +1788,13 @@ static int dwc3_gadget_stop(struct usb_gadget *g)
 {
        struct dwc3             *dwc = gadget_to_dwc(g);
        unsigned long           flags;
-       int                     irq;
 
        spin_lock_irqsave(&dwc->lock, flags);
        __dwc3_gadget_stop(dwc);
        dwc->gadget_driver      = NULL;
        spin_unlock_irqrestore(&dwc->lock, flags);
 
-       irq = platform_get_irq(to_platform_device(dwc->dev), 0);
-       free_irq(irq, dwc->ev_buf);
+       free_irq(dwc->irq_gadget, dwc->ev_buf);
 
        return 0;
 }