aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Brandt <chris.brandt@renesas.com>2019-01-28 13:25:56 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-02-12 19:47:26 +0100
commitc287265bfa65deff9f3af30f048efa87030bb425 (patch)
treee679a5b3ad274b1337825f098b9c7826d7b87489
parent57a3ef4dd520e089858484cd68a71c1858600436 (diff)
downloadlinux-linaro-stable-c287265bfa65deff9f3af30f048efa87030bb425.tar.gz
serial: sh-sci: Do not free irqs that have already been freed
commit 4d95987a32db53f3beca76f8c4c8309ef6a5f192 upstream. 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") Cc: stable <stable@vger.kernel.org> Signed-off-by: Chris Brandt <chris.brandt@renesas.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/tty/serial/sh-sci.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index c6e8ca2e5f7d..859b173e3b82 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1921,7 +1921,7 @@ out_nomem:
static void sci_free_irq(struct sci_port *port)
{
- int i;
+ int i, j;
/*
* Intentionally in reverse order so we iterate over the muxed
@@ -1937,6 +1937,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]);