| From 23a2bb27a354ac0f8b9d716a4d0f1e50211e1ebc Mon Sep 17 00:00:00 2001 |
| From: Vignesh R <vigneshr@ti.com> |
| Date: Fri, 7 Jul 2017 11:52:52 +0530 |
| Subject: usb: dwc3: omap: remove IRQ_NOAUTOEN used with shared irq |
| |
| [ Upstream commit ee249b4554947de3be77be4e9e6077b20c0fe055 ] |
| |
| IRQ_NOAUTOEN cannot be used with shared IRQs, since commit 04c848d39879 |
| ("genirq: Warn when IRQ_NOAUTOEN is used with shared interrupts") and |
| kernel now throws a warn dump. But OMAP DWC3 driver uses this flag. As |
| per commit 12a7f17fac5b ("usb: dwc3: omap: fix race of pm runtime with |
| irq handler in probe") that introduced this flag, PM runtime can race |
| with IRQ handler when deferred probing happens due to extcon, |
| therefore IRQ_NOAUTOEN needs to be set so that irq is not enabled until |
| extcon is registered. |
| |
| Remove setting of IRQ_NOAUTOEN and move the registration of |
| shared irq to a point after dwc3_omap_extcon_register() and |
| of_platform_populate(). This avoids possibility of probe deferring and |
| above said race condition. |
| |
| Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com> |
| Signed-off-by: Vignesh R <vigneshr@ti.com> |
| Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/dwc3/dwc3-omap.c | 18 ++++++++---------- |
| 1 file changed, 8 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c |
| index f221cb479e14..8e69150776f5 100644 |
| --- a/drivers/usb/dwc3/dwc3-omap.c |
| +++ b/drivers/usb/dwc3/dwc3-omap.c |
| @@ -512,15 +512,6 @@ static int dwc3_omap_probe(struct platform_device *pdev) |
| |
| /* check the DMA Status */ |
| reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG); |
| - irq_set_status_flags(omap->irq, IRQ_NOAUTOEN); |
| - ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, |
| - dwc3_omap_interrupt_thread, IRQF_SHARED, |
| - "dwc3-omap", omap); |
| - if (ret) { |
| - dev_err(dev, "failed to request IRQ #%d --> %d\n", |
| - omap->irq, ret); |
| - goto err1; |
| - } |
| |
| ret = dwc3_omap_extcon_register(omap); |
| if (ret < 0) |
| @@ -532,8 +523,15 @@ static int dwc3_omap_probe(struct platform_device *pdev) |
| goto err2; |
| } |
| |
| + ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, |
| + dwc3_omap_interrupt_thread, IRQF_SHARED, |
| + "dwc3-omap", omap); |
| + if (ret) { |
| + dev_err(dev, "failed to request IRQ #%d --> %d\n", |
| + omap->irq, ret); |
| + goto err1; |
| + } |
| dwc3_omap_enable_irqs(omap); |
| - enable_irq(omap->irq); |
| return 0; |
| |
| err2: |
| -- |
| 2.17.1 |
| |