On Mon, Jan 28, 2019 at 01:25:56PM -0500, Chris Brandt wrote: > Since IRQs might be muxed on some parts, we need to pay attention when we > are freeing them. > Otherwise we get the ugly WARNING "Trying to free already-free IRQ 20". > > Fixes: 628c534ae735 ("serial: sh-sci: Improve support for separate TEI and DRI interrupts") > Signed-off-by: Chris Brandt <chris.brandt@xxxxxxxxxxx> Reviewed-by: Simon Horman <horms+renesas@xxxxxxxxxxxx> > --- > v2: > * fix bad commit grammer s/grammer/grammar/ :) > --- > drivers/tty/serial/sh-sci.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c > index cb3d5d37674f..060fcd42b6d5 100644 > --- a/drivers/tty/serial/sh-sci.c > +++ b/drivers/tty/serial/sh-sci.c > @@ -1936,7 +1936,7 @@ static int sci_request_irq(struct sci_port *port) > > static void sci_free_irq(struct sci_port *port) > { > - int i; > + int i, j; > > /* > * Intentionally in reverse order so we iterate over the muxed > @@ -1952,6 +1952,13 @@ static void sci_free_irq(struct sci_port *port) > if (unlikely(irq < 0)) > continue; > > + /* Check if already freed (irq was muxed) */ > + for (j = 0; j < i; j++) > + if (port->irqs[j] == irq) > + j = i + 1; > + if (j > i) > + continue; > + > free_irq(port->irqs[i], port); > kfree(port->irqstr[i]); > > -- > 2.16.1 >