Skip to content

Commit

Permalink
tty: serial: lpuart: avoid report NULL interrupt
Browse files Browse the repository at this point in the history
The current driver register irq in .startup() and free the irq in
.shutdown(), then user will see the NULL interrupt output from
'cat /proc/interrupts' after the uart port test completed:
...
 41:        515          0          0          0     GICv3 257 Level     fsl-lpuart
 42:          2          0          0          0     GICv3 258 Level
...

It is better to register all the irqs during probe function via devm_request_irq()
to avoid to call free_irq().

Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Fugang Duan authored and Greg Kroah-Hartman committed Sep 18, 2017
1 parent 0e5ec41 commit 9d7ee0e
Showing 1 changed file with 17 additions and 23 deletions.
40 changes: 17 additions & 23 deletions drivers/tty/serial/fsl_lpuart.c
Original file line number Diff line number Diff line change
Expand Up @@ -1276,7 +1276,6 @@ static void rx_dma_timer_init(struct lpuart_port *sport)
static int lpuart_startup(struct uart_port *port)
{
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
int ret;
unsigned long flags;
unsigned char temp;

Expand All @@ -1291,11 +1290,6 @@ static int lpuart_startup(struct uart_port *port)
sport->rxfifo_size = 0x1 << (((temp >> UARTPFIFO_RXSIZE_OFF) &
UARTPFIFO_FIFOSIZE_MASK) + 1);

ret = devm_request_irq(port->dev, port->irq, lpuart_int, 0,
DRIVER_NAME, sport);
if (ret)
return ret;

spin_lock_irqsave(&sport->port.lock, flags);

lpuart_setup_watermark(sport);
Expand Down Expand Up @@ -1333,7 +1327,6 @@ static int lpuart_startup(struct uart_port *port)
static int lpuart32_startup(struct uart_port *port)
{
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
int ret;
unsigned long flags;
unsigned long temp;

Expand All @@ -1346,11 +1339,6 @@ static int lpuart32_startup(struct uart_port *port)
sport->rxfifo_size = 0x1 << (((temp >> UARTFIFO_RXSIZE_OFF) &
UARTFIFO_FIFOSIZE_MASK) - 1);

ret = devm_request_irq(port->dev, port->irq, lpuart32_int, 0,
DRIVER_NAME, sport);
if (ret)
return ret;

spin_lock_irqsave(&sport->port.lock, flags);

lpuart32_setup_watermark(sport);
Expand Down Expand Up @@ -1380,8 +1368,6 @@ static void lpuart_shutdown(struct uart_port *port)

spin_unlock_irqrestore(&port->lock, flags);

devm_free_irq(port->dev, port->irq, sport);

if (sport->lpuart_dma_rx_use) {
del_timer_sync(&sport->lpuart_timer);
lpuart_dma_rx_free(&sport->port);
Expand All @@ -1400,7 +1386,6 @@ static void lpuart_shutdown(struct uart_port *port)

static void lpuart32_shutdown(struct uart_port *port)
{
struct lpuart_port *sport = container_of(port, struct lpuart_port, port);
unsigned long temp;
unsigned long flags;

Expand All @@ -1413,8 +1398,6 @@ static void lpuart32_shutdown(struct uart_port *port)
lpuart32_write(port, temp, UARTCTRL);

spin_unlock_irqrestore(&port->lock, flags);

devm_free_irq(port->dev, port->irq, sport);
}

static void
Expand Down Expand Up @@ -2212,16 +2195,22 @@ static int lpuart_probe(struct platform_device *pdev)

platform_set_drvdata(pdev, &sport->port);

if (lpuart_is_32(sport))
if (lpuart_is_32(sport)) {
lpuart_reg.cons = LPUART32_CONSOLE;
else
ret = devm_request_irq(&pdev->dev, sport->port.irq, lpuart32_int, 0,
DRIVER_NAME, sport);
} else {
lpuart_reg.cons = LPUART_CONSOLE;
ret = devm_request_irq(&pdev->dev, sport->port.irq, lpuart_int, 0,
DRIVER_NAME, sport);
}

if (ret)
goto failed_irq_request;

ret = uart_add_one_port(&lpuart_reg, &sport->port);
if (ret) {
clk_disable_unprepare(sport->clk);
return ret;
}
if (ret)
goto failed_attach_port;

sport->dma_tx_chan = dma_request_slave_channel(sport->port.dev, "tx");
if (!sport->dma_tx_chan)
Expand All @@ -2240,6 +2229,11 @@ static int lpuart_probe(struct platform_device *pdev)
}

return 0;

failed_attach_port:
failed_irq_request:
clk_disable_unprepare(sport->clk);
return ret;
}

static int lpuart_remove(struct platform_device *pdev)
Expand Down

0 comments on commit 9d7ee0e

Please sign in to comment.