From: Felipe Balbi Date: Mon, 16 May 2016 11:17:06 +0000 (+0300) Subject: UPSTREAM: usb: dwc3: gadget: hold gadget IRQ in dwc->irq_gadget X-Git-Tag: firefly_0821_release~1825 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b99e9a341d7d3d8fed72ea8fe2005d7a15d8ffab;p=firefly-linux-kernel-4.4.55.git UPSTREAM: usb: dwc3: gadget: hold gadget IRQ in dwc->irq_gadget 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. Change-Id: I17ed4486bfcc1cd9fabb11fccb802e3a80d61501 Signed-off-by: Felipe Balbi Signed-off-by: Wu Liang feng (cherry picked from commit 3f308d17d7abbf35a6d40a7f16dc70cf43f12c98) --- diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index a5a911b98b94..3d40a4faada1 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -728,6 +728,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) @@ -835,6 +836,7 @@ struct dwc3 { enum usb_dr_mode dr_mode; u32 fladj; + u32 irq_gadget; u32 nr_scratch; u32 u1u2; u32 maximum_speed; diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index f24746b476dc..bb4268a2d946 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1755,6 +1755,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) { @@ -1791,15 +1792,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; }