tty: serial: samsung: Disable interrupts in a suspend-friendly way
authorTomasz Figa <t.figa@samsung.com>
Tue, 26 Mar 2013 14:57:35 +0000 (15:57 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Mar 2013 23:03:54 +0000 (16:03 -0700)
Since the interrupt mask register is not preserved across system suspend
and it defaults to all interrupts enabled, it is not enough to disable
UART interrupt.

This patch adds free_irq to port shutdown and mask setting to port
startup to handle IRQ disabling in a suspend-friendly way. In addition,
a bug caused by multiple request_irq calls in port startup callback is
fixed.

Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/samsung.c

index 2769a38..b386fc8 100644 (file)
@@ -446,6 +446,8 @@ static void s3c24xx_serial_shutdown(struct uart_port *port)
 
        /* Clear pending interrupts and mask all interrupts */
        if (s3c24xx_serial_has_interrupt_mask(port)) {
+               free_irq(port->irq, ourport);
+
                wr_regl(port, S3C64XX_UINTP, 0xf);
                wr_regl(port, S3C64XX_UINTM, 0xf);
        }
@@ -505,6 +507,8 @@ static int s3c64xx_serial_startup(struct uart_port *port)
        dbg("s3c64xx_serial_startup: port=%p (%08lx,%p)\n",
            port->mapbase, port->membase);
 
+       wr_regl(port, S3C64XX_UINTM, 0xf);
+
        ret = request_irq(port->irq, s3c64xx_serial_handle_irq, IRQF_SHARED,
                          s3c24xx_serial_portname(port), ourport);
        if (ret) {