serial: mctrl_gpio: add IRQ locking
authorYegor Yefremov <yegorslists@googlemail.com>
Fri, 29 Apr 2016 08:45:07 +0000 (10:45 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 1 May 2016 20:22:54 +0000 (13:22 -0700)
uart_handle_cts_change should be called with port->lock held. And for
this to be save you must also disable irqs.

Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/serial_mctrl_gpio.c

index 02147361eaa94747aea5d7f7235fc61c6cd92109..9e1086f7f22a9c45f708f1126d0ff0298b9b2c8b 100644 (file)
@@ -125,9 +125,12 @@ static irqreturn_t mctrl_gpio_irq_handle(int irq, void *context)
        struct uart_port *port = gpios->port;
        u32 mctrl = gpios->mctrl_prev;
        u32 mctrl_diff;
+       unsigned long flags;
 
        mctrl_gpio_get(gpios, &mctrl);
 
+       spin_lock_irqsave(&port->lock, flags);
+
        mctrl_diff = mctrl ^ gpios->mctrl_prev;
        gpios->mctrl_prev = mctrl;
 
@@ -147,6 +150,8 @@ static irqreturn_t mctrl_gpio_irq_handle(int irq, void *context)
                wake_up_interruptible(&port->state->port.delta_msr_wait);
        }
 
+       spin_unlock_irqrestore(&port->lock, flags);
+
        return IRQ_HANDLED;
 }