Hi, Roger Quadros <rogerq@xxxxxx> writes: > The wrapper interrupt is shared with OTG core so mark it IRQF_SHARED. > > Use request_threaded_irq() to ensure that irqflags match for the > shared interrupt handlers. If we don't use request_treaded_irq() then > forced threaded irq will set IRQF_ONESHOT and this won't match with > the OTG irq handler. then it seems you need to _first_ fix the OTG IRQ handler. Why does it defer ? At a minimum, first switch to threaded IRQ handler, then (in another patch) switch to IRQF_SHARED > Signed-off-by: Roger Quadros <rogerq@xxxxxx> > --- > drivers/usb/dwc3/dwc3-omap.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c > index 22e9606..51ca098 100644 > --- a/drivers/usb/dwc3/dwc3-omap.c > +++ b/drivers/usb/dwc3/dwc3-omap.c > @@ -274,19 +274,25 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap) > { > struct dwc3_omap *omap = _omap; > u32 reg; > + int ret = IRQ_NONE; > > reg = dwc3_omap_read_irqmisc_status(omap); > > + if (reg) > + ret = IRQ_HANDLED; you can avoid the local variable by returning early here. if (!reg) return IRQ_NONE; > if (reg & USBOTGSS_IRQMISC_DMADISABLECLR) > omap->dma_status = false; > > dwc3_omap_write_irqmisc_status(omap, reg); > > reg = dwc3_omap_read_irq0_status(omap); > + if (reg) > + ret = IRQ_HANDLED; and this check is probably unnecessary. > @@ -506,8 +512,8 @@ static int dwc3_omap_probe(struct platform_device *pdev) > reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG); > omap->dma_status = !!(reg & USBOTGSS_SYSCONFIG_DMADISABLE); > > - ret = devm_request_irq(dev, omap->irq, dwc3_omap_interrupt, 0, > - "dwc3-omap", omap); > + ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, this switch to threaded IRQ is not part of $subject. -- balbi
Attachment:
signature.asc
Description: PGP signature